56 ポイント 投稿者 GN⁺ 2026-03-05 | 10件のコメント | WhatsAppで共有
  • ソフトウェアエンジニアリング文化では、複雑なシステムを作る人のほうが高く評価され、単純な解決策を選んだ人は評価されにくい構造が続いている
  • 昇進評価や面接、設計レビューなどで、複雑さが「インパクト」と誤認され、不必要な抽象化や拡張性を追加する傾向が強まる
  • 単純な実装は「見えない成果」として残る一方、複雑な構造は華やかな説明や文書化で昇進資料を埋めやすい
  • 本当の熟練とは、より多くのツールを使うことではなく、いつ複雑さを排除すべきかを知る判断力と自信にある
  • エンジニアとリーダーの双方が単純さを可視化し、それを正式に認める評価・報酬の仕組みを作る必要がある

単純さ vs 複雑さ: 昇進ストーリーの非対称性

  • 同じチームの2人のエンジニアの例: Engineer Aは50行の簡潔なコードで数日で機能をリリースし、Engineer Bは新しい抽象化レイヤー、pub/subシステム、設定フレームワークを導入して3週間かけて完成
  • Engineer Bの仕事は昇進パケットに「スケーラブルなイベント駆動アーキテクチャの設計、再利用可能な抽象化レイヤーの導入、設定フレームワークの構築」と記述できる
  • Engineer Aの仕事は「機能Xの実装」という3語でしか表現されない
    • 実際にはより良い仕事だったが、単純に見えるように作ったため、不可視の貢献になってしまう
  • 「避けた複雑さ」で昇進する人はいない — 複雑さが賢そうに見えるのは、評価制度がそれに報いるように作られているからだ

面接とデザインレビューで複雑さが強化される構造

  • システムデザイン面接で単純な解決策(単一データベース、直感的なAPI、キャッシュレイヤー)を提案すると、面接官が「ユーザーが1000万人来たら?」と圧力をかける
    • サービス、キュー、シャーディングを追加するほど面接官が満足する、という経験につながる
    • 候補者が学ぶ教訓: 「単純な答えでは十分ではなかった」
  • 面接官が圧力をかけることには合理的な理由(プレッシャー下での思考力、分散システムの理解度の確認)があるかもしれないが、候補者に伝わるメッセージは「複雑さは印象的だ」ということ
  • デザインレビューでも「将来に備える(future-proof) べきでは?」という問いによって、不必要なレイヤーや抽象化を追加してしまうパターンが繰り返される
    • 問題が要求しているからではなく、会議室がそれを期待しているから追加している
  • 数行のコード重複を避けるために作った抽象化が、かえって理解と保守を難しくする例を何度も経験してきた
    • コードはより「プロフェッショナル」に見えたが、ユーザーが機能をより早く受け取れたわけではなく、次のエンジニアは変更前に半日を抽象化の理解に費やした

適正な複雑さ vs 不必要な複雑さ(Unearned Complexity)

  • 複雑さそのものが問題なのではない — 数百万件のトランザクション処理には分散システムが必要で、10チームが同じ製品を作るならサービス境界が必要になる
  • 問題は不必要な複雑さだ: 「データベースの限界に達したのでシャーディングが必要」と「3年後に限界に達するかもしれないので今シャーディングしよう」の違い
  • これを理解しているエンジニアのコードやアーキテクチャは、「当然そうだよね」と感じられ、魔法のようでも過度に賢くもなく、理解できないせいで自分が愚かに感じることもない
  • シニアになる本当の道は、より多くのツールやパターンを学ぶことではなく、いつ使わないかを知ることにある — 複雑さを追加するのは誰にでもできるが、取り除くには経験と自信が必要だ

