第一個系統的美德#

一個架構師設計的第一個系統往往是精簡而謹慎的。原因很簡單——他知道自己不懂的東西很多,因此處處小心,不敢輕舉妄動。面對誘人的功能與華麗的裝飾,他會自律地說:「這次先不做,下次再加。」

這種謹慎是一種美德。第一個系統可能不完美,但它通常是乾淨的、一致的、可理解的。

最危險的系統#

然而,當這位架構師信心滿滿地著手設計第二個系統時,情況就完全不同了。Brooks 指出:

「第二個系統是一個人所設計的最危險的系統。」

為什麼?因為在設計第一個系統的過程中,架構師累積了大量被擱置的想法——那些「下次再做」的功能、那些「以後可以改進」的技術方案。當第二個系統的機會來臨時,這些壓抑已久的想法如洪水般傾瀉而出。

第二系統效應的核心危險在於:架構師同時擁有了過多的自信過多的積壓想法。自信讓他低估風險,積壓的想法讓他過度設計。兩者結合,幾乎必然導致一個臃腫、延遲、超支的系統。

兩種過度工程#

第二系統效應主要表現為兩種形式的過度工程:

功能裝飾(Functional Embellishment)#

架構師把第一個系統中所有被捨棄的功能,一股腦地塞進第二個系統。每一個功能看似合理——「上次使用者就要求過這個」「這個功能只需要多花一點力氣」——但累積起來,系統變得龐大而笨重。

功能裝飾的特徵:

  • 過多的選項模式,讓使用者無所適從
  • 過度的通用性,試圖滿足所有可能的使用情境
  • 每個功能都有道理,但整體卻失去了焦點

技術精煉(Technique Refinement)#

在第一個系統中證明有效的技術手法,到了第二個系統中被過度精煉。架構師不滿足於「夠好」,而是追求將某個技術做到極致——即使邊際效益早已遞減。

功能裝飾是廣度上的過度——加入太多功能;技術精煉是深度上的過度——在單一技術上鑽得太深。兩者往往同時發生,而且互相加劇。

OS/360:活生生的案例#

Brooks 以 IBM 的 OS/360 作為第二系統效應的典型案例。對許多參與 OS/360 開發的架構師來說,IBM 的 Stretch 電腦是他們的「第一個系統」。OS/360 則是他們的第二個系統。

結果如何?OS/360 同時遭受了兩種過度工程的侵害:

  • 功能裝飾:系統提供了過多的選項與控制參數,試圖涵蓋所有可能的使用情境。使用者手冊厚得令人望而生畏。
  • 技術精煉:某些在 Stretch 上驗證過的技術被過度推展,增加了不必要的複雜度。

最終,OS/360 不僅延遲交付,而且嚴重超出預算。

自律與解藥#

Brooks 認為,對抗第二系統效應需要有意識的自律。架構師必須:

嚴格的成本會計#

為每一個功能計算明確的功能與成本比率。不能僅僅因為「使用者可能需要」就加入功能,而必須量化它帶來的價值與它消耗的資源。

拒絕無節制的裝飾#

堅持要求每一個功能都必須有充分的正當理由。架構師必須問自己:「如果省略這個功能,系統會因此變得更好還是更差?」很多時候,答案是「更好」。

與實作者的互動紀律#

實作者可以作為一股制衡力量。當架構師提出一個華而不實的功能時,實作者應該有權力和義務提出質疑:「這值得嗎?成本是多少?」

最有效的解藥是經驗。已經設計過第二個系統(並吃過虧)的資深架構師,最能辨識第二系統效應的徵兆。因此,讓有經驗的架構師擔任導師或審查者,是組織層面最好的防禦措施。

普遍的傾向#

第二系統效應並非個別現象。Brooks 觀察到,第二個系統幾乎普遍地呈現出以下特徵:

  • 延遲交付——功能太多,工期不斷延長
  • 超出預算——複雜度超出預期,開發成本失控
  • 效能不佳——過多的通用化與功能堆疊拖累了系統效能

第二系統效應不只發生在軟體領域。任何領域的創作者——建築師、作家、電影導演——在第二部作品中都容易犯下同樣的錯誤。認識到這個傾向的存在,本身就是最好的防禦。

本章要點#

  • 第一個系統因謹慎而精簡,第二個系統因自信而臃腫
  • 過度工程有兩種形式:功能裝飾(加太多)與技術精煉(鑽太深)
  • 每個功能都必須通過嚴格的成本效益分析
  • 實作者的回饋是制衡架構師過度設計的重要力量
  • 經驗是對抗第二系統效應最有效的解藥