§ 01–71 · エンジニアリングの法典

HAMMURABI

スーサ · 玄武岩か閃緑岩か · 2.25 m · 紀元前1754年頃 · 282条

ハンムラビ法典の条文はすべて条件文である——šumma awīlum、「人が…したならば」。この法典も同じだ。もしその力が働くならば、こうせよ。ただし対抗力が効く場合を除く。

「…この地に正義を行き渡らせ、強き者が弱き者を虐げぬように。」

— ハンムラビ法典、紀元前1754年頃

ハンムラビは正義を発明したのではない。それを書き留め、番号を振り、誰もが同じ法を読める石に刻んだ。この法典は同じことをエンジニアリングに対して行う——システム・チーム・意思決定を支配する反復する力を、午前3時に再発見されるのではなく、引用し、議論し、改訂できるよう、条文として刻む。

71/71
01
02
03
04

意思決定の可逆性

意思決定

もし

脳は生存本能的に「すべての失敗」を脅威と見なし、すぐに戻せる決定(双方向のドア)に対しても過剰な慎重さを求めてしまう。これが「分析麻痺」の正体。

ならば

容易にやり直しができる決定なら、24時間以内に実行してデータを得よ。数日・数週間かけるのは、やり直し不能な決定(DBスキーマの根幹、セキュリティ等)のみにせよ。

ただし

「一方向のドア」フィルター

出典Jeff Bezos『2015 年 株主への手紙』(Amazon.com, Inc.、2016 年 4 月提出)——"Type 1 / Type 2 decisions" の初出。1997 年の手紙は「Day 1」の手紙であり、この枠組みは含まれていない。

01
02
03
04

逸脱の常態化

安全工学

もし

小さなルール違反(テストのスキップ等)をしても即座に大惨事が起きない場合、脳はその「逸脱」を「正常」なものとして再定義する。これが破滅的な失敗の始まり。

ならば

「以前も大丈夫だった」を理由に調査を省略するな。その場しのぎの「ハック」を見つけたら、即座に修正するか、高優先度の技術負債として記録せよ。

ただし

割れ窓理論

出典Diane Vaughan, The Challenger Launch Decision (1996) — NASA チャレンジャー号事故の分析から提唱された概念。

01
02
03
04
05

チェスタトンの柵

システム

もし

背景文脈を知らない古いコードやプロセスを「無駄」に見誤る。エゴは理解できないものを「単純化」という名目で削除したがる。

ならば

その「柵(コード/ルール)」がなぜそこに立てられたのかを説明できるようになるまで壊してはならない——ただし、その調査には期限を切れ。期限が切れたら、ロールバックを用意してフラグの裏で外し、何が苦情を上げるかを見よ。

ただし

期限を切った考古学この規則を絶対に適用すれば何ひとつ削除できなくなる。理由を知っていた人と一緒に、理由そのものが去っていることもある

出典G. K. Chesterton, The Thing (1929) — 道に立つ柵の寓話の原典。

01
02
03
04

正常性バイアス

認知

もし

真の異常に直面しても、脳はエネルギー節約のため「いつものパターン」で解釈しようとする。DBが壊れ始めていても「一時的なネットワークの瞬断だろう」と片付けてしまう。

ならば

異常が起きたとき、「これがシステム全壊の始まりだとしたら、次の10分で何が起きるか?」を問え。その答えが恐ろしいなら、今すぐ調査せよ。

ただし

プレモータム / レッドチーミング

出典災害心理学の文献群。Amanda Ripley, The Unthinkable (2008) で総説されている。

01
02
03
04

パーキンソンの凡俗法則

組織

もし

人は複雑なこと(分散合意)より、単純なこと(変数名)に多くのフィードバックをする。誰でも理解できるため、意見を言うことで偽の貢献感を得やすいため。

ならば

PRレビューのコメントの8割がスタイルや命名に集中しているなら、即座に承認し、議論をリンターの設定自動化に移せ。

ただし

コア・バリューへの集中

出典C. Northcote Parkinson『Parkinson's Law and Other Studies in Administration』(Houghton Mifflin, 1957) 所収「High Finance, or the Point of Vanishing Interest」——自転車置き場の委員会の寓話の初出。英国版は『Parkinson's Law: The Pursuit of Progress』(John Murray, 1958)。

01
02
03
04

ガルの法則

システム

もし

複雑なシステムをゼロから「設計」できるという妄想。実際には、複雑系は混沌すぎてトップダウンでは設計できない。

ならば

機能している複雑なシステムは、例外なく「機能していた単純なシステム」から進化したものである。まずは動作する最小単位から始めよ。

ただし

MVP (実用最小限の製品)

出典John Gall, Systemantics: How Systems Really Work and How They Fail (1975)。

01
02
03
04

コンウェイの法則

組織

もし

ソフトウェアの構造は、組織図の写し鏡になる。2つのチームが会話しなければ、そのサービス間の統合もスムーズにはいかない。

ならば

モジュール化されたアーキテクチャが欲しいなら、先にチームを独立したモジュールとして再編せよ。組織構造とコードで戦うな。

ただし

逆コンウェイ戦略

出典Melvin E. Conway, How Do Committees Invent? (Datamation, 1968 年 4 月号)。

01
02
03
04
05

ハイラムの法則

システム

もし

ユーザー数が十分に増えれば、システムの観測可能なあらゆる挙動(バグさえも)は、誰かの依存対象になる。

ならば

ユーザーがいる限り「内部実装」は存在しない。約束した部分はバージョニングと機能フラグで守り、約束していない部分は意図的に揺らして、そもそも依存させるな。

ただし

意図的なゆらぎ観測可能な挙動すべてを不可侵とすれば何も変えられなくなる。約束していない部分は意図的に揺らせ——反復順序のランダム化、計画的な停止——そうすれば依存はそもそも生まれない

出典Hyrum Wright, hyrumslaw.com; Software Engineering at Google (Winters, Manshreck, Wright, 2020) で正式化。

01
02
03
04

ブルックスの法則

組織

もし

遅れているプロジェクトに人を追加すると、調整コストが二次関数的に増大する(n 人で n(n-1)/2 本の通信路)。新人はベテランの手を止めるため、貢献よりも損失が上回る。

ならば

プロジェクトが遅れているなら、人を増やすな。機能を削るか、期限を延ばせ。

ただし

スコープ削減

