A Day In The Boy's Life -21ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

4月も少し過ぎ、新しく入社したエンジニアたちは会社の事業内容や規則、業務フローの説明などもほどほどに具体的に現場で仕事をするための教育が始まっているかもしれません。

ここでは、プログラミングやHTMLの知識、ネットワークやサーバー周りの知識など所定のカリキュラムに沿って教育が実施されと思いますが、何れも十分な時間をとることができないため、広く浅くといった教育になりがちです。

 

また、一方でそのような教育を受けたとしても具体的に何を何処で使うのかがわからなかったりするため、次のステップとしてOJTなどでもう少し具体的な知識を身につけさせたり、実践に近いような形式で課題を与えてスキルアップさせたりする次の教育が始まったりもします。

ここで課題となるのがより実践に近いものを作らせるというものなのですが、そもそも具体的に何を作らせればいいのかと今度は教育をする側が悩むことにもなったりします。

理由は、インフラやサービスが整いすぎて新人レベルで作らせられるものが見つかりにくいというものです。

 

 

新人エンジニアの教育を取り巻く課題

 

何か新しい技術を教育したとしてもあくまでそれは机上のことであって、実際にそれを使ってみないことにはなかなかスキルというものは身につきにくかったりしますし、保守・運用の課題は実際にそれを保守・運用してみないと気が付かないことは多々あります。

要は、一定のスキルアップを図るためには実際にそれを作らせ、運用させ自分自身で体験し、自分自身で気が付かせるということが大事だったりします。

ただ、問題はその適当に作らせるものが見当たらないということです。

 

適当というのは、架空のサービスを作らせたとしても実際にそれを運用させるというのは難しかったりもしますし(作ったら終わりとなるので)、利用者が多いサービスの改修などをやらせてしまっては影響が大きかったりもして、その粒度が適当なものが見つかりにくいというものです。

例を挙げると以下のような点が理由にあります。

 

1. クラウドなどで安価な外部サービスをすぐに使うことができるのでわざわざ作る必要が無い

2. 知識としては必要だが、その技術を自社で保有していない

3. 失敗しても許される環境が無い

4. 業務フローやマニュアル外のことをやらせたくない

5. 技術がカプセル化しすぎていて具体的に中身を見せるのが難しい

6. システムのライフサイクルが長くなっている

7. そもそも時間が無い

 

もう少し具体的に書いていくと、1.に関しては車輪の再発明を避けるために今あって正しく動いているものをわざわざ新たに作る必要は無いという考え方です。

 

もちろん、教育の一環で作らせることは幾らでも可能なのですが、この場合はそれが本番としてサービスインできるようなものを新人自らに作らせるか、という点においてです。

一昔前なら、「これは自分が新人のときに作ったサービスだ」ってものが動いていたのかもしれませんが、今やよりよいサービスが低コスト・短納期で始められるのに悠長に作らせている時間は無いと思っている人も多いのかもしれません。

 

2.に関してはクラウドの流れと関連がある話ですが、以前に書いた「クラウド化によって捨て去られる技術 」のように捨てた技術というものもあったりして、ただエンジニアとして最低限その知識は持っておきたいものの具体的に触れることができる環境が手元に無いというものです。

ですので、参考書で読みました、ネットで調べて知識を得ましたというレベルまでしか教育ができなかったりします。

 

3.に関してはシステムの数が増え、また互いに密接に関わりあうような構成になっている関係で、一つのトラブルが他にも大きく波及してしまうので失敗が許されないというものです。

当たり前の話だったりもするのですが、それに加えてITサービスに対してユーザーの目が肥えていることもあり、何かトラブルが起きることのリスクを保守・運用側も恐れ、絶対に失敗させないような教育カリキュラムにすることで、踏み込んだ経験をさせることができなかったりもします。

実際には失敗でわかることやその経験が次に活かせることは大きかったりするので失敗することは悪いことではないんですけどね。

 

4.は3.の失敗できない環境に関連して、そのリスク回避として膨大なマニュアルが作られたり厳格な業務フローが定義されていたりすることです。

マニュアルどおりにすることを優先させ、その技術の本質に触れる機会が奪われたり、本番環境ならまだしも開発環境やソースにコミットをかけることすら申請が必要だといった厳格なフローが決められていたりしたらそのマニュアルやフローから外れるような知識は一切身につけることができなかったりもします。

 

