一、焦油坑:
1.編程系統產品:
?編寫程序:即每個模塊全部編寫完成,寫代碼;
?編程系統:即各個模塊可以完美結合,形成一整套系統;
?編寫程序的工作量只是編程系統的三分之一。
?編程產品:包括了通用化、測試、文檔和維護;
?編寫程序的工作量只是編程產品的三分之一。
?編程系統產品:是編程系統化和產品化的工作量,是編寫程序的九分之一。
2.職業的樂趣:
?首先是一種創建事物的純粹快樂。
?其次,快樂來自于開發對其他人有用的東西。
?第三是整個過程體現出魔術般的力量——將相互嚙合的零部件組裝在一起,看到它們精妙地運行,得到預先所希望的結果。
?第四是學習的樂趣,來自于這項工作的非重復特性。
?最后,樂趣還來自于工作在如此易于駕馭的介質上。
3.職業的苦惱
?首先,必須追求完美。
?其次,是由他人來設定目標,供給資源,提供信息。對于系統編程人員而言,對其他人的依賴是一件非常痛苦的事情。他依靠其他人的程序,而往往這些程序設計得并不合理,實現拙劣,發布不完整(沒有源代碼或測試用例),或者文檔記錄得很糟。所以,系統編程人員不得不花費時間去研究和修改,而它們在理想情況下本應該是可靠完整的。
?下一個煩惱——概念性設計是有趣的,但尋找瑣碎的bug卻只是一項重復性的活動。
?另外,人們發現調試和查錯往往是線性收斂的,或者更糟糕的是,具有二次方的復雜度。結果,測試一拖再拖,尋找最后一個錯誤比第一個錯誤將花費更多的時間。
?最后一個苦惱,有時也是一種無奈——當投入了大量辛苦的勞動,產品在即將完成或者終于完成的時候,卻已顯得陳舊過時。
二、人月神化
?對于軟件任務的進度安排,以下是我使用了很多年的經驗法則:
?1/3計劃
?1/6編碼
?1/4構件測試和早期系統測試
?1/4系統測試,所有的構件已完成
?
?簡單、武斷地重復一下Brooks法則:
?向進度落后的項目中增加人手,只會使進度更加落后。(Adding manpower to a late software project makes it later)
三、外科手術隊伍(The Surgical Team)
??????軟件經理很早就認識到優秀程序員和較差的程序員之間生產率的差異,但實際測量出的差異還是令我們所有的人吃驚。在他們的一個研究中,Sackman、Erikson和Grand曾對一組具有經驗的程序人員進行測量。在該小組中,最好的和最差的表現在生產率上平均為10:1;在運行速度和空間上具有5:1的驚人差異!簡言之,$20,000/年的程序員的生產率可能是$10,000/年程序員的10倍。數據顯示經驗和實際的表現沒有相互聯系(我懷疑這種現象是否普遍成立。)
??????
Mills的建議??????外科醫生。Mills稱之為首席程序員。他親自定義功能和性能技術說明書,設計程序,編制源代碼,測試以及書寫技術文檔。。首席程序員需要極高的天分、十年的經驗和應用數學、業務數據處理或其他方面的大量系統和應用知識。
??????副手。他是外科醫生的后備,能完成任何一部分工作,但是相對具有較少的經驗。他的主要作用是作為設計的思考者、討論者和評估人員。外科醫生試圖和他溝通設計,但不受到他建議的限制。副手經常在與其他團隊的功能和接口討論中代表自己的小組。他需要詳細了解所有的代碼,研究設計策略的備選方案。顯然,他充當外科醫生的保險機制。他甚至可能編制代碼,但針對代碼的任何部分,不承擔具體的開發職責。
??????管理員。外科醫生是老板,他必須在人員、加薪等方面具有決定權,但他決不能在這些事務上浪費任何時間。因而,他需要一個控制財務、人員、工作地點安排和機器的專業管理人員,該管理員充當與組織中其他管理機構的接口。Baker建議僅在項目具有法律、合同、報表和財務方面的需求時,管理員才具有全職責任。否則,一個管理員可以為兩個團隊服務。
??????編輯。外科醫生負責產生文檔——出于最大清晰度的考慮,他必須書寫文檔。對內部描述和外部描述都是如此。而編輯根據外科醫生的草稿或者口述的手稿,進行分析和重新組織,提供各種參考信息和書目,對多個版本進行維護以及監督文檔生成的機制。
??????兩個秘書。管理員和編輯每個人需要一個秘書。管理員的秘書負責項目的協作一致和非產品文件。
??????程序職員。他負責維護編程產品庫中所有團隊的技術記錄。該職員接受秘書性質的培訓,承擔機器碼文件和可讀文件的相關管理責任。所有的計算機輸入匯集到這個職員處。如果需要,他會對它們進行記錄或者標識。輸出列表會提交給程序職員,由他進行歸檔和編制索引。另外,他負責將任何模型的最新運行情況記錄在狀態日志中,而所有以前的結果則按時間順序進行歸檔保存。
??????
Mills概念的真正關鍵是“從個人藝術到公共實踐”的編程觀念轉換。它向所有的團隊成員展現了所有計算機的運作和產物,并將所有的程序和數據看作是團隊的所有物,而非私人財產。
??????程序職員的專業化分工,使程序員從書記的雜事中解放出來,同時還可以對那些雜事進行系統整理,確保了它們的質量,并強化了團隊最有價值的財富——工作產品。上述概念顯然考慮的是批處理程序。當使用交互式終端,特別是在沒有紙張輸出的情況下,程序職員的職責并未消失,只是有所更改。他會記錄小組程序和私有工作拷貝之間的更新,依然控制所有程序的運行,并使用自己的交互式工具來控制產品逐步增長的完整性和有效性。
??????工具維護人員。現在已經有很多文件編輯、文本編輯和交互式調試等工具,因此團隊很少再需要自己的機器和機器操作人員。但是這些工具使用起來必須毫無疑問地令人滿意,而且需要具備較高的可靠性。外科醫生則是這些工具、服務可用性的唯一評判人員。他需要一個工具維護人員,保證所有基本服務的可靠性,以及承擔團隊成員所需要的特殊工具(特別是交互式計算機服務)的構建、維護和升級責任。即使已經擁有非常卓越的、可靠的集中式服務,每個團隊仍然要有自己的工具人員。因為他的工作是檢查他的外科醫生所需要的工具。工具維護人員常常要開發一些實用程序、編制具有目錄的過程庫以及宏庫。
??????測試人員。外科醫生需要大量合適的測試用例,用來對他所編寫的工作片段,以及對整個工作進行測試。因此,測試人員既是為他的各個功能設計系統測試用例的對頭,同時也是為他的日常調試設計測試數據的助手。他還負責計劃測試的步驟和為測試搭建測試平臺。
??????語言專家。隨著Algol語言的出現,人們開始認識到大多數計算機項目中,總有一兩個樂于掌握復雜編程語言的人。這些專家非常有幫助,很快大家會向他咨詢。這些天才不同于外科醫生,外科醫生主要是系統設計者以及考慮系統的整體表現。而語言專家則尋找一種簡潔、有效的使用語言的方法來解決復雜、晦澀或者棘手的問題。他通常需要對技術進行一些研究(兩到三天)。通常一個語言專家可以為兩個到三個外科醫生服務。
??????如何運作

??????十個人,其中七個專業人士在解決問題,而系統是一個人或者最多兩個人思考的產物,因此客觀上達到了概念的一致性。
??????團隊的擴建
??????擴建過程的成功依賴于這樣一個事實,即每個部分的概念完整性得到了徹底的提高——決定設計的人員是原來的七分之一或更少。所以,可以讓200人去解決問題,而僅僅需要協調20個人,即那些“外科醫生”的思路。