年収に見合うエンジニアの秘密: 「わからないこと(Ambiguity)」を「できること」に変える技術
(terriblesoftware.org)要点:
- シニアとミドルレベルのエンジニアを分ける決定的な違いは、不確実で曖昧な問題を具体化する能力にある。
- シニアの価値はコーディング技術そのものではなく、プロジェクトのリスクを取り除き、実行可能な計画へと変換する点にある。
- 現在の採用慣行(アルゴリズムテストなど)は、こうした能力を評価できていない。
- 本当の成長は、コーディング前の段階で問題を明確に定義する練習から始まる。
序論: シニアエンジニアの定義を考え直す
- 一般にシニアエンジニアは、アーキテクチャ設計、コミュニケーション、リーダーシップなど、さまざまなスキルの一覧で定義される。
- しかし、肩書き、年収、経験年数を除いて考えると、シニア以上のエンジニアを分ける唯一の中核スキルは 「曖昧さを減らす能力」 である。
- 他のあらゆる能力(技術的な実行など)は、この中核スキルを土台として派生する結果にすぎない。
本文
1. 問題解決の進め方の違い: 明確さ vs 曖昧さ
- ミドルレベル(Mid-level)エンジニア: 明確な仕様(Spec)と制約条件が与えられたときに優れた成果を出す。よく定義された問題を解くのが得意である。
- シニアエンジニア: 「パフォーマンス改善が必要」「ユーザーの不満が増えている」「スケーラビリティを考慮」といった、不明瞭で抽象的な要求を受けたときに違いが現れる。
- シニアは曖昧な問題を単にこなすのではなく、それを分析し、分解し、具体的なタスクへと変換する。
2. シニアの中核的な役割は、プロジェクトのリスクを取り除くこと
-
シニアエンジニアは、大きく抽象的な問題を前にして、次のようなアプローチで不確実性を解消する:
-
他の人がしない本質的な問いを立てる。
-
重要なシグナルとノイズ(Noise)を切り分ける。
-
今すぐ実行することと後回しにすることの優先順位を決める。
-
この過程はプロジェクトのリスクを下げ(De-risking)、「何なのかまだわからない状態」を「実行可能な小さなプロジェクトと取り除くべき要素」へと整理する。
-
シニアがこれをうまく行うと、プロジェクトは滑らかに進み、見た目には簡単そうに見える。しかし実際には、その前段で膨大な「見えない仕事」が行われている結果である。
3. 曖昧さを解消するための具体的なアプローチ
- シニアエンジニアは、コーディングに先立って問題を明確にするために、次のような問いを投げかける:
- 問題の本質: 私たちが望んでいる解決策ではなく、実際に解決しようとしている根本問題は何か。
- ユーザーの定義: 具体的に誰のどんな痛みを解決しようとしているのか。 (「ユーザー」という包括的な言葉は避ける)
- 仮説の検証: 現在の計画に潜んでいる誤った前提は何か。
- リスク評価: 私たちの判断が間違っていた場合に起こりうる最悪の事態は何か。
4. 採用システムの限界と、誤ったシニア選抜
- ほとんどの企業は、技術スタックの一覧やアルゴリズム問題の解答力(LeetCode)に集中して採用を進めている。
- こうした方式では、曖昧なプロダクト要件を実行可能な計画へ変換する能力を検証できない。
- その結果、コーディング力は高いのに、不完全な仕様を前にすると何もできない「見かけだけのシニア」エンジニアが量産される。
結論: 成長のための提言
- アーキテクチャやコミュニケーション能力も重要だが、それらが価値を発揮するのは 「何を作るか」 が明確になってからである。
- 曖昧さを減らせないままの技術的優秀さは、「間違った問題を優雅に解いている」にすぎない。
- 自分がシニアレベルかどうかを判断する基準は、抽象的な課題を受け取ったとき、他人が明確化してくれるのを待つのか、それとも自分でチームが実行できる形に具体化するのかにかかっている。
- これは生まれつきの才能ではなく練習の領域なので、曖昧なチケット(業務)を受け取ったときは、すぐにコーディングするのではなく、問題を具体化する訓練を始めるべきである。
5件のコメント
シニア開発者を「アルゴリズムのコーディングテスト」で見極めようとするプロセスは、私も……採用システムの限界だと思います。何か問題の本質に近づいた人、近づける人こそが、年俸に見合うシニア開発者なのだと思います。
視点によって解釈がさまざまだということをこの記事で学びました。私の基準では、シニアと中堅エンジニアを分ける基準は単にスコープだと思います。
Ambiguityを具体化するのはエンジニアの基本的な素養であり、中堅エンジニアからはこれができてこそエンジニアというタイトルがふさわしいように思います。ですから私にとっては、この記事は中堅エンジニアと初級(associate)エンジニアを分ける基準になり得ます。
問題を明確に定義できていない状態での
技術的な卓越性は、「間違った問題を優雅に解決すること」にすぎない。
本当にゾッとする一文
シニア開発者のテストで、プログラミングテストまではまだあり得るとしても、
アルゴリズム問題を出されたらあまりにも呆れてしまいます(動揺しすぎて記憶にも残っていません)
1. 質問の技術と社会関係資本(Social Capital)
2. 自律性とリスク管理(Autonomy & Risk)
3. 肩書きのインフレと採用の構造的矛盾
4. 単純な勤続年数(Tenure)と意図的鍛錬
If)を処理することに集中するが、シニアは条件が変わった場合(What-if)を想定して備える。5. シニアという肩書きへの懐疑的な見方