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

ソフトウェアエンジニアリングにおける「良いセンス」とは何か?

2025年9月29日原文(seangoedecke.com)

概要

  • 技術的センス技術的スキル は異なる概念
  • センスは 価値観の選択 に関わり、スキルは 能力 に関わる
  • ソフトウェア開発では 価値観の優先順位 がセンスを決定
  • 柔軟性の欠如 が悪いセンスの主因
  • 良いセンスは 状況に応じた価値観の選択 で判断

技術的センスと技術的スキルの違い

  • 技術的スキル :勉強や反復によって向上する能力
  • 技術的センス :どのようなコードや設計が「良い」と感じるかという 価値観
  • スキルが高くてもセンスが悪い、逆に スキルが低くてもセンスが良い 場合も存在
  • 料理で例えると、「味の違いが分かるが、まだ自分で作れない」状態がセンス先行
  • センスは 経験や観察価値観の選択 で育つ傾向

ソフトウェアにおけるセンスの指標

  • どんなコードが「美しい」と思うか
  • どんなコードや設計が「醜い」と感じるか
  • どの設計判断に強い満足感を覚えるか
  • どんな技術的問題に強い関心やストレスを感じるか
  • どの問題を簡単に受け流せるか

センスとスキルの違いの具体例

  • 例:mapやfilterの利用を好むエンジニアとforループを好むエンジニア
    • mapやfilterは 純粋関数 でバグが減る、直感的に「良い」と感じる
    • 一方、Golangのようにforループが性能的・拡張的に優れている場合も
    • 好み=価値観の違い であり、スキルの優劣ではない

技術的センスの本質

  • ソフトウェア設計は トレードオフ の連続
  • 全ての技術的判断にはメリットとデメリットがある
  • 未熟なエンジニア :自分の好みを「絶対正しい」と思い込む傾向
  • 成熟したエンジニア :両方の立場や価値観を理解し、状況ごとに最適な選択を意識
  • センスとは「技術Xが技術Yより常に優れている」ではなく、「この状況ではXのメリットがYを上回る」と判断できる柔軟性

エンジニアの価値観(センス)を構成する要素

  • Resiliency(耐障害性) :障害発生時の自動回復力

  • Speed(速度) :理論上の限界にどれだけ近いか

  • Readability(可読性) :新規参加者への説明容易性、短く分かりやすい関数名、ドキュメントの充実度

  • Correctness(正確性) :不正な状態の防止、テストや型・アサートの徹底、形式手法の活用

  • Flexibility(柔軟性) :拡張・修正の容易さ、影響範囲の小ささ

  • Portability(移植性) :特定環境への依存度、他環境への再展開の容易さ

  • Scalability(スケーラビリティ) :トラフィック増加時の対応力、自動スケールの可否

  • Development speed(開発速度) :拡張の速さ、専門知識の必要性

  • その他: エレガンス、最新技術、オープンソース活用、運用コスト など

    • 価値観の優先順位が 個々のセンス を決定
    • 例: 速度・正確性重視ならRust可搬性よりスケーラビリティ重視ならAWS特化 など

悪いセンスの特徴

  • プロジェクトに合わない価値観 を押し付ける傾向
  • 過去の成功体験から「自分の好きなやり方」を強く主張
  • 「ベストプラクティスだから」と 文脈を無視した判断 をする
  • 柔軟性の欠如 =悪いセンス
  • 特定領域では有効でも、 環境やプロジェクトが変わると機能しなくなる

良いセンスの特徴

  • 技術的能力 よりも 状況に合った価値観の選択 ができること
  • お題や模擬問題ではなく、 実際のプロジェクト で成果が出ているかで判断
  • 様々な種類のプロジェクトで 設計判断が成功しているか が指標
  • 柔軟性と観察力 を持ち、状況ごとに価値観の優先順位を調整できる

良いセンスの育て方

  • 多様なプロジェクト経験 を積む
  • 各プロジェクトで「どこが簡単で、どこが難しいか」に注目
  • 普遍的な正解や強い意見 を持ちすぎず、柔軟性を重視
  • 時には 経験より早くセンスを身につける人 も存在

