本書對「複雜性」採取一個務實的定義:
複雜性是任何與軟體系統結構有關、使其難以理解或難以修改的特性。
換言之:難以理解、難以修改 → 複雜;容易理解、容易修改 → 簡單。
複雜性的多種樣貌#
複雜性可以以許多形式呈現,例如:
- 看不懂某段程式碼是怎麼運作的
- 想做一點點小改進,卻得花上很多力氣
- 不清楚系統裡哪些部位需要被修改才能完成任務
- 修了一個 bug 卻又冒出另一個
從成本與效益的角度理解#
- 複雜系統:要做出一點小改進,都需要投入大量工作
- 簡單系統:相同甚至更大的改進,反而花費較少力氣
複雜性與系統規模無關#
人們常用「複雜」來形容大型且功能繁複的系統。但本書的定義裡:
- 即使是大型系統,只要好維護,就不算複雜
- 反過來說,一個小而功能單純的系統,也可能極其複雜
當然在現實中,幾乎所有龐大且精細的系統都很難維護,所以它們也符合本書定義的「複雜」。
複雜性由「最常見的活動」決定#
如果系統某些部位非常複雜,但幾乎沒人會碰它們,那它們對整體複雜性的影響就有限。可以用一個粗略的數學式來表達:
$$ C = \sum_{p} c_p \cdot t_p $$
- $c_p$:第 $p$ 部分的複雜度
- $t_p$:開發者花在該部分上的時間比例
- $C$:系統整體的複雜度
把複雜性隔離(isolate)在沒人會看到的地方,效果幾乎等同於完全消除它。
複雜性對讀者比作者更明顯#
- 你寫的程式自己覺得單純,但別人覺得複雜——那它就是複雜的
- 遇到這種情況,值得追問對方為何覺得複雜,多半能挖出有趣的教訓
身為開發者,你的職責不只是寫出自己好維護的程式,而是寫出別人也容易上手的程式。