エンジニアのための実践策

  • 単純さを可視化しなければならない — 仕事はそれ自体では語ってくれず、評価制度もそれを聞き取れるようには設計されていないからだ
  • 「機能Xを実装」ではなく、「イベント駆動アーキテクチャやカスタム抽象化レイヤーを含む3つのアプローチを評価したうえで、単純な実装が現在と予想される要件の両方を満たすと判断し、2日でリリースして6か月間無停止で運用した」 と記述する
    • 何かを作らないと決めた判断もまた判断であり、重要な判断だ — それに見合った文書化が必要
  • デザインレビューで「将来に備えるべきでは?」と聞かれても単に屈するのではなく、「後から追加するならこれだけかかり、今追加するとこれだけのコストが発生するので、待つほうがよい」と示す
    • 反論ではなく、検討を終えていることを示すためだ
  • マネージャーに「作業の文書化の仕方を、コードだけでなく自分が下した判断も反映するものにしたい」と直接伝える — マネージャーにとっても擁護に使える言葉が提供されることになる
  • これだけ努力しても、最も精巧なシステムを作った人だけを昇進させるチームなら、それも有用な情報だ — ある組織は単純さを本気で価値あるものと考え、別の組織はそう言いながら反対のものに報いる

エンジニアリングリーダーのための実践策

  • インセンティブを設定するのはリーダーの責任だ — ほとんどの昇進基準は複雑さに報いるよう設計されており、「インパクト」は構築したものの規模と範囲で測られる傾向がある
    • 構築したものだけでなく、回避したものも評価に反映すべきだ
  • デザインレビューで「スケーラビリティは考慮したか?」の代わりに、「リリース可能な最も単純なバージョンは何で、より複雑なものが必要だと示す具体的なシグナルは何か?」 と問いを変える
    • この1つの問いがゲームを変える: 単純さをデフォルトにし、複雑さに立証責任を負わせる
  • 昇進の議論で、印象的なシステムの一覧で構成されたパケットに対して「それは本当に全部必要だったのか? pub/subシステムは本当に必要だったのか、それとも書類映えしただけなのか?」と問い返す必要がある
  • チームメンバーがきれいで単純なものをリリースしたら、そのストーリー作りを手助けすべきだ — 「複数のアプローチを評価し、問題を解決する最も単純なものを選んだ」という内容が説得力のある昇進事例になるには、リーダーが実際にそう扱わなければならない
  • チームのチャネルで公に称賛する対象に注意する — 大きく複雑なプロジェクトだけを褒めると、人はそこに最適化する
    • コードを削除したエンジニア、「まだ必要ない」と言って正しかったエンジニアを認めるべきだ

10件のコメント

 
goathead 2026-03-05

レジュメ主導の設計...

 
roxie 2026-03-30