まとめ

  • 技術的センス は、プロジェクトごとに最適な価値観を選び取る能力
  • 柔軟性と観察力 が良いセンスの鍵
  • 自己の価値観 を絶対視せず、状況に応じて変化させる姿勢が重要

Hackerたちの意見

このことの面白い結果の一つは、センスの悪いエンジニアは壊れたコンパスのようだということ。正しい場所にいると、壊れたコンパスでも北を指す。でも、動き出すとその壊れたコンパスが間違った方向に導いてしまう。だから、センスの悪いエンジニアでも、彼らの好みがプロジェクトのニーズと合致する特定のニッチではかなり効果的だったりする。この段落は、エンジニアリングの文脈で誰かのセンスを議論することが基本的に無意味だと思う理由をよく表している。この「予測可能に壊れたコンパス」の人は目立つから、20分の行動面接をすればフィルタリングできる。でも、もっと危険なのは「部分的に壊れたコンパス」で、一見するとちゃんと機能しているように見えるけど、実際には常に127度ずれている。

「部分的に壊れたコンパス」のエンジニアの例を挙げてもらえる?

良いセンスっていうのは、誰もが「そんなの誰でも書けるよ!」って言うような、シンプルに見えるコードを書くことだよね。

それが僕の基準でもある。複雑なものをシンプルなステップにまとめられる人にはいつも感心する。K&R Cの例のコードみたいにね。でも、お願いだから、もっと良いコメントを残してほしい。

プロジェクトに適したパフォーマンス要件とのバランスを取ることも大事だし、同じように健全なコミュニティがあって、続けていけそうな依存関係を選ぶことも大切だよね。ベンダーを選ぶときも同じで、「次の契約更新のときにぼったくられるか?」とか「もしぼったくられたらどんな選択肢があるか?」って質問が必要。

みんな「そんなの誰でも書ける!」って言うけど、問題の領域によるよね?ファスト逆二乗根[0]のコードを良いセンスだと思う? [0] https://en.wikipedia.org/wiki/Fast_inverse_square_root#Overv...

必須のシンプルさを簡単に。何かがシンプルだからって、誰でも理解できるわけじゃないからね。

そして悲しいことに、こういうコードの作者は、KISS原則に従って他の人の時間と労力を節約していることに対して、認識されないことが多い(たいていそうだよね)。理由は分からないけど、他の人には透明じゃないみたい。だから、テクノロジー業界には、無駄な複雑さを持つシステムを扱ったり維持したりするための仕事やチームが存在しているんだ。

でも、問題は人にその価値を理解してもらうことなんだよね。コードが退屈に見えるし、実際退屈だし。多くのジュニアだけど優秀でやる気のある開発者(自分も含めて)は、賢いコードを書きたいと思ってるけど、実際にはその必要がない環境にいることが多い。CRUDのバックエンドとフロントエンドにはこの問題があって、複雑さは(あるべきではない)コード自体ではなく、ドメインやアーキテクチャなどの高次の部分にあるんだよね。それに、退屈さからアーキテクチャを過剰に複雑にする人たちもいて、スケーリングのような見かけ上の問題やカゴ文化に基づいて、マイクロサービスやラムダを持ち込む代わりに、単純で実績のある解決策で目の前の問題を解決することをしないんだ。だから、「シンプルなCRUDアプリケーションのためのJava開発者を探しています」っていう求人では、優秀な開発者は見つからないよ。

その通り。エンジニアが特別なことをする能力があるのは時々便利だけど、最初は手強そうに見える問題に対して、シンプルで普通の解決策を一貫して見つける方がもっと良いよね。

それは良いセンスじゃなくて、良いエンジニアリングだね。

ソフトウェアは一目で理解しやすく、新しいエンジニアがオンボードしやすいか?これは思ったより難しい。そもそも「新しいエンジニア」って誰?ジュニア?10年の経験者?30年?どんな基準があるの?「可読性」って本当に幅広い概念で、ゼロから無限までの許容レベルがある。可読性は実際には非概念的なものだよ。マクスウェルの有名な方程式は、ある人には読みやすいけど、他の人には全く理解できない。だから「コードは可読性が必要」と言うとき、具体的に誰に向けて言ってるの?

Hacker Newsで議論の続きを見る