- 小brooks的《人月神話》這本書在軟件工程管理領(lǐng)域暢銷40年腊脱,我看的是40周年中文紀(jì)念版熊赖。相比于原版增加了一些作者根據(jù)今天軟件工程管理現(xiàn)狀添加的一些新的觀點與評論,看看哪些過時了虑椎,哪些依然有效震鹉。另外還附錄了一些名人以及讀者對本書的評論。整體來說捆姜,本書的主線——人月神話传趾、沒有銀彈在現(xiàn)今的軟件工程管理領(lǐng)域依然屬于有效的基礎(chǔ)理論。但是泥技,其中一些方法論對于國內(nèi)的軟件項目管理的環(huán)境是不適應(yīng)的浆兰,對于這些方法論我們可以吸收其思想精髓,改造其具體方法珊豹,創(chuàng)造一些中國特色的軟件項目管理方法簸呈。這是一個很大的話題,我經(jīng)驗尚淺店茶,所以本文就先不談這個蜕便。我想談的是本書中對我映像比較深的幾個概念理論。
焦油坑
- 焦油坑是作者用來形容大型系統(tǒng)開發(fā)的一個概念贩幻。史前時代轿腺,恐龍、猛犸象丛楚、劍齒虎這些大型食肉動物碰到焦油坑也是沒有辦法掙脫的族壳,而且越用力就越容易被沉入坑底。這種場景就像極了大型系統(tǒng)開發(fā)的工作趣些。
各種團隊仿荆,大型的或小型的,龐雜的或精干的坏平,一個接一個地淹沒在了焦油坑中拢操。表面上看起來好像沒有任何一個單獨的問題會導(dǎo)致困難,每個問題都能獲得解決功茴,但是當(dāng)它們相互糾纏和累積在一起的時候庐冯,團隊行動就會變得越來越慢孽亲。對于問題的麻煩程度坎穿,每個人似乎都會感到驚訝,并且很難看清問題的本質(zhì)。
- 基本上一個大型的編程系統(tǒng)產(chǎn)品的開發(fā)成本會是單個的簡單程序的9倍玲昧。這里的編程系統(tǒng)產(chǎn)品是指的由很多編程程序以及系統(tǒng)組合而成的可交互栖茉、協(xié)作的程序集合。我們每個人都應(yīng)清晰的認識到這樣一種非線性關(guān)系孵延,認識到真正的大型編程系統(tǒng)產(chǎn)品并不是簡單程序的簡單堆疊吕漂。這也就是所謂的“焦油坑”。
- 既然是明知是焦油坑尘应,那我們?yōu)槭裁匆M去呢惶凝?作者在書中分別列出了開發(fā)大型系統(tǒng)產(chǎn)品的樂趣以及苦惱。對我來說犬钢,在軟件開發(fā)中我的樂趣在于:
- 開發(fā)對其他人有用的東西的樂趣苍鲜。
- 面對不重復(fù)的任務(wù),不斷學(xué)習(xí)的樂趣玷犹。
- 最大的苦惱在于:
- 產(chǎn)品在完成前總面臨著陳舊過時的威脅混滔;只有實際需要時,才會用到最新的設(shè)想歹颓。
人月神話
- 對于軟件項目進度的估算往往會根據(jù)項目的緊急程度而得出過于樂觀的結(jié)果坯屿,這一方面是因為所有的編程人員都是樂觀主義者,我們往往會認為“這次肯定能運行”或者是“我已經(jīng)找出了最后一個bug”巍扛,另一方面則來源于市場的壓力领跛,這種情況在國內(nèi)環(huán)境更甚。我們對于進度估算的第一個錯誤假設(shè)就是:一切都將運作良好撤奸,每一項任務(wù)僅花費它所“應(yīng)該”花費的時間隔节。而這個假設(shè)往往是一廂情愿的,對于創(chuàng)造性工作來說寂呛,創(chuàng)造者常常是在實現(xiàn)過程中怎诫,才發(fā)現(xiàn)在構(gòu)思設(shè)計時候的不完整性和不一致性,從而反饋到的構(gòu)思設(shè)計上贷痪,處理這種問題的時間和復(fù)雜程度會隨著項目的結(jié)構(gòu)以及任務(wù)的大小而呈現(xiàn)非線性增加的關(guān)系幻妓。所以對于大型軟件項目來說,“一切都將運作良好”就是一件概率非常小的事情了劫拢。
- 在軟件項目中我們往往用人月這個指標(biāo)在衡量項目的工作量肉津。但是人月這個指標(biāo)實際上是一個危險的帶有欺騙性的神話。它暗示著人員數(shù)量和時間是可以互相替換的舱沧。只有在將任務(wù)分解給參與人員后他們之間不需要互相交流的情況下妹沙,人數(shù)和時間才是可以互換的。在實際軟件項目中熟吏,只要項目具有一定規(guī)模距糖,不論是設(shè)計玄窝、開發(fā)、測試悍引、部署各個階段都會有分解任務(wù)給不同人員恩脂,而且這些階段本身也屬于一種任務(wù)的分解,在不同人員間分解任務(wù)就不可避免的引發(fā)額外的溝通成本——培訓(xùn)和相互溝通趣斤。因為軟件開發(fā)本質(zhì)上是一項系統(tǒng)工作——錯綜復(fù)雜的關(guān)系下的一種實踐俩块,溝通、交流的工作量非常大浓领,它很快會消耗任務(wù)分解所節(jié)省下來的個人時間玉凯。簡單來說就是,3個人要干3個月的事情不是說安排9個人就能1個月干完了联贩。而且壮啊,在進度落后的項目中增加人手的做法,往往只會使進度更加落后撑蒜。這就是去除了神話色彩的人月歹啼。
項目的時間依賴于順序上的限制,人員的最大數(shù)量依賴于獨立子任務(wù)的數(shù)量座菠。從這兩個數(shù)值可以推算出進度表狸眼,該表安排的人員較少,花費的時間較長(唯一的風(fēng)險是產(chǎn)品可能會過時)浴滴。相反拓萌,分派較多的人手,計劃較短的時間升略,將無法得到可行的進度安排微王。總之品嚣,在眾多軟件項目中炕倘,缺乏合理的進度安排是造成項目滯后的最主要的原因,它比其他所有因素加起來的影響還要大翰撑。
外科手術(shù)隊伍
- 面對軟件項目的“焦油坑”以及“人月神話”罩旋,作者給出的一個解決辦法是——“外科手術(shù)隊伍”。有研究表明眶诈,同樣有兩年經(jīng)驗而且受到同樣培訓(xùn)的情況下涨醋,優(yōu)秀的專業(yè)程序員的生產(chǎn)率是較差程序員的10倍。在軟件項目中逝撬,一個小型的浴骂、精干的隊伍是最好的,這樣既減少了溝通成本宪潮,又提高了生產(chǎn)率溯警。但是對于真正意義上的大型系統(tǒng)來說趣苏,小型精干的隊伍往往意味著太慢。這就是矛盾的所在愧膀,對于效率和概念的完整性來說,最好由少數(shù)精干的人員來設(shè)計和開發(fā)谣光,而對于大型系統(tǒng)來說檩淋,則需要大量的人手,以使產(chǎn)品能在時間是滿足市場的需求萄金。
- 在軟件項目中的“外科手術(shù)隊伍”有一個類似于外科醫(yī)生的首席程序員蟀悦。他親自定義功能和性能技術(shù)說明書,設(shè)計程序氧敢,編制主架構(gòu)源代碼日戈,測試以及書寫技術(shù)文檔。首席程序員還擁有一個副手孙乖,他主要作用是作為設(shè)計的思考者浙炼、討論者和評估人員。與傳統(tǒng)的兩人隊伍每人負責(zé)一部分工作的設(shè)計和實現(xiàn)不同唯袄,“外科手術(shù)隊伍”中的這兩個人需要一起了解所有的設(shè)計和全部的代碼弯屈。其他的程序員以及管理者,文檔編輯人員等圍繞著主架構(gòu)的設(shè)計來具體實現(xiàn)功能以及推進項目恋拷。這種隊伍的好處就在于既能獲得由少數(shù)頭腦產(chǎn)生的產(chǎn)品完整性资厉,又能得到多位協(xié)助人員的總體生產(chǎn)率,還徹底地減少了溝通的工作量蔬顾。
- 作者特別強調(diào)軟件系統(tǒng)的概念完整性宴偿,為了確保這種完整性也是需要由一個首席程序員或者具有共識的小型團隊來從上至下的對系統(tǒng)結(jié)構(gòu)進行設(shè)計。
要使工作易于管理诀豁,必須清晰地劃分體系結(jié)構(gòu)設(shè)計和實現(xiàn)之間的界線窄刘,系統(tǒng)結(jié)構(gòu)師必須一絲不茍地專注于體系結(jié)構(gòu)。
沒有銀彈
在未來的十年內(nèi)舷胜,無論是在技術(shù)還是管理方法上都哭,都看不出有任何突破性的進步,能夠保證在十年內(nèi)大幅度地提高軟件的生產(chǎn)率逞带、可靠性和簡潔性欺矫。
- 人狼這種民間傳說中存在的怪物,會在月圓之夜由我們熟悉的人類面孔變成可怕的狼臉展氓。我們熟悉的軟件項目也有著人狼的特性穆趴,看似簡單明了的外表,但是卻可能隨時變成一個進度落后遇汞、超出預(yù)算未妹、存在大量缺陷的怪物簿废。在民間傳說中對付人狼唯一可靠的武器就是銀彈。所以銀彈在軟件項目中就是比喻這種使得軟件成本像計算機硬件成本一樣迅速降低的尚方寶劍络它。然而族檬,作者在40年前悲觀的告訴我們,沒有銀彈化戳。40年后我們回首望去单料,這個預(yù)言恐怕是真的。
- 首先我們要認識到的是軟件開發(fā)中存在著兩種困難点楼,一種是根本的——軟件特性中固有的困難扫尖,另一種是次要的——目前存在的,但并非與生俱來的困難掠廓。對于前一種困難來說换怖,沒有銀彈。而后一種困難可以通過軟件工程管理或者技術(shù)的進步來克服。
軟件開發(fā)中困難的部分是規(guī)格說明、設(shè)計和測試這些概念上的結(jié)構(gòu)毙替,而不是對概念進行表達和對現(xiàn)實逼真程度進行驗證漩氨。
- 在軟件開發(fā)中存在著4個天生的根本困難——復(fù)雜度、一致性、可變性和不可見性。
- 復(fù)雜度是說在規(guī)模上,軟件實體可能比以往人類創(chuàng)造的其他任何實體都更加復(fù)雜抬探。一方面,來自于計算機本身的復(fù)雜性帆赢,還有軟件系統(tǒng)的狀態(tài)的繁多小压。另一方面,軟件系統(tǒng)的各種元素還是以非線性遞增的方式在交互椰于,使得軟件復(fù)雜度比非線性增長還多得多怠益。而且由于復(fù)雜度,軟件團隊成員的溝通成本也非常的大瘾婿,也產(chǎn)生了一系列的技術(shù)上的困難蜻牢,同時還會引發(fā)很多管理上的問題。
- 一致性說得其實是軟件兼容性偏陪,我們開發(fā)的軟件往往為了保持一些必須遵循的人為慣例和系統(tǒng)抢呆,必須為這些接口保持其一致性。
- 只要是從事軟件行業(yè)的人應(yīng)該都能體會到軟件的可變性笛谦,因為應(yīng)用抱虐、用戶習(xí)慣、自然社會規(guī)律饥脑、計算機硬件等的各種變化都會無情地持續(xù)地強迫著軟件也要隨之變化恳邀。在軟件行業(yè)中有一句話就是懦冰,唯一不變的可能就是變化的需求。
- 不可見性是說軟件在客觀存在上不具有空間的形體特征谣沸,無法可視化刷钢。無論是流程圖還是時序圖等等軟件工程中使用的圖表都無法像地圖或者電路圖一樣在整體上給予所有使用者完整的概念。從而使得軟件設(shè)計人員和開發(fā)人員之間在設(shè)計上的一些概念無法完整而清晰的進行溝通交流乳附。
- 現(xiàn)代軟件工程中通過高級語言内地、分時系統(tǒng)、面向?qū)ο蟪绦蛟O(shè)計许溅、使用開源庫瓤鼻、敏捷開發(fā)等新的理論實踐不斷在克服軟件開發(fā)中的次要困難秉版,同時也減輕了一些根本困難贤重。但始終不能消除軟件復(fù)雜度這樣的根本性困難。因為隨著軟件工具能力不斷的提升清焕,軟件開發(fā)中需要面對的復(fù)雜度其實也是在不斷提升的并蝗。所以,我們在軟件生產(chǎn)效率上的提升需要的是逐步的進步秸妥,而不是期待一個一蹴而就的突破滚停。
最后
軟件工程的焦油坑在將來很長一段時間內(nèi)會繼續(xù)使人們舉步維艱,無法自拔粥惧。軟件系統(tǒng)可能是人類創(chuàng)造中最錯綜復(fù)雜的事物键畴,只能期待人們在力所能及的活在剛剛超越力所能及的范圍內(nèi)進行探索和嘗試。這個復(fù)雜的行業(yè)需要:進行持續(xù)的發(fā)展突雪;學(xué)習(xí)使用更大的要素來開發(fā)起惕;新工具的最佳使用;經(jīng)論證的工程管理方法的最佳應(yīng)用咏删;良好的自我判斷以及能夠使我們認識到自己的不足——上帝所賜予的謙卑惹想。