《人月神話》讀書筆記

發表於2012-07-24

來源:DanielXLee

人月神話這本書幾年前就聽別人說是本很經典的軟體開發方面的書,這本書的成功之處在於他思想的前衛性,以至於不只是軟體行業的人在讀。現在終於找到讀他的理由了,可以感受一下大師的傑作。在讀之前我已經讀過了《軟體工藝》和《極限程式設計》,為什麼留到最後讀人月神話呢?主要是因為我覺得一本能夠流傳30年還被人們津津樂道的書,肯定是本學要好好細讀的書,所以留到了最後。按照前兩篇讀書筆記的慣例,前面幾段是一些我讀書時的感受和收穫,還有一些對內容的評價。

從這本書的內容來看,對於一個專案經理來說肯定會有更大的收穫,這本書主要是針對軟體開發管理方面的內容,這主要原因可能是因為作者以前就是專案的管理者,他是站在管理者的角度寫的。即便這樣,對於一個從來沒有參與過真實專案開發,更沒有領導過團隊的我還是有一定的吸引力,這本書中我最喜歡的就是前四章(焦油坑、人月神話、外科手術隊伍、貴族專制、民主政治和系統設計)和沒有銀彈這章。這本書裡面為了論證某一觀點,會舉出許多實際的專案作為證據,這一點非常好,事實勝於雄辯嘛!這些例子也許對於作者那個年代的人來說很好理解,但是放在30年後來看這些例子又有些陳舊和難懂了。另外,從文中我發現作者非常注重文件,一個優質的文件就是專案成功的保證,這一點與傳統的軟體工程很相似,但是卻與極限程式設計的觀點相悖。下面就是一些讀書的總結了。

The Mythical Man-Month 人月神話

 

焦油坑

1. 程式設計系統產品開發的工作量是供個人使用的、獨立開發的構件程式的九倍。

2. 程式設計行業的一些內在固有苦惱:

●   將做事方式調整到追求完美,是學習程式設計的最困難部分。

●   由其他人來設定目標,並且必須依靠自己無法控制的事物。

●   真正的權威來自於每次任務的完成。

●   任何創造性活動都伴隨著枯燥艱苦的勞動,程式設計也不例外

●   人們通常期望專案在接近結束時(bug、工作時間)能收斂得快一些,然而軟體專案的情況卻是越接近完成,收斂得越慢。

●   產品在即將完成時總面臨著陳舊過時的威脅。

 

人月神話

1. 缺乏合理的時間進度是造成專案滯後的最主要原因,它比其他所有因素加起來影響還大。

2. 良好的烹飪需要時間,某些任務無法在不損害結果的情況下加快速度。

3. 我們的構思是有缺陷的,因此總會有bug。

4. 我們圍繞成本核算的估計技術,混淆了工作量和專案進展。人月是危險和帶有欺騙性的神話,因為它暗示人員數量和時間是可以相互替換的。

5. 在若干人員中分解任務會引發額外的溝通工作量——培訓和相互溝通。

6. 關於進度安排,作者的經驗是為1/3計劃、1/6編碼、1/4構件測試以及1/4系統測試。

7. 因為我們對自己的估計技術不確定,所以在管理和客戶的壓力下,我們常常缺乏堅持的勇氣。

8. Brook法則:向進度落後的專案中增加人手,只會使進度更加落後。

9. 向軟體專案中增派人手從三個方面增加了專案必要的總體工作量:任務重新分配本身和所造成的工作中斷;培訓新人員;額外的相互溝通。

 

外科手術隊伍

1. 同樣有兩年經驗而且在受到同樣的培訓的情況下,優秀的專業程式設計師的工作效率是較差程式設計師的十倍。關於這一條我在極限程式設計裡看到,Sackman和Humphrey分別做了實驗發現優秀程式設計師工作效率比較差程式設計師的工作效率最高要高達28倍。

2. 小型、精幹隊伍是最好的。這一點在軟體工藝和極限程式設計裡都得到了充分的體現。

3. 兩個人的團隊,其中一個專案經理,常常是最佳的人員使用方法。

