Microsoftのエンジニアとしてアメリカで働いている牛尾剛さんが優秀な同僚から学んだ思考法について書いた著書『世界一流エンジニアの思考法』を読んだので学びになったトピックについて簡単に書こうと思う。

頭がよくても「理解」には時間がかかる

ある若くて優秀な同僚が新しいプロジェクトに参加するときにアーキテクチャの説明ビデオを「難しいので何回も見直している」と言っていたのに対して著者が衝撃を受けたというエピソードが紹介されていた。

なかなか他人の作業過程を観察する機会もないのでついつい「優秀な人は複雑な物事でも一瞬で理解してしまうのだろう」と想像してしまいがちだが、Microsoftの凄腕エンジニアでも理解に時間がかかることがあるという実例を知り、何だかとても励まされた気分になった。

新しい技術や概念の理解に時間がかかるとついつい仮想上の優秀な人と自分を比べて「はやくインプットしてはやくアウトプットを出さなければ」と焦るのをたまにやってしまうが「優秀な人でも物事を正確に理解するには時間がかかることもある」という心持ちでいるだけで焦らず着実にインプットしていけそうだと感じた。

そうして「正確に理解している概念」が増えていくほど新しい概念を理解する速度も向上するはずなので焦らず地道に理解することに努めたい。(もちろん時間的制約があるケースもあるので一概には言えないが)

このトピックに関しては以下の記事にもあるのでもし気になったら読んでみて欲しい。

プログラミングというより物事が出来るようになる思考法|牛尾 剛

完全に余談だが、優秀な人をリスペクトしすぎると「自分とあの人は違うしな・・・」と自分にはそういった人のような素晴らしいアウトプットは出せないという思い込みを持ってしまいがちなので自分を卑下せずかといって奢りもせずフラットな気持ちで自分を励ましまくっていきたい。

Be Lazy(怠惰であれ)

より少ない時間で価値を最大化するという考え方。これを体現するために習慣として次が紹介されていた。

  • 望んでいる結果を達成するために、最低限の努力をする。
  • 不必要なものや付加価値のない仕事(過剰準備含む)をなくす。
  • 簡潔さを目指す。
  • 優先順位をつける。
  • 時間や費やした努力より、アウトプットと生産性に重点を置く。
  • 長時間労働しないように推奨する。
  • 会議は会議の時間内で効率的かつ生産的に価値を提供する。

自分なりに抽象化すると

  • 成果にフォーカスする
  • より効率的に成果が出るように工夫する

ということなのかなと思った。

とくに自分は成果を安定的に出せているかと言われると全然そんなことはないので、まずは「成果を出すこと」次に「より効率的に成果を出すこと」というステップで意識していくと良さそうだと思った。(あまり残業しないことばかりに意識を向けると結局期待される成果がでずに会社も自分も不幸せ、という状況に陥ってしまいそう)

ただ、成果を出す手段として長時間労働を第一の選択肢にしてしまうとさまざまな弊害があるとは思うのでそこは気をつけたい。

長期的な生産性を高めるためには

  • 振り返りをして改善し自分 / 自チームの生産性を高めること
  • 振り返りを通して得た気付きを共有して組織の生産性を高めること
  • 自分のスキルアップに一定時間を投資すること

あたりは大事かなと思うのでやっていきたい。

タイムボックス制

以下のように紹介されていた。

タイムボックス制で、学習の時間を確保する

今までは、時短を試みても「アウトカム」重視派だったので、切りのいいところまでやろうと考えて、結局寝る直前までかかってしまうことが頻繁にあった。(中略)ソリューションは簡単だった。「タイムボックス」制だ。 例えば、5時になったら仕事が途中でも、どんなに切りが悪くても、すぐに仕事をやめる。いつの間にか時間が過ぎてしまわないよう、5時きっかりにアラームをセットして。

絶対に時間をオーバーすることはないよう、しばらく無理矢理にでも「タイムボックス」で生活してみたらどうなったか? まず、5時に強制終了するようにすると、就業後にランニングできるようになった。頭がすっきりとリフレッシュするのがわかるし、夜に本を読んだり、ギターを弾いたり、ゲームしたりする余裕が生まれた。以前はそうした時間にすごく罪悪感を感じたが、一番イケてる人たちの意見をじることにしたのだ。 タイムボックス導入と同時に朝型の生活にシフトして、必ず夜10時には寝るスタイルにしてみた。

すると1週間もしないうちに、というか翌日から頭が冴えて生産性が上がった。 正直マジかよ!と思ったが、今までどれだけ働きすぎて頭の切れが鈍くなっていたかを痛感した。運動をしなければ、動物として何かがおかしくなるのも当然だし、深夜まで起きて作業したって、ろくに頭が働いていなかったのだ。人間は週40時間労働が一番生産性が上がるという説もあるし、確かに時間を区切ったほうが合理的だ。

仕事に使える時間を定めることで「たくさん残業して気合いで解決する」みたいな解決方法が第一の選択肢となることを防ぎ、工夫や改善によって生産性を上げることに繋がり持続可能な形で開発生産性を上げる文化に繋がりそうだと思った。

成果が出るならばより少ない時間でその成果が得られる方がいいのはそれはそうなので少し自分なりにアレンジして取り入れたい。具体的には「残業しすぎないように気をつける」くらいのマイルドな感じで取り入れてみようと思う。

ここでの示唆は、業務だけに自分の時間を使ってしまうと

  • 学習によって自分の生産性を向上させることがしずらい
  • 残業前提で成果を出すため再現性が低い

ということだと思う。残業しすぎないことで学習の時間を確保したり、開発プロセスの改善やスコープの調整によってうまく成果を出せるようにできていることが重要なのだと思う。

ときには多少残業をしないと厳しいこともあると思うし個人としても残業を1秒もしたくないというほどでもないのでこういう取り入れ方にしてみようと思った。

まとめ

というわけでマインドセットだけでなく具体的なプラクティスの面でも大いに参考になる内容が多かったのでとても勉強になったので折に触れてまた読み返したい。気になった方はぜひ読んでみてください。