5.は豊富なライブラリや仮想化技術の発展により、技術のコアに触れる機会がなくなっていたりしています。

開発効率を上げるために作り上げた独自のメソッドやAPIを通してデータアクセスや加工ができるとなると、その中で行われている処理の詳細がわからなくてもシステムを組み上げることができたり、物理的なサーバーがなくなることでハードウェアに触れる機会が無かったり、アプリケーションの仮想化によりミドルウェアが抽象化され何が動いているのかわからなかったり、簡単に環境がコピーできたりもします

こういった知識はトラブルが起きたときに影響が大きかったりもして、この環境がないと対応できませんとか、GUIじゃないとやったことがありませんとか、API叩いているだけなんでデータ構造は知りませんとかなったりして何もできない状況に陥ったりもします。

 

6.は仮想化などの技術の発展、ベンダーによる保守の延長、クラウドを利用することによるオンプレミス型の運用からの開放など、システムのライフサイクルがずっと長くなることでリプレイス案件などが少なくなってきたりしています。

つまり、先輩が作ったものを後輩が作り変えるといった案件がなくなることで、経験の場が失われていったりもします。

 

7.は言うまでもなく新人教育に割く時間がそもそも無いというものです。

 

初期の教育期間が終われば即、現場に出されるというのも珍しくありませんし、そこで経験を積めばよいという考え方の管理職も多数いたりします。

しかし実際には、これまで書いてきたような理由により現場でもなかなか思った以上の経験を積むことができず、要するにその環境でしか仕事ができなかったり、マニュアルどおりの対応しかできないエンジニアが育ったりして何時までも教育に関する悩みは尽きない状況となります。

 

 

まとめ

 

何れにせよ、思い切った経験をさせるということは本人にとってかなりプラスになることです。

自分としてはかなり恵まれていた(?)のか、多くの失敗が経験できる環境で教育を受けました。

実際のところ教育というよりは放任され、自分たちで作れ何とかしろって感じだったので、自ら作ったもので失敗を重ね、改良を加えていくということを繰り返してわかったことが多かったように思えます。

 

今ではそのような堂々と失敗できる環境や全てをコントロールできるような環境というのはなかなか見つからず、ある意味新人エンジニアにとってはつまらないものとなっているかもしれません。
そのようなことを促進できるためにも、管理する立場がもう少し自由度を与え、何かあったら自分たちで責任とって復旧するぐらいの考えを持たないといけないのかもしれません。

 

 

 

 

 

composerを使って管理するパッケージの中で、開発環境では必要だが本番では必要ないといったパッケージもあったりします。

例えば、テストツールのPHPUnitは開発環境では必要だけど本番ではいらないといった具合です。

こういった場合でも、composer.jsonをうまく書いてあげれば環境を分離して不要なパッケージを本番環境に導入せずに済んだりします。



開発環境で必要なパッケージを定義する


前回の[Composer] composer.jsonを読み解く にて、composerでインストールしたいパッケージはrequireキーの中にJSONの配列形式で記述すると書きましたが、require-devという項目も存在します。

文字通り、開発環境で必要なパッケージを定義するもので、デフォルトではこのrequire-devに指定したパッケージもインストール、更新の対象となります。


{
  "require": {
    "pear/pear_exception": "1.0.*@dev",
    "pear/log": "dev-master"
  },
  "require-dev": {
    "squizlabs/php_codesniffer": "dev-master",
    "phpunit/phpunit": "4.5.*"
  }
}

そのままupdateを実行するとrequireおよびrequire-devの両方がインストールされます。