この記事に出てくる提案が無意味だとは思いませんが、「巨大な設計」に勝つにはあまりにも力不足だと思います。あちらは説明するのがあまりにも簡単すぎるので :(

 
GN⁺ 2026-03-05
Hacker Newsのコメント
  • 面接の質問で、2人がメールでスプレッドシートをやり取りしている状況を提示されたことがあった
    私はGoogle Sheetsに移行すると答えたが、面接官は私にツールそのものを設計してほしかったようだ
    当時は気まずかったが、今でもそこからどんな教訓を得るべきなのかはよく分からない

    • こういう状況は面接官トレーニングの失敗だと思う
      良い答えとして認めたうえで、その次に「これは技術設計を評価するための仮想シナリオなので、新しいシステムを設計してみましょう」と誘導するべきだった
      応募者がその前提を受け入れられないなら、それはまた別のシグナルとして評価すればよい
      私なら「既存の解決策がない前提で新しく設計しましょうか?」と聞くだろう
      これは面接官が自分の望む答えだけを聞きたがるシステム設計版のアルゴリズム論争のようなものだ
    • 私の共同創業者がStripeの買収協議中にシステム設計面接を受けたとき、要件を聞いて「そのままPostgresに入れます」と答えた
      実際それが正しい判断だったが、Patrick Collison本人から電話があり、「面接は通らなかったが、意図は分かるか」と聞かれた
      結局その後もう一度面接を受けて合格した
      面接の目的を理解することの重要性を示す逸話だった
    • 友人とこのテーマについて議論したことがある
      ある大手フェリー会社がGoogle Sheetsで船の位置や従業員の配置を管理していて、友人は「これは大企業のやることではない」と言っていた
      しかし私は、すでに検証済みのツールで問題を解決したのは素晴らしいと思った
      そのおかげで社内開発チームや高額な外注なしで運用できる
      私にとってはうぬぼれを深く葬ることになった経験だった
    • こういう面接質問なら、まず「なぜこれが問題なのですか?」と聞き返すのがよいと思う
      相手に何が具体的に合っていないのか説明してもらってから、そこで初めて技術設計を始めるべきだ
    • 正しい答えは「なぜGoogle Sheetsを使わず、メールでやり取りしているのですか?」と聞くことだ
      Sheetsを使えない理由はいろいろある — 機能制約、中国国内でのアクセス制限、会社のポリシー、ネットワークの問題など
      顧客がすでにそうした理由でカスタムソリューションを求めているかもしれない
      つまり、単に「Google Sheetsを使ってください」ではなく、顧客の文脈を理解することが開発者の役割だ
  • AIコーディングツールが問題をさらに微妙なかたちで悪化させている
    今では複雑なアーキテクチャを5分で生成できるが、保守コストはそのままだ
    その結果、より派手な構造がすぐ作られ、昇進用の文書もあっという間に完成する
    しかし実際には、誰もそのコードを完全には理解していない
    本当のシンプルさの基準は「次の人が質問なしに理解できるか」だが、AI生成コードはその試験を完全には通過できていない

    • 実際、LLM以前から午前3時に呼び出されたオンコール担当者がシステムをよく分かっていないことは多かった
      今はそれがさらに悪化するだけだ
      だから私は組織のコード理解文化がどれだけ強いかをキャリア選択の基準にしている
      誰もシステムを分かっていない状況は二度と経験したくない
    • こうした理由から、今後はソフトウェア製品そのものの価値が下がっていく気がする
      問題解決が目的なら、AIで作ったツールでも購入したツールでも、結局は問題を解決しなければならない
      しかし既製品が合わないなら、最終的には自分で生成したカスタムソリューションが増えていくだろう
      ただしそれを誰も理解できなければ、次の人がまた最初から作り直すことになる
      それでも、利用者と作り手の距離が近づくという点では改善かもしれない
    • AIツールを使うときは保守性の原則を文書化することが重要だ
      たとえばAGENTS.mdに「KISS」「YAGNI」のような指針を明記しておくと役に立つ
    • 私もAIでコーディングしながらシンプルさを保とうと努力している
      問題は、「次の人」が結局6か月後の自分自身だということだ
      AIもcontext windowの限界で同じ問題を抱える
    • AIが生み出したコードの運用コストも無視できない
      多くの開発者は人気スタックばかり追い、運用のしやすさを考えない
      AIも「これは過剰設計だ」とは言ってくれない
      KubernetesやElasticSearchが欲しければ、そのまま作ってくれるだけだ
  • FAANGとスタートアップの両方を経験した立場から言うと、複雑さとシンプルさのバランスが核心だ
    大企業では場当たり的なハックが何千人もの生産性を損なう可能性があり、
    スタートアップでは過剰なインフラが会社を潰しかねない
    本当に熟練したエンジニアとは、その2つの状況を見分け、経験に基づいて適切なトレードオフを選べる人だ

    • チーム規模が5人のときと500人のときでは、不具合の発生率はまったく違う
    • 自己管理型のプロジェクトマネジメント能力は本当に身につけるのが難しい技術だ
  • Amazon(2005〜2008)で働いていた頃、会社文化の象徴だった2つの賞があった
    「Just Do It」賞は自発的な問題解決、「Door Desk」賞は節約とシンプルさを象徴していた
    実際に、役に立たないテレビを片付けた社員が賞をもらい、報酬としてそのテレビを渡されたという逸話がある

    • ただ、そのドアデスクは実際にはIkeaより高く、組み立ても難しかった
      比喩としてのシンプルさは、現実では少し曖昧だった
    • 今でも「Just Do It」賞は引き続き授与されている
  • シンプルさを主張するなら、ビジネスの言葉で表現しなければならない
    「インシデント80%削減」「コスト40%削減」「性能33%向上」のように
    シンプルさ自体は評価されなくても、その結果は高く評価される

    • しかし「複雑なものを作らなかったおかげ」の効果は測定しにくい
    • 最初から高速なシステムを設計しても、遅いものを作ってから80%改善した人より評価されにくい
    • シンプルさはP&Lに現れないため昇進につながりにくい
      私はリファクタリングをコストモデルに変換してKPIを計測し、MTTRを60%削減した
      こうした数値を自分で示して初めて認められる
    • たいていの経営陣は「より速く」を選び、「よりシンプルに」を選ぶことはほとんどない
  • マネージャーとして私はシンプルなコードを好んでいた
    ただしそれは、チームが熟練したメンバーで構成されていたからだ
    経験の浅いチームでは、The Parable of The Toaster のようなことが起きる

  • 年を重ねるほど複雑性に抵抗するようになる
    しかしリーダーシップはしばしば、それを「理解できないから反対している」と誤解する
    もっとも長く生き残ったプロジェクトは、シンプルで置き換えやすいものだった
    AIツールはこうしたアプローチをさらに簡単にしてくれる — 独立したサンプルプロジェクトでコンポーネントを試し、検証済みコードを本番プロジェクトに統合するのだ
    社内ネットワーク環境なのでAIを直接つなげてはいないが、このやり方は非常に有用だ

    • リーダーシップはしばしばシンプルなアプローチを怠慢だと誤解する
      だから私は「複雑なものも作れますが、まずは簡単なバージョンから始めましょう」と提案する
      たいていはそのシンプルなバージョンが、結局何年も動き続ける本番コードになる
    • こうした教訓は結局、自分で苦労してみて初めて学べる
  • シンプルな解決策を素早く出した開発者は、残った時間でさらに多くの機能を実装できる
    一方で複雑な解決策にこだわる人は、1つの機能に何週間も費やす
    結局、生産性指標ではシンプルなアプローチのほうが魅力的に見える
    私自身も「大きなアイデア」より、着実に結果を出す人としてキャリアを築いてきた

    • ただし、あまりにシンプルすぎると「小さな機能しかやっていない人」に見える危険もある
    • またある人は「男性中心的な表現」を問題視していたが、核心は結果重視の文化だった
  • うちの会社の面接の1つに、公共図書館システム設計の問題がある
    最初は小さな町の図書館規模から始め、全国規模に拡張していくシナリオだ
    最良の回答は「最大規模でもミドルクラスのサーバーとPostgresで十分だ」だった

    • しかし面接官によっては「毎秒10,000リクエスト」のような非現実的なスケールを求める
      現実には10でも10,000でも大差ないのに、経験のない面接官がプロンプトを読んでいるだけのことが多い
    • 「すべての会社がSpotify級のシステムを設計するわけではない」ことを忘れてはいけない
    • 初期のWebはサーバールームの片隅の機材でも数百リクエストを処理していた
      その後、過剰なインフラと履歴書主導の開発が問題を大きくした
  • AIは結局、利用者の力量を増幅するツールだと思う
    熟練した開発者には生産性を高めてくれるが、未熟な人には混乱を素早く拡散する道具になる

    • 私はシンプルさを好むエンジニアだが、AIがコードをよりシンプルにしてくれたことはない
      むしろ不要なラッパー関数や型変換を追加する傾向がある
      AIは「コードをもっと足す側」に近いと感じる
    • しかし経験が浅くても、批判的に学ぼうとする姿勢でAIを使えば、PR前に自分でコードを改善する助けになることはある
    • 私もChatGPT Codexで着手しづらかった作業を始められた経験がある
      ただし、深みのない「vibe coding」が増えるのは不安だ
 
yangeok 2026-03-11

私が会った面接官たちも複雑さを好んでいました。

 
botplaysdice 2026-03-06

シンプルさが高く評価されることまでは期待していませんよ。現実には、複雑にして問題を起こし、その後始末をしたことで昇進することさえあるんですから。

 
beoks 2026-03-05

サービスのための設計ではなく、能力を誇張するための過剰設計がはびこっていますね

 
shakespeares 2026-03-05

評価者の理解度が高いことが重要だと思います。
説明も十分に聞く必要があるのもその通りです。

 
botplaysdice 2026-03-06

それを評価できる人が上にいるならすべてうまくいくのですが、そもそもそれができていないから、こういうことが正当に評価されず、だからそういう人たちは上に上がれず……

これが悪循環なんですよね……

会社の立場からすると、バランスの取れたエンジニアとして成功して上に上がってこそ、良いエンジニア/エンジニアリングのprincipleも守れるのだと思います。

 
aa1567 2026-03-05

現実の大半は、単純に機能実装だけができる人と、拡張性を意識して設計できてトレードオフもうまく判断できる人、という違いではないでしょうか

 
devsepnine 2026-03-05

複雑に作業したとしても、結局は機能Xの実装と言えるわけで、
それを評価者にどのように表現するかの違いですね