出典Fred Brooks, 人月の神話 (The Mythical Man-Month) (1975, 20 周年記念版 1995)。

01
02
03
04

XY問題

認知

もし

ユーザーやエンジニアが解決策(Y)で詰まったとき、その方法を質問してしまうが、本来の目的(X)にはもっと簡単な解決策があることが多い。

ならば

誰かが「どうやってYをすればいいか?」と聞いてきたら、常に「Yで何を達成したいのか?」と問い返せ。

ただし

なぜなぜ分析

出典Perl IRC やシステム管理者コミュニティ発の口承。標準的な解説は xyproblem.info

01
02
03
04

ポステルの法則

分散システム

もし

分散システムで全員が仕様を完璧に守ると想定すると、脆い失敗を招く。

ならば

自分が送るものには厳格に(仕様準拠)、受け取るものには寛容に(不完全な入力も優雅に処理)。

ただし

フェイルファスト (内部エラー限定)

出典Jon Postel『RFC 761』(DoD Standard TCP, 1980年1月) §2.10——"be conservative in what you do, be liberal in what you accept from others"。同じ趣旨は『RFC 760』(IP) §3.2 に別の言い回しで、『RFC 793』(1981) に同文で再掲される。

01
02
03
04

ハンロンの剃刀

組織

もし

バグや遅延を「悪意」や「嫌がらせ」と受け取ってしまう。実際には、単なる睡眠不足やコンテキストの欠如であることがほとんど。

ならば

無能(知識不足や文脈欠如)で説明がつくことに、決して悪意を見出すな。人ではなくシステムをデバッグせよ。

ただし

心理的安全性

出典Robert J. Hanlon が Murphy's Law Book Two (Arthur Bloch 編, 1980) に寄稿した格言。

01
02
03
04

ホフスタッターの法則

見積り

もし

「この法則を考慮に入れたとしても、常に予想以上の時間がかかる」。脳は「未知の未知」を可視化できない。

ならば

最も慎重な見積もりを2倍し、さらに20%加えよ。それでもなお、外れることを覚悟せよ。

ただし

実績ベースのスケジューリング

出典Douglas Hofstadter, ゲーデル、エッシャー、バッハ — あるいは不思議の環 (Gödel, Escher, Bach) (1979)。

01
02
03
04

グッドハートの法則

インセンティブ

もし

ある指標が目標になると、それは良い指標ではなくなる。「コミット数」で評価すれば、人々は意味のない小さなコミットを量産する。

ならば

単一の指標でパフォーマンスを判断するな。システムの「出力」そのものを観察し、その代用指標(プロキシ)に固執するな。

ただし

バランスト・スコアカード

出典Charles Goodhart, Problems of Monetary Management (1975); 現代によく引用される定式化は Marilyn Strathern (1997) による。

01
02
03
04

リンディ効果

システム

もし

アイデアやソフトウェアのような非腐敗的なものは、長く生き残ってきたものほど、今後も長く生き残る可能性が高い。

ならば

今後10年安定させたいなら、既に10年以上存在している技術(例:新しいNoSQLよりPostgreSQL)を選べ。

ただし

ハイプサイクル分析

出典Albert Goldman 命名 (New Republic, 1964); Benoit Mandelbrot が形式化し、Nassim Taleb Antifragile (2012) で普及。

01
02
03
04

サンクコストの誤謬

意思決定

もし

「既に多額の投資をしたから」という理由で、失敗している技術やプロジェクトに投資し続けてしまう。脳は負けを認めるのを嫌う。

ならば

「もし今日、ゼロから始めるとしたら、この道を選ぶか?」と問え。答えがNOなら、今すぐ捨てろ。

ただし

ゼロベース予算

出典Hal R. Arkes & Catherine Blumer, The Psychology of Sunk Cost (Organizational Behavior and Human Decision Processes, 1985)。

01
02
03
04

カーゴ・カルト・エンジニアリング

認知

もし

成功企業の慣行(例:Spotifyモデル)を、なぜそれが機能したか理解せずに真似る。同じ結果が得られると盲信する罠。

ならば

Googleが使っているからという理由で導入するな。そのスケールにおけるGoogleと同じ問題が自分たちにあるから、導入せよ。

ただし

第一原理思考

出典Richard P. Feynman, Cargo Cult Science (Caltech 卒業式講演, 1974)。

01
02
03
04

アムダールの法則

性能

もし

ボトルネックが他にある場合、システムの一部をいくら最適化しても全体の性能には影響しない。

ならば

実行時間の90%を占める1%のコードを見つけ、そこだけを最適化せよ。それ以外は無視してよい。

ただし

制約理論

出典Gene Amdahl, Validity of the Single Processor Approach to Achieving Large Scale Computing Capabilities (AFIPS, 1967)。

01
02
03
04

リーキー・アブストラクション

システム

もし

あらゆる非自明な抽象化は、ある程度「漏れる」。インデックスの仕組みを知らずにSQLを使い続けることはできない。

ならば

抽象化を利用して加速せよ。ただし、チーム内に少なくとも一人は、その下の層で何が起きているか理解している人間を置け。

ただし

T型スキル

出典Joel Spolsky, The Law of Leaky Abstractions (Joel on Software, 2002)。

01
02
03
04

パレートの法則

意思決定

もし

バグの80%はコードの20%に起因する。価値の80%は機能の20%から生まれる。

ならば

「重要な20%」を特定し、品質管理のリソースの100%をそこに集中させよ。

ただし

非情な優先順位付け

出典Vilfredo Pareto, Cours d'Économie Politique (1896); 品質工学への応用は Joseph M. Juran, Quality Control Handbook (1951)。

01
02
03
04

生存者バイアス

認知

もし

生き残った成功事例だけを研究し、そこから結論を導いてしまう。同じ戦略を採って消えていった無数の失敗は、データとして見えない。本質的に偏った情報で意思決定している。

ならば

「X社がこの方法で成功した」を根拠にする前に、同じ方法で失敗した企業を調べよ。死者はブログ記事を書かない。

ただし

失敗学 / ポストモーテム文化

出典Abraham Wald, A Method of Estimating Plane Vulnerability (SRG メモ, 1943) — 第二次大戦時の爆撃機装甲分析。

01
02
03
04

カーニハンの法則

保守性

もし

