狼人與銀彈#

Brooks 以一個令人難忘的隱喻開場:軟體專案就像狼人——平時看起來無害,卻能在不經意間變成恐怖的怪物,進度失控、預算爆炸、產品缺陷百出。所有人都渴望一顆銀彈(Silver Bullet),一種神奇的技術或方法,能夠一舉殲滅軟體開發中的怪物。

然而,Brooks 的結論冷酷而直接:

「沒有任何單一的技術或管理方法,能在十年內帶來軟體生產力十倍的提升。」(There is no single development, in either technology or management technique, which by itself promises even one order-of-magnitude improvement within a decade.)

這篇文章最初發表於 1986 年的 IFIP 大會,是 Brooks 被引用最多的著作之一,其核心論點至今仍在軟體工程界引發共鳴。

本質與附屬:關鍵的區分#

Brooks 將軟體開發的困難分為兩大類:

本質困難(Essence)#

本質困難是軟體問題本身固有的概念複雜度,無法透過更好的工具消除。軟體的本質是建構一組互相嵌套的抽象概念——資料結構、演算法、業務規則、介面協議——這些概念的複雜性來自問題本身,而非我們表達它們的方式。

附屬困難(Accident)#

附屬困難是我們目前用來表達與實現這些概念的工具和方法所帶來的額外障礙。例如,早期程式設計師必須用機器語言編碼,這是一種附屬困難;高階語言的出現大幅消除了這個障礙。

過去數十年軟體生產力的重大突破——從機器語言到高階語言、從批次處理到互動式運算——都是在攻克附屬困難。但隨著附屬困難不斷被消除,剩下的主要是本質困難,而這才是真正的硬骨頭。

軟體的四大本質特性#

Brooks 歸納出軟體固有的四項本質特性,解釋了為何軟體開發如此困難:

  • 複雜性(Complexity):軟體實體中沒有兩個部分是完全相同的。這與物理系統不同——建築可以有重複的構件,但軟體的每個元素都獨一無二。複雜性隨規模以非線性方式增長。
  • 配合性(Conformity):軟體必須配合各種外部介面——硬體、作業系統、法規、既有系統。這些介面往往是任意且不合理的,卻無法改變。
  • 易變性(Changeability):軟體總是被要求改變。因為它比硬體更容易修改,所有的變更壓力最終都落在軟體身上。
  • 不可見性(Invisibility):軟體沒有天然的幾何形狀或空間表達方式。你無法像建築藍圖那樣「看見」軟體的結構,這使得溝通與理解格外困難。

過去的真正突破#

Brooks 承認,過去確實有一些技術帶來了巨大的生產力提升,但它們都是攻克附屬困難:

  • 高階語言:消除了逐行撰寫機器碼的負擔,可能帶來了五倍以上的生產力提升
  • 分時系統(Time-sharing):消除了批次處理的等待時間,加速了開發迴圈
  • 統一的程式設計環境(如 Unix):提供了整合的工具鏈,減少了工具之間的摩擦

候選銀彈:為何都不夠格#

Brooks 逐一檢視了當時被寄予厚望的技術,解釋為何它們都無法帶來十倍提升:

  • Ada 等現代高階語言:提供了漸進式改善,但不是量級的突破
  • 物件導向程式設計(OOP):有助於模組化設計,但主要解決的仍是表達層面的問題
  • 人工智慧:當時的 AI 技術遠未成熟,無法自動解決軟體的本質複雜性
  • 專家系統:能在狹窄領域輔助決策,但無法取代軟體設計的創造性工作
  • 自動程式設計:除了在特定領域,真正的自動化程式生成仍是幻想
  • 圖形化程式設計:軟體的複雜性無法用二維圖形充分表達
  • 程式驗證:正確性證明本身的工作量可能不亞於編寫程式
  • 更好的開發環境與工具:有幫助,但只是漸進式改善

Brooks 警告:對銀彈的盲目追求本身就是危險的。它讓管理者忽視真正重要的漸進式改善,轉而追逐不切實際的承諾。

真正有希望的方向#

雖然沒有銀彈,Brooks 認為有幾個方向能有效攻克本質困難:

購買而非自建(Buy vs. Build)#

最有效的方式是根本不寫程式——購買現成的商業軟體包。當市場上有適用的產品時,購買遠比自建經濟。

需求精煉與快速原型#

軟體最難的部分是決定「要建什麼」。透過快速原型(Rapid Prototyping)讓使用者儘早看到、觸碰到系統,是精煉需求的最佳方式。

漸進式開發(Incremental Development)#

不要試圖一次建好整個系統。讓軟體生長(grow, not build),從一個能運行的核心開始,逐步增加功能。

培養傑出的設計者#

軟體設計是一種創造性活動。最好的設計者與平庸者之間的差距可能是十倍。組織應該投資於識別、培養和留住傑出的設計人才。

雖然沒有一顆銀彈能帶來戲劇性的突破,但許多小改善疊加起來,仍然可以帶來顯著的進步。真正的進步來自紀律、持續的努力、以及對本質困難的誠實面對

本章重點#

  • 軟體開發的困難分為本質(概念複雜度)和附屬(工具限制),過去的突破主要消除了附屬困難
  • 軟體的四大本質特性——複雜性、配合性、易變性、不可見性——使得根本性的突破極為困難
  • 沒有任何單一技術或管理方法能帶來十倍的生產力提升
  • 真正有希望的方向是購買現成軟體、快速原型、漸進式開發、以及培養傑出設計者
  • 進步來自許多小改善的累積,而非對銀彈的追求