💻Craft & Know-How

ソフトウェアエンジニア · 現代生活を動かすコードを書き、テストし、保守する仕事であり、AIが自分自身の日々の作業を自動化していく様子を最初に目の当たりにしている職業の一つでもある。

8時間ずっとタイピングし続けているエンジニアというイメージはおおむね誤りだ。他人のコードを読むこと、原因不明の障害について考えること、技術的なトレードオフをエンジニアでない人に説明することは、新しいコードを書くのと同じくらい──最初の数年を過ぎた人にとってはそれ以上に──仕事の大きな部分を占める。

この職業内で受け継がれる技は、どの言語を学ぶべきかというより、思考の習慣にかかわる。当てずっぽうではなく体系的にバグを探す方法、動いているコードにいつ手を出さずにおくべきか、そしてコードを削除することがその週で最も価値ある仕事だったこともあるという感覚である。

What the work demands

889074807083
問題の分解
88
デバッグ
90
システム設計
74
コミュニケーションと協働
80
テストとコード品質
70
継続的な学習
83

問題の分解

曖昧で大きな依頼を、独立して構築・テスト可能な小さな断片に分割すること──大きな仕事で行き詰まるエンジニアと生産的なエンジニアを最も分けるスキル。

デバッグ

当てずっぽうで物をいじって偶然動くようにするのではなく、システムがどこで、なぜ誤動作しているかを体系的に絞り込むこと。

システム設計

初日に動くだけでなく、何年にもわたって安全に変更し続けられるよう、サービスやデータ、チームをどう分割すべきかを選ぶこと。

コミュニケーションと協働

技術的なトレードオフを非エンジニアに説明し、レビュアー向けに変更内容を明確に書き記し、スコープを交渉すること──プロのコードは書かれるよりもはるかに多く読まれ議論される。

テストとコード品質

ユーザーが気づく前に壊れた変更を検知するチェックを書き、次に触る人(多くの場合は数か月後の同じエンジニア自身)が安全に修正できる程度にコードベースを読みやすく保つこと。

継続的な学習

言語やフレームワーク、そして今やAIツールも数年ごとに入れ替わる。最初の仕事を終えた後に意図的な学習をやめてしまうエンジニアはすぐに頭打ちになる。

A day in the life

受信箱、スタンドアップ、トリアージ集中作業:コードを書く昼食レビュー、ペアプログラミング、会議デバッグ、デプロイ、締めくくり勤務時間外(おおむね) 036912151821 24h
  1. 7–9 受信箱、スタンドアップ、トリアージ

    夜間のアラートやメッセージに目を通し、その後チームが取り組んでいることと障害になっていることを話す短いスタンドアップ会議を行う。

  2. 9–12 集中作業:コードを書く

    一日の中で最も保護されたブロックで、理想的には通知を切り、持続的な集中を要する機能や修正の実装に費やす。

  3. 12–13 昼食

    本物の休憩。多くのエンジニアが、多忙な時期に最初に失われるのがこの時間であり、失って最初に後悔するものだと語る。

  4. 13–16 レビュー、ペアプログラミング、会議

    同僚のプルリクエストを読み、難しい問題をペアで解決し、午後に集中しがちな設計や計画の会議に出席する。

  5. 16–19 デバッグ、デプロイ、締めくくり

    その日の変更を仕上げて出荷し、安全に展開されるのを見守り、明日のため、あるいは夜間のオンコール担当者のためにメモを残す。

  6. 19–7 勤務時間外(おおむね)

    私的な時間と睡眠──ただしオンコールの週は別で、電話のアラートが午前3時を予定外の本番障害対応に変えることもある。

The know-how

Craft knowledge practitioners actually pass on — not motivation.

01

推測せず二分探索する

動いていたバージョンと壊れたバージョンの間のどこかでバグが現れた場合、差分を目で追うのではなく履歴を二分探索する──中間点を確認し、一つの変更だけが残るまで繰り返す。

標準的な二分探索デバッグ手法。Gitのbisectコマンドで自動化される
02

コードを読む前に失敗を読む

完全なエラーメッセージ、スタックトレース、周辺のログ行には通常すでに答えが含まれている。すぐにソースに飛びついて推測するのは、コンピューターが無料でくれた唯一の証拠を無駄にすることになる。

ブライアン・カーニハンとロブ・パイク著『プログラミング作法』(1999年)で繰り返し述べられている
03

変更を簡単にしてから、簡単な変更をする

機能の追加が難しい場合、それは通常、コードがその機能に合わない形になっているサインだ。まず挙動を変えずにリファクタリングし、その機能が小さく明白な差分になるようにしてから、その差分を実装する。

ケント・ベック
04

チェスタトンの柵

理解していないコードや設定値、チェックを削除または簡素化する前に、なぜそれが置かれたのかを調べる。まさにそのおかげで何年も起きていない障害を静かに防いでいるのかもしれない。

G・K・チェスタトン『The Thing』(1929年)、エンジニアリングの民間伝承として採用された
05

コードを削除することは前進である

もはや存在しないコードにはバグがなく、次に読む人を混乱させず、更新の必要もない。使われなくなった経路や機能を削除することは、機能を出荷することと同じように称賛されるべきだ。

ジェフ・アトウッド、Coding Horror、2007年(「最良のコードはコードが無いことだ」)に呼応
06

ラバーダック・デバッグ

助けを求める前に、同僚や無生物にさえ、問題を一行ずつ声に出して説明する。それを正確に言語化する行為そのものが、誰かが答える前にバグを明らかにすることが多い。

アンドリュー・ハントとデビッド・トーマス著『達人プログラマー』(1999年)

Tools of the trade

コードエディタ/IDE

Visual Studio CodeとJetBrainsのIDEが主流であり、両方とも今ではAI支援の自動補完やチャットをエディタに直接組み込んでいる。

Git

トーバルズが2005年に作った、業界のほぼ全体が標準として採用したバージョン管理システム。これなしで出荷されるものはほとんどない。

課題管理ツール

Jira、Linear、GitHub Issuesは、バグや機能のバックログを、チームが週や四半期単位で計画できるものに変える。

CI/CDパイプライン

変更のたびにコードをビルド、テスト、デプロイする自動化システムで、リリースを緊張を伴う手作業のイベントから日常的なものへと変える。

AIコーディングアシスタント

GitHub Copilotのようなツールは、今やエンジニアが受け入れるコード行の大きな割合を書いており、日々の仕事をタイピングよりもレビューと方向づけへとシフトさせている。

How people fail at it

履歴書駆動開発

問題に合っているからではなく履歴書に映えるからという理由で流行の言語やフレームワーク、アーキテクチャを選ぶこと。次のチームが保守しなければならない複雑さを残していく。

エラーメッセージを読まない

プログラムが実際に報告している内容を読む代わりに、記憶にある修正パターンに当てはめてしまうこと。これが誤った原因を追いかけて何時間も無駄にすることにつながりうる。

ビッグバン書き直し

動いているシステムを捨てて『きちんと』ゼロから作り直すことは、悪名高いほどリスクの高い動きである。1990年代後半のネットスケープによるブラウザの全面書き直しは、それが会社の市場での主導権を失わせたと広く引用される事例である。

Keep exploring

More in Engineering & Technology