$ composer show -i
doctrine/instantiator             1.0.4              A small, lightweight utility to instantiate objects in PHP without invoking their const...
pear/log                          dev-master df7aa17 PEAR Logging Framework
pear/pear_exception               1.0-beta1          The PEAR Exception base class.
phpdocumentor/reflection-docblock 2.0.4              
phpspec/prophecy                  1.4.0              Highly opinionated mocking framework for PHP 5.3+
phpunit/php-code-coverage         2.0.15             Library that provides collection, processing, and rendering functionality for PHP code ...
phpunit/php-file-iterator         1.3.4              FilterIterator implementation that filters files based on a list of suffixes.
phpunit/php-text-template         1.2.0              Simple template engine.
phpunit/php-timer                 1.0.5              Utility class for timing
phpunit/php-token-stream          1.4.0              Wrapper around PHP's tokenizer extension.
phpunit/phpunit                   4.5.1              The PHP Unit Testing framework.
phpunit/phpunit-mock-objects      2.3.1              Mock Object library for PHPUnit
sebastian/comparator              1.1.1              Provides the functionality to compare PHP values for equality
sebastian/diff                    1.3.0              Diff implementation
sebastian/environment             1.2.2              Provides functionality to handle HHVM/PHP environments
sebastian/exporter                1.2.0              Provides the functionality to export PHP variables for visualization
sebastian/global-state            1.0.0              Snapshotting of global state
sebastian/recursion-context       1.0.0              Provides functionality to recursively process PHP variables
sebastian/version                 1.0.5              Library that helps with managing the version number of Git-hosted PHP projects
squizlabs/php_codesniffer         dev-master f307928 PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a def...
symfony/yaml                      v2.6.6             Symfony Yaml Component

本番環境(require-devで指定したパッケージは不要)の場合は、下記のように実行します。


$ composer update --no-dev

$ composer show -i
pear/log            dev-master df7aa17 PEAR Logging Framework
pear/pear_exception 1.0-beta1          The PEAR Exception base class.

require-devのパッケージをインストールしてしまった場合でも、--no-devオプションをつけたら不要なパッケージは削除してくれます。

オプションの順番を変えて


$ composer --no-dev update

でも動いたりしますので、本番環境では省略したcomposerコマンドのAliasを作ってしまってもよいかもしれません。


ちなみに、--no-devオプションはオートロードでも有効になります。

本番環境と開発環境で読み込むライブラリが違うといった場合は、下記のように環境を分けることもできたりします。


{
  "autoload": {
    "psr-0": {
      "Foo\\Bar\\": "prod/lib/"
    },
    "classmap": [
      "prod/another_lib/Foo.class.php"
    ]
  },
  "autoload-dev": {
     "psr-0": {
     "Foo\\Bar\\": "dev/lib/"
    },
    "classmap": [
      "dev/another_lib/Foo.class.php"
    ]
  }
}

classmapで指定しているように本番(require)と開発(require-dev)で同一のクラスを読み込んでいる場合、デフォルトだとautoload-devのものがオートロードされます。

本番環境用にしたければ同じように--no-devオプションを付けます。

dump-autoloadでも使えます。


$ composer dump-autoload --no-dev


composer.jsonを環境ごとにうまく管理していけば同様のこともできたりもしますが、手間となったりミスがあった場合に余計なパッケージが導入されてしまうというリスクもあるため、うまく活用すれば管理が楽になるかもしれません。





仕事をする上では、少なくとも数名でチームを組んで取り組むことが多いですし、そもそも会社という組織に入れば上下関係などからコミュニケーションは避けて通れない状況に陥ります。

ただ、そこでのコミュニケーションによってたびたび自分の仕事が中断に追い込まれ、酷く生産性の悪い状況に陥ったりするのですが、こういった議論ってチーム内であんまりされませんしオフィスでも意図的ではないにしろ邪魔してくださいといわんばかりの環境が多かったりします。

 

 

中断から再開へのエネルギー

 

仕事が中断に追い込まれる理由は多々あります。

 

部下が不明点を質問にきたり、同僚が雑談してきたり、上司が資料を作るように急かして優先度を変更してきたり、打ち合わせが入ったり、トラブルが起きたり。

仕事のことではなければ「今は忙しいので後にして」とあしらうこともできますが、仕事のこととなれば相手も急いでたりしてどうしてもすぐの答えが求められたりします。

 

こうやって中断する仕事を再開するエネルギーって結構なもので、自分の事で言えばコードを書いてる集中力が途切れたり、ログを追っている状況なら何処まで見たかわからなくなったり、設計資料を書いているものなら実装しようとしている仕様が頭から飛んだりもします。

 

そんな状況ですぐにまた同じ状況に復帰できるかというと難しく、かなりの時間をかけて徐々に回復させていかなくてはなりません。

集中力とかは再開できるってレベルのものでもなく、「もう今日は無理」って状況になったりもしますし、エンジニアの仕事に限らず黙々とやるタスクってゾーンに入ることがあったりして、ものすごいスピードで処理できる気分を味わえたりもするんですけど、そんな中で仕事が中断させられると再びゾーンに入れることはありません(そもそも長続きする状況じゃないのにさらに横槍入れられたらモチベーションも下がりますし)。

 

