我在讀《人月神話》時,對「沒有銀彈(No Silver Bullet)」這個命題印象最深:軟體開發上,不會有像銀彈這種可以快速解決開發時程延誤或重大錯誤的捷徑。這篇文章整理書中對「本質性工作」與「附屬性工作」的區分,以及曾讓軟體界有所突破的各項技術為什麼都屬於後者。
為什麼軟體開發沒有銀彈?
書中花了兩章的篇幅說明:在軟體開發上,不會有類似銀彈這種可以快速解決開發時程延誤或發生重大錯誤的捷徑。原因是軟體工程存在著無法被工具消除的「本質性困難」,我把它們整理如下:
| 困難 | 說明 |
|---|---|
| (1) 複雜性 | 軟體開發的複雜度與規模大小並非線性關係,複雜度增加的情況遠遠超過線性預估。也因為結構上的複雜性,軟體擴充新功能時難保不會產生新的副作用。程式裡的狀態難以一一列舉,也更加難以明瞭,整個產品會變得更不可靠。另外因為複雜性,開發時也容易遇到溝通困難、時程落後、成本超支。 |
| (2) 配合性 | 軟體必須配合其他的領域,例如電腦、不同語言、不同介面等等。 |
| (3) 易變性 | 1. 時常面臨修改,因為軟體是純思考的產物,有無限延展性,修改容易,也因此特別容易面臨修改。2. 成功的軟體生命周期會比硬體來得長,因此常需要配合硬體環境去修改。 |
| (4) 隱匿性 | 過於抽象、難以理解。 |
哪些技術突破屬於附屬性工作?
在這邊書中也提出了幾項過去曾讓軟體界有所突破的重大發展,但這些突破都是屬於附屬性的,沒辦法突破軟體工程本質上的複雜性:
- 高階語言:高階語言的發行的確是最強而有力的一次突破,對生產力而言至少有五倍以上的提升,並伴隨得到可靠度、簡潔性、理解力上的增益。它把和程式內涵一點關係都沒有的那一整層複雜性給去除了。
- 分時技術:分時技術對於程式設計師的生產力及產品品質有了重大的提升。因為分時確保了即時性,使我們得以持續保持住腦子裡對複雜的概觀。但緩慢的回復時間是附屬難題。
- PS:分時系統:作業系統依中央處理器排程(CPU Scheduling),將中央處理器的時間切割為極小的時間片段(Time Slice)。
- 統一的軟體開發環境:Unix 和 Interlisp 是第一個得到廣泛使用的整合開發環境,藉由提供完整的程式庫、統一的檔案格式、管道和過濾器,以促成軟體的共用。
- 物件導向程式設計:抽象資料型別和階層式型別的使用。允許介面可以用次一層級的型別去做進一步的細緻化,隱藏類別裡面的實際操作,讓開發者可以在開發時專注於設計該類別的邏輯,排除掉許多附屬性困難。
- 人工智慧:例如語音辨識、圖形辨識。
- 專家系統:一支具有廣義推理引擎與知識庫的軟體程式,被設計成可接收輸入資料和假設條件的軟體程式,然後藉由知識庫來推導出邏輯上的結果。這項技術所帶來最重要的進步,是將應用領域的複雜性從程式中區隔出來。
- 『自動化』程式設計:換句話說是用更高階的語言來編寫程式。未來可能我們會是用『建構』的方式來寫程式,也就是更完備的函式庫,可以讓寫程式的複雜度更加的降低。
- 圖形化程式設計(graphical programming):一個博班論文提出的新想法,但本書覺得要有成果應有些困難。
- 軟體的驗證:編輯軟體自動驗證程式的某些錯誤,例如比對資料型態、變數是否已宣告等等。
- 環境與工具:用來除錯、或是搜尋該類別曾被用在哪些地方的開發工具。
- 工作站:也就是編輯所消耗的時間,若是機器的編譯時間減少,程式師能花在思考上的時間就會變多。
我從「沒有銀彈」學到什麼?
我的體會是:這四項本質性困難(複雜性、配合性、易變性、隱匿性)解釋了為什麼再好的工具都無法讓軟體專案「一夜搞定」。新技術能削減的,多半是附屬性的工作量——編譯、環境、重複勞動——而需求理解、抽象設計與溝通協調這些本質性工作,仍然需要人投入時間與判斷。這也提醒我,在評估任何「提升開發效率 X 倍」的新工具時,先分辨它解決的是本質性還是附屬性問題,才不會對銀彈抱持不切實際的期待。
延伸閱讀
- 沒有銀彈:軟體工程的本質性與附屬性工作:同樣聚焦 軟體工程、人月神話,可接著比較不同情境的做法。
- 人月神話讀後筆記:軟體專案管理不可不慎的經典啟示:同樣聚焦 專案管理、人月神話,可接著比較不同情境的做法。
- 人月神話讀後筆記:為什麼延遲的專案不能靠加人救?:同樣聚焦 專案管理、人月神話,可接著比較不同情境的做法。
常見問題
什麼是軟體工程中的「沒有銀彈」?
這是《人月神話》作者 Fred Brooks 提出的著名命題,指軟體開發不存在任何單一技術或管理方法,能在十年內讓生產力、可靠度與簡潔性提升一個數量級。因為軟體的本質性困難無法被工具消除。
本質性工作與附屬性工作有什麼差別?
本質性工作是軟體本身的困難,如複雜性、配合性、易變性與隱匿性;附屬性工作則是實作過程中伴隨產生的困難,例如語言限制、編譯時間、開發環境等。歷史上的重大突破多半只削減了附屬性工作。
軟體工程的四大本質性困難是什麼?
複雜性(複雜度隨規模非線性成長)、配合性(軟體必須配合硬體、語言與介面)、易變性(軟體容易修改因此頻繁變動)、隱匿性(軟體過於抽象難以視覺化理解)。
物件導向程式設計為什麼被歸類為附屬性突破?
物件導向透過抽象資料型別與隱藏類別實作,讓開發者專注於設計類別邏輯,排除掉許多附屬性困難。但它並沒有消除問題本身的複雜性,因此仍屬於附屬性工作的突破。
專家系統對軟體工程最大的貢獻是什麼?
專家系統結合廣義推理引擎與知識庫,能接收輸入資料與假設條件並推導邏輯結果。它最重要的進步是將應用領域的複雜性從程式本體中區隔出來,讓程式碼更聚焦。
AI 算是軟體開發的銀彈嗎?
依《人月神話》的框架,AI 同樣只能削減附屬性工作,例如自動補全程式碼、產生文件初稿。需求理解、架構設計與品質判斷等本質性工作,仍需要工程師投入思考與驗證。
最後更新
2026-08-28(原文發布於 2012-08-17,本文保留原始筆記內容並補上 GEO 結構。)
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2012-08-17
