著者は現在、アメリカのシアトルでシニアソフトウェアエンジニアとしてマイクロソフト社に勤務しています。しかし、著者自身は「一流エンジニア」とは言えず、むしろ「三流」と感じています。
幼少期から”要領が悪く”、何度もプログラマを目指して挑戦してきました。特にADHDと診断されたことで、自分の不得意なことへの効率的な対処法を模索してきました。
本記事では、著者が一流エンジニアたちの思考法を学び、実践してきたプロセスをお伝えします。成功を目指す方や、自信を持てない方にとって、有益な知見となることを願っています。
もくじ
第1章「世界一流エンジニアは何が違うのだろう?」
トップエンジニアの衝撃的な解決法
プログラムの問題発生とペアプログラミング
著者は自分のプログラムに問題が発生したため、チームの優秀なエンジニアであるポールに「ペアプログラミング」を依頼。「ログ」(プログラムの動作記録)を使い、原因究明に時間がかかることを予想していた。
ポールの思考アプローチ
ポールは最初の一つのログだけを見て「仮説」を立て始めた。手は一切動かさない。データーベースを閲覧するソフトを起動し、クエリ(システムへの命令文)を1回投げただけで、プログラムの問題の根本原因を見事に特定。
驚きと気づき
このコードベースに関して、ポールは経験がほとんどないのに、自分よりも早く問題を解決したことに驚いた。これは、優れたプログラマと一般的なプログラマの生産性の差を実感させる出来事だったが、ポールは特殊な能力ではなく、効率的な思考法を用いただけだった。
仮説ベースの問題解決
同僚のバーラの言葉を思い出し、試行錯誤ではなく、まずは、事実(データ)を一つ見つける→いくつかの仮説を立てる→その仮説を証明するための行動をとることが大切だと学んだ。
「理解に時間をかける」を実践する
そもそも学習における「理解」とはなんだろう。さまざまなレイヤーがあるが、著者の考える(理解の三要素)とは次のようなものだ。
- その構造をつかんで、人に説明できること。
- いつでもどこでも即座に取り出して使えること。
- 知見を踏まえて応用がきくこと。
著者は、あるプロジェクトで同僚とコードを読んでいたさい、自分よりも理解のスピードが速い同僚が、時間をかけて丁寧にコードを読み込む姿勢に驚いた。その同僚は、コードのロジックを読むのではなく、コードの意図とその背後のアーキテクチャを理解するために読み込んでいた。
著者は自分のプログラミングスタイルを振り返り、毎度Googleでサーチして、「こんな感じ」かなとコーディングしていた。つまり、誰もが知っている「基礎」が身についていなかったのだ。
複雑な技術をコントロールできている感覚を得る
著者は、「実際にコードに触れないとわからないよね?」といった手を先に動かす悪習慣を捨て、プログラミングの基礎からやり直す三つの作戦を実行した。
- 定時後や週末に、プログラミングの基礎を学ぶ。
- c#の言語仕様を勉強する。
- LeetCode(コーディング面接の準備のための学習サイト)を一番簡単なレベルから毎日やる。
同じ毎日を送っていても自分の「プログラミングが遅い、精緻ではない」という問題の解決にならないので、仕事中ではなく、フリーの時間に「誰でも知ってる方法で、プログラミングを0から勉強しなおす」作戦を決行した。
初歩の学習を「簡単だ」と馬鹿にせず、本当に一からやり直してみました。
「理解には時間がかかる」との意識を持ち、急がずに徹底的に理解する習慣を身につけることで、以前とは異なる体験をするようになりました。コードリーディングでは挙動を100%理解できるようになりました。
デバッグ(プログラミングのバグ取り作業)でも少ないログをゆっくり観察して、従来読み飛ばしていたようなログの他の項目も見ることで、圧倒的に試行錯誤が減って問題を一直線に解決できるようになってきました。
頭の中に「メンタルモデル」をつくる
同僚たちは驚くほど細かいところまで仕組みを把握し、記憶している。スキップマネージャーのアニルーダに「どうしてそんなに多くのことを把握できるのか?」と尋ねたら、彼は「メンタルモデルをつくるとそれができるようになる」と教えてくれた。
メンタルモデルとは、人々が世界を理解し、予測し、解釈し、新しい状況に適用するための、自己の心の中のイメージや理論のことだ。チームメイトは「メンタルモデル」という言葉を頻繁に使うが、頭の中で素早く情報処理をするために、何らかの脳内イメージを持っていることが非常に有効なのだ。
著者は「システム思考」を独自にアレンジし、ソフトウェア全体の構造を把握してから部分の相互作用を考える方法を採用しているしかし、入社間もない同僚。この手法により、新しいコードベースの理解や問題の対処が迅速になりました。
自分の業種・業態にあった思考の枠組みを学んだり、経験したりして、自分なりの脳内イメージを作り上げることができれば、頭の中で考えを整理したり、問題発見に至るプロセスが大幅に高速化します。
第2章「アメリカで見つけたマインドセット」
「Be Lazy」というマインドセット
「Be Lazy」(怠惰であれ)というマインドセットは「より少ない時間で価値を最大化するという考え方」で、優先順位をつけ、重要なタスクに集中することを重視します。著者は、アメリカのインターナショナルチームで働く中で、このマインドセットの効果を体感しました。
日本では「すべてのタスクをできるだけこなそう」とする傾向がありますが、アメリカでは「最もインパクトのある一つのタスクに集中し、他はやらない」というアプローチが取られます。これは〈2ー8の法則〉とも関連しており、20%の仕事が80%の価値を生むという考え方です。
つまり、無理なく生産性を上げるためには、少量のタスクで高い価値を生み出すことが重要です。
いかにやることを減らすか?
生産性を高めるための4つのステップを紹介しています。
1. 一つだけピックアップする
まずは「一番重要なもの」を一つだけ選び、それに集中します。複数あるタスクの中で「何をやらないか」を明確にし、限られた時間で最大の成果を出すことが大切です。
2. 時間を固定して、できることを最大化する
「すべきこと」にとらわれず、時間を固定してその中でできることを最大化します。時間の制約があることで、自然と優先順位がはっきりし、重要なことに集中できます。
3. 会議内で全て解決する
準備や持ち帰り作業を極力減らし、会議内で意思決定を完結させます。これにより、後で追加の作業をする必要がなく、生産性が向上します。
4. 物理的にやることを減らす
タスクを物理的に減らし、重要でないものは除外します。計画はあくまで予測であり、変更が必要なときには優先順位を見直して不要なタスクを削ることが効果的です。
リスクや間違いを快く受け入れる
欧米のビジネスでは、成功しようがしまいが、まずはやってみて、早くフィードバックを得て、早く間違いを修正して行くーーFail Fastの精神が重要です。検討ばかりして、さっさと「やらない」ことのほうが最大のリスクです。
第3章「脳に余裕を生む情報整理・記憶術」
コードリーディングのコツは極力コードを読まないこと
著者は、プログラマとして、コードリーディングが一番苦手でした。時間がかかり、読み間違えることが多く、いつも疲れ果ててしまいます。周囲のエンジニアにコツを尋ねても、具体的なアドバイスを得ることができませんでした。
しかし、入社間もない同僚のクーパーがこう言ったのです。「コードリーディングのコツは、極力読まないことですよ。他のデベロッパーのことを信頼して、実装はちゃんと動くものとする。だって、たくさんコード読むと、圧倒されちゃうでしょ?」
この言葉に目からウロコでした。
いかに脳みその負荷を減らすか
クーパーのアドバイスに従い、コードリーディングの負荷を減らす方法について考えました。彼は「実装を極力見ず、インターフェイスと構造を理解するようにする」と説明してくれました。ダイヤグラムや関連性のグラフを書きながら、メソッドやクラスの役割、パラメータをしっかり理解することが重要です。
確かにコードを読むのは必要な部分だけで十分で、端から端まで読もうとすると脳が疲れ果ててしまいます。実際にこのクーパーメソッドを試してみると、余計なコードは読まず、インターフェイスの理解に集中した結果、短時間で理解が進みました。
「自分には才能が足りない」と感じるときは、大抵の脳の使い方が間違っているサイン。才能の差なのではなく、脳に余裕の無い状態で酷使している可能性が高いです。
仕事の難易度別で考える
仕事の難易度を4つのレベルに分けて考えると、脳の使い方がクリアになります。
- レベル1: 何もググらずに即座に実装できるもの。
- レベル2: 問題をどう解決するのかすぐに思いつくが、具体的な方法は忘れているので、ググる必要があるもの。
- レベル3: 自分は解法を知らないが、スパイクソリューション(課題把握のための大まかなプログラム)をしたらできそうなもの。
- レベル4: 自分だけでは解決が難しい、もしくはものすごく時間がかかるもの。
著者は、レベル4をクリアしなければならないという焦りから独りで取り組むと、時間を浪費し、ストレスを感じることが多かった。そこでふと、レベル2のタスクをレベル1に引き上げることが生産性向上につながるのではと気づきます。
コードリーディングが遅いのは、即座に動作をイメージできないことや構造把握が苦手なため。レベル1のタスクを増やすことで脳の負担が減り、重要な部分に集中できるようになります。
レベル4のタスクは無理をせず人に頼るか、学習を通じてレベルを上げることが大切です。「今の自分では解けない」と認識し、自分の成長に合わせて取り組むことが重要です。
「アウトカム」至上主義が上達を阻害する
AIに書いてもらったり、既存のコードをコピペして成果を出すと、内容を理解していないため、応用ができず、結果的に学びが少なくなります。技術の真価は地味な積み重ねにあり、即席で身につけることは不可能です。
時間をかけて技術を徹底的に理解し、理解した情報の整理をして、すぐに取り出せるレベル1の状態にしてこそ、長い目で見たさいの生産性向上につながります。
新人でもベテランでも、うまくいかない場合は「分かっていない」ことが原因です。基礎ができていない状態で自分流にアレンジすると、混乱を招き、成功しません。基本を愚直に実行し、ゆっくりと理解を深めることが重要です。
第4章「コミュニケーションの極意」
「情報量を減らす」大切さ
アメリカでの経験から、対クライアントや社内でのコミュニケーションでは「脳の負荷を減らす」端的な伝え方が重視されることを学びました。特にエンジニアにとっては、情報が少ない方が好まれる傾向があります。初めはその文化に戸惑い、日本での豊富な情報を提供するスタイルが通じないことに驚きました。
日本では、プレゼンテーションや会議で多くの情報を盛り込むことが好まれ、聴衆に「お得感」を与えるために詳細な資料やサンプルを準備していました。しかし、アメリカでは、過剰な情報が「分かりにくい」とされ、シンプルで明確なコミュニケーションが求められます。
アメリカのスタンスは、「その場で吸収できることを最大化したい」という考え方に基づいており、複雑な情報を一度に提供することが理解を妨げることが多いため、シンプルで理解しやすい情報が求められるのです。インターナショナルチームでは、脳に負担をかけない伝え方がスタンダードになっています。
第5章「生産性を高めるチームビルディング」
「サーバントリーダーシップ」とは何か
ソフトウェア開発の分野では、2001年にアジャイル開発が登場して以降、「サーバントリーダーシップ」が主流になりました。従来の「コマンドアンドコントロール」スタイルは、リーダーが指示を出し、部下の状況を把握して管理する方法です。
一方、サーバントリーダーシップでは、リーダーは〈ビジョンとKPI〉は示すものの、実際の行動はチームが自主的に決定します。
「コマンドアンドコントロール」と「サーバントリーダーシップ」の違い
特徴 | コマンドアンドコントロール | サーバントリーダーシップ |
---|---|---|
指示 | マネージャーが部下に指示 | メンバーが主体的に動く |
役割 | 指示・管理 | 障害を取り除くサポート |
スタンス | 社員を「子供」として扱う | ステークホルダーとして扱う |
ボスの役割はサポートすること
自主的に動くメンバーをマネージャーがどのようにサポートするかについて、ダミアンはその模範的な存在です。彼はチームのゴールやミッションを明確に数値で示し、無理のない形で共有します。ゴール設定も非常に親身になって一緒に行ってくれ、困ったときにはアドバイスをしてくれるものの、細かい指示は一切ありません。
マネージャーの主な役割は「アンブロック」です。つまり、開発者(IC)がつまずいたさいに、その障害を取り除いてくれる役割です。例えば、技術的な問題があり、チーム外の専門家に問い合わせても返答が得られず、仕事が進まないといった場合には、マネージャーが人をつないだり、他のメンバーに協力を依頼したり、技術的な提案をしてくれます。
このように、常に「仕事の遂行を助けるサポーター」としての姿勢を貫いています。
また、デッドラインが近づくとリマインドをしてくれ、指示をするのではなく、メンバーの理解を深め助けようとします。エンジニアたちは、個人事業主に近い形で、自分たちをサポートするマネージャーのもとで自由に動くことができます。自分がやりたいことを自ら選び、困ったときには同僚やマネージャーに相談することで、迅速に助けを受けることができます。
さらに、マネージャーはエンジニアの中長期的なキャリアアップについても相談に乗り、支援をしてくれます。各メンバーの思い描く将来に応じて、スキルを高め、充実したキャリアを築くための具体的なサポートをしてくれるのです。このような環境では、メンバーは自立し、自らの成長を実感しながら働くことができます。
第6章「仕事と人生の質を高める生活習慣術」
生産性を上げたければ定時上がりが効率がいい
長時間労働が逆に効率を下げることは、多くの人が経験していることだと思います。著者もかつては、しっかり休もうと努力していたものの、満足できずに作業に戻ることの繰り返しでした。その結果、プライベートの充実感が低く、仕事に没頭しすぎて心身ともに疲弊していました。
そんな中、メンターのクリスとのセッションが大きな転機となります。クリスは
「生産性を上げるためには学習だよ。だから、僕は仕事を定時ぐらいで切り上げる。その後で、自分のやりたいトピックを勉強したり試したりする。ずっと仕事していると疲れるし、たとえ同じプログラミングでも、仕事と切り離したものはリラックスしてできるよね」とアドバイスした。
この考え方に触れ、著者は「仕事ばかりしていては短期的なアウトプットが増えることはあっても、根本的な生産性は上がらない」と気づきます。
著者が目指しているタイプを観察すると、大抵定時くらいで帰る傾向があり、アメリカ人は時間外労働を避ける文化があることがわかります。
「タイムボックス」制で、学習の時間を確保する
例えば、5時になったらどんなに切りが悪くても仕事をやめる。アラームをセットし、時間が過ぎないように徹底する。しばらく無理やりタイムボックス制で生活してみたところ、5時に仕事を終えると、終業後にランニングをする時間ができ、リフレッシュできるようになった。夜に本を読んだりギターを弾いたり、ゲームしたりする余裕が生まれた。
以前はそうした時間にすごく罪悪感を感じたが、一番イケてる人たちの意見を信じることにした。
タイムボックス制を取り入れつつ、朝型の生活にシフトし、夜10時には必ず寝るようにした。すると翌日から頭が冴えて生産性が上がった。運動をしなければ、動物として自然なバランスを失うことに気づいた。人間は週40時間労働が一番生産性が上がるという説もあり、時間を区切ることが合理的だと感じた。
朝起きてから就業前までの時間を「学習」の時間に充て、プログラミングや技術の勉強を続けた結果、数ヶ月後にはコードベース(ソースコードの集まり)への理解が深まり、仕事をコントロールできている感が高まった。技術力も向上し、5時には確実に仕事が終わるため、ストレスも溜まらない。
タイムボックス制を始めたのは1年で最も忙しい時期だったが、実働時間が減ったのに生産性は落ちるどころか、いきなり上がった感がある。
タイムボックス制のコツは、「完了」を目指さないことだ。時間内で集中し、タスクが終わらなくても割り当てた時間で終了すること。
違うことをするのがリフレッシュに
脳をリフレッシュさせるためには、全く違うことをするのが効果的です。特に、「頭を使わない手作業」である「ギターを弾く」ことが、著者に合ったリフレッシュ方法です。平日の夜に30分~1時間、堂々とギターを弾くことで、朝からエネルギーが増え、日中の仕事にも集中力が生まれました。好きなことをする時間が、生命力を賦活する役割を果たしていると感じています。
アメリカに移住してからは、休日をうまく取ることができず、生産性を犠牲にしてまで働き続けていました。しかし『Time off』という本との出会いを通じて、休息の重要性を学び、考え方が変わりました。要点を簡潔にまとめると以下の通り。
- 水泳をするときに、息継ぎせずに泳ぐことはできない。
- 発想のブレークスルーは、その仕事をしていないときに発生する。
- 一日に一つのことに集中できるのは4時間。4時間過ぎて疲れたら、単に休むのではなく、違うことをするのが良い。
- 休息するのは、何もしないことではなく、いつもと違うことをするのが重要。
いつもと違うことをするのが休息になるーー飽きずに長続きする秘訣がこの辺りにありそうだと著者は述べています。
物理的なエネルギー不足をどう解消するか
年齢を重ねるにつれて体力や気力が低下するのは自然なことですが、特に中高年に差し掛かるとその影響が顕著になります。著者は、アメリカに移住してからの運動不足とテストステロンの減少により、気力の低下を経験しました。
そこで、男性の更年期障害的な不調に対処するため、運動を最優先し、テストステロンを増やすことを目指しました。具体的には、週3回の筋トレを取り入れ、筋肉を効果的に鍛えるためにパーツごとに日を分けて行いました。また、一日10分の高強度インターバルトレーニング(HIIT)を実施しています。
さらに、気力を取り戻すために有酸素運動も必要だと認識し、毎日30分の有酸素運動をルーチンにしました。
こうした取り組みを続けた結果、著者は気力の回復を実感し、身体的なエネルギーも増加しました。特に毎朝の30分の有酸素運動がメンタル面に大きな影響を与え、気力の低下は単なる気合いややる気の問題ではなく、物理的な「エネルギー量」の問題でした。
テストステロンを意識的に増やす
テストステロンを増やすには、食事や運動の面で工夫することが大切です。特に、肉や玉ねぎ、加熱されたニンニクなど、テストステロンを増やすのに効果的な食品を意識して食べましょう。具体的には、以下の食材が効果的です。
- 動物性たんぱく質:牛肉、豚肉、鶏肉、魚、乳製品、卵など。
- 亜鉛が豊富な食品:牡蠣やレバーがおすすめ。特に鶏レバーや豚レバーはテストステロン産生に密接に関わるビタミンAがたくさん含まれている。
- ナッツ:亜鉛やミネラルに加えて、神経伝達物質であるアセチルコリンの原料となるレシチンも豊富に含まれるので、脳の老化防止と集中力アップにもつながる。
サプリメントに関する個人的なオススメは、もう直球でテストステロンブースターを飲むことです。特に年齢のいっている人は習慣的に摂取するとよい。加齢に伴うさまざまな不調を一気に改善できる可能性が高いです。
一番手っ取り早いのはテストステロンを増やす注射ですが、コストが高いため、著者自身はテストステロンパッチを使っています。その効果を実感しており、筋トレと組み合わせることでさらにテストステロンの恒常的な増加を感じています。
テストステロンが増加すると、更年期特有の抑うつ感やイライラ、不眠が軽減され、集中力や記憶力の向上にもつながります。
仕事のパフォーマンスの根底にある身体づくり、脳の休ませ方は生産性と直結するため、ぜひそれぞれの身体に合ったやり方で工夫するとよいでしょう。
第7章「AI時代をどう生き残るか?」
AIと過去のテクノロジーの違い
AI技術の進化は、かつての技術革新と比べても圧倒的なスピードで社会に影響を与えています。2023年春のChatGPT-4のリリースが象徴的ですが、これは単なるツールの登場ではなく、根本的に労働市場や社会の在り方を変えるものでした。「プログラマ職」も例外ではなく、多くの人がその将来に不安を抱くようになりました。
過去の技術革新、例えばパーソナルコンピュータやインターネット、スマートフォンの普及は確かに大きな影響を与えましたが、それらはあくまで「便利なツール」としての側面が強かったため、個々の職業や生活に与える影響は直接的ではありませんでした。しかし、AIは異なります。AIは単に補助的な存在ではなく、人間の仕事を「置き換える」ことができる存在として台頭しています。
どんな職業ならAIに食われないだろう?
友人のAIの専門家とディスカッションした中で、AIに食われないものは、少なくともしばらくは身体的なもの、対人的なものーー創造的な仕事や、芸術などの分野ではないかという話が出ました。
例えば、料理の分野。AIが完璧においしい料理をつくれたとしても、ほとんどの人は人間が料理し、給仕するレストランで食事をしたがるでしょう。音楽の分野でも同様です。AIがスティーヴィー・レイ・ヴォーンやジミヘンのように完璧な演奏を模倣できても、それは過去の学習データをもとにしたもの。新しい個性や創造性は人間による演奏にこそ見いだされます。
対して、エンジニアリングの分野はどうか?この分野は、完璧であることが求められるため、AIに追い抜かれる可能性が高い領域です。エンジニアの仕事は、今後緩やかに、あるいは急激にAIに取って代わられる可能性があります。
問題を解決するカギ
しかし、シアトル近郊のレッドモンドにある著者の職場では、友人たちはあまり不安を抱えている様子はありません。著者の「自分が今をエンジョイするしかない」というツイートに対して、友達のジェフは「仕事がもはや面白くなくなったら、そのときは何か新しくて挑戦的なものを探すだけだよ」とリプライしてくれました。
また、友人のクリスは別のツイートで「いいトリックがあって、自分が何年も頑張ってきた分野のコンテキストで、どうしたらAIとアラインできるかを見つけ出して、そこから行くんだよ。それはたぶん、多くの分野でとてもインパクトがある。大勢の人たちにとって、たくさんの機会が存在するよ」と励ましてくれました。
AIがどれだけ進化しても、まだAIが対処できない分野や、人間ならではの価値は残ります。そして、その価値を活かす方法を見つけ出すことが今後の鍵となるでしょう。
AI時代には「専門性」こそが強みとなる
AI時代において、「専門性」はエンジニアの強みです。多くのITエンジニアがAIの進化に不安を感じていますが、時流に惑わされず「専門性」を追求する姿勢が重要です。誰もやったことのないものに取り組んでいる専門家は、AIがとって代わることは原理的にありえません。
AIが高度なソフトウェアをつくり出せるようになっても、用途や目的に応じた学習のためのAIモデル(データ解析の方法)は人がつくる必要があるし、モデルを使って、求めるサービスにインテグレーション(統合)する仕事も不可欠です。AIが生成したプログラムを顧客に提供するためには、エンジニアによるインテグレーションが必要です。
ソフトウェアエンジニアとデータサイエンティストの協同が、今後ますます重要になっていきます。著者のチームもそれぞれの専門性を磨き、次の変化に備えています。
ここで、エクストリーム・プログラミングを開発した、ケント・ベックの言葉をご紹介します。
「私は偉大なプログラマではなく、偉大な習慣を身につけたプログラマだ」。
結局のところ、シンプルな日々の積み重ねが一番強いということですね。
最後まで読んでいただき、ありがとうございます😌🙇