世界を動かす技術を、日本語で。

シンプルさでは昇進できない

概要

  • シンプルさ は高い価値を持つが、評価されにくい現実
  • 複雑さ がエンジニアの評価や昇進で優遇される傾向
  • シンプルな解決策が 目立たず埋もれてしまう 問題
  • インセンティブ構造 の見直しが必要
  • シンプルさを 可視化し、正当に評価する 方法の提案

シンプルさと複雑さの評価の歪み

  • Edsger Dijkstra の「シンプルさは美徳だが、評価されにくい」という指摘
  • エンジニアリング現場で 複雑な設計や実装 が評価されやすい構造
  • シンプルな実装は 印象に残りにくく、昇進や評価で不利 になりがち
  • 複雑なシステムを作るエンジニアは 「スケーラブルな設計」などの実績 として評価されやすい
  • シンプルに解決した場合、 「feature Xを実装」だけで終わり、評価材料が少ない
  • 複雑さが賢く見える という誤った印象が蔓延

面接・設計レビューにおける複雑さの偏重

  • システム設計面接で シンプルな解決策 を出しても「スケーラビリティは?」などの質問で 複雑な案を求められる
  • 面接官や設計レビューで 「将来の拡張性」「将来的な問題」 を理由に 不要な抽象化やレイヤー追加 を要求されがち
  • 結果として 現実には不要な複雑さ が増え、保守性や開発速度が落ちる

複雑さが必要な場合とそうでない場合

  • 本当に複雑な問題 (大規模トランザクション処理や多数チーム開発)には複雑な解決策が必要
  • 問題がシンプルな場合、 複雑さは「未然の心配」や「見た目のプロフェッショナリズム」 でしかない
  • 「やらない決断」 も重要な技術的判断

シンプルさを評価するための具体策

  • 自分の仕事を言語化 する工夫
    • 「feature Xを実装」ではなく、「複数案を検討し、要件を満たす最もシンプルな実装を選択」
    • 判断プロセスや選択理由 を記録・説明
  • 設計レビューでの対応
    • 「将来的な拡張」要求には「必要になった時の追加コスト」と「現時点での複雑化コスト」を比較
    • 「今は待つべき理由」 を説明
  • マネージャーへの相談
    • 「自分の判断や選択を正当に評価できるようなドキュメント化をしたい」と相談
    • マネージャーに評価材料を提供

組織文化とインセンティブの転換

  • 複雑なシステムを作った人ばかりが昇進する組織 は、シンプルさを評価しない文化
  • シンプルさを評価する組織 かどうかを見極めるポイント
  • エンジニアリングリーダー の役割
    • 昇進や評価の基準を見直し、 「何を作らなかったか」も評価
    • 設計レビューでは「最もシンプルな案は何か?」を問う
    • シンプルな実装や不要なコード削除 を積極的に称賛

結論:シンプルさを報酬とする文化へ

  • 複雑さばかりを評価し続ければ、複雑なものしか生まれない
  • シンプルさを可視化し、正当に評価するインセンティブ設計 が重要
  • 問題の本質は「複雑さ」ではなく、「 不必要な複雑さ」の温存
  • シンプルな解決策を誇れる組織文化 の醸成が最終的なゴール

Hackerたちの意見

私の経験では、これがよくあることだとは思わないな。複雑な解決策を提案するのは、経験の浅い若手エンジニアが多いし、逆に経験豊富なエンジニアはシンプルさを重視することが多いんだ。彼らは複雑さに苦しんできたからこそ、シンプルさの価値を理解しているし、問題を明確にして、最もシンプルな解決策にたどり着くための経験もある。こういう意見を言うのは簡単だけど、表面的には良さそうに聞こえるだけで、実際には検証に耐えない気がする。これが本当にトレンドなのか、証拠や研究を見てみたいな。

私はあまり多くの会社で働いたわけじゃないから、ちゃんとした意見は持ってないけど、確かに賢い人たちが無茶な複雑さに従っていたところにはいたことがある。その理由の一つは、すでにものすごく複雑な状態になっていて、シンプルな解決策が政治的に実現可能ではなかったからだと思う。

ある大銀行のエンジニアリングチームが、クライアントからの単一のAPIコールが1,100のマイクロサービスと相互作用する4,000以上のマイクロサービスを持っているというブログ記事を以前に書いていた。素晴らしいアーキテクチャに聞こえるよね?/s これを4年以上も「シニアスタッフ」の役職で簡素化する責任を持ちたいと思う?これは複雑さを持つ多くの例の一つで、祝福されている。マイクロサービスの流行(Netflixから始まり、Thoughtworksによって過剰に宣伝された)は、この狂気を引き起こし、ある人たちにとっては維持するための技術的負債の山になってしまった。もし、自社の複雑なインフラコストから救うための非常に良い理由がない限り、このアーキテクチャを簡素化しようとすると、他のシニアスタッフエンジニアのチームから激しい反発に遭い、リスク担当者との何百もの会議や、建築家との永遠の会議でブロックされることになるよ。

私はAmazonの小売プラットフォームで、9桁の収益を生む技術的な機能を立ち上げたことがある。立ち上げた時はインフラが全くなかったんだ。各コアプラットフォーム(詳細ページ、カート、チェックアウトなど)に小さな変更を加えただけ。最初は「まあ、大したことしてないね」って言われたけど、価値を見たら状況が一変した。人を引き込むためにはちょっとしたマーケティングが必要なんだよね。残念ながら、しばしば見える影響は複雑さと相関している。