4. 對於真正意義上的大型系統,小型精幹的隊伍太慢了。

5. 實際上,絕大多數大型程式設計系統的經驗顯示出,一擁而上的開發方法是高成本、速度緩慢、不充分的,開發出的產品無法進行概念上的整合。

6. 一位首席程式設計師、類似於外科手術隊伍的團隊架構提供了一種方法,既能獲得由少數頭腦產生的產品完整性,又能得到多位協助人員的總體生產率,還徹底地減少了溝通的工作量。

 

貴族專制、民主政治和系統設計

1. 概念完整性是系統設計中最重要的考慮因素。

2. 為了獲得概念完整性,設計必須由一個人或者具有共識的小型團隊來完成。

3. 對於非常大型的專案,將設計方法、體系結構方面的工作與具體實現相分離是獲得概念完整性的強有力方法。

4. 紀律、規則對行業是有益的。外部的體系結構規定實際上是增強,而不是限制實現小組的創造性。

5. 體系結構、設計實現、物理實現的許多工作可以併發進行。

 

畫蛇添足

1. 儘早交流和持續溝通能使結構師有較好的成本意識,以及使開發人員獲得對設計的信心,並且不會混淆各自的責任分工。

2. 結構師如何成功地影響實現:

i. 牢記是開發人員承擔創造性的實現責任;結構師只能提出建議。

ii. 聽取開發人員在體系結構上改進的建議。

3. 第二個系統是人們所設計的最危險的系統,通常的傾向是過分地進行設計。關於這一點也許是正確的,但是這是一個迴避不了的問題,如果沒有開發第二個系統經驗的人,就不可能有開發第三個系統經驗的人了。

 

貫徹執行

1. 即使是大型的設計團隊,設計結果也必須由一個或兩個人來完成,以確保這些決定是一致的。

2. 必須明確定義體系結構中與先前定義不同的地方,重新定義的詳細程度應該與原先的說明一致。

3. 出於精確性的考慮,我們需要形式化的設計定義,同樣,我們需要記敘性定義來加深理解。

4. 允許體系結構師對實現人員的詢問做出電話應答解釋是非常重要的,並且必須進行日誌記錄和整理髮布。

5. 專案經理最好的朋友就是他每天要面對的敵人——獨立的產品測試機構/小組。

 

為什麼巴比倫塔會失敗?

1. 巴比倫塔專案的失敗是因為缺乏交流,以及交流的結果的組織。

2. 因為左手不知道右手在做什麼,從而進度災難、功能的不合理和系統缺陷紛紛出現。由於對其他人的各種假設,團隊成員之間的理解開始出現偏差。

3. 團隊應該以儘可能多的方式進行相互之間的交流:非正式、常規專案會議,會上進行簡要的技術陳述、共享的正式專案工作手冊。

 

胸有成竹

1. 僅僅通過對編碼部分的估計,然後乘以任務其他部分的相對係數,是無法得出對整項工作的精確估計的。

2. 構建獨立小型程式的資料不適用於程式設計系統專案。

3. 程式開發與程式規模成指數增長趨勢。

4. 當使用適當的高階語言時,程式編制的生產率可以提高5倍。

 

削足適履

這一章主要是要解決專案投資與磁碟空間和記憶體之間的矛盾,但是這個矛盾在電腦硬體發展到現在的層次已經可以忽略掉了。

 

提綱挈領

1. 軟體專案的要求:目標、使用者手冊、內部文件、進度、預算、組織機構圖和工作空間分配。

2. 即使是小型專案,專案經理也應該在專案早期規範化上述的一系列文件。
這一章強調文件重要性,但並沒有將一些教條主義的道理讓你相信文件的重要性,而是給專案經理給出了實實在在的操作步驟。

 

未雨綢繆

