不是所有複雜度都能靠 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: 擴充功能時,知識呈次線性成長

假設每個元件都需要與其他元件互動,互動數隨元件數呈組合爆炸:

元件數可能互動數
510
1045
20190

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: 引入抽象層級

解法:引入四個高階模組——CaseManagementIdentityAndAccessDistributionBilling用新的抽象層級重新組織同一份知識,讓互動結構回到平衡。

公司結構也是同樣道理:部門對外提供服務、對內封裝細節;公司成長時部門再分裂。如 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 是貫穿所有抽象層級的自我相似原則

成長帶來的複雜度,不是「夠強的個別模組」能解決的,必須讓整個結構在每個尺度上都保持平衡