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

o_image1.JPG


??????十個(gè)人,其中七個(gè)專業(yè)人士在解決問(wèn)題,而系統(tǒng)是一個(gè)人或者最多兩個(gè)人思考的產(chǎn)物,因此客觀上達(dá)到了概念的一致性。
??????團(tuán)隊(duì)的擴(kuò)建
??????擴(kuò)建過(guò)程的成功依賴于這樣一個(gè)事實(shí),即每個(gè)部分的概念完整性得到了徹底的提高——決定設(shè)計(jì)的人員是原來(lái)的七分之一或更少。所以,可以讓200人去解決問(wèn)題,而僅僅需要協(xié)調(diào)20個(gè)人,即那些“外科醫(yī)生”的思路。