「デバッグは、コードを書くときの2倍の知性を要する。したがって、自分の知力の限界まで賢いコードを書いた時点で、そのコードをデバッグする知性が定義上、足りなくなる。」

ならば

コードの「賢さ」は資産ではなく負債である。6ヶ月後の、午前3時に睡眠不足の自分がまだ理解できるコードを書け。

ただし

KISS (Keep It Simple, Stupid)

出典Brian W. Kernighan & P. J. Plauger, The Elements of Programming Style, 第 2 版 (1978)。

01
02
03
04

コブラ効果

インセンティブ

もし

問題を解決するための施策が、かえって問題を悪化させる。英領インドでコブラ駆除のため懸賞金をかけたら、人々がコブラを養殖し始めた。懸賞金を廃止すると養殖コブラが放流され、さらに事態が悪化した。

ならば

あらゆるインセンティブに対し「これを悪用するならどうする?」を問え。悪用方法が見つかるなら、設計が間違っている。

ただし

二次効果分析 / システムダイナミクス

出典Horst Siebert, Der Kobra-Effekt: Wie man Irrwege der Wirtschaftspolitik vermeidet (2001)。

01
02
03
04

ダンバー数

組織

もし

人間が安定した社会関係を維持できる認知限界は約150人。ダンバーの結果は霊長類全般における新皮質サイズと群れの大きさの関係についてであって、仕事のチームについてではない。エンジニアリングがそこから外挿しているのは別の議論だ——コミュニケーション経路は n(n-1)/2 で増えるので、全員が全員の文脈をまだ保持できる規模を超えた時点から、増えた人員は成果ではなく調整に消える。

ならば

チームが7±2人を超えたら分割を検討せよ。「情報共有ミーティング」が増殖し始めたら、認知限界を超えた兆候である。

ただし

ツー・ピザ・ルール / チームトポロジー

出典Robin I. M. Dunbar, Neocortex size as a constraint on group size in primates (Journal of Human Evolution, 1992)。併せて引かれる小さいチーム規模の数字——7±2、ツー・ピザ・ルール——はダンバーの知見ではなく、通俗的な外挿である。

01
02
03
04

劣っている方が勝つ

システム

もし

理論的に「正しい」が複雑な設計よりも、単純で「不完全」だが実装と採用が容易な設計の方が、現実世界では勝利する。UnixはLispに勝ち、HTTPはCORBAに勝った。

ならば

80%正しくて今日リリースできるものは、100%正しくて来年リリースされるものに勝つ。優雅さではなく普及を最適化せよ。

ただし

The Right Thing / 完璧主義

出典Richard P. Gabriel, Lisp: Good News, Bad News, How to Win Big (1991) — "Worse is Better" のエッセイ。

01
02
03
04

カニンガムの法則

組織

もし

「インターネットで正しい答えを得る最良の方法は、質問することではなく、間違った答えを投稿することだ。」人は質問に答えるよりも、間違いを訂正する動機の方が強い。

ならば

ドキュメントがないシステムについて「これはXをやっているのだと思う」と書け。真実を知る人間が沈黙を破って訂正してくれる確率は、単に「これは何?」と聞くより遥かに高い。

ただし

ソクラテス式問答

出典Ward Cunningham (wiki の発明者) に Steven McGeady が帰属、Wikipedia 上でこの名称で定着 (~2010)。

01
02
03
04

傍観者効果

組織

もし

緊急事態において、居合わせる人数が多いほど、個々人が行動を起こす可能性は低くなる。「誰かが対応するだろう」と全員が思い、結果誰も対応しない。エンジニアリングでは、グループチャンネルへのアラートは往々にして無視される。

ならば

「誰か見てますか?」とは決して言うな。「@名前、あなたがこれを調査してください」と名指しで依頼せよ。すべてのインシデントに、名前のある単一のオーナーを割り当てよ。

ただし

明示的な役割割り当て / インシデントコマンダー制

出典John M. Darley & Bibb Latané, Bystander Intervention in Emergencies: Diffusion of Responsibility (Journal of Personality and Social Psychology, 1968)。

01
02
03
04

マーフィーの法則

安全工学

もし

「うまくいかない可能性があることは、必ずうまくいかない。」十分な時間・トラフィック・想定外の入力さえあれば、潜在的な失敗モードはいずれ必ず発火する。ハッピーパスだけを設計したシステムは、ネットワークの一瞬の揺れで崩れる。

ならば

外部依存・リトライ・タイムアウトはすべて、本番でいつか必ず失敗するものとして扱え。成功パスより先に失敗パスを設計せよ。

ただし

防御的設計 / カオスエンジニアリング

出典Capt. Edward A. Murphy Jr. (USAF MX981 計画, 1949); Maj. John Paul Stapp により普及。

01
02
03
04
05

ボーイスカウトの規則

保守性

もし

クリーンアップは常に「誰か別の人の仕事」になりがちで、コードベースは劣化していく。各エンジニアはエントロピー増加の影響だけ受けて、修正は「いつかのリファクタ」に先送りされ、それは結局来ない。

ならば

コードを来たときよりきれいにして去れ。ただし清掃は、同じ差分の中で読み切れる大きさに留めよ——1行のリネーム、より明確なコメント、デッドコードの削除。それより大きいものは独立したコミットにせよ。

ただし

1つの差分に1つの理由振る舞いの変更に清掃が相乗りすると変更そのものが隠れる。ついでに40箇所リネームした PR は、誰にもレビューされない

