不是所有複雜度都能靠 rebalancing 解決#
Chapter 11 結尾留下伏筆:rebalancing 有時只是把 local complexity 換成 global complexity,反之亦然。這是成長驅動的複雜度,本章專治此症。
本章視角橫跨物理、生物、社會科學,最終指向一個結論:軟體設計也是一種「網路型系統」,能用碎形幾何處理成長。
系統為何成長#
成長是健康系統生命週期的一部分——軟體、生物、公司、城市都從小開始,再隨時間擴張。Geoffrey West 的研究指出,所有「網路型系統」都遵循相同的成長動力學。
網路型系統(Network-Based Systems)#
定義(West, 2018):
- Space filling:透過階層式分支網路把能量送到所有部分
- Invariant terminal units:能量在終端單元被消費,這些終端單元規格不隨系統大小改變
- Optimization:系統不斷演進以最小化能量浪費、最大化可用能量
例子:
- 生物循環系統:血管把氧氣與養分送到每個細胞,細胞規格固定
- 城市:水、電、道路、通訊送到每個居民
- 公司、社會結構、網際網路 也都是網路型系統

Figure 12.1: 循環系統與城市都是網路型系統的範例
軟體設計也是網路型系統#
軟體流動的「能量」是知識(knowledge)。模組間的互動就是輸送知識的管路。
- Space filling:知識最終流到所有元件,從高階模組到機器碼
- Invariant terminal units:所有知識最終被翻成同樣的機器碼,硬體規格不變
- Optimization:模組邊界的設計可以被優化
整合強度反映流經的知識,距離反映知識穿越的路徑。
為什麼系統會「想要」成長#
不同層面的成長速率不同:
- Sublinear(次線性):城市規模翻倍,加油站只需多 85%;獵犬比巴哥犬重一倍,每日卡路里只多 75%
- Superlinear(超線性):城市規模翻倍,社交互動與機會超過兩倍

Figure 12.2: 成長動力學:線性 (a)、超線性 (b)、次線性 (c)
系統越大越有效率,因為很多正面層面是次線性成長:
- 大型動物每單位重量耗能更少
- 大船每單位貨物的阻力更低
- 城市人口擴大,生產力與創新會更快成長
為什麼系統不能無限成長#
負面層面也跟著成長——城市越大,犯罪率、疾病傳染率、生活成本也超線性成長。
伽利略(Galileo Galilei)在 1638 年的 Two New Sciences 中以木樑說明:
- 木樑長寬高都加倍 → 重量增加 8 倍(三維)
- 抗斷裂強度由斷面積決定 → 只增加 4 倍(二維)

Figure 12.3: 木樑放大的尺度效應
「人若身高極端增加,他將在自己的重量下崩塌。」——Galileo
當負面成長超越正面成長,系統就到達其成長極限。
軟體設計的成長動力學#
把功能加倍不需要把知識加倍——新功能可以建立在既有知識上。所以新增功能很誘人。
但隨著元件增加,互動會超線性成長。

Figure 12.4: 擴充功能時,知識呈次線性成長
假設每個元件都需要與其他元件互動,互動數隨元件數呈組合爆炸:
| 元件數 | 可能互動數 |
|---|---|
| 5 | 10 |
| 10 | 45 |
| 20 | 190 |

Figure 12.5: 互動數相對於元件數呈超線性成長
我們的認知能力幾乎是固定的。當互動量超過認知極限,系統就跨越「複雜門檻」。
軟體成長動力學總結:
- 功能(functionality)→ 線性成長
- 知識(knowledge)→ 次線性成長
- 複雜度(complexity)→ 超線性成長
- 我們的認知能力 → 沒有成長

Figure 12.6: 軟體系統中的成長動力學(功能/知識/複雜度/認知)
創新:突破成長極限#
伽利略提出兩條路:
- 更強的材料:例如骨頭若是鋼做的,動物就能更巨大
- 改變形狀與比例:例如他為「三倍大的骨頭」畫的形狀草圖

Figure 12.7: 伽利略畫的骨頭形狀變化草圖
回看城市:
- 5,000 年前最大城市約 5 萬人
- 2,000 年前升到 100 萬人
- 100 年前 650 萬人
- 2024 年達 3,700 萬人
這些都靠創新——鋼骨摩天樓讓城市垂直成長、運輸與通訊讓人能遠距通勤。
Eliyahu Goldratt 的話:「技術只在它至少消除了一個限制時才有價值」。創新的本質就是消除某項極限。
軟體中的創新#
軟體系統的成長極限就是它變成 Big Ball of Mud 的時刻。隨功能成長,意外互動(bug、糾纏的模組)也跟著超線性成長。
伽利略的兩條路在軟體中:
- 更強的材料:用 AI 取代人類處理複雜度(目前還沒到位)
- 改變形狀:優化知識在系統中的分布——這是現階段唯一可行的選項
「優化知識分布」就是設計新的抽象(abstraction),讓互動重新被組織。
抽象作為創新#
當互動已經複雜到無法理解,就該優化知識流動。Chapter 4 強調抽象的目的:「create a new semantic level in which one can be absolutely precise」(Dijkstra)。
範例:WolfDesk 第一版 10 個物件全在同一個 namespace。第二版功能加倍——若繼續放在同一邊界,會引發嚴重 local complexity(低 strength + 低 distance)。

Figure 12.8: WolfDesk 第一版實作的物件

Figure 12.9: 引入抽象層級
解法:引入四個高階模組——
CaseManagement、IdentityAndAccess、Distribution、Billing。用新的抽象層級重新組織同一份知識,讓互動結構回到平衡。
公司結構也是同樣道理:部門對外提供服務、對內封裝細節;公司成長時部門再分裂。如 Parnas 所說,所有的重組最終都是責任分配。
碎形幾何#
「高度複雜、自我維持的結構……透過演化出碎形式、階層式分支網路系統,達成所有規模的有效服務。」——Geoffrey West
碎形(fractal) 的特性是「自我相似(self-similarity)」——可以拆解成多個比例縮小的自身複本。
例子:
- 數學:Mandelbrot set、Julia set、Sierpinski 三角、Koch 雪花

Figure 12.10: 數學模型產生的碎形圖樣
- 自然:樹枝、葉脈、雲、銀河系分布

Figure 12.11: 自然界中的碎形圖樣
網路型系統能透過次線性與超線性成長變得更有效率,正是因為背後的能量輸送網路具備碎形幾何。
碎形模組化(Fractal Modularity)#
把這個觀念套用到軟體:
Chapter 10 已經給出軟體設計的「自我相似原則」——balanced coupling。
整合強度與距離都是相對的#
- 一個物件的公開介面,對另一個微服務而言是「實作細節」
- 一個微服務的整合契約,從另一個系統角度看也可能是實作細節
- 距離的尺度也隨抽象層級不同而不同
Balanced coupling 模型可以套用在任何抽象層級——這正是「碎形」的精神。下一章將透過案例展示這如何在實務中發揮。
重點整理#
把軟體看作網路型系統:
- 知識是能量,模組間的介面是輸送管路
- 系統成長時,互動超線性成長 → 複雜度超線性成長
- 突破成長極限要靠抽象層級的創新
- Balanced coupling 是貫穿所有抽象層級的自我相似原則
成長帶來的複雜度,不是「夠強的個別模組」能解決的,必須讓整個結構在每個尺度上都保持平衡。