システムを最適化せよ、コンポーネントではない
Hamming のシステム工学第一原則
Hamming の第 28 章における核心原則:コンポーネントを最適化すれば、システム性能はおそらく損なわれる。
彼は微分解析機の事例でこれを説明した。2 つのユニットを接続する予定だった。開発者は 2 番目のユニットのアンプを改良した。受入検査の日、Hamming は標準テストを実行した — y'' + y = 0 を解き、y 対 y' をプロットし、円になるはずだった。しかし失敗した。原因は、改良されたアンプが接地回路により大きな電流を流したためだった。接地は元の設計では問題なかったが、新しい電流レベルには耐えられなかった。壊れたのはインターフェースで、コンポーネントではなかった。
彼の一般化:ほとんどのシステム障害は、コンポーネントではなくインターフェースに起因する。コンポーネントは設計され、テストされ、認証される。インターフェースは後回しで設計され、ほとんどテストされず、独立して認証されることはない。コンポーネントが変更されると、そのインターフェースの動作も変わる。下流のものはその新しいインターフェース向けに設計されていない。
重要な非対称性: コンポーネントが10倍改善されても、それが制約のあるインターフェースに接続されている場合、システム全体では10倍の劣化を引き起こす可能性がある。改善は加算されず、むしろ減算される。
失敗したシステム工学としての教育システム
Hammingの教育事例
Hammingはこの原則を教育に適用した。各科目の成績を最適化すること——各科目でテストのパフォーマンスを最大化するよう生徒を訓練すること——は、個々のテストでは良い点を取れるが、分野を超えて知識を統合できない生徒を生み出す。
各コンポーネント(科目ごとの得点)は改善する。システム(教育、統合的な理解として定義される)は劣化する。科目間のインターフェース——学生が異なる領域に知識を適用する能力——は最適化されたことがなく、萎縮した。
これは実装上の偶然ではない。構造的な問題である。コンポーネントのパフォーマンスを測定し報酬を与えると、コンポーネントの最適化が得られる。インターフェースはコンポーネント指標には見えない。
彼の処方箋:システム内のボトルネックを見つけ、それを除去したときに下流で何が起こるかを問うこと。ボトルネックの除去は次のキューに洪水を引き起こす。制約のない最適化は新たな制約となる。
インターフェース劣化の追跡
Hammingは、コンポーネントを改善するとそのインターフェースの振る舞いが変化し、システムの残りの部分は古いインターフェースを前提に設計されていたことを示した。
Nodes, Queues, Surge Scores
A MOAD Factory Model
すべてのソフトウェア依存関係グラフは工場を形成します。各ノードはワークステーションです。各エッジはキューです。作業はノードのキューに入り、処理され、下流のキューへ流れていきます。
2つのスコアが各ノードの特徴を表します:
Surge score = speedup × in-degree
このボトルネックが解消されたときに、下流にどれだけの作業が流れ込むかを示します。in-degreeが5(5つの上流依存関係がすべてこのノードに流れ込む)で100倍のスピードアップが発生する場合、下流に500倍のsurgeが生じます。
Betweenness = in-degree + out-degree
このワークステーションが全体のフローに対してどれだけ中心的な役割を果たしているか。高ビトウィーンネスは、多くのパスがこのノードを通過することを意味する。
2つの典型例:
Workaholic node: 高ビトウィーンネス、高サージスコア。これはボトルネックである。上流のすべてのキューがこれによって滞留する。下流の容量を段階的に増やさずにこのボトルネックを除去すると、下流のすべてが同時に崩壊する。
Glutton node: 高アウトディグリー、低サージスコア。投入されたすべてを消費する。ボトルネックがスループットではなく内部にあるため、痛みを感じない。停止を忘れた機械 — 作業は入るが何も出ず、ノードは永遠に「ビジー」と報告する。
MOAD-0001 & MOAD-0005: カップリング事例
GHC の事例
GHC の依存関係リゾルバに MOAD-0001 パッチを適用する前:N=50,000 の依存関係でビルドに 17 分かかっていた。適用後:10 秒。高速化:100×。
下流では何が起こるか? 17 分ごとのバッチ到着に合わせてペースを合わせていたすべてのビルドキャッシュ、アーティファクトストア、CI ランナーが、1 時間あたり 100× の完了ビルドを受け取るようになる。1 時間に 60 個のビルド成果物を扱うよう設計されていたキャッシュは、6,000 個を受け取るようになる。
これが MOAD-0005:キャッシュスタンピード欠陥である。新しい到着率に合わせて事前にウォームアップされていなかったため、すべてのキャッシュキーが同時にミスする。MOAD-0001 の修正が MOAD-0005 を生み出す。
この結合は偶発的ではない。構造的である。入次数 > 1 の O(N²) → O(N) の高速化は、1 を超えるサージスコアを生成する。100 を超えるサージスコアは MOAD-0005 の候補となる。
開示前のステージング
ビルドシステムは1時間あたり1,000件のパッケージ依存グラフを処理します。グラフトラバーサルでMOAD-0001を修正したことで、ビルド時間が60分から30秒に短縮され、120倍の高速化を実現しました。システムは現在、1時間あたり120,000件のグラフを処理しています。
いつ止めるか:停止条件
停止条件
パッチが停止条件を満たす — すなわち:開示しない — のは、以下の4つの条件がすべて同時に成立する場合です:
1. パッチが本番システムに存在する(マージ済み、デプロイ済み)
2. 下流への影響を管理する担当者が割り当てられていない
3. 下流の欠陥(MOAD-0005)が未解決
4. 高速化が 100× 以上
4つすべてが揃う = 赤ちゃんが泣く。マージする前にチームを割り当てよ。マージした後ではない。
世話人のいないノードは、作業員のいない作業場のように動作する。仕事が溜まり、誰かが倒れる。パーマコンピュータの原則:ドライバーをステージングせずにディスパッチアルゴリズムを修正してはならない。ドライバー3人、300万人:アルゴリズムの解除は、より速い配送ではなく、未処理リクエストの殺到を生む。
WALL-E:大食いと仕事中毒
WALL-Eモデル
ピクサーのWALL-Eは、工場モデルの失敗を最も明確に描いている。ホバーチェアに座った大食いたちは、摩擦なく食べ続けている。仕事中毒——WALL-E、EVE——は、供給を維持するために自らのステーションで死にかけている。
大食いノード(ホバーチェアに座った人間)は最大の出力次数を持つ:与えられたものをすべて消費し、何も生み出さない。そのサージスコアはゼロ——それはシンクである。出力に何も蓄積しないため、痛みを感じない。ただ消費するだけだ。
The workaholic node (WALL-E) has maximum betweenness: everything flows through it. It absorbs all input. It produces the only output. Its surge score, if ever it were replaced by a faster model, would flood every downstream queue simultaneously.
The defect in the WALL-E system is not the gluttons. It is the absent caretaker: no one assigned to balance the workstations. No one staged the capacity before running the algorithm.
The pip Case: Pre-Disclosure Checklist
You discover MOAD-0001 in Python's pip dependency resolver. Measured speedup: 200×. pip runs on approximately 400 million installs per day. PyPI serves the packages.