工匠與他的工具#
Brooks 以一句古老的智慧開場:
「工匠的價值,從他的工具便可見一斑。」
優秀的工具能夠大幅提升程式設計的生產力。然而,大多數軟體專案在工具方面的投資嚴重不足。Brooks 認為,專案經理必須認真對待工具的建設,就如同認真對待系統架構本身一樣。
通用工具與專用工具#
專案團隊需要兩類工具:
- 通用工具(common tools):編輯器、編譯器、除錯器等,由整個組織共享維護
- 專用工具(specialized tools):針對特定專案需求量身打造的工具
Brooks 特別強調,每個團隊都應該有一位專職的工具匠(toolsmith)——一位專門負責建造和維護團隊專用工具的程式設計師。這個角色不是兼職,而是全職投入。工具匠了解團隊的需求,能夠快速回應工具方面的問題與改進要求。
工具匠的價值常常被低估。當團隊中每個人都因為缺乏合適的工具而浪費 20% 的時間,一位專職工具匠的投資回報將極為可觀。
目標機器與載具機器#
軟體最終運行的機器稱為目標機器(target machine),它通常是稀缺的共享資源。Brooks 提出兩種開發模式:
直接在目標機器上開發#
所有團隊共享目標機器時間。問題顯而易見:排程衝突、等待時間長、資源爭奪激烈。
使用載具機器開發#
團隊在另一台載具機器(vehicle machine)上進行日常開發,只在需要實際測試時才使用目標機器。載具機器提供以下工具:
- 模擬器(simulator):在載具機器上模擬目標機器的行為,讓開發者無需等待即可測試
- 交叉編譯器(cross-compiler):在載具機器上編譯,產生目標機器的程式碼
- 程式庫系統(program library)——這是所有工具中最重要的
目標機器時間的排程#
Brooks 建議混合排程策略:一部分時間以固定區塊分配給個人,一部分時間保持不排程以供臨時需求。全部排程或全部不排程都會造成效率低落。
程式庫的三層結構#
Brooks 描述了一套精密的程式庫管理系統,由三個子庫組成:
- 遊戲場(playpen):每位程式設計師的私人工作區,可以自由修改和實驗
- 系統整合子庫(system integration sublibrary):經過單元測試的元件在此進行整合測試
- 目前版本(current version):已釋出的基準版本,最穩定可靠
程式碼的晉升路徑是嚴格單向的:遊戲場 → 整合子庫 → 目前版本。每一次晉升都需要通過相應的測試和審查。
這套三層程式庫結構,本質上就是現代版本控制系統(version control)的雛形。Brooks 在 1975 年描述的流程,與今日的 Git 分支策略(feature branch → staging → main)驚人地相似。
程式庫管理員(program clerk)負責管理程式碼在三個子庫之間的流動。這個角色維護所有版本的記錄,確保變更的可追溯性,並控制整合的節奏。
高階語言的力量#
Brooks 強烈主張使用高階語言(high-level language)進行開發。他以當時的 PL/I 為例,指出高階語言帶來的好處:
- 程式碼更短、更清晰
- 除錯更容易——錯誤訊息更有意義
- 生產力大幅提升——同樣的功能,程式碼量可能只有組合語言的五分之一
使用高階語言的生產力提升不僅僅來自於「少寫程式碼」。更重要的是,高階語言讓程式設計師能夠在更高的抽象層次上思考問題,減少因低階細節而分心的認知負擔。
互動式程式設計#
Brooks 引用 Multics 系統的經驗,指出互動式開發(interactive programming)——即透過終端機即時與系統互動——相較於傳統的批次處理(batch processing),能帶來約 2 倍的生產力提升。
關鍵在於回饋時間(turnaround time)。當程式設計師可以立即看到修改的結果,他的思維流程不會被打斷。而在批次處理模式下,提交一次修改後可能需要等待數小時才能看到結果,等待期間的思維脈絡早已消散。
文件系統#
Brooks 還提倡使用自動化文件產生系統,直接從原始碼中提取文件。這個概念在後續章節(第 15 章)中會有更深入的討論。
本章重點#
- 好的工具能大幅提升生產力,每個團隊都需要一位專職的工具匠
- 使用載具機器搭配模擬器和交叉編譯器,可以緩解目標機器的資源爭奪
- 程式庫的三層結構(遊戲場、整合子庫、目前版本)是現代版本控制的先驅
- 高階語言在幾乎所有情況下都優於低階語言,生產力提升顯著
- 互動式開發比批次處理快約兩倍,回饋時間是關鍵因素