仕事が中断されるというのは生産性が悪くなるという以外に、本人にとってとてもフラストレーションが溜まります

 

気分が乗っていたのに止めさせられたり、思い出す作業で時間をとられてしまったり、やりたいことができないという自分のペースを乱されることへのイライラが募ります。

相手は自分の目的を達成するので特に気にしませんが、中断された側としては自分の目的が達成できない状況に追い込まれることにかなりの負担を強いられたりもするわけです。

 

これは誰しも経験があることだと思いますが、仕事を中断させてしまって悪いなと思いつつ、「今ちょっといいですか?」という問いに対して「大丈夫」と答えられたらついつい相手の仕事を遮ってしまいがちです。

 

多くの場合は肯定的な回答を貰うことで相手の仕事を中断させる免罪符を得てしまいますし、それ以降は気にも留めずに話し込んでしまったりもします。

オフィス環境も、多くは長机に数人が座るような構成が多いでしょうから話がしやすいですし、回りで話し込まれたりウロウロされたりしたら気が散ってしまうような環境も悪循環に拍車をかける形になっている気がします。

 

 

集中する環境を作る

 

で、どうやって仕事に集中できる時間をなるべく多く確保できるようにするかって事に関して色々言われてたりもしますけど、権限をフラット化してある程度個々の判断に委任することで細かい承認作業を省略したり、私語や会議を禁止する時間帯を設けている企業もあるとか聞きますし、オフィスにしても各自に個室を分け与えるのは無理でも別室で仕事ができるようにする事で雑音を遮断できる環境を与えてあげることができるかもしれません。

 

 

まぁ、多くのことは一個人として状況を変えていくのは難しいので、うまいこと喋りかけるなオーラを出す方法を身につけるぐらいしかないかなと思うんですが、こういうのって個人の性格にもよったりするので会社の中でのキャラクターというのも大事な要素になってくるな、とか思ったりします。
後は、一日の予定の中で予め時間が細切れになることが予想できるのであれば、長く時間がかかるようなタスクというのは諦めてしまうとか、時間を確保するために集中的に雑務をこなしてしまうというのもありかもしれません。

 

が、大体の場合は今日の雑務が片付いても明日の雑務が発生するので、やりたいことややらないといけないことは他の雑務を切り捨てることを割り切って、最初から優先度を上げてやっていってしまった方が効率的だったりもするんですけどね。

 

これが管理職の立場となると、部下にその集中する時間を確保してあげなくてはなりませんので、ある程度自分が犠牲にならざるを得ないことも多々あります。

 

「お前まだ仕事終わってないのか」とか自らが集中する時間を遮ってしまうのは害悪でしかないですし、そもそも当人に依頼しているタスクは、その当人がやることが現状を考慮してベストと判断しているのであれば、その人が最も集中して仕事をする必要があるわけです。

会議なんかでダラダラと説教とか始めると、その全ての人の時間を奪うことにもなっているわけで、「その話を聞いたところで仕事が進むわけではないんだよ」とかはよく思うところです。

 

コミュニケーションをとることでしか進まない仕事も当然ありますので一概に言えないことではあるんですけど、馴れ合いの組織環境にいたりするとそれがかなり悪く働いたりしますし、一方で疎遠な環境だと仕事は集中できるものの、それぞれがあらぬ方向に進んでしまうミスも発生したりし、息苦しさを感じる人も多くなるかもしれません。

 

 

ある程度、話すことでしか解決できないコミュニケーションと、話さなくてもよいコミュニケーションというものをルール付けして仕事をした方が効率的になるのではないかと思います。

 

前者は厳密に言うとそんなものは存在しないんでしょうけど、早急に決めないといけなかったり、トラブルなどの対処が必要なものだったり、話す内容が複雑でテキストで伝えることが困難な場合といったものがどうしてもあったりします。

後者の話は要はメールとか、チケット管理システムとかのツールを使うといったケースで、大体の場合はこちらで相手の時間をさえぎることなくコミュニケーションができたりもします。

問題は、すぐに答えを欲しがったり、人と話すことが好きだったり、権威を示したいと思うような人がいるってところで、結局はメンバーの意識改革をするというのが一番難しいところだなと思う今日この頃です。