偶然似たような話だけど、違う結末があった。私はAstro(Amazonのホームロボット)の最終組立ラインからテストステーションを排除したんだ。テストステーションがキャッチできるユニークな故障モードがなかったから(アイデアを集めて、提案された故障モードを分析した結果、他のステーションで全て検出できることがわかった)。これで約100万ドルの節約が見込まれ、ワークフローもシンプルになり、最終テストにかかる時間も減った。昇進を推進するためにマネージャーにこのことを話したら、「その価値を作ったのは他の誰かだよ、君はそれを無駄にしないようにしただけ」と言われた、笑。もっと強く押すべきだったかもしれないけど、確かに評価されてないと感じたし、もっと認識されるべきだったのか今でもわからない。でも、私のことを気の毒に思わないで、給料は十分良かったし、今は自分のやりたいことを楽しんでるよ :)

そんな大きなシステムの一つの変更の集まりで、どうやって収益の数字を割り当てるの?おそらく、同じ時期に他にもたくさんの機能がリリースされていたんじゃないの?その周りでA/Bテストはたくさん行われていたの?

いい記事だね。私が思う反論としては、有名なビル・アトキンソンの-2000行のコードの話がある。建築家として、ミニマリストなプロジェクトに特別な愛着を持っていた。建物は複雑な問題空間なんだ。不要な複雑さを完全に排除することは通常できない。だから、目標(完成形)からインフラ(建物の構造)に遡って、最終製品をほとんど何もないように見せる方法を考えなきゃならない(ミースの「beinahe nichts」)。この記事が言うように「複雑さは印象的だ」が、目の肥えた人はシンプルさの方がさらに印象的だと理解している。これで、フレッド・ブルックスの「ノー・シルバー・ブレット」と、必須の複雑さと偶発的な複雑さの考え方に思いを馳せる。もう少しニュアンスを加えて考えると、「偶発的」ではなく、少なくとも「偶然的」だと思う。

これは単なる事実じゃないよ。人は影響を与えたことで昇進するんだから、解決策が複雑でもシンプルでも関係ない。私が知っている最高のエンジニアは、大きな会社で巨大な複雑なシステムを扱える人で、通常は複雑な解決策から始めて、達成したいことを理解した後に、既存の複雑なシステムの中で最小限のコード変更で再実装するんだ。

こんな感じのことを言おうと思ってた。シンプルに物事を保つのが得意なら、インパクトを出すのに役立って、それが昇進につながるよ。

どんなルールにも例外や天才がいるけど、一般的にはシンプルな解決策をもとに昇進を主張するのは難しい。大きな影響を与えたとしても、トップ評価や少し大きめのボーナスはもらえるかもしれないけど、昇進は難しい。大企業には昇進のための基準があって、結局は「複雑」って言葉に集約される。「1年間のイニシアチブを推進する」とか「複数のチーム」とか「複数のコンポーネントを持つ大きな複雑なタスク」なんてのがその例だ。

これには共感するなぁ。「シンプルさ」って、欠けてるときにしか気づかないもので、ほとんどの組織は「起こらなかったこと」に対して報酬を与える良い方法がないんだよね。このダイナミクスは何度も見てきた。ある人がつまらない実装を出して、何も壊れず、みんなそのまま進む。一方で、別の人が「プラットフォーム」バージョンを出すと、ドキュメントや図、社内のプレゼンがあって… そしたら新入社員に説明しなきゃいけないサブシステムができちゃう。どっちが「インパクト」として見えるかは明らかだよね。あまり話題にならないと思うのは、複雑さには持ち運びコストがあって、それがビルダーに請求されることはほとんどないってこと。チームが後でそのコストを払うことになる:表面積が増え、失敗の可能性が増え、変更する前に読む時間が増える。そういう意味では、得られない複雑さはレバレッジを持つことに似てる。時にはそれが正しい選択だけど、ただの熱意じゃなくてビジネスケースが必要だよね。私が好きなチームで役立ったのは、「シンプルさ」を意思決定の記録として明確にすること。PRやADRで、取らなかった「クールな」選択肢を明示的にリストアップして、その理由を書いて、後でアップグレードするためのトリガー条件も書くんだ(「p95がY日間Xを超えたら」とか、「2番目のプロデューサーを追加したら」とか)。これで「実装された機能X」が「意図的なトレードオフを行い、リスクを減らし、明確な逃げ道を定義した」ってなる。そうすると、「未来を見越した」みたいな雰囲気じゃなくて、具体的に議論することが強制されるんだよね。それと、面接のポイントにも賛成。多くのシステムデザインの面接は、面接官がうなずくまでボックスを増やすことが目標だと無意識に教えてる。もっと上級者の動きは、まずシンプルに始めて、計測して、閾値を設定してから機械を追加することなんだけど、45分でそれを「演じる」のは、カフカやシャーディングを並べるより難しいよね。組織がインセンティブを修正したいなら、レビューで聞くべき質問は「あなたが作ったものの大きさは?」じゃなくて、「次の四半期にシステムを変更しやすくしたか?」だと思う。それが積み重なるインパクトで、シンプルさと通常相関してるんだ。

このコメントには、私の耳にはLLMっぽい表現がいくつかあるな。特に「それが積み重なるインパクトだ」って部分。

Hacker Newsで議論の続きを見る