推測せず二分探索する
動いていたバージョンと壊れたバージョンの間のどこかでバグが現れた場合、差分を目で追うのではなく履歴を二分探索する──中間点を確認し、一つの変更だけが残るまで繰り返す。
濃いマスほど、このテーマでその指標が高いことを示します。
低高
多くの日は、新しいコードを書くこと、レビューで他人のコードを読むこと、バグを修正すること、次に何を作るべきかチームメイトと話し合うことに分かれる。会議や計画立案、後輩の指導は新人が思う以上に時間を占める。シニアエンジニアはジュニアエンジニアより自分でコードを書く量が少なく、設計判断やレビュー、他者の障害を取り除くことに多くの時間を費やすことが多い。
必須ではないが、依然として最も一般的で摩擦の少ない道である。4年制の学位ではアルゴリズムやデータ構造、システムの概念を学ぶが、これらは独学では習得コストが高い。ブートキャンプ卒業生や独学のエンジニアも採用されており、特に小規模企業ではそうだが、通常は学歴の代わりとなる強力なポートフォリオやオープンソースへの貢献が必要になる。
一部はすでにそうなっている。現代のコードエディタに組み込まれたツールは、定型コードや初稿のテスト、言語間の変換など、日常的なコードの大きな部分を、日常的に使うエンジニアのために書くようになっている。はるかに自動化が難しいのは、何を、なぜ作るのか、そして実際のユーザーや障害にさらされても生き延びるようにシステムをどう形作るかを決めることである。
国や企業によって大きく異なる。米国では中央値が年間約13万3000ドル、ドイツではおよそ6万9000ユーロ、業界が最も多くの人を雇用しているインドでは全国平均が90万ルピー前後になる。大手テクノロジー企業のシニアやスタッフエンジニアは、株式報酬を含めると全国中央値の数倍を稼ぐこともある。
実際にはほとんど違いがない。肩書きは重複しており、企業によって使い方も一貫していない。「プログラマー」は最も古い用語でコードを書くことを重視し、「開発者」はウェブやプロダクト企業でよく使われ、「ソフトウェアエンジニア」はより古いエンジニアリング分野から借りた規律あるプロセスやテスト、設計の考え方をソフトウェア構築に適用するという意味合いを持つ。求人票でこれらが一貫して区別されることはほとんどない。
多くの大手テクノロジー企業では、そうである。共有ドキュメントやホワイトボード上でアルゴリズム問題を解くライブまたは持ち帰り形式の技術面接が標準的な選考手法であり、より上級の職種にはシステム設計面接も加わる。小規模企業やスタートアップでは、有償の試用プロジェクトやポートフォリオレビュー、過去の実績についての会話で代替する可能性が高い。
8時間ずっとタイピングし続けているエンジニアというイメージはおおむね誤りだ。他人のコードを読むこと、原因不明の障害について考えること、技術的なトレードオフをエンジニアでない人に説明することは、新しいコードを書くのと同じくらい──最初の数年を過ぎた人にとってはそれ以上に──仕事の大きな部分を占める。
この職業内で受け継がれる技は、どの言語を学ぶべきかというより、思考の習慣にかかわる。当てずっぽうではなく体系的にバグを探す方法、動いているコードにいつ手を出さずにおくべきか、そしてコードを削除することがその週で最も価値ある仕事だったこともあるという感覚である。
曖昧で大きな依頼を、独立して構築・テスト可能な小さな断片に分割すること──大きな仕事で行き詰まるエンジニアと生産的なエンジニアを最も分けるスキル。
当てずっぽうで物をいじって偶然動くようにするのではなく、システムがどこで、なぜ誤動作しているかを体系的に絞り込むこと。
初日に動くだけでなく、何年にもわたって安全に変更し続けられるよう、サービスやデータ、チームをどう分割すべきかを選ぶこと。
技術的なトレードオフを非エンジニアに説明し、レビュアー向けに変更内容を明確に書き記し、スコープを交渉すること──プロのコードは書かれるよりもはるかに多く読まれ議論される。
ユーザーが気づく前に壊れた変更を検知するチェックを書き、次に触る人(多くの場合は数か月後の同じエンジニア自身)が安全に修正できる程度にコードベースを読みやすく保つこと。
言語やフレームワーク、そして今やAIツールも数年ごとに入れ替わる。最初の仕事を終えた後に意図的な学習をやめてしまうエンジニアはすぐに頭打ちになる。
夜間のアラートやメッセージに目を通し、その後チームが取り組んでいることと障害になっていることを話す短いスタンドアップ会議を行う。
一日の中で最も保護されたブロックで、理想的には通知を切り、持続的な集中を要する機能や修正の実装に費やす。
本物の休憩。多くのエンジニアが、多忙な時期に最初に失われるのがこの時間であり、失って最初に後悔するものだと語る。
同僚のプルリクエストを読み、難しい問題をペアで解決し、午後に集中しがちな設計や計画の会議に出席する。
その日の変更を仕上げて出荷し、安全に展開されるのを見守り、明日のため、あるいは夜間のオンコール担当者のためにメモを残す。
私的な時間と睡眠──ただしオンコールの週は別で、電話のアラートが午前3時を予定外の本番障害対応に変えることもある。
現場で実際に伝えられる技術知 — モチベーション文句ではない。
動いていたバージョンと壊れたバージョンの間のどこかでバグが現れた場合、差分を目で追うのではなく履歴を二分探索する──中間点を確認し、一つの変更だけが残るまで繰り返す。
完全なエラーメッセージ、スタックトレース、周辺のログ行には通常すでに答えが含まれている。すぐにソースに飛びついて推測するのは、コンピューターが無料でくれた唯一の証拠を無駄にすることになる。
機能の追加が難しい場合、それは通常、コードがその機能に合わない形になっているサインだ。まず挙動を変えずにリファクタリングし、その機能が小さく明白な差分になるようにしてから、その差分を実装する。
理解していないコードや設定値、チェックを削除または簡素化する前に、なぜそれが置かれたのかを調べる。まさにそのおかげで何年も起きていない障害を静かに防いでいるのかもしれない。
もはや存在しないコードにはバグがなく、次に読む人を混乱させず、更新の必要もない。使われなくなった経路や機能を削除することは、機能を出荷することと同じように称賛されるべきだ。
助けを求める前に、同僚や無生物にさえ、問題を一行ずつ声に出して説明する。それを正確に言語化する行為そのものが、誰かが答える前にバグを明らかにすることが多い。
Visual Studio CodeとJetBrainsのIDEが主流であり、両方とも今ではAI支援の自動補完やチャットをエディタに直接組み込んでいる。
トーバルズが2005年に作った、業界のほぼ全体が標準として採用したバージョン管理システム。これなしで出荷されるものはほとんどない。
Jira、Linear、GitHub Issuesは、バグや機能のバックログを、チームが週や四半期単位で計画できるものに変える。
変更のたびにコードをビルド、テスト、デプロイする自動化システムで、リリースを緊張を伴う手作業のイベントから日常的なものへと変える。
GitHub Copilotのようなツールは、今やエンジニアが受け入れるコード行の大きな割合を書いており、日々の仕事をタイピングよりもレビューと方向づけへとシフトさせている。
問題に合っているからではなく履歴書に映えるからという理由で流行の言語やフレームワーク、アーキテクチャを選ぶこと。次のチームが保守しなければならない複雑さを残していく。
プログラムが実際に報告している内容を読む代わりに、記憶にある修正パターンに当てはめてしまうこと。これが誤った原因を追いかけて何時間も無駄にすることにつながりうる。
動いているシステムを捨てて『きちんと』ゼロから作り直すことは、悪名高いほどリスクの高い動きである。1990年代後半のネットスケープによるブラウザの全面書き直しは、それが会社の市場での主導権を失わせたと広く引用される事例である。
分野だけでなく、6つのスコアが近い職業です。
データからパターンを見つけ予測モデルを構築する職業――2008年生まれの肩書きだが、その土台には数値を数え、検証し、可視化してきた3世紀分の営みがある。
AI耐性 38 📦本番環境で機械学習モデルを訓練・配備・監視・ガバナンスするためのシステムを構築する仕事。
AI耐性 54 🗺️会社が次に何を作るべきか、なぜそれを作るのかを決める仕事。顧客のニーズ、事業目標、エンジニアリングの制約を、誰か一人がすべてを所有するわけではない一つの共有計画へとまとめ上げる。
AI耐性 50 🔐デジタル攻撃を発見、防止し、対応することで、システム、データ、人々を保護します。
AI耐性 63 🌿組織が事業上の義務を果たしながら環境・社会への害を減らせるよう、戦略、測定、報告を主導する。
AI耐性 66 🧾帳簿の番人――文字そのものを生み出したほど古い技を受け継ぎ、いまはそれを自動化するために作られたソフトウェアと折り合いをつけている。
AI耐性 35機械知能を支えるアルゴリズムを設計・検証する仕事。今やその研究プロセス自体の自動化を競う分野になりつつある。
AI耐性 50 🛰️地上を離れる航空機・ロケット・宇宙船を設計・解析・認証する仕事で、推測の余地を残さない安全マージンを守り続ける。
AI耐性 74 🌉川と岩と重力を橋・道路・清潔な水に変える職業――イムホテプ以来、文明を静かに支え続ける仕事。
AI耐性 72 🔌自動車のブレーキから核ミサイルの誘導システムまで、あらゆるコンピュータや携帯電話の中にあるトランジスタを設計・製造する。地球上でごく一部の工場しか動かせないほど精密な機械を使う仕事だ。
AI耐性 60 🦾感知し、判断し、物理世界で行動する機械を設計する仕事。真の難問は知能ではなく、世界そのものだった。
AI耐性 65 🔐デジタル攻撃を発見、防止し、対応することで、システム、データ、人々を保護します。
AI耐性 63 📦本番環境で機械学習モデルを訓練・配備・監視・ガバナンスするためのシステムを構築する仕事。
AI耐性 54 🌬️再生可能な資源を信頼できる電力に変える、風力、太陽光、蓄電、送電網のシステムを設計・構築・改善する。
AI耐性 72