1. 對於大多數專案,第一個開發的系統並不合用。它可能太慢、太大,而且難以使用,或者三者兼而有之。系統的丟棄和重新設計可以一步完成,也可以一塊塊地實現。這是個必須完成的步驟,如果將開發的第一個系統丟棄原型釋出給使用者,可以獲得時間,但是它的代價很高。對於使用者,使用極度痛苦;對於重新開發的人員,分散了精力;對於產品,影響了聲譽,即使最好的再設計也難以挽回名聲。

2. 使用者的實際需要和使用者感覺會隨著程式的構建、測試和使用而變化。

3. 軟體產品易於掌握的特性和不可見性,導致了它的構建人員面臨著永恆的需求變更。

4. 目標和開發策略上的一些正常變化無可避免,事先為它們做準備總比假設它們不會出現要好得多。

5. 對於一個廣泛使用的程式,其維護總成本通常是開發成本的40%或更多。

6. 維護成本受使用者數目的嚴重影響。使用者越多,所發現的錯誤也越多。

7. Campbell指出了一個顯示產品生命期中每月bug數的有趣曲線,它先是下降,然後攀升。

8. 缺陷修復總會以(20-50)%的機率引入新的bug。

9. 在每次修復之後,必須重新執行先前所有的測試用例,從而確保系統不會以更隱蔽的方式被破壞。

10. 同樣,設計實現的人員越少、介面越少,產生的錯誤也就越少。

11. 所有修改都傾向於破壞系統的架構,增加了系統的混亂程度。即使是最熟練的軟體維護工作,也只是放緩了系統退化到不可修復混亂的程式。

 

干將莫邪

專案經理應該制訂一套策略,以及為通用工具的開發分配資源,與此同時,他還必須意識到專業工具的需求。

 

禍起蕭牆

1.  一天一天的進度落後比起重大災難,更難以識別,更不容易防範和更加難以彌補。

2. 根據一個嚴格的進度表來控制專案的第一個步驟是制訂進度表,進度表由里程碑和日期組成。

3. 里程碑必須是具體的、特定的、可度量的事件,能進行清晰能定義。

4. 如果里程碑定義得非常明確,以致於無法自欺欺人時,程式設計師很少會就里程碑的進展弄虛作假。

 

另外一面

1. 對於軟體程式設計產品來說,程式向使用者所呈現的面貌與提供給機器識別的內容同樣重要。

2. 即使對於完全開發給自己使用的程式,描述性文字也是必須的,因為它們會被使用者和作者所遺忘。

3. 文件能在整個軟體開發的生命週期對程式設計師克服懶惰和進度的壓力起促進激勵作用,但向程式設計人員成功地灌輸對待文件的積極態度是一件困難的事情。

4. 為了使文件易於維護,將它們合併至源程式是至關重要的,而不是作為獨立文件進行儲存。

 

沒有銀彈

人狼的傳說可能有人聽過也可能沒聽過,人狼是一種具有人和狼兩種特徵的恐怖生物,而銀彈是消滅它的一種最有效的子彈,如果看過《吸血鬼傳說》也許就能和容易的理解這一點。作者將軟體開發比作人狼,而將提高軟體開發效率的方法比作銀彈。作者預言未來十年,想要試圖通過尋找一種有效地銀彈將軟體開發效率提高一個甚至幾個數量級,這種銀彈不可能出現。

沒有銀彈這篇文章裡作者列舉出了當時一些非常先進的技術或思想理念,例如Ada和其他高階程式語言、物件導向程式設計、人工智慧、專家系統、“自動”程式設計、圖形化程式設計、程式驗證、環境和工具、工作站等。雖然這些先進技術在一定程度上提高了軟體開發的效率,但是始終沒有達到銀彈的效果。距離作者的預言已經過去有20多年了,縱觀現在的軟體開發領域,雖然新技術層出不窮,但是還是沒有一種銀彈能夠讓軟體開發產生一次革命。

 

焦油坑依然存在

軟體工程的焦油坑在將來很長一段時間內會繼續困擾著人們。由於軟體系統多變性和錯綜複雜性,這個行業只能是一步一個臺階的往上爬,而出現銀彈的希望在我們可以想象的時間範圍內是非常渺茫的。我們將長期與焦油作鬥爭。

 

相關文章