出典Robert C. Martin『The Boy Scout Rule』(Kevlin Henney 編『97 Things Every Programmer Should Know』O'Reilly, 2010 所収)——ベーデン=パウエルの「この世界を来たときより少しだけ良くして去れ」の翻案。『Clean Code』(2008) にも記述がある。

01
02
03
04

テスラーの複雑性保存則

システム

もし

あらゆるシステムには取り除けない本質的複雑性があり、それは消えるのではなく移動するだけだ。ユーザーから隠せば開発者へ、開発者から隠せば運用者へ、運用者から隠せば午前 3 時の顧客の手元に着地する。

ならば

「シンプルな API」が綺麗すぎると感じたら問え——いま自分が消した複雑性を、誰が吸収したのか? 答えられないなら、簡素化したのではなく転嫁しただけだ。

ただし

誠実なレイヤリング / 明示的なトレードオフ

出典Larry Tesler (Xerox PARC / Apple 在籍時, ~1984) が "Law of Conservation of Complexity" として提示。

01
02
03
04
05

ダニング・クルーガー効果

認知

もし

ある分野で専門性を欠くということは、「自分の無能さを認識するために必要なメタ的スキル」も同時に欠くということ。元の研究では、下位四分位の被験者は実際には12パーセンタイル程度でありながら、自己評価を60パーセンタイル付近に置いた。逆に上位の被験者は、他人にも同じくらい簡単なはずだと仮定して自分を過小評価した。

ならば

誰かが難問を「簡単」と断言したら、その見積もりを信じる前に、その分野での実績を確認せよ。スコーピングの場面では、自信ある新参者と寡黙な熟達者をペアにし、寡黙な側の声を重く扱え。

ただし

較正された自信この効果には異論がある——古典的なパターンの多くは、ノイズの多い自己評価の平均への回帰でも再現できる。だから過信は「診断」ではなく「実績を確認せよという合図」として扱え

出典Justin Kruger & David Dunning, Unskilled and Unaware of It (Journal of Personality and Social Psychology, 1999)。

01
02
03
04

知識の呪い

認知

もし

一度ある事を知ってしまうと、「それを知らなかった状態」を容易には想像できなくなる。エンジニアはドキュメント、エラーメッセージ、API を、自分にとっては自明で、次に使う人にとっては不透明な状態で書いてしまう。

ならば

ドキュメントや公開 API を出荷する前に、システムを一度も触ったことのない人にそのタスクをやらせ、自分は黙って観察せよ。彼らの混乱は、自分が言語化し忘れた前提を正確に指している。

ただし

ユーザーテスト / オンボーディングバディ / 著者のチーム外のドキュメントレビュアー

出典Colin Camerer, George Loewenstein & Martin Weber, The Curse of Knowledge in Economic Settings: An Experimental Analysis (Journal of Political Economy, 1989)。

01
02
03
04

スイスチーズモデル

安全工学

もし

すべての保護層(レビュー、テスト、アラート、ランブック、ロールバック)には穴がある。事故は、独立した複数層の穴が偶然一直線に並んだ瞬間に発生する。単一の層を完璧にすることはできないので、独立した形で失敗する複数層に依存するしかない。

ならば

インシデントレビューにおいて、「失敗した一つのもの」で止まってはならない。本来それを捉えるはずだった全層を列挙し、なぜ同じ瞬間にすべての穴が開いていたのかを問え。修正対象は単一層ではなく、最も安価に塞げる二層が答えになる。

ただし

多層防御 / 独立した統制 / ポストモーテムでの「穴の監査」

出典James Reason, Human Error (Cambridge University Press, 1990)。

01
02
03
04

早すぎる最適化

性能

もし

「早すぎる最適化はあらゆる悪の根源である。」計測が必要性を示す前にコードを最適化すると、エンジニアの時間を浪費するだけでなく、ホットパスとコールドパスを絡め取って、本当に必要となる最適化を阻む複雑性を残してしまう。

ならば

まず素直なコードを書け。プロファイラがボトルネックと証明したホットパスのみを最適化せよ。残り 97% のクリティカルでないコードは単純なまま保て——次のメンテナーが住むのはそこである。

ただし

プロファイル優先 / Make It Work, Make It Right, Make It Fast (この順序で)

出典Donald E. Knuth, Structured Programming with go to Statements (Computing Surveys, 1974)。

01
02
03
04

リーナスの法則

保守性

もし

「十分な目玉があれば、あらゆるバグは浅い。」一人の目には不可能に見える欠陥も、独立した多くの視点が当たれば自明になる——ただし、コードが実際にその視点に対して可視であることが前提。

ならば

ある型のバグが何度もすり抜けるなら、解決策は「同じ人による、より慎重なレビュー」ではない。形の違う多くの目にコードを晒せ。レビュアーをローテーションし、内部ライブラリを公開し、バウンティを開け。

ただし

オープンソース / レビュアーのローテーション / バグバウンティ / 社内コードの発見可能性

出典Eric S. Raymond, The Cathedral and the Bazaar (1999) — Linus Torvalds に因んで命名。

01
02
03
04

CAP定理

分散システム

もし

ネットワーク化されたデータストアは、一貫性 (C)可用性 (A)分断耐性 (P) を同時には保証できない。現実世界でネットワーク分断は不可避なので、実際に選べるのは分断が起きたその瞬間の「一貫性か可用性か」である。

ならば

障害が起きるに、各操作が一貫性と可用性のどちらを優先するか決めておけ。分断は必ず起きる。問われるのは「起きた時にシステムが何をするか」だけだ。

ただし

PACELC / 調整可能な一貫性

出典Eric Brewer, Towards Robust Distributed Systems (PODC 基調講演, 2000); Seth Gilbert & Nancy Lynch が証明 (SIGACT News, 2002)。

01
02
03
04

リトルの法則

性能

もし

安定したシステムでは、系内の平均項目数 (L) は平均到着率 (λ) と平均滞留時間 (W) の積に等しい: L = λW。到着分布やサービス規律に依らず成り立つ。

ならば

容量 (capacity) を増やさずにレイテンシ (W) を下げたいなら、仕掛り (L) を減らせ。同時リクエスト数に上限を設けよ——短い行列は、速いサーバより速い。

ただし

バックプレッシャ / 流入制御

出典John D. C. Little, A Proof for the Queuing Formula L = λW (Operations Research, 1961)。

01
02
03
04

二人の将軍問題

分散システム

もし

不確実な通信路で通信する二者は、合意に達したと確信することが決してできない——あらゆるメッセージは確認応答を必要とし、その応答自体もまた応答を必要とし、永遠に終わらない。いかなる固定回数のやり取りも共有知識をもたらさない。

ならば

「送ったから届いた」と決して仮定するな。ネットワークを跨ぐ操作はすべて再送安全かつべき等に設計し、一往復を信じる代わりに状態を突き合わせて整合させよ。

ただし

べき等性 / 結果整合性 / 確認付き再送

出典E. A. Akkoyunlu, K. Ekanadham & R. V. Huber (1975); Jim Gray が Notes on Data Base Operating Systems (1978) でデータベースの問題として定式化。

01
02
03
04

ピーターの法則

組織

もし

階層組織では、人は一つ上の職務ではなく現職の成績で昇進する。だから誰もが、自分の不得手な職位に達するまで昇り続け、そこで留まる。有能は昇進によって失われ、無能が堆積していく。

ならば

最高のエンジニアを褒美にマネジメントへ昇進させるな——優れたエンジニアを一人失い、かつ貧弱なマネージャーを一人生むリスクがある。技術職の梯子を用意し、すでに習熟した職務ではなく「一つ上の職務」への適性で候補者を評価せよ。

ただし

複線型キャリアパス / 職務別の評価

出典Laurence J. Peter & Raymond Hull, The Peter Principle (1969)。

01
02
03
04

パーキンソンの法則

組織

もし

「仕事は、それを完了するために与えられた時間を満たすまで膨張する。」一週間与えれば一週間かかり、同じ作業も締切が二日なら二日で片付く。緩衝 (slack) は貯蓄されず、消費される。

ならば

終わりの見えない作業には意図的に短いタイムボックスを切り、締切の時点で見直せ。きつい箱は、緩い箱が永遠に先送りしてしまうスコープ判断を強制する。

ただし

タイムボックス

出典C. Northcote Parkinson『Parkinson's Law』(The Economist, 1955年11月19日)。『Parkinson's Law and Other Studies in Administration』(Houghton Mifflin, 1957) に発展した。

01
02
03
04

ヴィルトの法則

性能

もし

「ソフトウェアはハードウェアが速くなるよりも速く遅くなっている。」ハードの利得はそのたびに、追加された抽象層・機能・不注意によって吸収され、ユーザーが体感する速度は横ばいか悪化する。

ならば

速いマシンが買ってくれた速度を、「使ってよい許可」ではなく「守るべき予算」とみなせ。性能予算を設け、リリースがそれを割り込んだらビルドを失敗させよ。

ただし

パフォーマンスバジェット / リーンなソフトウェア

出典Niklaus Wirth, A Plea for Lean Software (IEEE Computer, 1995)。

01
02
03
04

90対90の法則

見積り

もし

「最初の90%のコードが、開発時間の最初の90%を占める。残り10%のコードが、もう90%を占める。」目に見える作業は、同じ大きさの統合・エッジケース・仕上げという第二の塊を隠している。

ならば

「ほぼ完成」に見えたら、もう一つ丸ごとプロジェクトが残ると思え——最後の10%、すなわち堅牢化・エッジケース・統合。端数として無視せず、明示的にスケジュールに積め。

ただし

本番相当データでのデモ / 厳格な完了の定義

出典Tom Cargill (Bell Labs); Jon Bentley が Programming Pearls (CACM, 1985) で広めた。

01
02
03
04

イーグルソンの法則

保守性

もし

「半年見ていない自分のコードは、他人が書いたも同然である。」コードそのものより遥かに速く、頭の中のメンタルモデルは蒸発する。文脈はソースには保存されない。

ならば

半年後に他人と化す自分のために、コードとコミットメッセージを書け。コードから自明でない判断は、その「なぜ」をコメントか ADR に残せ——頭の中だけに留めるな。

ただし

ADR / 自己説明的なコード / 「なぜ」を記すコメント

出典Peter Eagleson に帰される、プログラミングの口伝。カタログ化された「ソフトウェア開発の法則」群の一つとして長く流布。

01
02
03
04

ヒックの法則

ヒューマンインタフェース

もし

決定にかかる時間は選択肢の数の対数で増える: T = b·log₂(n+1)。選択肢の増加は見た目を散らかすだけでなく、すべてのユーザーを計測可能なほど遅くする。

ならば

画面や API 表面の選択肢を、効くものだけに絞れ。残りは既定値と段階的開示の裏へ押しやれ。ドアが少ないほど、決定は速い。

ただし

段階的開示 / 妥当な既定値

出典William E. Hick (1952) と Ray Hyman (1953) — 「ヒック・ハイマンの法則」。

01
02
03
04

フィッツの法則

ヒューマンインタフェース

もし

標的へ移動する時間は、その距離と大きさで決まる。遠く小さい標的は遅く誤りやすく、近く大きい標的は速い。ポインティングは計測可能なコストを持つ物理的行為である。

ならば

頻用する操作や破壊的な操作は大きく当てやすく、稀な操作や危険な操作は小さく遠くに。画面の端と角は実質無限大の的である——主要な操作はそこに置け。

ただし

端と角の活用 / 頻度に応じたサイズ設計

出典Paul M. Fitts, The Information Capacity of the Human Motor System in Controlling the Amplitude of Movement (Journal of Experimental Psychology, 1954)。

01
02
03
04

ミラーの法則

認知

もし

「マジカルナンバー 7 ± 2」——人間の作業記憶が一度に保持できるのは約7チャンクのみ。その限界を超えると想起は崩壊する。脳は速度を落とすのではなく、項目を捨てる。

ならば

人が頭の中で状態を保持しなければならない場所——関数の引数・フォーム項目・メニュー群・オンコール手順——では、関連する項目を電話番号のように少数の名前付きチャンクへまとめよ。

ただし

チャンク化 / 情報隠蔽

出典George A. Miller, The Magical Number Seven, Plus or Minus Two (Psychological Review, 1956)。

01
02
03
04
05

分散コンピューティングの誤謬

分散システム

もし

分散システムに不慣れな者は、ネットワークは信頼でき、遅延はゼロ、帯域は無限、通信は安全、構成は不変、管理者は一人、転送コストはゼロ、ネットワークは均質だと暗黙に仮定する。この8つの仮定はすべて本番で崩れる。

ならば

プロセス間呼び出しを出す前に、8つの仮定のどれに依存しているかを明示し、各々に明示的なタイムアウト・リトライ・失敗経路を与えよ。

ただし

失敗前提の設計起こり得ない故障への過剰武装は避けつつ

出典L. Peter Deutsch(誤謬 5〜7、1994年)と James Gosling(8つ目、1997年頃)——Sun Microsystems での先行研究に基づく。

01
02
03
04
05

自動化の皮肉

安全工学

もし

作業の定型部分を自動化すると、人間には最も稀で難しい例外だけが残る——しかも使わぬ間に手作業の技能と状況認識は衰える。破綻した自動システムが制御を人へ返すのは、まさにその瞬間である。

ならば

定期的なゲームデーと実地訓練で運用者の勘を保て。引き継ぎは、文脈なく冷えた状態でなく、状況を保持したまま人が引き取れるよう設計せよ。

ただし

人間参加型の訓練自動化を減らすのではなく、協働を良くする

出典Lisanne Bainbridge, Ironies of Automation (Automatica, 1983)。

01
02
03
04
05

最小権限の原則

セキュリティ

もし

厳密に必要な以上の権限を与えられた要素は、あらゆるバグ・侵害・事故の被害範囲を広げ、監査者が考慮すべき相互作用を増やす。

ならば

すべてのプロセス・サービスアカウント・トークンを既定で拒否とし、職務が証明できる最小限の権限だけを加えよ。職務が変わるたびに権限を再監査せよ。

ただし

心理的受容性利用者が回避してしまうほどの過剰な制限は、自らを敗北させる

出典Jerome Saltzer & Michael Schroeder, The Protection of Information in Computer Systems (Proceedings of the IEEE, 1975)。

01
02
03
04
05

ケルクホフスの原理

セキュリティ

もし

暗号方式は、鍵以外のすべてが公開されても安全であるべきだ。アルゴリズムの秘匿は脆い——仕組みは漏れ、解析され、他システムで使い回される。

ならば

攻撃者は自分のソースと設計をすべて握っていると仮定せよ。秘密はすべて交換可能な鍵に置き、隠したアルゴリズムに防御を頼るな。

ただし

多層防御秘匿は薄い一層としてなら許されるが、決して土台にはならない

出典Auguste Kerckhoffs, La cryptographie militaire (Journal des sciences militaires, 1883)。

01
02
03
04
05

グスタフソンの法則

性能

もし

時間の予算を固定すれば、大きな計算機はそれに比例して大きな問題を解ける。ゆえに規模とともに逐次部分の割合は縮み、速度向上はほぼ線形に伸びる——固定作業量を前提とするアムダールの悲観に対する、楽観的な対の視点である。

ならば

コア増設を正当化する前に、問題規模がハードウェアとともに大きくなるかを問え。作業量が固定ならアムダールで考え、規模とともに増えるならグスタフソンが効く。

ただし

アムダールの法則固定サイズの作業量では、逐次部分が依然として速度向上を頭打ちにする

出典John L. Gustafson, Reevaluating Amdahl's Law (Communications of the ACM, 1988)。

01
02
03
04
05

スケールの裾野

分散システム

もし

多数の要素へ扇状に処理を広げるサービスでは、ノード単位の稀な遅延(GC 停止・競合・不良ディスク)がほぼ毎リクエストどこかのノードで発生する。ゆえに中央値が健全に見えても、裾野のレイテンシ(p99・p99.9)が体感を支配する。

ならば

平均ではなく p99/p99.9 で SLO を引け。すべてのノードを均一に速くしようとするより、ヘッジドリクエストやマイクロ分割といった裾野耐性の技法を導入せよ。

ただし

冗長化には代償があるヘッジドリクエストや連動リクエストは負荷を増やす。中央値が体感を決める場面で裾野を追うな

出典Jeffrey Dean & Luiz André Barroso, The Tail at Scale (Communications of the ACM, 2013)。

01
02
03
04
05

アシュビーの必要多様性の法則

システム

もし

制御装置が系を調整できるのは、その系が生み出しうる状態の多様性に匹敵できる場合のみである。力不足の制御は、十分に豊かな環境にはそもそも対処できない。

ならば

障害がアラートや手順書を繰り返しすり抜けるなら、対応能力を多様性に見合うまで増やすか、設定を減らし入力を厳しくして系の状態空間を意図的に縮めよ。

ただし

環境そのものを制約する制御側の過剰な多様性は、それ自体がコストと複雑さである

出典W. Ross Ashby, An Introduction to Cybernetics (Chapman & Hall, 1956)。

01
02
03
04
05

デメテルの法則

保守性

もし

他オブジェクトの内部を辿って呼び出すコード(`a.getB().getC().doThing()`)は、依存の連鎖全体に自らを結びつける。ゆえにその連鎖のどこかの変更が波及して壊れる。

ならば

呼んでよいのは、直接の協力者・引数・自分が生成したもの・自分のフィールドのメソッドだけ。getter を数珠つなぎにしているなら、データを持つオブジェクト側にメソッドを足せ。

ただし

教条より実用厳格な適用は転送メソッドとラッパーの肥大を招く

出典Karl Lieberherr & Ian Holland, Assuring Good Style for Object-Oriented Programs (IEEE Software, 1989)。

01
02
03
04
05

ジェヴォンズのパラドックス

インセンティブ

もし

資源の単位あたり利用を安くすると実効価格が下がり、総消費はむしろ増えうる——効率化で浮いた分は、節約として貯まらず、さらなる利用に費やされる。

ならば

計算資源・ストレージ・社内 API など何かを安くしたら、需要が膨らむと見込め。純減を前提にせず、反動を織り込んで容量と予算を確保せよ。

ただし

反動に上限を設ける効率化には割当・上限・価格シグナルを組み合わせ、節約を実際に回収せよ

出典William Stanley Jevons, The Coal Question (1865)。

01
02
03
04
05

通常事故理論

安全工学

もし

相互作用的に複雑で、かつ密結合な系では、独立した小さな故障が設計者の予見しない形で相互作用し、運用者が介入するより速く伝播する——ゆえに事故は不運ではなく、構造の性質となる。

ならば

バッファ・タイムアウト・隔壁・サーキットブレーカで結合を緩め、複雑さを削れ。安全連動装置を足すのはその後だ——連動装置自体もまた相互作用を増やす。

ただし

高信頼性組織(HRO)文化・余裕・疎結合は、宿命論に測定可能な形で勝る

出典Charles Perrow, Normal Accidents: Living with High-Risk Technologies (Basic Books, 1984)。

01
02
03
04
05

割れ窓理論

安全工学

もし

割れたまま放置された窓は「誰も見ていない」という信号になり、次の違反のコストを下げる。コードベースでも、見逃された一つのハック、飛ばされた一つのテスト、恒久的に黙らされた一つのアラートが揃って「この基準は守らなくてよい」と宣言する。

ならば

いま触っているファイルにある、最初の目に見える欠陥を直せ。黙認する例外にはすべて担当者と期限を付けよ。自分がいま立っていない場所の窓を直すためにリファクタを起こすな。

ただし

修繕もタダではない塗装に注ぐ注意は土台に注がれない注意であり、そもそも元の犯罪学的主張の実証には強い異論がある

出典James Q. Wilson & George L. Kelling『Broken Windows』(The Atlantic, 1982年3月号)。

01
02
03
04
05

YAGNI

保守性

もし

推測に基づく一般化は3回支払わされる。抽象を書くとき、使われないまま抱え続けるとき、そして予期した要件が違う形で実際に来て解きほぐすとき。将来要件の予測は、たいてい「その抽象が固定してしまった細部」で外れる。

ならば

実際に手元にあるケースだけを実装せよ。一般化したくなったら、まず2つ目の具体的なケースを名指しせよ。名指しできないなら、それはパターンではなく当て推量だ。

ただし

チェスタトンの柵YAGNI が許すのは「作らないこと」だけであり、目的を確かめていないものを「消すこと」まで許してはいない

出典Ron Jeffries による Extreme Programming の実践ノート。"You Aren't Gonna Need It" として命名され、Kent Beck『Extreme Programming Explained』(1999) で広まった。

01
02
03
04
05

KISS の原則

保守性

もし

"Keep it simple, stupid" は航空機設計から出た言葉で、要件は「平均的な整備兵が、基本的な工具だけで、野戦で直せること」だった。基準は優雅さではなく、その機体が実際に遭遇する最悪の状況で、普通の人間が直せるかどうかだった。

ならば

設計はレビューでの読みやすさではなく、「午前3時に誰が直せるか」で評価せよ。オンコール担当が作者を呼ばないと直せないなら、それは単純なのではなく、一人にとって馴染みがあるだけだ。

ただし

アシュビーの必要多様性の法則制御すべき問題より単純な系はその問題に対処できない。その下限を割った単純さは、複雑さの削減ではなく移動である

出典Lockheed Skunk Works の Kelly Johnson に帰される (1960年頃)。戦闘機の野戦整備性の要求として。

01
02
03
04
05

DRY 原則

保守性

もし

重複した知識は必ずずれていく。コピー同士を一緒に変えることを強制するものが何もないからだ。コストは余分な文字数ではない。将来の誰かが片方だけを直し、自分自身と静かに矛盾するシステムを出荷してしまうことだ。

ならば

重複を排除するのはテキストではなく知識だ。似た2つのブロックを統合する前に、「同じ理由で、同じ人の要求によって変わるか」を問え。違うなら分けたままにせよ。

ただし

誤った抽象より重複のほうが安い今は似ているだけの2つのブロックは、分岐が必要になった瞬間に互いを縛り合う

出典Andrew Hunt & David Thomas『The Pragmatic Programmer』(Addison-Wesley, 1999)——「あらゆる知識は、システムの中で単一かつ明確で権威ある表現を持たねばならない」。

01
02
03
04
05

制約理論

性能

もし

鎖には必ず最も弱い環が一つある。それ以外のどこを改善しても、局所的な効率は上がるが全体のスループットは動かない。むしろ悪化することが多い——速くなった上流工程が、本当のボトルネックの前により多くの仕掛品を積み上げるからだ。

ならば

制約を特定し、能力を買い足す前にまず徹底的に使い切り、他の全工程をそれに従属させよ。そのうえで測り直せ。あなたはたった今、別の場所に新しいボトルネックを作ったところだ。

ただし

制約は移動する一つを緩めれば別のものが制約になる。昨日のボトルネックに合わせて恒久的に最適化された工程は、新しい制約のところで飢える

出典Eliyahu M. Goldratt & Jeff Cox『The Goal: A Process of Ongoing Improvement』(North River Press, 1984)。

01
02
03
04
05

オッカムの剃刀

認知

もし

インシデントの圧力下では、思考は面白い仮説に手を伸ばす——カーネルのバグ、壊れたディスク、攻撃者。だが未検証の仮定を最も必要としない説明は、ほぼ常に「20分前に出たデプロイ」である。

ならば

仮説を「未検証の仮定がいくつ必要か」で並べ、最も安いものから検証せよ。「何が壊れたか」の前に「何が変わったか」を問え。

ただし

ヒッカムの格言系は複数の独立した障害を同時に抱えうる。症状に合う最も単純な物語が、自動的に真実になるわけではない

出典オッカムのウィリアム (1287頃–1347) に帰される。「剃刀」の比喩も、定式 entia non sunt multiplicanda praeter necessitatem も、彼の倹約の原理に対する後世の注釈である。

01
02
03
04
05

単一責任の原則

保守性

もし

一つのモジュールが二つの利用者集団に仕える場合、彼らの変更要求は異なるスケジュールで届き、同じファイルの上で衝突する。結合とは本当はモジュール間の呼び出しの話ではない——「誰があなたにそのモジュールの編集を強制できるか」の話だ。

ならば

責務は「コードが何をするか」ではなく「誰が変更を要求してくるか」で定義せよ。同じモジュールに対して別々の人物がそれぞれ編集を要求できるなら、その線でだけ分割せよ。

ただし

早すぎる分解想像上の責務で分割すると、メソッド1個のクラスが散乱し、複雑さがすべてその間の配線に移るだけになる

出典Robert C. Martin『Agile Software Development: Principles, Patterns, and Practices』(2002)。『The Single Responsibility Principle』(The Clean Code Blog, 2014年5月8日、本項のリンク先) で「モジュールはただ一人のアクターに対して責任を負う」と鋭くされ、『Clean Architecture』(2017) で再掲された。

01
02
03
04
05

驚き最小の原則

ヒューマンインタフェース

もし

利用者は、これまで使ってきた似たものすべてから組み立てたモデルを持ってやって来る。「筋は通っているが意外な」振る舞いは、「わずかに劣るが予想どおりの」振る舞いより高くつく。驚きは全利用者が、毎回、永久に支払い続けるからだ。

ならば

2つの設計が拮抗したら、利用者がすでに知っている慣習に合うほうを取れ——フラグ名、終了コード、並び順。意図的な驚きは、告知するコストを払える場所にだけ使え。

ただし

驚きは相対的である今日の期待だけに合わせた設計は、悪い慣習をその場に凍結する。ときには移行手順を添えて、一度だけ大きく驚かせるのが正しい

出典言語・インタフェース設計の古くからの言い伝え。Michael F. Cowlishaw『The Design of the REXX Language』(IBM Systems Journal, 1984) に明示的な記述がある。

01
02
03
04
05

セカンドシステム症候群

システム

もし

1番目のシステムは、地面の固さを測りかねている者によって慎重に作られる。その成功が慎重さを自信に変え、1回目に見送ったアイデアがすべて一度に書き直しへ流し込まれる。結果は過剰に汎用的で、遅れ、そして多くの場合そもそも出荷されない。

ならば

書き直すときは、願望リストだけでなく制約も引き継げ。見送っていた機能は「実際に利用者を止めていた2つ」まで削り、元のシステムを一つずつ置き換えよ。

ただし

ガルの法則答えは1番目のシステムを凍結することではなく、育てることだ。分割して出荷される書き直しは「2番目のシステム」ではない

出典Fred Brooks『人月の神話』(Addison-Wesley, 1975) 第5章。

01
02
03
04
05

ムーアの法則

性能

もし

ムーアの観察は物理ではなく経済のものだった——部品あたりコストが最小になる集積度が、およそ2年で倍になる。これが半世紀成立し、「ハードがいずれ救ってくれる」という前提のあらゆる計画を静かに支えた。だが2005年頃にデナードスケーリングが終わってから、シングルスレッド性能はこの曲線から外れている。

ならば

ハードウェアが設計を救ってくれる前提で予算を組むな。ワークロードがシングルスレッドかつレイテンシ律速なら、来年のマシンは助けにならない。並列化するか、やる仕事を減らすかだ。

ただし

ヴィルトの法則得られた余力は貯金されず消費される。しかもクロック速度はトランジスタ数よりずっと早く頭打ちになった

出典Gordon E. Moore『Cramming More Components onto Integrated Circuits』(Electronics, 1965年4月19日)。

01
02
03
04
05

アマラの法則

見積り

もし

新技術はデモで評価され——デモは技術を実際より良く見せる——そして既存の設備の上に導入される。既存設備は抵抗する。だから最初の2年は期待外れになる。その後、初期予測を外させたのと同じ複利が10年間逆方向に働き、10年予測もまた外れる。今度は過小に。

ならば

新技術についての2年予測は割り引き、10年予測は真に受けよ。ただし計画はデモ版ではなく、実際に出荷される版を前提に立てよ。

ただし

そもそも来ないものもある生存者バイアスがこの法則を必然に見せている。長期を迎えられなかった技術は、あとから引用されないからだ

出典Institute for the Future 会長 Roy Amara に帰される。1970年代以降に流布した言葉。

01
02
03
04
05

苦い教訓

システム

もし

AI研究の70年を通じて勝ったのは、利用可能な計算量とともにスケールする探索と学習であり、その領域についての人間の洞察を埋め込んだ手法ではなかった。作り込まれた知識は短期では効き、長期では天井になる。計算資源と違って、毎年安くならないからだ。

ならば

「知っていることを埋め込む」か「より多くのデータや計算から学ぶものを作る」かで迷ったら、予算が倍になったとき勝手に良くなるのはどちらかを問え。数年単位の話なら、そちらに賭けよ。

ただし

計算資源はタダではない固定予算の内側では領域知識が唯一使えるレバーであることも多い。この教訓は分野の軌跡を述べたものであって、今四半期の正解ではない

出典Richard S. Sutton『The Bitter Lesson』(2019年3月13日)。

01
02
03
04
05

メトカーフの法則

システム

もし

n ノードのネットワークには n(n−1)/2 通りの接続がありうるため、価値は n² に比例すると主張された。指数には異論があり——実在のネットワークには n log n のほうがよく当てはまる——だが形は変わらない。新しいノードは既存の全ノードに価値を足す。だからネットワークは滑らかに成長せず、ある点で一気に傾く。

ならば

価値が他の利用者から生まれるプロダクトでは、初期の労力を機能ではなく「その参加者にとってすでに有用な最小のネットワーク」に注げ。チームでは逆に、接続を削れ。

ただし

同じ二次関数はコストでもある接続は利用者どうしでは資産だが、同僚どうしでは負債になる。ブルックスの法則はメトカーフの法則の符号を反転させたものだ

出典Robert Metcalfe に帰される (1980年頃)。n log n による批判は Bob Briscoe, Andrew Odlyzko & Benjamin Tilly『Metcalfe's Law is Wrong』(IEEE Spectrum, 2006年7月)。

01
02
03
04
05

リンゲルマン効果

組織

もし

リンゲルマンは、綱を一人で引かせた場合とチームで引かせた場合の力を測った。人を増やすたび、一人あたりの寄与は単独時より小さくなった。一部は協調のロスだが、一部は「寄与が分離できなくなった途端に落ちる個人の努力」である。成果が合算され、誰がどの部分を出したか見えない場所ならどこでも起きる。

ならば

すべての作業の流れに、名前の付いた担当者一人と、目に見える成果物を与えよ。成果のどの部分を誰が出したか言えないなら、その集団は構成員の総和より少ない成果しか出さないと考えよ。

ただし

寄与を分離可能にするこの効果は人間の性質ではなく仕事の測り方の性質だ。個人の寄与を可視化すれば、その大半は消える

出典Maximilien Ringelmann『Recherches sur les moteurs animés: Travail de l'homme』(Annales de l'Institut National Agronomique, 1913)。

01
02
03
04
05

シャーキーの原理

インセンティブ

もし

ある問題を解くために作られた組織は、その問題が存続することから予算・人員・地位を得る。これが働くのに誰かが冷笑的である必要はない。インセンティブが「自分のチームを不要にすること」を決して指さないだけだ。時間が経つと、解決策は静かに問題の存続理由へと変わる。

ならば

何かを直すために作ったチームやツールには、「直った状態」がどう見えるか、いつそれを確認するかを書き出せ。自らの不要化を説明できないプラットフォームチームは、自らの生存を最適化している。

ただし

永続する問題も実在する長命なチームをすべて自己保存的だと見なせば、必要な保守をしているチームを壊す。保守はうまくいっているときほど見えない

出典Clay Shirky の言。Kevin Kelly『The Shirky Principle』(The Technium, 2010) で命名・引用された。

優れたエンジニアリングとは、すべてのリスクを避けることではない。どのリスクを取る価値があるかを、意図して選ぶことである。

— 法典より

なぜ柵が立つかを学ばずに引き倒す者、測定を目標へとすり替える者、難問を「簡単だ」と言い切る者——その者に午前3時のページャーを継がせよ。