Frederick Brooks:the Mythical Man Month——essays On Software Engineering@1995 (20周年纪念版)
軟體工程的迷思與真諦:費德烈克·布魯克斯的關鍵論點解析
本文摘錄並闡述了費德烈克·布魯克斯(Frederick P. Brooks, Jr.)在其著作《人月神話》(The Mythical Man-Month)中提出的主要論點,特別是結合了週年紀念版中新增的內容,以呈現其思想的演進與對當代軟體工程的影響。
一、軟體開發的本質難題
布魯克斯開宗明義地指出,軟體開發是一項充滿挑戰的工作,他稱之為「柏油坑」(Tar Pit)。這不僅是因為開發過程中的種種「偶發性」(Accidental)困難,例如工具不足、語言限制、機器資源匱乏等,更因為軟體本身的「本質性」(Essence)難題:
- 複雜性(Complexity): 軟體實體比其他人類建造物(如建築、汽車、硬體)更為複雜,因為它們很少有完全相同的重複部分。即使有,也會被抽象化為副程式或模組。大型軟體系統的複雜性會隨著規模非線性增長,這導致團隊溝通困難、產品缺陷、成本超支、時程延誤,也使得理解程式的所有狀態變得異常困難,進而影響可靠性。
- 一致性(Conformity): 軟體常常需要遵循外部介面(如使用者、硬體、其他軟體)的要求。這些介面可能因設計者不同或隨時間變化而缺乏統一性,軟體必須隨之調整,這種被迫的一致性增加了軟體的複雜性。
- 易變性(Changeability): 成功的軟體總是不斷面臨變革的壓力。一部分來自新應用和使用者需求,一部分來自運行環境的變化(如新的硬體)。軟體作為一種純粹的思維產物,極易被修改,這使得變革頻率遠高於硬體產品,也增加了複雜性。
- 不可見性(Invisibility): 軟體本質上不具空間維度,難以像建築或硬體那樣用幾何圖形來直觀呈現。控制流、資料流、依賴關係等多重圖形疊加在一起,使得全面理解軟體結構變得困難,這不僅阻礙了單一設計師的思考,也嚴重妨礙了團隊成員之間的溝通。
布魯克斯認為,過去軟體生產力的大部分提升,來自於消除了偶發性困難(如高階語言、分時系統、整合開發環境)。然而,當偶發性困難被大量消除後,要取得數量級的提升,就必須直接面對本質性難題。
二、「人月」的迷思
「人月」(Man-Month)作為衡量軟體開發工作的單位是一個危險且具有欺騙性的迷思。
- 努力與進度的混淆: 「人月」暗示人和時間是可以互換的,即增加人手可以縮短時程。然而,只有當任務可以完全獨立地分配給多人時(如採摘棉花),人和時間才是可互換的。對於需要大量溝通和協調的軟體開發而言,情況並非如此。
- 溝通成本: 當任務必須在多人之間劃分時,溝通(包括培訓和相互溝通)的成本會大大增加。如果任務之間的相互關係複雜,溝通成本甚至會抵消分工帶來的好處,導致增加人手反而延長時程。
- 布魯克斯法則(Brooks’s Law): 在時程落後的軟體專案中增加人手,只會讓專案更加落後。這是因為新人需要時間學習和融入團隊,並增加了團隊的溝通和協調負擔,這些額外工作會消耗現有團隊成員的時間,進一步拖慢進度。
專案經理必須認識到時程落後是日積月累的結果,而不是突然的災難。每個微小的延遲都會累積,特別是那些位於關鍵路徑上的任務。有效的時程控制需要銳利的里程碑(具體、特定、可衡量),並透過關鍵路徑分析來識別關鍵任務。經理必須鼓勵團隊報告真實狀況,即使是壞消息。布魯克斯建議建立一個小型「規劃與控制」團隊來協助追蹤進度,使經理能夠及時發現問題並採取行動。
三、概念完整性與架構師的角色
為了克服軟體本質性難題中的複雜性,並確保產品對使用者而言易於理解和使用,布魯克斯強調了「概念完整性」(Conceptual Integrity)的重要性。
- 易用性的核心: 對於給定的功能水平,一個系統如果能以最簡單、最直接的方式來完成任務,它就是最好的。簡潔性和直接性源於概念完整性,即系統的各個部分都反映相同的設計理念和取捨權衡。
- 單一設計師: 概念完整性要求設計源自單一的思維,或是一小群意見一致的協同思維。
- 架構師的分工: 由於大型專案需要大量人手,必須將「架構」(Architecture)與「實現」(Implementation)分開。架構師負責定義使用者可見的產品外部規格,作為使用者的代理人,確保設計符合使用者利益並具有概念完整性。實現者則負責將規格轉化為實際程式碼,他們在給定的架構下擁有創造力。
- 「第二系統效應」(Second-System Effect): 架構師設計的第一個系統往往簡潔明瞭,因為他們謹慎行事。然而,設計第二個系統時,他們往往傾向於加入所有在第一個系統中被擱置的奇思妙想和修飾,導致過度設計。專案經理應警惕這種效應,並透過賦予功能明確的成本(空間和時間)來約束設計。
-
溝通與規範: 維護概念完整性需要有效的溝通機制,包括:
- 書面規格(手冊): 作為架構師的主要產出,手冊必須精確、完整、詳細,並明確界定設計規範和未規範的部分。建議同時提供形式化定義和散文式解釋,但必須指定一個標準。
- 直接引入(Direct Incorporation): 在軟體中,透過在程式碼中直接引入公共規格的定義(如使用巨集或包含檔),可以有效確保各部分介面的一致性。這是一種比單純依賴規格文檔更好的方法。
- 會議與仲裁: 透過定期會議討論設計問題,並指定最終決策者(如首席架構師),以避免無休止的爭論。
- 電話記錄: 鼓勵實現者向架構師詢問規格解釋問題,並記錄這些問答,廣泛分發給所有相關人員,以確保資訊傳播和理解一致性。
- 獨立產品測試: 獨立測試團隊是專案經理最好的朋友,他們從使用者的角度檢查產品是否符合規格,是傳遞設計意圖的重要環節。
四、組織與團隊
大型軟體專案的組織結構應旨在減少所需的溝通和協調。
- 分工與專業化: 組織透過分工和專業化來達成此目的。雖然正式的權力結構通常呈樹狀,但實際的溝通結構是一個網絡,需要輔以其他機制(如工作組、委員會)來彌補。
- 專案團隊的核心角色: 每個子專案團隊都需要兩個核心角色:生產者(經理)和技術指導(架構師)。這兩個角色所需的才能不同,可以由一人兼任(僅適用於小團隊)、生產者為主導、或技術指導為主導,這取決於團隊成員的才能組合。
- 外科團隊(Surgical Team): 為了在高生產力和概念完整性之間取得平衡,布魯克斯提出「外科團隊」模型。團隊圍繞一位高生產力的「首席程式設計師」(外科醫生),配備副手、行政人員、編輯、程式文書、工具工程師、測試人員、語言專家等支持人員。這使得設計和核心程式碼由少數人完成,但能運用多人的努力,同時大幅減少了溝通路徑。
五、軟體開發的實際方法
除了組織和設計原則,布魯克斯也提出了一些實用的軟體開發方法:
- 計畫丟棄一個(Plan to Throw One Away): 這是《人月神話》中最廣為人知的論點之一。由於在構建第一個系統時必然會學到新的經驗並發現設計中的缺陷,第一個系統往往只是勉強可用。更好的做法是計畫將第一個系統作為原型丟棄,然後根據經驗重新設計和構建真正的產品。這是一種承認設計和需求在實現過程中會不斷變化的策略。
- 增量式開發(Incremental Development): 後續對「計畫丟棄一個」觀點的修正,以及對傳統瀑布模型的批判,引出了增量式開發模型的優越性。這不是一次性構建整個系統,而是在一個運行的基本骨架上,逐步添加和完善功能模組。這使得在開發過程中始終有一個可運行的系統,可以更早進行使用者測試,並更容易進行進度控制。微軟的「每夜構建」(Build Every Night)即是這種理念的極致體現。
- 快速原型(Rapid Prototyping): 作為增量式開發的一部分或獨立步驟,快速原型旨在快速構建系統的關鍵部分或介面,以便及早獲取使用者反饋, уточняване (refining)需求,解決需求不確定性這一軟體開發中最困難的部分。
- 程式碼的「另一面」(The Other Face): 除了機器可讀的程式碼,程式還有一張面向人類使用者的「另一面」,即文檔。文檔的重要性常常被低估,維護也困難。布魯克斯強調應將文檔嵌入原始碼中,使程式碼本身「自解釋」(Self-Documenting),並利用高階語言、格式編排、注釋等手段來提升可讀性。他對詳細的流程圖(flow chart)持批判態度,認為在高階語言時代,它已淪為低效的工具。
- 銳利的工具(Sharp Tools): 好的工具對於提升生產力至關重要。這包括高效的電腦硬體(尤其是有足夠的記憶體)、作業系統、高階語言、偵錯工具、程式庫、文字編輯系統等。布魯克斯特別強調高階語言和互動式程式設計對於提高生產力的巨大潛力,認為它們能夠消除許多偶發性困難。
六、迴響與驗證:二十年後再回顧
《人月神話》出版二十年後,布魯克斯在紀念版中對原書的論點進行了回顧和評價,證實了其中許多觀點的持續有效性,並對一些觀點進行了修正和補充。
- 概念完整性與架構師的再肯定: 他重申概念完整性是產品品質的核心,並指定系統架構師是達成此目標的最重要步驟。這不僅適用於軟體,也適用於任何複雜的構建。
- 「人月」迷思的數據支持: Barry Boehm 等人的量化研究證實了人和月之間關係的非線性,印證了「人月」作為生產力單位是具有誤導性的。Brooks’s Law 雖然簡化,但在實踐中仍是重要的警示。
- 資訊隱藏(Information Hiding)的平反: 布魯克斯承認當年對 Parnas 的資訊隱藏概念的質疑是錯誤的。他現在堅信資訊隱藏(體現為模組化、抽象資料類型、物件導向)是提高軟體設計水平的關鍵,是構建可重用模組和物件庫的基礎。
- 瀑布模型的過時: 他明確指出傳統的瀑布模型存在根本性缺陷,無法適應需求的變化和設計的迭代。增量式開發和快速原型是更優越的方法。
- 人員的重要性: 他強調團隊品質和管理對於專案成功的決定性作用,遠超工具和技術。DeMarco 與 Lister 的《人件》(Peopleware)等著作印證了這一點。
- 授權的力量: 他借鑒 Schumacher 的思想,主張將權力下放給專案團隊,賦予他們更多自主權和責任感,這能極大地激發創造力和提升士氣。
- 微型電腦革命的巨大影響: 他承認自己當年未能預見微型電腦和隨之而來的套裝軟體產業的爆發。這場革命改變了電腦的使用方式(普羅大眾),也改變了軟體的開發方式(工具的提升,構建流程的改變)。
- 「購買」與「構建於上」的新模式: 套裝軟體的普及催生了一種新的軟體開發模式:在現有套裝軟體之上進行定製開發(Metaprogramming)。這種模式透過重用大型、已驗證的功能模組(套裝軟體本身),直接攻擊了本質性難題,極大地提升了生產力,是未來軟體開發的重要方向。
總而言之,《人月神話》的核心論點圍繞著軟體開發固有的複雜性、管理上的常見錯誤(人月迷思)、設計上追求概念完整性的重要性、組織團隊的方法、以及實用的開發實踐。週年紀念版的內容則結合了數十年的產業發展,驗證並深化了這些觀點,尤其強調了資訊隱藏、增量開發、人員重要性以及套裝軟體作為構建組件的新趨勢。這些洞見對於理解和應對當代軟體工程的挑戰仍然具有深刻的指導意義。
comments
comments for this post are closed