- 小brooks的《人月神話》這本書在軟件工程管理領(lǐng)域暢銷40年,我看的是40周年中文紀(jì)念版。相比于原版增加了一些作者根據(jù)今天軟件工程管理現(xiàn)狀添加的一些新的觀點(diǎn)與評(píng)論,看看哪些過時(shí)了,哪些依然有效。另外還附錄了一些名人以及讀者對(duì)本書的評(píng)論。整體來說,本書的主線——人月神話、沒有銀彈在現(xiàn)今的軟件工程管理領(lǐng)域依然屬于有效的基礎(chǔ)理論。但是,其中一些方法論對(duì)于國(guó)內(nèi)的軟件項(xiàng)目管理的環(huán)境是不適應(yīng)的,對(duì)于這些方法論我們可以吸收其思想精髓,改造其具體方法,創(chuàng)造一些中國(guó)特色的軟件項(xiàng)目管理方法。這是一個(gè)很大的話題,我經(jīng)驗(yàn)尚淺,所以本文就先不談這個(gè)。我想談的是本書中對(duì)我映像比較深的幾個(gè)概念理論。
焦油坑
- 焦油坑是作者用來形容大型系統(tǒng)開發(fā)的一個(gè)概念。史前時(shí)代,恐龍、猛犸象、劍齒虎這些大型食肉動(dòng)物碰到焦油坑也是沒有辦法掙脫的,而且越用力就越容易被沉入坑底。這種場(chǎng)景就像極了大型系統(tǒng)開發(fā)的工作。
各種團(tuán)隊(duì),大型的或小型的,龐雜的或精干的,一個(gè)接一個(gè)地淹沒在了焦油坑中。表面上看起來好像沒有任何一個(gè)單獨(dú)的問題會(huì)導(dǎo)致困難,每個(gè)問題都能獲得解決,但是當(dāng)它們相互糾纏和累積在一起的時(shí)候,團(tuán)隊(duì)行動(dòng)就會(huì)變得越來越慢。對(duì)于問題的麻煩程度,每個(gè)人似乎都會(huì)感到驚訝,并且很難看清問題的本質(zhì)。
- 基本上一個(gè)大型的編程系統(tǒng)產(chǎn)品的開發(fā)成本會(huì)是單個(gè)的簡(jiǎn)單程序的9倍。這里的編程系統(tǒng)產(chǎn)品是指的由很多編程程序以及系統(tǒng)組合而成的可交互、協(xié)作的程序集合。我們每個(gè)人都應(yīng)清晰的認(rèn)識(shí)到這樣一種非線性關(guān)系,認(rèn)識(shí)到真正的大型編程系統(tǒng)產(chǎn)品并不是簡(jiǎn)單程序的簡(jiǎn)單堆疊。這也就是所謂的“焦油坑”。
- 既然是明知是焦油坑,那我們?yōu)槭裁匆M(jìn)去呢?作者在書中分別列出了開發(fā)大型系統(tǒng)產(chǎn)品的樂趣以及苦惱。對(duì)我來說,在軟件開發(fā)中我的樂趣在于:
- 開發(fā)對(duì)其他人有用的東西的樂趣。
- 面對(duì)不重復(fù)的任務(wù),不斷學(xué)習(xí)的樂趣。
- 最大的苦惱在于:
- 產(chǎn)品在完成前總面臨著陳舊過時(shí)的威脅;只有實(shí)際需要時(shí),才會(huì)用到最新的設(shè)想。
人月神話
- 對(duì)于軟件項(xiàng)目進(jìn)度的估算往往會(huì)根據(jù)項(xiàng)目的緊急程度而得出過于樂觀的結(jié)果,這一方面是因?yàn)樗械木幊倘藛T都是樂觀主義者,我們往往會(huì)認(rèn)為“這次肯定能運(yùn)行”或者是“我已經(jīng)找出了最后一個(gè)bug”,另一方面則來源于市場(chǎng)的壓力,這種情況在國(guó)內(nèi)環(huán)境更甚。我們對(duì)于進(jìn)度估算的第一個(gè)錯(cuò)誤假設(shè)就是:一切都將運(yùn)作良好,每一項(xiàng)任務(wù)僅花費(fèi)它所“應(yīng)該”花費(fèi)的時(shí)間。而這個(gè)假設(shè)往往是一廂情愿的,對(duì)于創(chuàng)造性工作來說,創(chuàng)造者常常是在實(shí)現(xiàn)過程中,才發(fā)現(xiàn)在構(gòu)思設(shè)計(jì)時(shí)候的不完整性和不一致性,從而反饋到的構(gòu)思設(shè)計(jì)上,處理這種問題的時(shí)間和復(fù)雜程度會(huì)隨著項(xiàng)目的結(jié)構(gòu)以及任務(wù)的大小而呈現(xiàn)非線性增加的關(guān)系。所以對(duì)于大型軟件項(xiàng)目來說,“一切都將運(yùn)作良好”就是一件概率非常小的事情了。
- 在軟件項(xiàng)目中我們往往用人月這個(gè)指標(biāo)在衡量項(xiàng)目的工作量。但是人月這個(gè)指標(biāo)實(shí)際上是一個(gè)危險(xiǎn)的帶有欺騙性的神話。它暗示著人員數(shù)量和時(shí)間是可以互相替換的。只有在將任務(wù)分解給參與人員后他們之間不需要互相交流的情況下,人數(shù)和時(shí)間才是可以互換的。在實(shí)際軟件項(xiàng)目中,只要項(xiàng)目具有一定規(guī)模,不論是設(shè)計(jì)、開發(fā)、測(cè)試、部署各個(gè)階段都會(huì)有分解任務(wù)給不同人員,而且這些階段本身也屬于一種任務(wù)的分解,在不同人員間分解任務(wù)就不可避免的引發(fā)額外的溝通成本——培訓(xùn)和相互溝通。因?yàn)檐浖_發(fā)本質(zhì)上是一項(xiàng)系統(tǒng)工作——錯(cuò)綜復(fù)雜的關(guān)系下的一種實(shí)踐,溝通、交流的工作量非常大,它很快會(huì)消耗任務(wù)分解所節(jié)省下來的個(gè)人時(shí)間。簡(jiǎn)單來說就是,3個(gè)人要干3個(gè)月的事情不是說安排9個(gè)人就能1個(gè)月干完了。而且,在進(jìn)度落后的項(xiàng)目中增加人手的做法,往往只會(huì)使進(jìn)度更加落后。這就是去除了神話色彩的人月。
項(xiàng)目的時(shí)間依賴于順序上的限制,人員的最大數(shù)量依賴于獨(dú)立子任務(wù)的數(shù)量。從這兩個(gè)數(shù)值可以推算出進(jìn)度表,該表安排的人員較少,花費(fèi)的時(shí)間較長(zhǎng)(唯一的風(fēng)險(xiǎn)是產(chǎn)品可能會(huì)過時(shí))。相反,分派較多的人手,計(jì)劃較短的時(shí)間,將無法得到可行的進(jìn)度安排??傊?,在眾多軟件項(xiàng)目中,缺乏合理的進(jìn)度安排是造成項(xiàng)目滯后的最主要的原因,它比其他所有因素加起來的影響還要大。
外科手術(shù)隊(duì)伍
- 面對(duì)軟件項(xiàng)目的“焦油坑”以及“人月神話”,作者給出的一個(gè)解決辦法是——“外科手術(shù)隊(duì)伍”。有研究表明,同樣有兩年經(jīng)驗(yàn)而且受到同樣培訓(xùn)的情況下,優(yōu)秀的專業(yè)程序員的生產(chǎn)率是較差程序員的10倍。在軟件項(xiàng)目中,一個(gè)小型的、精干的隊(duì)伍是最好的,這樣既減少了溝通成本,又提高了生產(chǎn)率。但是對(duì)于真正意義上的大型系統(tǒng)來說,小型精干的隊(duì)伍往往意味著太慢。這就是矛盾的所在,對(duì)于效率和概念的完整性來說,最好由少數(shù)精干的人員來設(shè)計(jì)和開發(fā),而對(duì)于大型系統(tǒng)來說,則需要大量的人手,以使產(chǎn)品能在時(shí)間是滿足市場(chǎng)的需求。
- 在軟件項(xiàng)目中的“外科手術(shù)隊(duì)伍”有一個(gè)類似于外科醫(yī)生的首席程序員。他親自定義功能和性能技術(shù)說明書,設(shè)計(jì)程序,編制主架構(gòu)源代碼,測(cè)試以及書寫技術(shù)文檔。首席程序員還擁有一個(gè)副手,他主要作用是作為設(shè)計(jì)的思考者、討論者和評(píng)估人員。與傳統(tǒng)的兩人隊(duì)伍每人負(fù)責(zé)一部分工作的設(shè)計(jì)和實(shí)現(xiàn)不同,“外科手術(shù)隊(duì)伍”中的這兩個(gè)人需要一起了解所有的設(shè)計(jì)和全部的代碼。其他的程序員以及管理者,文檔編輯人員等圍繞著主架構(gòu)的設(shè)計(jì)來具體實(shí)現(xiàn)功能以及推進(jìn)項(xiàng)目。這種隊(duì)伍的好處就在于既能獲得由少數(shù)頭腦產(chǎn)生的產(chǎn)品完整性,又能得到多位協(xié)助人員的總體生產(chǎn)率,還徹底地減少了溝通的工作量。
- 作者特別強(qiáng)調(diào)軟件系統(tǒng)的概念完整性,為了確保這種完整性也是需要由一個(gè)首席程序員或者具有共識(shí)的小型團(tuán)隊(duì)來從上至下的對(duì)系統(tǒng)結(jié)構(gòu)進(jìn)行設(shè)計(jì)。
要使工作易于管理,必須清晰地劃分體系結(jié)構(gòu)設(shè)計(jì)和實(shí)現(xiàn)之間的界線,系統(tǒng)結(jié)構(gòu)師必須一絲不茍地專注于體系結(jié)構(gòu)。
沒有銀彈
在未來的十年內(nèi),無論是在技術(shù)還是管理方法上,都看不出有任何突破性的進(jìn)步,能夠保證在十年內(nèi)大幅度地提高軟件的生產(chǎn)率、可靠性和簡(jiǎn)潔性。
- 人狼這種民間傳說中存在的怪物,會(huì)在月圓之夜由我們熟悉的人類面孔變成可怕的狼臉。我們熟悉的軟件項(xiàng)目也有著人狼的特性,看似簡(jiǎn)單明了的外表,但是卻可能隨時(shí)變成一個(gè)進(jìn)度落后、超出預(yù)算、存在大量缺陷的怪物。在民間傳說中對(duì)付人狼唯一可靠的武器就是銀彈。所以銀彈在軟件項(xiàng)目中就是比喻這種使得軟件成本像計(jì)算機(jī)硬件成本一樣迅速降低的尚方寶劍。然而,作者在40年前悲觀的告訴我們,沒有銀彈。40年后我們回首望去,這個(gè)預(yù)言恐怕是真的。
- 首先我們要認(rèn)識(shí)到的是軟件開發(fā)中存在著兩種困難,一種是根本的——軟件特性中固有的困難,另一種是次要的——目前存在的,但并非與生俱來的困難。對(duì)于前一種困難來說,沒有銀彈。而后一種困難可以通過軟件工程管理或者技術(shù)的進(jìn)步來克服。
軟件開發(fā)中困難的部分是規(guī)格說明、設(shè)計(jì)和測(cè)試這些概念上的結(jié)構(gòu),而不是對(duì)概念進(jìn)行表達(dá)和對(duì)現(xiàn)實(shí)逼真程度進(jìn)行驗(yàn)證。
- 在軟件開發(fā)中存在著4個(gè)天生的根本困難——復(fù)雜度、一致性、可變性和不可見性。
- 復(fù)雜度是說在規(guī)模上,軟件實(shí)體可能比以往人類創(chuàng)造的其他任何實(shí)體都更加復(fù)雜。一方面,來自于計(jì)算機(jī)本身的復(fù)雜性,還有軟件系統(tǒng)的狀態(tài)的繁多。另一方面,軟件系統(tǒng)的各種元素還是以非線性遞增的方式在交互,使得軟件復(fù)雜度比非線性增長(zhǎng)還多得多。而且由于復(fù)雜度,軟件團(tuán)隊(duì)成員的溝通成本也非常的大,也產(chǎn)生了一系列的技術(shù)上的困難,同時(shí)還會(huì)引發(fā)很多管理上的問題。
- 一致性說得其實(shí)是軟件兼容性,我們開發(fā)的軟件往往為了保持一些必須遵循的人為慣例和系統(tǒng),必須為這些接口保持其一致性。
- 只要是從事軟件行業(yè)的人應(yīng)該都能體會(huì)到軟件的可變性,因?yàn)閼?yīng)用、用戶習(xí)慣、自然社會(huì)規(guī)律、計(jì)算機(jī)硬件等的各種變化都會(huì)無情地持續(xù)地強(qiáng)迫著軟件也要隨之變化。在軟件行業(yè)中有一句話就是,唯一不變的可能就是變化的需求。
- 不可見性是說軟件在客觀存在上不具有空間的形體特征,無法可視化。無論是流程圖還是時(shí)序圖等等軟件工程中使用的圖表都無法像地圖或者電路圖一樣在整體上給予所有使用者完整的概念。從而使得軟件設(shè)計(jì)人員和開發(fā)人員之間在設(shè)計(jì)上的一些概念無法完整而清晰的進(jìn)行溝通交流。
- 現(xiàn)代軟件工程中通過高級(jí)語言、分時(shí)系統(tǒng)、面向?qū)ο蟪绦蛟O(shè)計(jì)、使用開源庫、敏捷開發(fā)等新的理論實(shí)踐不斷在克服軟件開發(fā)中的次要困難,同時(shí)也減輕了一些根本困難。但始終不能消除軟件復(fù)雜度這樣的根本性困難。因?yàn)殡S著軟件工具能力不斷的提升,軟件開發(fā)中需要面對(duì)的復(fù)雜度其實(shí)也是在不斷提升的。所以,我們?cè)谲浖a(chǎn)效率上的提升需要的是逐步的進(jìn)步,而不是期待一個(gè)一蹴而就的突破。
最后
軟件工程的焦油坑在將來很長(zhǎng)一段時(shí)間內(nèi)會(huì)繼續(xù)使人們舉步維艱,無法自拔。軟件系統(tǒng)可能是人類創(chuàng)造中最錯(cuò)綜復(fù)雜的事物,只能期待人們?cè)诹λ芗暗幕钤趧倓偝搅λ芗暗姆秶鷥?nèi)進(jìn)行探索和嘗試。這個(gè)復(fù)雜的行業(yè)需要:進(jìn)行持續(xù)的發(fā)展;學(xué)習(xí)使用更大的要素來開發(fā);新工具的最佳使用;經(jīng)論證的工程管理方法的最佳應(yīng)用;良好的自我判斷以及能夠使我們認(rèn)識(shí)到自己的不足——上帝所賜予的謙卑。