最佳化系統,而非其元件
Hamming 的系統工程第一法則
Hamming 在第 28 章的核心原則:若你最佳化元件,你很可能會毀掉系統效能。
他以微分分析儀的故事說明此原則。當時有兩個單元需要連接。建造者改善了第二個單元的放大器。在驗收當天,Hamming 執行標準測試——求解 y'' + y = 0,並繪製 y 對 y' 的圖形,預期應為圓形。結果測試失敗。原因在於:改善後的放大器會透過接地電路汲取更多電流。原設計的接地對舊規格足夠,但無法承受新電流等級。介面因此損壞,而非元件本身。
他的概括:大多數系統失效都源於介面,而非元件。元件會經過設計、測試與認證。介面卻往往是事後才設計、很少測試,也從未獨立認證。當元件改變時,其介面行為也隨之改變,而下游系統並未針對這個新介面進行設計。
關鍵不對稱: 元件若有 10 倍的改善,卻可能導致系統效能下降 10 倍——只要該元件所連接的介面存在限制。改善並未累加,反而造成減損。
教育系統作為失敗的系統工程
漢明對教育的案例分析
漢明將此原則應用於教育。最佳化單一科目成績——讓學生在各科測驗中達到最高表現——會培養出在個別測驗中表現良好,但無法跨領域整合知識的學生。
每個元件(科目成績)都獲得改善。系統(教育,定義為整合性理解)卻退化。科目之間的介面——學生跨領域應用知識的能力——從未被最佳化。它萎縮了。
這不是實作上的意外,而是結構性的問題。當你衡量並獎勵元件表現時,你得到的只是元件層級的最佳化。介面在元件指標中是不可見的。
他的處方:找出系統中的瓶頸,然後問如果移除它,下游會發生什麼。移除瓶頸會讓下一個佇列湧入。原本無約束的最佳化會變成新的約束。
追蹤介面退化
Hamming 指出,改善一個元件會改變其介面行為——而系統的其餘部分是根據舊介面設計的。
節點、佇列、尖峰分數
MOAD 工廠模型
每個軟體相依圖都形成一座工廠。每個節點就是一個工作站。每條邊就是一條佇列。工作進入節點的佇列,經過處理,再流向下游的佇列。
每個節點由兩個分數來描述:
Surge score = speedup × in-degree
當瓶頸解除時,有多少工作量會向下游湧入。一個節點若有 in-degree 5(5 個上游依賴同時餵入),且 speedup 為 100×,則會向下游產生 500× 的 surge。
Betweenness = in-degree + out-degree
此工作站對整體流程的中心性。高中介中心性(betweenness)表示許多路徑都經過此節點。
兩種原型:
工作狂節點: 高中介中心性,高突波分數。這就是瓶頸。上游的每個佇列都會因為它而堆積。如果移除此瓶頸卻未先準備下游容量,下游所有流程將同時崩潰。
貪食節點: 高出度,低突波分數。它會消耗所有輸入的東西。它感覺不到痛,因為它的瓶頸是內部的,而非吞吐量。這種機器會忘記停止——工作進入,沒有輸出,而節點永遠回報「忙碌」。
MOAD-0001 與 MOAD-0005:耦合案例
GHC 案例
在 GHC 相依性解析器套用 MOAD-0001 修補程式之前:N=50,000 個相依性需要 17 分鐘才能建置。修補後:只需 10 秒。加速比:100×。
下游會發生什麼事?原本配合 17 分鐘批次到達的每一個建置快取、成品存放區與 CI 執行器,現在每小時會收到 100× 倍的已完成建置。原本設計每小時處理 60 個建置成品的快取,現在每小時會收到 6,000 個。
這就是 MOAD-0005:快取雪崩缺陷。每個快取鍵同時發生未命中,因為沒有快取事先為新的到達速率預熱。MOAD-0001 的修正製造了 MOAD-0005。
這種耦合並非偶然,而是結構性的。任何具有入度 > 1 的 O(N²) → O(N) 加速,都會產生大於 1 的湧現分數。湧現分數大於 100 即為 MOAD-0005 的候選案例。
披露前暫存
某建置系統每小時處理 1,000 個套件依賴圖。您在圖形遍歷中修補 MOAD-0001,將建置時間從 60 分鐘縮短至 30 秒——提速 120 倍。該系統現在每小時可處理 120,000 個圖形。
何時停止:停止條件
停止條件
當以下四個條件同時成立時,修補程式即滿足停止條件——意即:不得揭露:
1. 修補程式已存在於即時系統中(已合併、已部署)
2. 尚未指派負責人來承擔下游影響
3. 下游缺陷(MOAD-0005)尚未解決
4. 加速比 ≥ 100×
四者合一 = 嬰兒啼哭。合併前先分配團隊,而非合併後再分配。
沒有照顧者的節點就像無工人的工作站。工作堆積。有人崩潰。永續電腦原則:未先部署驅動程式前,不要修復分派演算法。三個驅動程式,三百萬人:解除演算法封鎖,帶來的不是更快的交付,而是未處理請求的驚人洪流。
WALL-E:暴食者與工作狂
WALL-E 模型
皮克斯的《WALL-E》以最清晰的形式描繪了工廠模型的失敗。暴食者坐在懸浮椅上,無摩擦地被餵食。工作狂——WALL-E、EVE——在工作站上殫精竭慮,只為維持供應鏈運轉。
暴食者節點(懸浮椅上的人類)具有最大的出度:它消耗所有餵給它的東西,卻不產出任何東西。它的激增分數為零——它是一個匯。它感受不到痛苦,因為在其輸出端沒有任何累積。它只是單純地消耗。
工作狂節點(WALL-E)具有最高的中介中心性:所有流量都必須經過它。它吸收所有輸入,也產生唯一的輸出。如果它被更快的模型取代,其激增分數將同時淹沒所有下游佇列。
WALL-E 系統的缺陷不在於貪食者,而在於缺少照料者:沒有人負責平衡工作站,也沒有人在執行演算法前先規劃容量。
pip 案例:揭露前檢查清單
你在 Python 的 pip 依賴解析器中發現 MOAD-0001。測得的加速效果為 200 倍。pip 每天約執行 4 億次安裝,PyPI 則提供套件服務。