推薦理由
作者Frederick P. Brooks,是北卡羅萊納大學(xué)Kenan-Flagler商學(xué)院的計算機(jī)科學(xué)教授。他曾榮獲圖靈獎道伟,美國計算機(jī)協(xié)會(ACM)稱贊他“對計算機(jī)體系結(jié)構(gòu)迹缀、操作系統(tǒng)和軟件工程做出了里程碑式的貢獻(xiàn)∶刍眨”
作為軟件工程領(lǐng)域的重要著作祝懂,《人月神話》結(jié)合工業(yè)界具體的大型系統(tǒng)開發(fā)實例,對軟件開發(fā)領(lǐng)域的諸多問題提出了思考和見解拘鞋,許多論斷被軟件開發(fā)從業(yè)者奉為圭臬砚蓬。經(jīng)過數(shù)十年的時間淬煉,對今天的大型軟件開發(fā)都有啟發(fā)意義盆色。
本書要點
- 焦油坑:大型系統(tǒng)開發(fā)中各種問題纏繞和積累在一起灰蛙,使得大型系統(tǒng)的開發(fā)十分困難。
- 人月神話:在軟件開發(fā)領(lǐng)域隔躲,用人月作為工作規(guī)模的衡量指標(biāo)并不適用摩梧。
- 外科手術(shù)式隊伍:軟件開發(fā)團(tuán)隊可以參照外科手術(shù)式隊伍組成、運(yùn)作宣旱、擴(kuò)建
- 貴族專治障本、民主政治和系統(tǒng)設(shè)計:在系統(tǒng)設(shè)計中,概念完整性應(yīng)該是最重要考慮的因素
- 畫蛇添足:架構(gòu)師和項目經(jīng)理都需要避免second-system effect
- 貫徹執(zhí)行:定義良好的規(guī)格說明是重要的响鹃,會議、測試小組等形式是保證設(shè)計執(zhí)行的良好方式案训。
- 為什么巴比倫塔會失斅蛑谩?:軟件團(tuán)隊的交流和組織是軟件開發(fā)成敗的關(guān)鍵
- 胸有成竹:對大型軟件系統(tǒng)產(chǎn)品的開發(fā)所需的時間和資源進(jìn)行準(zhǔn)確的估測强霎,能讓我們在項目進(jìn)度和前景胸有成竹
- 削足適履:最大化資源利用率忿项;巧妙的數(shù)據(jù)結(jié)構(gòu)
- 提綱挈領(lǐng):文檔是重要和必要的
- 未雨綢繆:只有“變化“是不變的,為需求和設(shè)計的變化做準(zhǔn)備
- 干將莫邪:項目經(jīng)理需要為軟件開發(fā)團(tuán)隊配備完備的工具
- 整體部分:好的自頂向下的設(shè)計避免缺陷
- 禍起蕭墻:軟件開發(fā)團(tuán)隊需要為計劃和控制投入資源
- 另外一面:提供給用戶的使用說明等文檔是軟件呈現(xiàn)給用戶的另外一面
- 《沒有銀彈》:由于軟件的復(fù)雜性城舞,一致性轩触,變化性和不可見性,解決軟件危機(jī)的銀彈并不存在
- 再論《沒有銀彈》:人們期待中的重大突破不可能在近期內(nèi)到來
精編書摘
焦油坑
過去幾十年的大型系統(tǒng)開發(fā)猶如焦油坑家夺,各種團(tuán)隊一個接一個淹沒在焦油坑中脱柱。表面上沒有任何一個單獨的問題導(dǎo)致困難,當(dāng)他們相互纏繞和累積在一起的時候拉馋,團(tuán)隊的行動就會變得越來越慢榨为。如果想看清這個問題的本質(zhì)惨好,就必須試圖先去理解它。
編程系統(tǒng)產(chǎn)品是大多數(shù)系統(tǒng)開發(fā)的目標(biāo)随闺,然而它的成本是程序的9倍日川。
編程的樂趣在于:編程是一種創(chuàng)建事物的純粹快樂;快樂來自于開發(fā)對其他人有用的東西矩乐;整個過程體現(xiàn)出魔術(shù)般的力量龄句;學(xué)習(xí)的樂趣;工作在如此易于駕馭的介質(zhì)上散罕。
編程的苦惱在于:必須追求完美分歇;由他人來設(shè)定目標(biāo),供給資源笨使,提供信息卿樱;概念性設(shè)計是有趣的,但尋找瑣碎的bug卻只是一項重復(fù)性的活動硫椰;調(diào)試和查錯是往往是線性收斂的繁调;產(chǎn)品在完成時可能就已經(jīng)過時。
人月神話
軟件項目中缺乏合理的時間進(jìn)度的主要原因是:
? 對估算技術(shù)缺乏有效的研究
? 采用的估算技術(shù)隱含的假設(shè)人和月可以互換靶草,錯誤的將工作量與進(jìn)度相互混淆
? 軟件經(jīng)理由于對自己的估算缺乏信心蹄胰,往往不會有耐心持續(xù)的進(jìn)行估算這項工作
? 對進(jìn)度缺少跟蹤和監(jiān)督
? 當(dāng)意識到進(jìn)度的偏移時,下意識的反應(yīng)是增加人力
編程人員的樂觀主義并不應(yīng)該是理所應(yīng)當(dāng)?shù)?/p>
用人月作為衡量一項工作的規(guī)模是一個危險和帶有欺騙性的神話奕翔,在軟件開發(fā)項目中裕寨,由于任務(wù)在次序上的不可分解、培訓(xùn)和交流的需要派继,人月并不適用宾袜。
在早期進(jìn)度策劃時,允許充分的系統(tǒng)測試時間是非常重要的驾窟。
Brooks法則:
向進(jìn)度落后的項目中增加人手庆猫,只會使進(jìn)度更加落后。
外科手術(shù)式隊伍
外科手術(shù)式隊伍的組成:外科醫(yī)生(首席程序員)绅络、副手月培、管理員、編輯恩急、兩個秘書杉畜、程序職員、工具維護(hù)人員衷恭、測試人員此叠、語言專家。
外科手術(shù)式隊伍的運(yùn)作:
? 首席程序員和副手都了解所有的設(shè)計和全部的代碼匾荆,節(jié)省了空間分配拌蜘、磁盤訪問等的勞動量杆烁,同時也確保了工作概念上的完整性。
? 不存在利益上的差別简卧,觀點不一致由首席程序員單方面來統(tǒng)一兔魂。
? 剩余人員職能的專業(yè)化分工是高效的關(guān)鍵,使成員之間采用非常簡單的交流模式成為可能举娩。
外科手術(shù)式隊伍的擴(kuò)建成功依賴于這樣一個事實:每個部分的概念完整性得到了徹底的提高析校。
貴族專治、民主政治和系統(tǒng)設(shè)計
在系統(tǒng)設(shè)計中铜涉,概念完整性應(yīng)該是最重要考慮的因素
概念完整性的獲得:
? 每個部分必須反映相同的原理智玻、原則和一致的折衷機(jī)制。在語法上芙代,每個部分應(yīng)使用相同的技巧吊奢;在語義上,應(yīng)具有相同的相似性纹烹。
? 對于非常大型的項目页滚,將設(shè)計方法、體系結(jié)構(gòu)方面的工作與具體實現(xiàn)相分離是獲得概念完整性的強(qiáng)有力方法铺呵。
外部的體系結(jié)構(gòu)規(guī)定實際上是增強(qiáng)裹驰, 而不是限制實現(xiàn)小組的創(chuàng)造性。
整個創(chuàng)造性活動包括了三個獨立的階段: 體系結(jié)構(gòu)( architecture)片挂、 設(shè)計實現(xiàn)( implementation)幻林、 物理實現(xiàn)( realization)。 在實際情況中音念,它們往往可以同時開始和并發(fā)地進(jìn)行沪饺。
同工作的水平分割相比, 垂直劃分從根本上大大減少了勞動量闷愤, 結(jié)果是使交流徹底地簡化随闽,概念完整性得到大幅提高。
畫蛇添足
架構(gòu)師的交互準(zhǔn)則和機(jī)制:
? 牢記是開發(fā)人員承擔(dān)創(chuàng)造性和發(fā)明性的實現(xiàn)責(zé)任肝谭,所以架構(gòu)師只能建議而不能支配
? 時刻準(zhǔn)備著為所指定的說明建議一種實現(xiàn)的方法,同樣準(zhǔn)備接受其他任何能達(dá)到目標(biāo)的方法蛾扇。
? 對上述的建議保持低調(diào)和平靜
? 準(zhǔn)備放棄堅持所作的改進(jìn)和建議
架構(gòu)師如何避免畫蛇添足--開發(fā)第二個系統(tǒng)所引起的后果(second-system effect)?
? 有意識關(guān)注那些系統(tǒng)的特殊危險攘烛, 運(yùn)用特別的自我約束準(zhǔn)則, 來避免那些功能上的修飾
? 根據(jù)系統(tǒng)基本理念及目的變更镀首, 舍棄一些功能
項目經(jīng)理如何避免畫蛇添足(second-system effect)?
他必須堅持至少擁有兩個系統(tǒng)以上開發(fā)經(jīng)驗結(jié)構(gòu)師的決定坟漱。 同時, 保持對特殊誘惑的警覺更哄, 他可以不斷提出正確的問題芋齿,確保原則上的概念和目標(biāo)在詳細(xì)設(shè)計中得到完整的體現(xiàn)腥寇。
貫徹執(zhí)行
手冊、或者書面規(guī)格說明觅捆,是一個非常必要的工具赦役,盡管光有文檔是不夠的。
會議是必要的栅炒,我們把會議分成兩個級別: 周例會和年度大會——這實際上是一種非常有效的方式
設(shè)立測試小組是使設(shè)計決策得以貫徹執(zhí)行的必要手段掂摔, 同樣也是需要盡早著手,與設(shè)計同時實施的重要環(huán)節(jié)
為什么巴比倫塔會失斢蕖乙漓?
團(tuán)隊相互之間的交流溝通的可能的途徑有:
非正式途徑;會議释移;工作手冊
編程人員僅了解自己負(fù)責(zé)的部分叭披,而不是整個系統(tǒng)的開發(fā)細(xì)節(jié)時,工作效率最高玩讳。 這種方法的先決條件是精確和完整地定義所有接口涩蜘。這的確是一個徹底的解決方法。如果能處理得好锋边,的確是能解決很多“災(zāi)難“皱坛。一個好的信息系統(tǒng)不但能暴露接口錯誤,還能有助于改正錯誤
交流和交流的結(jié)果——組織豆巨, 是成功的關(guān)鍵剩辟。 交流和組織的技能需要管理者仔細(xì)考慮, 相關(guān)經(jīng)驗的積累和能力的提高同軟件技術(shù)本身一樣重要
胸有成竹
對大型軟件系統(tǒng)產(chǎn)品的開發(fā)所需的時間和資源進(jìn)行準(zhǔn)確的估測往扔,能讓我們在項目進(jìn)度和前景胸有成竹贩猎。軟件代碼的開發(fā)效率和代碼模塊之間所需的交互相關(guān)。界面交互復(fù)雜的程序需要更多的測試和調(diào)試時間萍膛,單純地增加人手并不能有助于開發(fā)效率的提高吭服。
削足適履
同任何開銷一樣, 規(guī)模本身不是壞事蝗罗,但不必要的規(guī)模是不可取的
創(chuàng)造出自精湛的技藝艇棕,精煉、充分和快速的程序也是如此串塑。技藝改進(jìn)的結(jié)果往往是戰(zhàn)略上的突破沼琉, 而不僅僅是技巧上的提高
更普遍的是,戰(zhàn)略上突破常來自數(shù)據(jù)或表的重新表達(dá)——這是程序的核心所在
提綱挈領(lǐng)
軟件項目的關(guān)鍵文檔:目標(biāo)桩匪;產(chǎn)品技術(shù)說明打瘪;進(jìn)度表;預(yù)算;工作空間分配闺骚;組織圖
正式文檔的必要性:書面記錄決策是必要的彩扔;文檔能夠作為同其他人的溝通渠道;項目經(jīng)理的文檔可以作為數(shù)據(jù)基礎(chǔ)和檢查列表
未雨綢繆
目標(biāo)上的一些變化無可避免僻爽,事先為它們做準(zhǔn)備總比假設(shè)它們不會出現(xiàn)要好得多虫碉。 不但目標(biāo)上的變化不可避免, 而且設(shè)計策略和技術(shù)上的變化也不可避免进泼。 拋棄原型概念本身就是對事實的接受——隨著學(xué)習(xí)的過程更改設(shè)計
系統(tǒng)軟件開發(fā)是減少混亂度(減少熵)的過程蔗衡,所以它本身是處于亞穩(wěn)態(tài)的。軟件維護(hù)是提高混亂度(增加熵) 的過程乳绕, 即使是最熟練的軟件維護(hù)工作绞惦, 也只是放緩了系統(tǒng)退化到非穩(wěn)態(tài)的進(jìn)程
干將莫邪(sharp tools)
項目經(jīng)理必須考慮、計劃洋措、組織的工具有:
? 計算機(jī)設(shè)施济蝉,需要硬件和使用安排策略
? 操作系統(tǒng),提供服務(wù)的方式必須明了
? 語言菠发,語言的使用方針必須明確
? 實用程序王滤、調(diào)試輔助程序、測試用例生成工具和處理文檔的字處理系統(tǒng)
整體部分
許許多多的失敗完全源于那些產(chǎn)品未精確定義的地方滓鸠。
好的自頂向下設(shè)計從四個方面避免了 bug雁乡。
? 首先, 清晰的結(jié)構(gòu)和表達(dá)方式更容易對需求和模塊功能進(jìn)行精確的描述糜俗;
? 其次踱稍, 模塊分割和模塊獨立性避免了系統(tǒng)級的 bug。
? 另外悠抹, 細(xì)節(jié)的隱藏使結(jié)構(gòu)上的缺陷更加容易識別珠月。
? 第四,設(shè)計在每個精化步驟的層次上是可以測試的楔敌,所以測試可以盡早開始啤挎,并且每個步驟的重點可以放在合適的級別上。
禍起蕭墻
好的里程碑對團(tuán)隊來說實際上是一項服務(wù)卵凑,可以用來向項目經(jīng)理提出合理要求的一項服務(wù)庆聘, 而不確切的里程碑是難以處理的負(fù)擔(dān)。
對計劃和控制職能進(jìn)行適度的技術(shù)人力投資是非常值得贊賞的勺卢。它對項目的貢獻(xiàn)方式和直接開發(fā)軟件產(chǎn)品有很大的不同
另外一面
對于軟件編程產(chǎn)品來說掏觉, 程序向用戶所呈現(xiàn)的面貌與提供給機(jī)器識別的內(nèi)容同樣重要
程序修改人員所使用的文檔中, 除了描述事情如何以外值漫, 還應(yīng)闡述它為什么那樣。對于加深理解织盼,目的是非常關(guān)鍵的杨何,但即使是高級語言的語法酱塔,也不能表達(dá)目的
沒有銀彈
所有軟件活動包括根本任務(wù)——打造由抽象軟件實體構(gòu)成的復(fù)雜概念結(jié)構(gòu),次要任務(wù)——使用編程語言表達(dá)這些抽象實體危虱, 在空間和時間限制內(nèi)將它們映射成機(jī)器語言羊娃。
軟件開發(fā)中困難的部分是規(guī)格化、設(shè)計和測試這些概念上的結(jié)構(gòu)埃跷,而不是對概念進(jìn)行表達(dá)和對實現(xiàn)逼真程度進(jìn)行驗證
現(xiàn)代軟件系統(tǒng)中復(fù)雜度蕊玷、一致性、可變性和不可見性是無法規(guī)避的弥雹。
銀彈的希望:Ada和其他高級編程語言垃帅;面向?qū)ο缶幊蹋蝗斯ぶ悄芗粑穑粚<蚁到y(tǒng)贸诚;“自動”編程;圖形化編程厕吉;程序驗證酱固;環(huán)境和工具;工作站头朱。
針對概念上根本問題的頗具前途的方法:
購買和自行開發(fā)运悲;需求精煉和快速原型;增量開發(fā)--增長项钮,而非搭建系統(tǒng)班眯;卓越的設(shè)計人員
再論《沒有銀彈》
《 沒有銀彈》 提出了全力解決復(fù)雜性問題的方法, 這種方法可以在現(xiàn)實中取得十分樂觀的進(jìn)展寄纵。 它倡導(dǎo)向軟件系統(tǒng)增加必要的復(fù)雜性:層次化鳖敷,通過分層的模塊或者對象;增量化程拭,從而系統(tǒng)可以持續(xù)地運(yùn)行