最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

人月神話讀書(shū)筆記

2023-05-15 19:10 作者:笑到猝死的家伙  | 我要投稿

? ? ? ?讀罷本書(shū),會(huì)對(duì)軟件工程的開(kāi)發(fā)管理有一個(gè)基本的了解,對(duì)自己開(kāi)發(fā),合作提供一個(gè)思路和教科書(shū)。

? ?????整篇文章是我在閱讀這本書(shū)時(shí)自己的摘抄,可能會(huì)用重復(fù)。侵權(quán)刪。

001

焦油坑

過(guò)去幾十年的大型系統(tǒng)開(kāi)發(fā)就猶如一個(gè)焦油坑,很多大型動(dòng)物在其中劇烈掙扎,他們中大多數(shù)開(kāi)發(fā)出了可運(yùn)行的系統(tǒng)--不過(guò),其中只有非常少數(shù)的項(xiàng)目滿足了目標(biāo)、時(shí)間進(jìn)度和預(yù)算的要求。

各種團(tuán)隊(duì),大型的和小型的,龐雜的和精干的,一個(gè)接一個(gè)淹沒(méi)在了焦油坑中。表面上看起來(lái)好像沒(méi)有任何一個(gè)單獨(dú)的問(wèn)題會(huì)導(dǎo)致困難,每個(gè)都能被解決,但是當(dāng)它們相互糾纏和累積在一起的時(shí)候,團(tuán)隊(duì)的行動(dòng)就會(huì)變得越來(lái)越慢且很難看清問(wèn)題的本質(zhì)。

水平邊界以下,程序變成編程產(chǎn)品(

Programming Product)。這是可以被任何人運(yùn)行、

測(cè)試、修復(fù)和擴(kuò)展的程序。它可以運(yùn)行在多種操作系統(tǒng)平臺(tái)上,供多套數(shù)據(jù)使用。要成為通

用的編程產(chǎn)品,程序必須按照普遍認(rèn)可的風(fēng)格來(lái)編寫(xiě),特別是輸入的范圍和形式必須擴(kuò)展,

以適用于所有可以合理使用的基本算法。接著,對(duì)程序進(jìn)行徹底測(cè)試,確保它的穩(wěn)定性和可

靠性,使其值得信賴。這就意味著必須準(zhǔn)備、運(yùn)行和記錄詳盡的測(cè)試用例庫(kù),用來(lái)檢查輸入

的邊界和范圍。此外,要將程序提升為程序產(chǎn)品,還需要有完備的文檔,每個(gè)人都可以加以

使用、修復(fù)和擴(kuò)展。經(jīng)驗(yàn)數(shù)據(jù)表明,相同功能的編程產(chǎn)品的成本,至少是已經(jīng)過(guò)測(cè)試的程序

的三倍

?

回到圖中,垂直邊界的右邊,程序變成編程系統(tǒng)(Programming System)中的一個(gè)構(gòu)

件單元。它是在功能上能相互協(xié)作的程序集合,具有規(guī)范的格式,可以進(jìn)行交互,并可以用

來(lái)組裝和搭建整個(gè)系統(tǒng)。要成為系統(tǒng)構(gòu)件,程序必須按照一定的要求編制,使輸入和輸出在

語(yǔ)法和語(yǔ)義上與精確定義的接口一致。同時(shí)程序還要符合預(yù)先定義的資源限制——內(nèi)存空

間、輸入輸出設(shè)備、計(jì)算機(jī)時(shí)間。最后,程序必須同其它系統(tǒng)構(gòu)件單元一道,以任何能想象

到的組合進(jìn)行測(cè)試。由于測(cè)試用例會(huì)隨著組合不斷增加,所以測(cè)試的范圍非常廣。因?yàn)橐恍?

意想不到的交互會(huì)產(chǎn)生許多不易察覺(jué)的 bug,測(cè)試工作將會(huì)非常耗時(shí),因此相同功能的編程

系統(tǒng)構(gòu)件的成本至少是獨(dú)立程序的三倍。如果系統(tǒng)有大量的組成單元,成本還會(huì)更高。

圖 1.1 的右下部分代表編程系統(tǒng)產(chǎn)品(

Programming Systems Product)。和以上的所

有的情況都不同的是,它的成本高達(dá)九倍。然而,只有它才是真正有用的產(chǎn)品,是大多數(shù)系

統(tǒng)開(kāi)發(fā)的目標(biāo)

?

002人月神話

在眾多軟件項(xiàng)目中,缺乏合理的時(shí)間進(jìn)度是造成項(xiàng)目滯后的最主要原因,它比其他所

有因素加起來(lái)的影響還大。導(dǎo)致這種普遍性災(zāi)難的原因是什么呢?

首先,我們對(duì)估算技術(shù)缺乏有效的研究,更加嚴(yán)肅地說(shuō),它反映了一種悄無(wú)聲息,但

并不真實(shí)的假設(shè)——一切都將運(yùn)作良好。

第二,我們采用的估算技術(shù)隱含地假設(shè)人和月可以互換,錯(cuò)誤地將進(jìn)度與工作量相互

混淆。

第三,由于對(duì)自己的估算缺乏信心,軟件經(jīng)理通常不會(huì)有耐心持續(xù)地進(jìn)行估算這項(xiàng)工

作。

第四,對(duì)進(jìn)度缺少跟蹤和監(jiān)督。其他工程領(lǐng)域中,經(jīng)過(guò)驗(yàn)證的跟蹤技術(shù)和常規(guī)監(jiān)督程

序,在軟件工程中常常被認(rèn)為是無(wú)謂的舉動(dòng)。

第五,當(dāng)意識(shí)到進(jìn)度的偏移時(shí),下意識(shí)(以及傳統(tǒng))的反應(yīng)是增加人力。這就像使用

汽油滅火一樣,只會(huì)使事情更糟。越來(lái)越大的火勢(shì)需要更多的汽油,從而進(jìn)入了一場(chǎng)注定會(huì)

導(dǎo)致災(zāi)難的循環(huán)。

?

所有的編程人員都是樂(lè)觀主義者??赡苁沁@種現(xiàn)代魔術(shù)特別吸引那些相信美滿結(jié)局的

人;也可能是成百上千瑣碎的挫折趕走了大多數(shù)人,只剩下了那些習(xí)慣上只關(guān)注結(jié)果的人;

還可能僅僅因?yàn)橛?jì)算機(jī)還很年輕,程序員更加年輕,而年輕人總是些樂(lè)觀主義者——無(wú)論是

什么樣的程序,結(jié)果是勿庸置疑的:“這次它肯定會(huì)運(yùn)行?!被蛘摺拔覄倓傉页隽俗詈笠粋€(gè)錯(cuò)

誤?!?

所以系統(tǒng)編程的進(jìn)度安排背后的第一個(gè)假設(shè)是:一切都將運(yùn)作良好,每一項(xiàng)任務(wù)僅花

費(fèi)它所“應(yīng)該”花費(fèi)的時(shí)間。

?

?

第二個(gè)謬誤的思考方式是在估計(jì)和進(jìn)度安排中使用的工作量單位:人月。成本的確隨

開(kāi)發(fā)產(chǎn)品的人數(shù)和時(shí)間的不同,有著很大的變化,進(jìn)度卻不是如此。因此我認(rèn)為用人月作為

衡量一項(xiàng)工作的規(guī)模是一個(gè)危險(xiǎn)和帶有欺騙性的神話。它暗示著人員數(shù)量和時(shí)間是可以相互

替換的。

人數(shù)和時(shí)間的互換僅僅適用于以下情況:某個(gè)任務(wù)可以分解給參與人員,并且他們之

間不需要相互的交流(圖 2.1)。這在割小麥或收獲棉花的工作中是可行的;而在系統(tǒng)編程

中近乎不可能。

?

?

?

。

?

?

?

?

對(duì)于軟件任務(wù)的進(jìn)度安排,以下是我使用了很多年的經(jīng)驗(yàn)法則:

1/3 計(jì)劃

1/6 編碼

- 10 -

1/4 構(gòu)件測(cè)試和早期系統(tǒng)測(cè)試

1/4 系統(tǒng)測(cè)試,所有的構(gòu)件已完成

在許多重要的方面,它與傳統(tǒng)的進(jìn)度安排方法不同:

1. 分配給計(jì)劃的時(shí)間比尋常的多。即便如此,仍不足以產(chǎn)生詳細(xì)和穩(wěn)定的計(jì)劃規(guī)格說(shuō)

明,也不足以容納對(duì)全新技術(shù)的研究和摸索。

2. 對(duì)所完成代碼的調(diào)試和測(cè)試,投入近一半的時(shí)間,比平常的安排多很多。

3. 容易估計(jì)的部分,即編碼,僅僅分配了六分之一的時(shí)間。

?

?

?

前面的討論僅僅是第一個(gè)里程碑估計(jì)不當(dāng)?shù)那闆r。如果在 3 月 1 日,項(xiàng)目經(jīng)理做出了

比較保守的假設(shè),即整個(gè)估計(jì)過(guò)于樂(lè)觀了,如圖 2.7 所示。6 個(gè)人手需要添加到原先的任務(wù)

中。培訓(xùn)、任務(wù)的重新分配、系統(tǒng)測(cè)試工作量的計(jì)算作為練習(xí)留給讀者。但是毫無(wú)疑問(wèn),重

現(xiàn)“災(zāi)難”所開(kāi)發(fā)出的產(chǎn)品,比沒(méi)有增加人手,而是重新安排開(kāi)發(fā)進(jìn)度所產(chǎn)生的產(chǎn)品更差。

簡(jiǎn)單、武斷地重復(fù)一下 Brooks 法則:

向進(jìn)度落后的項(xiàng)目中增加人手,只會(huì)使進(jìn)度更加落后。(Adding manpower to a late

software project makes it later)

?

向軟件項(xiàng)目中增派人手從三個(gè)方面增加了項(xiàng)目必要的總體工作量:

?

任務(wù)重新分配本身和所造成的工作中斷;

?

培訓(xùn)新人員;

?

額外的相互溝通。

?

?

?

003外科手術(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)

象是否普遍成立。)

?

?

?

外科醫(yī)生。Mills 稱之為首席程序員。他親自定義功能和性能技術(shù)說(shuō)明書(shū),設(shè)計(jì)程序,

編制源代碼,測(cè)試以及書(shū)寫(xiě)技術(shù)文檔。他使用例如 PL/I 的結(jié)構(gòu)化編程語(yǔ)言,擁有對(duì)計(jì)算機(jī)

系統(tǒng)的訪問(wèn)能力;該計(jì)算機(jī)系統(tǒng)不僅僅能進(jìn)行測(cè)試,還存儲(chǔ)程序的各種版本,以允許簡(jiǎn)單的

文件更新,并對(duì)他的文檔提供文本編輯能力。首席程序員需要極高的天分、十年的經(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é)任。

?

工具維護(hù)人員?,F(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ù)。

?

?

004貴族專制、民主政治和系統(tǒng)設(shè)計(jì)(Aristocracy,

Democracy, and System Design)

?

我主張?jiān)谙到y(tǒng)設(shè)計(jì)中,概念完整性應(yīng)該是最重要的考慮因素。也就是說(shuō)為了反映一系

列連貫的設(shè)計(jì)思路,寧可省略一些不規(guī)則的特性和改進(jìn),也不提倡獨(dú)立和無(wú)法整合的系統(tǒng),

哪怕它們其實(shí)包含著許多很好的設(shè)計(jì)。在本章和以下的兩章里,我們將解釋在編程系統(tǒng)設(shè)計(jì)

中,這個(gè)主題的重要性。

?

對(duì)于非常大型的項(xiàng)目,將設(shè)計(jì)方法、體系結(jié)構(gòu)方面的工作與具體實(shí)現(xiàn)相分離是獲得概

念完整性的強(qiáng)有力方法。我親眼目睹了它在 IBM 的 Stretch 計(jì)算機(jī)和 360 計(jì)算機(jī)產(chǎn)品線上的巨大成功。但同時(shí)我也看到了這種方法在 360 操作系統(tǒng)的開(kāi)發(fā)中,由于缺乏廣泛應(yīng)用所遭受的失敗。

?

?

現(xiàn)在讓我們來(lái)處理具有濃厚感情色彩的問(wèn)題——貴族統(tǒng)治和民主政治。結(jié)構(gòu)師難道不

是新貴?他們一些智力精英,專門(mén)來(lái)告訴可憐的實(shí)現(xiàn)人員如何工作?是否所有的創(chuàng)造性活動(dòng)

被那些精英單獨(dú)占有,實(shí)現(xiàn)人員僅僅是機(jī)器中的齒輪?難道不能遵循民主的理論,從所有的

員工中搜集好的創(chuàng)意,以得到更好的產(chǎn)品,而不是將技術(shù)說(shuō)明工作僅限定于少數(shù)人?

?

最后一個(gè)問(wèn)題是最簡(jiǎn)單的。我當(dāng)然不認(rèn)為只有結(jié)構(gòu)師才有好的創(chuàng)意。新的概念經(jīng)常來(lái)

自實(shí)現(xiàn)者或者用戶。然而,我一直試圖表達(dá),并且我所有的經(jīng)驗(yàn)使我確信,系統(tǒng)的概念完整

性決定了使用的容易程度。不能與系統(tǒng)基本概念進(jìn)行整合的良好想法和特色,最好放到一邊,

不予考慮。如果出現(xiàn)了很多非常重要但不兼容的構(gòu)想,就應(yīng)該拋棄原來(lái)的設(shè)計(jì),對(duì)不同基本

概念進(jìn)行合并,在合并后的系統(tǒng)上重新開(kāi)始。

?

004管理

一個(gè)可以開(kāi)闊結(jié)構(gòu)師眼界的準(zhǔn)則是為每個(gè)小功能分配一個(gè)值:每次改進(jìn),功能 x 不超

過(guò) m 字節(jié)的內(nèi)存和 n 微秒。這些值會(huì)在一開(kāi)始作為決策的向?qū)В谖锢韺?shí)現(xiàn)期間充當(dāng)指南和對(duì)所有人的警示。

項(xiàng)目經(jīng)理如何避免畫(huà)蛇添足(second-system effect)?他必須堅(jiān)持至少擁有兩個(gè)系

統(tǒng)以上開(kāi)發(fā)經(jīng)驗(yàn)結(jié)構(gòu)師的決定。同時(shí),保持對(duì)特殊誘惑的警覺(jué),他可以不斷提出正確的問(wèn)題,

確保原則上的概念和目標(biāo)在詳細(xì)設(shè)計(jì)中得到完整的體現(xiàn)。

?

手冊(cè)、或者書(shū)面規(guī)格說(shuō)明,是一個(gè)非常必要的工具,盡管光有文檔是不夠的。手冊(cè)是

產(chǎn)品的外部規(guī)格說(shuō)明,它描述和規(guī)定了用戶所見(jiàn)的每一個(gè)細(xì)節(jié);同樣的,它也是結(jié)構(gòu)師主要

的工作產(chǎn)物。

?

手冊(cè)不但要描述包括所有界面在內(nèi)的用戶可見(jiàn)的一切,它同時(shí)還要避免描述用戶看不

見(jiàn)的事物。后者是編程實(shí)現(xiàn)人員的工作范疇,而實(shí)現(xiàn)人員的設(shè)計(jì)和創(chuàng)造是不應(yīng)該被限制的。

體系結(jié)構(gòu)設(shè)計(jì)人員必須為自己描述的任何特性準(zhǔn)備一種實(shí)現(xiàn)方法,但是他不應(yīng)該試圖支配具

體的實(shí)現(xiàn)過(guò)程。

?

一句古老的格言警告說(shuō):“決不要攜帶兩個(gè)時(shí)鐘出海,帶一個(gè)或三個(gè)?!蓖瑯拥脑瓌t也

適用于形式化和記敘性定義。如果同時(shí)具有兩種方式,則必須以一種作為標(biāo)準(zhǔn),另一種作為

輔助描述,并照此明確地進(jìn)行劃分。它們都可以作為表達(dá)的標(biāo)準(zhǔn),例如,Algol 68 采用形

式化定義作為標(biāo)準(zhǔn),記敘性文字作為輔助。PL/I 使用記敘性定義作為主要方式,形式化定

義用作輔助表述。System/360 也將記敘性文字用作標(biāo)準(zhǔn),以及形式化定義用作派生的論述。

?

在規(guī)定系統(tǒng)外部功能的同時(shí),幾乎所有的形式化定義均會(huì)用來(lái)描述和表達(dá)硬件系統(tǒng)或

軟件系統(tǒng)的某個(gè)設(shè)計(jì)實(shí)現(xiàn)。語(yǔ)法和規(guī)則的表達(dá)可以不需要具體的設(shè)計(jì)實(shí)現(xiàn),但是特定的語(yǔ)義

和意義通常會(huì)通過(guò)一段實(shí)現(xiàn)該功能的程序來(lái)定義。理所當(dāng)然,這是一種實(shí)現(xiàn),不過(guò)它過(guò)多地

限定了體系結(jié)構(gòu)。所以必須特別指出形式化定義僅僅用于外部功能,說(shuō)明它們是什么。

?

周例會(huì)的決策會(huì)給出迅捷的結(jié)論,允許工作繼續(xù)進(jìn)行。如果任何人對(duì)結(jié)果過(guò)于不高興,

可以立刻訴諸于項(xiàng)目經(jīng)理,但是這種情況非常少見(jiàn)。

這種會(huì)議的卓有成效是由于:

1. 數(shù)月內(nèi),相同小組——結(jié)構(gòu)師、用戶和實(shí)現(xiàn)人員——每周交流一次。因此,大家對(duì)

項(xiàng)目相關(guān)的內(nèi)容比較了解,不需要安排額外時(shí)間對(duì)人員進(jìn)行培訓(xùn)。

2. 上述小組十分睿智和敏銳,深刻理解所面對(duì)的問(wèn)題,并且與產(chǎn)品密切相關(guān)。沒(méi)有人

是“顧問(wèn)”的角色,每個(gè)人都要承擔(dān)義務(wù)。

3. 當(dāng)問(wèn)題出現(xiàn)時(shí),在界線的內(nèi)部和外部同時(shí)尋求解決方案。

4. 正式的書(shū)面建議集中了注意力,強(qiáng)制了決策的制訂,避免了會(huì)議草稿紀(jì)要方式的不

一致。

5. 清晰地授予首席結(jié)構(gòu)師決策的權(quán)力,避免了妥協(xié)和拖延。

?

巴比倫塔的管理教訓(xùn)

據(jù)《創(chuàng)世紀(jì)》記載,巴比倫塔是人類繼諾亞方舟之后的第二大工程壯舉,但巴比倫塔

同時(shí)也是第一個(gè)徹底失敗的工程。

這個(gè)故事在很多方面和不同層次都是非常深刻和富有教育意義的。讓我們將它僅僅作

為純粹的工程項(xiàng)目,來(lái)看看有什么值得學(xué)習(xí)的教訓(xùn)。這個(gè)項(xiàng)目到底有多好的先決條件?他們

是否有:

1. 清晰的目標(biāo)?是的,盡管幼稚得近乎不可能。而且,項(xiàng)目早在遇到這個(gè)基本的限制

之前,就已經(jīng)失敗了。

2. 人力?非常充足。

3. 材料?在美索不達(dá)米亞有著豐富的泥土和柏油瀝青。

4. 足夠的時(shí)間?沒(méi)有任何時(shí)間限制的跡象。

5. 足夠的技術(shù)?是的,金字塔、錐形的結(jié)構(gòu)本身就是穩(wěn)定的,可以很好分散壓力負(fù)載。

對(duì)磚石建筑技術(shù),人們有過(guò)深刻的研究。同樣,項(xiàng)目遠(yuǎn)在達(dá)到技術(shù)限制之間,就已經(jīng)失敗了。

那么,既然他們具備了所有的這些條件,為什么項(xiàng)目還會(huì)失敗呢?他們還缺乏些什么?

兩個(gè)方面——交流,以及交流的結(jié)果——組織。他們無(wú)法相互交談,從而無(wú)法合作。當(dāng)合作

無(wú)法進(jìn)行時(shí),工作陷入了停頓。通過(guò)史書(shū)的字里行間,我們推測(cè)交流的缺乏導(dǎo)致了爭(zhēng)辯、沮

喪和群體猜忌。很快,部落開(kāi)始分裂——大家選擇了孤立,而不是互相爭(zhēng)吵。

?

我們很快決定了每一個(gè)編程人員應(yīng)該了解所有的材料,即在每間辦公室中應(yīng)保留一份

工作手冊(cè)的拷貝。

?

卡內(nèi)基-梅隆大學(xué)的 D.L.Parnas 提出了更徹底的解決方法 1 。他認(rèn)為,編程人員僅了

解自己負(fù)責(zé)的部分,而不是整個(gè)系統(tǒng)的開(kāi)發(fā)細(xì)節(jié)時(shí),工作效率最高。這種方法的先決條件是

精確和完整地定義所有接口。這的確是一個(gè)徹底的解決方法。如果能處理得好,的確是能解

決很多“災(zāi)難”。一個(gè)好的信息系統(tǒng)不但能暴露接口錯(cuò)誤,還能有助于改正錯(cuò)誤。

?

讓我們考慮一下樹(shù)狀編程隊(duì)伍,以及要使它行之有效,每棵子樹(shù)所必須具備的基本要

素。它們是:

1. 任務(wù)(a mission)

2. 產(chǎn)品負(fù)責(zé)人(a producer)

3. 技術(shù)主管和結(jié)構(gòu)師(a technical director or architect)

4. 進(jìn)度(a schedule)

5. 人力的劃分(a division of labor)

6. 各部分之間的接口定義(interface definitions among the parts)

?

產(chǎn)品負(fù)責(zé)人的角色是什么?他組建團(tuán)隊(duì),劃分工作及制訂進(jìn)度表。他要求,并一直要

求必要的資源。這意味著他主要的工作是與團(tuán)隊(duì)外部,向上和水平地溝通。他建立團(tuán)隊(duì)內(nèi)部

的溝通和報(bào)告方式。最后,他確保進(jìn)度目標(biāo)的實(shí)現(xiàn),根據(jù)環(huán)境的變化調(diào)整資源和團(tuán)隊(duì)的構(gòu)架。

?

那么技術(shù)主管的角色是什么?他對(duì)設(shè)計(jì)進(jìn)行構(gòu)思,識(shí)別系統(tǒng)的子部分,指明從外部看

上去的樣子,勾畫(huà)它的內(nèi)部結(jié)構(gòu)。他提供整個(gè)設(shè)計(jì)的一致性和概念完整性;他控制系統(tǒng)的復(fù)

雜程度。當(dāng)某個(gè)技術(shù)問(wèn)題出現(xiàn)時(shí),他提供問(wèn)題的解決方案,或者根據(jù)需要調(diào)整系統(tǒng)設(shè)計(jì)。用

Al Capp 所喜歡的一句諺語(yǔ),他是“攻堅(jiān)小組中的獨(dú)行俠”(

inside-man at the skunk works.)。

他的溝通交流在團(tuán)隊(duì)中是首要的。他的工作幾乎完全是技術(shù)性的。

?

技術(shù)主管作為總指揮,產(chǎn)品負(fù)責(zé)人充當(dāng)其左右手

我猜測(cè)最后一種安排對(duì)小型的團(tuán)隊(duì)是最好的選擇,如同在第 3 章《外科手術(shù)隊(duì)伍》一

文中所述。對(duì)于真正大型項(xiàng)目中的一些開(kāi)發(fā)隊(duì)伍,我認(rèn)為產(chǎn)品負(fù)責(zé)人作為管理者是更合適的

安排

?

006胸有成竹(Calling the Shot)

必須聲明的是,構(gòu)建獨(dú)立小型程序的數(shù)據(jù)不適用于編程系統(tǒng)產(chǎn)品。對(duì)規(guī)模平均 為 3200 指令的程序,如 Sackman、Erikson 和 Grant 的報(bào)告中所述,大約單個(gè)的程序員所需 要的編碼和調(diào)試時(shí)間為 178 個(gè)小時(shí),由此可以外推得到每年 35,800 語(yǔ)句的生產(chǎn)率。而規(guī)模

只有一半的程序花費(fèi)時(shí)間大約僅為前者的四分之一,相應(yīng)推斷出的生產(chǎn)率幾乎是每年

80,000 代碼行 1 。計(jì)劃、編制文檔、測(cè)試、系統(tǒng)集成和培訓(xùn)的時(shí)間必須被考慮在內(nèi)。因此,

上述小型項(xiàng)目數(shù)據(jù)的外推是沒(méi)有意義的。就好像把 100 碼短跑記錄外推,得出人類可以在 3

分鐘之內(nèi)跑完 1 英里的結(jié)論一樣。

?

?

?

Aron、Harr 和 OS/360 的數(shù)據(jù)都證實(shí),生產(chǎn)率會(huì)根據(jù)任務(wù)本身復(fù)雜度和困難程度表現(xiàn)出

顯著差異。在復(fù)雜程度估計(jì)這片“沼澤”上的指導(dǎo)原則是:編譯器的復(fù)雜度是批處理程序的

三倍,操作系統(tǒng)復(fù)雜度是編譯器的三倍 8 。

?

對(duì)常用編程語(yǔ)句而言。生產(chǎn)率似乎是固定的。這個(gè)固定的生產(chǎn)率包括了編程中需要

注釋,并可能存在錯(cuò)誤的情況.

‰ 使用適當(dāng)?shù)母呒?jí)語(yǔ)言,編程的生產(chǎn)率可以提高 5 倍

?

?

削足適履(Ten Pounds in a Five-Pound

Sack)

?

第三個(gè)更深刻的教訓(xùn)體現(xiàn)在以上的經(jīng)驗(yàn)中。項(xiàng)目規(guī)模本身很大,缺乏管理和溝通,以

至于每個(gè)團(tuán)隊(duì)成員認(rèn)為自己是爭(zhēng)取小紅花的學(xué)生,而不是構(gòu)建系統(tǒng)軟件產(chǎn)品的人員。為了滿

足目標(biāo),每個(gè)人都在局部?jī)?yōu)化自己的程序,很少會(huì)有人停下來(lái),考慮一下對(duì)客戶的整體影響。

對(duì)大型項(xiàng)目而言,這種導(dǎo)向和缺乏溝通是最大的危險(xiǎn)。在整個(gè)實(shí)現(xiàn)的過(guò)程期間,系統(tǒng)結(jié)構(gòu)師

必須保持持續(xù)的警覺(jué),確保連貫的系統(tǒng)完整性。在這種監(jiān)督機(jī)制之外,是實(shí)現(xiàn)人員自身的態(tài)

度問(wèn)題。培養(yǎng)開(kāi)發(fā)人員從系統(tǒng)整體出發(fā)、面向用戶的態(tài)度是軟件編程管理人員最重要的職能。

?

提綱挈領(lǐng)(The Documentary Hypothesis)

?

?

?

?

在許多軟件項(xiàng)目中,開(kāi)發(fā)人員從商討結(jié)構(gòu)的會(huì)議開(kāi)始,然后開(kāi)始書(shū)寫(xiě)代碼。不論項(xiàng)目

的規(guī)模如何小,項(xiàng)目經(jīng)理聰明的做法都是:立刻正式生成若干文檔作為自己的數(shù)據(jù)基礎(chǔ),哪

怕這些迷你文檔非常簡(jiǎn)單。接著,他會(huì)和其他管理人員一樣要求各種文檔。

?

做什么:目標(biāo)。定義了待完成的目標(biāo)、迫切需要的資源、約束和優(yōu)先級(jí)。

?

做什么:產(chǎn)品技術(shù)說(shuō)明。以建議書(shū)開(kāi)始,以用戶手冊(cè)和內(nèi)部文檔結(jié)束。速度和空間說(shuō)

明是關(guān)鍵的部分。

?

時(shí)間:進(jìn)度表

?

資金:預(yù)算

- 62 -

地點(diǎn):工作空間分配

?

人員:組織圖。它與接口說(shuō)明是相互依存的,如同 Conway 的規(guī)律所述:“設(shè)計(jì)系統(tǒng)的

組織架構(gòu)受到產(chǎn)品的約束限制,生產(chǎn)出的系統(tǒng)是這些組織機(jī)構(gòu)溝通結(jié)構(gòu)的映射。1 ”Conway

接著指出,一開(kāi)始反映系統(tǒng)設(shè)計(jì)的組織架構(gòu)圖,肯定不會(huì)是正確的。如果系統(tǒng)設(shè)計(jì)能自由地

變化,則項(xiàng)目組織架構(gòu)必須為變化做準(zhǔn)備。

?

?

未雨綢繆(Plan to Throw One Away)

因此,管理上的問(wèn)題不再是“是否構(gòu)建一個(gè)試驗(yàn)性的系統(tǒng),然后拋棄它?”你必須這

樣做。現(xiàn)在的問(wèn)題是“是否預(yù)先計(jì)劃拋棄原型的開(kāi)發(fā),或者是否將該原型發(fā)布給用戶?”從

這個(gè)角度看待問(wèn)題,答案更加清晰。將原型發(fā)布給用戶,可以獲得時(shí)間,但是它的代價(jià)高昂

——對(duì)于用戶,使用極度痛苦;對(duì)于重新開(kāi)發(fā)的人員,分散了精力;對(duì)于產(chǎn)品,影響了聲譽(yù),

即使最好的再設(shè)計(jì)也難以挽回名聲。

?

軟件維護(hù)不包括清潔、潤(rùn)滑和對(duì)損壞器件的修復(fù)。它主要包含對(duì)設(shè)計(jì)缺陷的修復(fù)。和

硬件維護(hù)相比,這些軟件變更包含了更多的新增功能,它通常是用戶能察覺(jué)的。

對(duì)于一個(gè)廣泛使用的程序,其維護(hù)總成本通常是開(kāi)發(fā)成本的 40%或更多。令人吃驚的

是,該成本受用戶數(shù)目的嚴(yán)重影響。用戶越多,所發(fā)現(xiàn)的錯(cuò)誤也越多。

?

程序維護(hù)中的一個(gè)基本問(wèn)題是——缺陷修復(fù)總會(huì)以(20-50)%的機(jī)率引入新的 bug。

所以整個(gè)過(guò)程是前進(jìn)兩步,后退一步。

為什么缺陷不能更徹底地被修復(fù)?首先,看上去很輕微的錯(cuò)誤,似乎僅僅是局部操作

上的失敗,實(shí)際上卻是系統(tǒng)級(jí)別的問(wèn)題,通常這不是很明顯。修復(fù)局部問(wèn)題的工作量很清晰,

并且往往不大。但是,更大范圍的修復(fù)工作常常會(huì)被忽視,除非軟件結(jié)構(gòu)很簡(jiǎn)單,或者文檔

書(shū)寫(xiě)得非常詳細(xì)。其次,維護(hù)人員常常不是編寫(xiě)代碼的開(kāi)發(fā)人員,而是一些初級(jí)程序員或者

新手。

?

干將莫邪(Sharp Tools)

輔助機(jī)器和數(shù)據(jù)服務(wù)

仿真裝置。如果目標(biāo)機(jī)器是新產(chǎn)品,則需要一個(gè)目標(biāo)機(jī)器的邏輯仿真裝置。這樣,在

生產(chǎn)出新機(jī)器之前,就有輔助的調(diào)試平臺(tái)可供使用。同樣重要的是——即使在新機(jī)器出現(xiàn)之

- 73 - 后,仿真裝置仍然可以提供可靠的調(diào)試平臺(tái)。

可靠并不等于精確。在某些方面,仿真機(jī)器肯定無(wú)法精確地達(dá)到與新型機(jī)器一致的實(shí)

現(xiàn)。但是至少在一段時(shí)間內(nèi),它的實(shí)現(xiàn)是穩(wěn)定的,新硬件就不會(huì)。

現(xiàn)在,我們已經(jīng)習(xí)慣于計(jì)算機(jī)硬件自始至終能正常工作。除非程序開(kāi)發(fā)人員發(fā)現(xiàn)相同

運(yùn)算在運(yùn)行時(shí)會(huì)產(chǎn)生不一致的結(jié)果,否則出錯(cuò)時(shí),他都會(huì)被建議去檢查自己代碼中的錯(cuò)誤,

而不是去懷疑他的運(yùn)行平臺(tái)。

這樣的經(jīng)驗(yàn),對(duì)于支持新型機(jī)器的編程工作來(lái)說(shuō),是不好的。實(shí)驗(yàn)室研制和試制的模

型產(chǎn)品和早期硬件不會(huì)像定義的那樣運(yùn)行,不會(huì)穩(wěn)定工作,甚至每天都不會(huì)一樣。當(dāng)一些缺

陷被發(fā)現(xiàn)時(shí),所有的機(jī)器拷貝,包括軟件編程小組所使用的,都會(huì)發(fā)生修改。這種飄忽不定

的開(kāi)發(fā)基礎(chǔ)實(shí)在是夠糟的。而硬件失敗,通常是間歇性的,導(dǎo)致情況更加惡劣。不確定性是

所有情況中最糟糕的,因?yàn)樗鼊儕Z了開(kāi)發(fā)人員查找 bug 的動(dòng)力——可能根本就沒(méi)有問(wèn)題。所

以,一套運(yùn)行在穩(wěn)定平臺(tái)上的可靠仿真裝置,提供了遠(yuǎn)大于我們所期望的功用。

編譯器和匯編平臺(tái)。出于同樣的原因,編譯器和匯編軟件需要運(yùn)行在可靠的輔助平臺(tái)

上,為目標(biāo)機(jī)器編譯目標(biāo)代碼。接著,可以在仿真器上立刻開(kāi)始后續(xù)的調(diào)試。

高級(jí)語(yǔ)言的編程開(kāi)發(fā)中,在目標(biāo)機(jī)器上開(kāi)始全面測(cè)試目標(biāo)代碼之前,編譯器可以在輔

助機(jī)器上完成很多目標(biāo)代碼的調(diào)試和測(cè)試工作。這為直接運(yùn)行提供了支持,而不僅僅是穩(wěn)定

機(jī)器上的仿真結(jié)果。

程序庫(kù)和管理。在 OS/360 開(kāi)發(fā)中,一個(gè)非常成功的重要輔助機(jī)器應(yīng)用是維護(hù)程序庫(kù)。

該系統(tǒng)由 W. R. Crowley 帶領(lǐng)開(kāi)發(fā),連接兩臺(tái) 7010 機(jī)器,共享一個(gè)很大的磁盤(pán)數(shù)據(jù)庫(kù)。7010

同時(shí)還提供 System/360 匯編程序。所有經(jīng)過(guò)測(cè)試或者正在測(cè)試的代碼都保存在該庫(kù)中,包

括源代碼和匯編裝載模塊。這個(gè)庫(kù)實(shí)際上劃分成不同訪問(wèn)規(guī)則下的子庫(kù)。

首先,每個(gè)組或者編程人員分配了一個(gè)區(qū)域,用來(lái)存放他的程序拷貝、測(cè)試用例以及

單元測(cè)試需要的測(cè)試輔助例程和數(shù)據(jù)。在這個(gè)開(kāi)發(fā)庫(kù)(playpen)中,不存在任何限制開(kāi)發(fā)

人員的規(guī)定。他可以自由處置自己的程序,他是它們的擁有者。

當(dāng)開(kāi)發(fā)人員準(zhǔn)備將軟件單元集成到更大的部分時(shí),他向集成經(jīng)理提交一份拷貝,后者

將拷貝放置在系統(tǒng)集成子庫(kù)中。此時(shí),原作者不可以再改變代碼,除非得到了集成經(jīng)理的批

準(zhǔn)。當(dāng)系統(tǒng)合并在一起時(shí),集成經(jīng)理開(kāi)始進(jìn)行所有的系統(tǒng)測(cè)試工作,識(shí)別和修補(bǔ) bug。

- 74 - 有時(shí),系統(tǒng)的一個(gè)版本可能會(huì)被廣泛應(yīng)用,它被提升到當(dāng)前版本子庫(kù)。此時(shí),這個(gè)拷

貝是不可更改的,除非有重大缺陷。該版本可以用于所有新模塊的集成和測(cè)試。7010 上的

一個(gè)程序目錄對(duì)每個(gè)模塊的每個(gè)版本進(jìn)行跟蹤,包括它的狀態(tài)、用途和變更。

這有兩個(gè)重要的理念。首先是受控,即程序的拷貝屬于經(jīng)理,他可以獨(dú)立地授權(quán)程序

的變更。其次是使發(fā)布的進(jìn)展變得正式,以及開(kāi)發(fā)庫(kù)(playpen)與集成、發(fā)布的正式分離。

在我看來(lái),這是 OS/360 工作中最優(yōu)秀的成果之一。它實(shí)際上是管理技術(shù)的一部分,很

多大型的項(xiàng)目都獨(dú)立地發(fā)展了這些技術(shù) 2 ,包括 Bell 試驗(yàn)室、ICL、劍橋大學(xué)等。它同樣適

用于文檔,是一種不可缺少的技術(shù)。

編程工具。隨著調(diào)試技術(shù)的出現(xiàn),舊方法的使用減少了,但并沒(méi)有消失。因此,還是

需要內(nèi)存轉(zhuǎn)儲(chǔ)、源文件編輯、快照轉(zhuǎn)儲(chǔ)、甚至跟蹤等工具。

與之類似,一整套實(shí)用程序同樣是必要的,用來(lái)實(shí)現(xiàn)磁帶走帶、拷貝磁盤(pán)、打印文件、

更改目錄等工作。如果一開(kāi)始就任命了項(xiàng)目的工具操作和維護(hù)人員,那么這些工作可以一次

完成,并且隨時(shí)處在待命狀態(tài)。

文檔系統(tǒng)。在所有的工具中,最能節(jié)省勞動(dòng)力的,可能是運(yùn)行在可靠平臺(tái)上的、計(jì)算

機(jī)化的文本編輯系統(tǒng)。我們有一套使用非常方便的系統(tǒng),由 J. W. Franklin 發(fā)明。沒(méi)有它,

OS/360 手冊(cè)的進(jìn)度可能會(huì)遠(yuǎn)遠(yuǎn)落后,而且更加晦澀難懂。另外,對(duì)于 6 英尺的 OS/360 手冊(cè),

很多人認(rèn)為它表達(dá)的是一大堆口頭垃圾,巨大容量帶來(lái)了新的不理解問(wèn)題——這種觀點(diǎn)有一

些道理。

對(duì)此,我通過(guò)兩種途徑作出了反應(yīng)。首先,OS/360 的文檔規(guī)模是不可避免的,需要制

訂仔細(xì)的閱讀計(jì)劃。如果選擇性地閱讀,則可以忽略大部分內(nèi)容和省下大量時(shí)間。人們必須

把 OS/360 的文檔看成是圖書(shū)館或者百科全書(shū),而不是一系列強(qiáng)制閱讀的文章。

第二,它比那些刻畫(huà)了大多數(shù)編程系統(tǒng)特性的短篇文檔更加可取。不過(guò),我也承認(rèn),

手冊(cè)仍有某些需要大量改進(jìn)的地方,經(jīng)改進(jìn)后文檔篇幅會(huì)大大減少。事實(shí)上,某些部分(“概

念和設(shè)施”)已經(jīng)被很好地改寫(xiě)了。

性能仿真裝置。最好有一個(gè)。正如我們將在下章討論到的,徹底地開(kāi)發(fā)一個(gè)。使用相

同的自頂向下設(shè)計(jì)方法,來(lái)實(shí)現(xiàn)性能仿真器、邏輯仿真裝置和產(chǎn)品。盡可能早地開(kāi)始這項(xiàng)工

作,仔細(xì)地聽(tīng)取“它們表達(dá)的意見(jiàn)”

?

?

整體部分(The Whole and the Parts)

我能召喚遙遠(yuǎn)的精靈。

那又怎么樣,我也可以,誰(shuí)都可以,問(wèn)題是你真的召喚的時(shí)候,它們會(huì)來(lái)嗎?

- 莎士比亞,《亨利四世》,第一部分

?

自頂向下的設(shè)計(jì)。在 1971 年的一篇論文中,Niklaus Wirth 把一種被很多最優(yōu)秀的編

程人員所使用的設(shè)計(jì)流程 2 形式化。盡管他的理念是為了程序設(shè)計(jì),同樣也完全適用于復(fù)雜

系統(tǒng)的軟件開(kāi)發(fā)設(shè)計(jì)。他將程序開(kāi)發(fā)劃分成體系結(jié)構(gòu)設(shè)計(jì)、設(shè)計(jì)實(shí)現(xiàn)和物理編碼實(shí)現(xiàn),每個(gè)步驟可以使用自頂向下的方法很好地實(shí)現(xiàn)。?

簡(jiǎn)言之,Wirth 的流程將設(shè)計(jì)看成一系列精化步驟。開(kāi)始是勾畫(huà)出能得到主要結(jié)果的,

但比較粗略的任務(wù)定義和大概的解決方案。然后,對(duì)該定義和方案進(jìn)行細(xì)致的檢查,以判斷

結(jié)果與期望之間的差距。同時(shí),將上述步驟的解決方案,在更細(xì)的步驟中進(jìn)行分解,每一項(xiàng)

任務(wù)定義的精化變成了解決方案中算法的精化,后者還可能伴隨著數(shù)據(jù)表達(dá)方式的精化。

?

好的自頂向下設(shè)計(jì)從幾個(gè)方面避免了 bug。首先,清晰的結(jié)構(gòu)和表達(dá)方式更容易對(duì)需求

和模塊功能進(jìn)行精確的描述。其次,模塊分割和模塊獨(dú)立性避免了系統(tǒng)級(jí)的 bug。另外,細(xì)

節(jié)的隱藏使結(jié)構(gòu)上的缺陷更加容易識(shí)別。第四,設(shè)計(jì)在每個(gè)精化步驟的層次上是可以測(cè)試的,

所以測(cè)試可以盡早開(kāi)始,并且每個(gè)步驟的重點(diǎn)可以放在合適的級(jí)別上。

當(dāng)遇到一些意想不到的問(wèn)題時(shí),按部就班的流程并不意味著步驟不能反過(guò)來(lái),直到推

翻頂層設(shè)計(jì),重新開(kāi)始整個(gè)過(guò)程。實(shí)際上,這種情況經(jīng)常發(fā)生。至少,它讓我們更加清楚在

什么時(shí)候和為什么拋棄了某個(gè)臃腫的設(shè)計(jì),并重新開(kāi)始。一些糟糕的系統(tǒng)往往就是試圖挽救

一個(gè)基礎(chǔ)很差的設(shè)計(jì),而對(duì)它添加了很多表面裝飾般的補(bǔ)丁。自頂向下的方法減少了這樣的

企圖。

我確信在十年內(nèi),自頂向下進(jìn)行設(shè)計(jì)將會(huì)是最重要的新型形式化軟件開(kāi)發(fā)方法。

?

?

?

關(guān)鍵的地方和構(gòu)建無(wú) bug 程序的核心,是把系統(tǒng)的結(jié)構(gòu)作為控制結(jié)構(gòu)來(lái)考慮,而不是

獨(dú)立的跳轉(zhuǎn)語(yǔ)句。這種思考方法是我們?cè)诔绦蛟O(shè)計(jì)發(fā)展史上向前邁出的一大步

?

軟件開(kāi)發(fā)也需要用到“紫色線束”的手法。對(duì)于最后成為產(chǎn)品的程序代碼,它更迫切

地需要進(jìn)行嚴(yán)密控制和深層次的關(guān)注。上述技巧的關(guān)鍵因素是對(duì)變更和差異的記載,即在一

個(gè)日志中記錄所有的變更,而在源代碼中顯著標(biāo)記快速補(bǔ)丁和正式修改之間的區(qū)別,正式修

改是完備并經(jīng)過(guò)測(cè)試的,而且需要文檔化。

?

禍起蕭墻(Hatching a Catastrophe)

?

當(dāng)人們聽(tīng)到某個(gè)項(xiàng)目的進(jìn)度發(fā)生了災(zāi)難性偏離時(shí),可能會(huì)認(rèn)為項(xiàng)目一定是遭受了一系

列重大災(zāi)難。然而,通常災(zāi)禍來(lái)自白蟻的肆虐,而不是龍卷風(fēng)的侵襲。同樣,項(xiàng)目進(jìn)度經(jīng)常

以一種難以察覺(jué),但是殘酷無(wú)情的方式慢慢落后。實(shí)際上,重大災(zāi)害是比較容易處理的,它

往往和重大的壓力、徹底的重組、新技術(shù)的出現(xiàn)有關(guān),整個(gè)項(xiàng)目組通??梢詰?yīng)付自如。

?

但是一天一天的進(jìn)度落后是難以識(shí)別、不容易防范和難以彌補(bǔ)的。昨天,某個(gè)關(guān)鍵人

員生病了,無(wú)法召開(kāi)某個(gè)會(huì)議。今天,由于雷擊打壞了公司的供電變壓器,所有機(jī)器無(wú)法啟

動(dòng)。明天,因?yàn)楣S磁盤(pán)供貨延遲了一周,磁盤(pán)例程的測(cè)試無(wú)法進(jìn)行。下雪、應(yīng)急任務(wù)、私

人問(wèn)題、同顧客的緊急會(huì)議、管理人員檢查——這個(gè)列表可以不斷地延長(zhǎng)。每件事都只會(huì)將

某項(xiàng)活動(dòng)延遲半天或者一天,但是整個(gè)進(jìn)度開(kāi)始落后了,盡管每次只有一點(diǎn)點(diǎn)。

?

里程碑還是沉重的負(fù)擔(dān)?

如何根據(jù)一個(gè)嚴(yán)格的進(jìn)度表來(lái)控制項(xiàng)目?第一個(gè)步驟是制訂進(jìn)度表。進(jìn)度表上的

每一件事,被稱為“里程碑”,它們都有一個(gè)日期。選擇日期是一個(gè)估計(jì)技術(shù)上的問(wèn)題,

在前面已經(jīng)討論過(guò),它在很大程度上依賴以往的經(jīng)驗(yàn)。

里程碑的選擇只有一個(gè)原則,那就是,里程碑必須是具體的、特定的、可度量的事件,

能夠進(jìn)行清晰定義。以下是一些反面的例子,例如編碼,在代碼編寫(xiě)時(shí)間達(dá)到一半的時(shí)候就

- 85 - 已經(jīng)“90%完成”了;調(diào)試在大多時(shí)候都是“99%完成”的;“計(jì)劃完畢”是任何人只要愿

意,就可以聲明的事件 1 。

然而,具體的里程碑是百分之百的事件。“結(jié)構(gòu)師和實(shí)現(xiàn)人員簽字認(rèn)可的規(guī)格說(shuō)明”,

“100%源代碼編制完成,紙帶打孔完成并輸入到磁盤(pán)庫(kù)”,“測(cè)試通過(guò)了所有的測(cè)試用例”。

這些切實(shí)的里程碑澄清了那些劃分得比較模糊的階段——計(jì)劃、編碼、調(diào)試。

里程碑有明顯邊界和沒(méi)有歧義,比它容易被老板核實(shí)更為重要。如果里程碑定義得非

常明確,以致于無(wú)法自欺欺人時(shí),很少有人會(huì)就里程碑的進(jìn)展弄虛作假。但是如果里程碑很

模糊,老板就常常會(huì)得到一份與實(shí)際情況不符的報(bào)告。畢竟,沒(méi)有人愿意承受壞消息。這種

做法只是為了起到緩和的作用,并沒(méi)有任何蓄意的欺騙。

?

?

對(duì)于大型開(kāi)發(fā)項(xiàng)目中的估計(jì)行為,政府的承包商做了兩項(xiàng)有趣的研究。研究結(jié)果顯示:

1. 如果在某項(xiàng)活動(dòng)開(kāi)始之前就著手估計(jì),并且每?jī)芍苓M(jìn)行一次仔細(xì)的修訂。這樣,隨

著開(kāi)始時(shí)間的臨近,無(wú)論最后情況會(huì)變得如何的糟糕,它都不會(huì)有太大的變化。

2. 活動(dòng)期間,對(duì)時(shí)間長(zhǎng)短的過(guò)高估計(jì),會(huì)隨著活動(dòng)的進(jìn)行持續(xù)下降。

3. 過(guò)低估計(jì)在活動(dòng)中不會(huì)有太大的變化,一直到計(jì)劃的結(jié)束日期之前大約三周左右。

好的里程碑對(duì)團(tuán)隊(duì)來(lái)說(shuō)實(shí)際上是一項(xiàng)服務(wù),可以用來(lái)向項(xiàng)目經(jīng)理提出合理要求的一項(xiàng)

服務(wù),而不確切的里程碑是難以處理的負(fù)擔(dān)。當(dāng)里程碑沒(méi)有正確反映損失的時(shí)間,并對(duì)人們

形成誤導(dǎo),以致事態(tài)無(wú)法挽回的時(shí)候,它會(huì)徹底碾碎小組的士氣。慢性進(jìn)度偏離同樣也是士

氣殺手。

?

減少角色的沖突。首先老板必須區(qū)別行動(dòng)信息和狀態(tài)信息。他必須規(guī)范自己,不對(duì)項(xiàng)

目經(jīng)理可以解決的問(wèn)題做出反應(yīng),并且決不在檢查狀態(tài)報(bào)告的時(shí)候做安排。我曾經(jīng)認(rèn)識(shí)一個(gè)

老板,他總是在狀態(tài)報(bào)告的第一個(gè)段落結(jié)束之前,拿起電話發(fā)號(hào)施令。這樣的反應(yīng)肯定壓制

信息的完全公開(kāi)。

?

另外一面(The other face)

公共應(yīng)用程序的用戶在時(shí)間和空間上都遠(yuǎn)離它們的作者,因此對(duì)這類程序,文檔的重

要性更是不言而喻!對(duì)軟件編程產(chǎn)品來(lái)說(shuō),程序向用戶所呈現(xiàn)的面貌和提供給機(jī)器識(shí)別的內(nèi)

容同樣重要。

?

?

需要什么樣的文檔

不同用戶需要不同級(jí)別的文檔。某些用戶僅僅偶爾使用程序,有些用戶必須依賴程序,

還有一些用戶必須根據(jù)環(huán)境和目的的變動(dòng)對(duì)程序進(jìn)行修改。

使用程序。每個(gè)用戶都需要一段對(duì)程序進(jìn)行描述的文字。可是大多數(shù)文檔只提供了很

少的總結(jié)性內(nèi)容,無(wú)法達(dá)到用戶要求,就像是描繪了樹(shù)木,形容了樹(shù)葉,但卻沒(méi)有一副森林

的圖案。為了得到一份有用的文字描述,就必須放慢腳步,穩(wěn)妥地進(jìn)行。

1. 目的。主要的功能是什么?開(kāi)發(fā)程序的原因是什么?

2. 環(huán)境。程序運(yùn)行在什么樣的機(jī)器、硬件配置和操作系統(tǒng)上?

3. 范圍。輸入的有效范圍是什么?允許顯示的合法范圍是什么?

4. 實(shí)現(xiàn)功能和使用的算法。精確地闡述它做了什么。

5. 輸入-輸出格式。必須是確切和完整的。

6. 操作指令。包括控制臺(tái)及輸出內(nèi)容中正常和異常結(jié)束的行為。

7. 選項(xiàng)。用戶的功能選項(xiàng)有哪些?如何在選項(xiàng)之間進(jìn)行挑選?

8. 運(yùn)行時(shí)間。在指定的配置下,解決特定規(guī)模問(wèn)題所需要的時(shí)間?

- 93 - 9. 精度和校驗(yàn)。期望結(jié)果的精確程度?如何進(jìn)行精度的檢測(cè)?

一般來(lái)說(shuō),三、四頁(yè)紙常常就可以容納以上所有的信息。不過(guò)往往需要特別注意的是

表達(dá)的簡(jiǎn)潔和精確。由于它包含了和軟件相關(guān)的基本決策,所以這份文檔的絕大部分需要在

程序編制之前書(shū)寫(xiě)。

驗(yàn)證程序。除了程序的使用方法,還必須附帶一些程序正確運(yùn)行的證明,即測(cè)試用例。

每一份發(fā)布的程序拷貝應(yīng)該包括一些可以例行運(yùn)行的小測(cè)試用例,為用戶提供信心—

—他擁有了一份可信賴的拷貝,并且正確地安裝到了機(jī)器上。

然后,需要得到更加全面的測(cè)試用例,在程序修改之后,進(jìn)行常規(guī)運(yùn)行。這些用例可

以根據(jù)輸入數(shù)據(jù)的范圍劃分成三個(gè)部分。

1. 針對(duì)遇到的大多數(shù)常規(guī)數(shù)據(jù)和程序主要功能進(jìn)行測(cè)試的用例。它們是測(cè)試用例的主

要組成部分。

2. 數(shù)量相對(duì)較少的合法數(shù)據(jù)測(cè)試用例,對(duì)輸入數(shù)據(jù)范圍邊界進(jìn)行檢查,確保最大可能

值、最小可能值和其他有效特殊數(shù)據(jù)可以正常工作。

3. 數(shù)量相對(duì)較少的非法數(shù)據(jù)測(cè)試用例,在邊界外檢查數(shù)據(jù)范圍邊界,確保無(wú)效的輸入

能有正確的數(shù)據(jù)診斷提示。

修改程序。調(diào)整程序或者修復(fù)程序需要更多的信息。顯然,這要求了解全部的細(xì)節(jié),

并且這些細(xì)節(jié)已經(jīng)記錄在注釋良好的列表中。和一般用戶一樣,修改者迫切需要一份清晰明

了的概述,不過(guò)這一次是關(guān)于系統(tǒng)的內(nèi)部結(jié)構(gòu)。那么這份概述的組成部分是什么呢?

1. 流程圖或子系統(tǒng)的結(jié)構(gòu)圖,對(duì)此以下有更詳細(xì)的論述。

2. 對(duì)所用算法的完整描述,或者是對(duì)文檔中類似描述的引用。

3. 對(duì)所有文件規(guī)劃的解釋。

4. 數(shù)據(jù)流的概要描述——從磁盤(pán)或者磁帶中,獲取數(shù)據(jù)或程序處理的序列——以及在

每個(gè)處理過(guò)程完成的操作。

5. 初始設(shè)計(jì)中,對(duì)已預(yù)見(jiàn)修改的討論;特性、功能回調(diào)的位置以及出口;原作者對(duì)可

能會(huì)擴(kuò)充的地方以及可能處理方案的一些意見(jiàn)。另外,對(duì)隱藏缺陷的觀察也同樣很有價(jià)值。

- 94 - 流程圖 (真的嗎??)

流程圖是被吹捧得最過(guò)分的一種程序文檔。事實(shí)上,很多程序甚至不需要流程圖,很

少有程序需要一頁(yè)紙以上的流程圖。

流程圖顯示了程序的流程判斷結(jié)構(gòu),它僅僅是程序結(jié)構(gòu)的一個(gè)方面。當(dāng)流程圖繪制在

一張圖上時(shí),它能非常優(yōu)雅地顯示程序的判斷流向,但當(dāng)它被分成幾張時(shí),也就是說(shuō)需要采

用經(jīng)過(guò)編號(hào)的出口和連接符來(lái)進(jìn)行拼裝時(shí),整體結(jié)構(gòu)的概觀就嚴(yán)重地被破壞了。

因此,一頁(yè)紙的流程圖,成為表達(dá)程序結(jié)構(gòu)、階段或步驟的一種非?;镜膱D示。同

樣,它也非常容易繪制。圖 15.1 展示了一個(gè)子程序流程圖的圖樣

?

?

現(xiàn)實(shí)中,流程圖被鼓吹的程度遠(yuǎn)大于它們的實(shí)際作用。我從來(lái)沒(méi)有看到過(guò)一個(gè)有經(jīng)驗(yàn)

的編程人員,在開(kāi)始編寫(xiě)程序之前,會(huì)例行公事地繪制詳盡的流程圖。在一些要求流程圖的

組織中,流程圖總是事后才補(bǔ)上。一些公司則很自豪地使用工具軟件,從代碼中生成這個(gè)“不

可缺少的設(shè)計(jì)工具”。我認(rèn)為這種普遍經(jīng)驗(yàn)并不是令人尷尬和惋惜的對(duì)良好實(shí)踐的偏離(似

乎大家只能對(duì)它露出窘迫的微笑),相反,它是對(duì)技術(shù)的良好評(píng)判,向我們傳授了一些流程

圖用途方面的知識(shí)。

?

沒(méi)有銀彈-軟件工程中的根本和次要問(wèn)題

在所有恐怖民間傳說(shuō)的妖怪中,最可怕的是人狼,因?yàn)樗鼈兛梢酝耆龊跻饬系貜氖?

悉的面孔變成可怕的怪物。為了對(duì)付人狼,我們?cè)趯ふ铱梢韵麥缢鼈兊你y彈。

大家熟悉的軟件項(xiàng)目具有一些人狼的特性(至少在非技術(shù)經(jīng)理看來(lái)),常??此坪?jiǎn)單明

了的東西,卻有可能變成一個(gè)落后進(jìn)度、超出預(yù)算、存在大量缺陷的怪物。因此,我們聽(tīng)到

了近乎絕望的尋求銀彈的呼喚,尋求一種可以使軟件成本像計(jì)算機(jī)硬件成本一樣降低的尚方

寶劍

?

如果回顧一下軟件領(lǐng)域中取得的最富有成效的三次進(jìn)步,我們會(huì)發(fā)現(xiàn)每一次都是解決

了軟件構(gòu)建上的巨大困難,但是這些困難不是本質(zhì)屬性,也不是主要困難。同樣,我們可以

- 106 - 對(duì)每一次進(jìn)步進(jìn)行外推,來(lái)了解它們的固有限制。

高級(jí)語(yǔ)言。勿庸置疑,軟件生產(chǎn)率、可靠性和簡(jiǎn)潔性上最有力的突破是使用高級(jí)語(yǔ)言

編程。大多數(shù)觀察者相信開(kāi)發(fā)生產(chǎn)率至少提高了五倍,同時(shí)可靠性、簡(jiǎn)潔性和理解程度也大

為提高。

分時(shí)。大多數(shù)觀察者相信分時(shí)提高了程序員的生產(chǎn)率和產(chǎn)品的質(zhì)量,盡管它帶來(lái)的進(jìn)

步不如高級(jí)語(yǔ)言。

統(tǒng)一編程環(huán)境。第一個(gè)集成開(kāi)發(fā)環(huán)境——Unix 和 Interlisp 現(xiàn)在已經(jīng)得到了廣泛應(yīng)用,

并且使生產(chǎn)率提高了 5 倍。為什么?

?

現(xiàn)在,讓我們來(lái)討論一下當(dāng)今可能作為潛在銀彈的最先進(jìn)的技術(shù)進(jìn)步。它們各自針對(duì)

什么樣的問(wèn)題?它們是屬于必要問(wèn)題,或者依然是解決我們剩下的次要困難?它們是提供了

創(chuàng)新,還是僅僅是增量改進(jìn)?

Ada 和其他高級(jí)編程語(yǔ)言。

面向?qū)ο缶幊獭?/strong>

人工智能。很多人期望人工智能上的進(jìn)展可以給軟件生產(chǎn)率和質(zhì)量帶來(lái)數(shù)量級(jí)上的增

長(zhǎng) 4 ,但我不這樣認(rèn)為。追究其原因,我們必須剖析“人工智能”意味著什么,以及它如何

應(yīng)用。

?

“自動(dòng)”編程。近四十年中,人們一直在預(yù)言和編寫(xiě)有關(guān)“自動(dòng)編程”的文字,從問(wèn)

題的一段陳述說(shuō)明自動(dòng)產(chǎn)生解決問(wèn)題的程序?,F(xiàn)在,仍有一些人期望這樣的技術(shù)能夠成為下

一個(gè)突破點(diǎn) 7 。

圖形化編程。在軟件工程的博士論文中,一個(gè)很受歡迎的主題是圖形化和可視化編程,

計(jì)算機(jī)圖形在軟件設(shè)計(jì)上的應(yīng)用 9 。這種方法的推測(cè)部分來(lái)自 VLSI 芯片設(shè)計(jì)的類比,計(jì)算機(jī) 圖形化在設(shè)計(jì)中扮演了高生產(chǎn)力的角色。部分源于——人們將流程圖作為一種理想的設(shè)計(jì)介質(zhì),并為繪制它們提供了很多功能強(qiáng)大的實(shí)用程序——這證實(shí)了圖形化的可行性。

?

程序驗(yàn)證。現(xiàn)代編程的許多工作是測(cè)試和修復(fù) bug。是否有可能出現(xiàn)銀彈,能夠在系統(tǒng)

設(shè)計(jì)級(jí)別、源代碼級(jí)別消除 bug 呢?是否可以在大量工作被投入到實(shí)現(xiàn)和測(cè)試之前,通過(guò)采用證實(shí)設(shè)計(jì)正確性的“深?yuàn)W”策略,徹底提高軟件的生產(chǎn)率和產(chǎn)品的可靠性?

?

環(huán)境和工具。向更好的編程開(kāi)發(fā)環(huán)境開(kāi)發(fā)中投入,我們可以期待得到多少回報(bào)呢?人

們的本能反應(yīng)是首先著手解決高回報(bào)的問(wèn)題:層次化文件系統(tǒng),統(tǒng)一文件格式以獲得一致的

編程接口和通用工具等。特定語(yǔ)言的智能化編輯器在現(xiàn)實(shí)中還沒(méi)有得到廣泛應(yīng)用,不過(guò)它們

最有希望實(shí)現(xiàn)的是消除語(yǔ)法錯(cuò)誤和簡(jiǎn)單的語(yǔ)義錯(cuò)誤

?

增量開(kāi)發(fā)——增長(zhǎng),而非搭建系統(tǒng)。我現(xiàn)在還記得在 1958 年,當(dāng)聽(tīng)到一個(gè)朋友提及搭

建(

building),而不是編寫(xiě)(writing)系統(tǒng)時(shí),我所感受到的震動(dòng)。一瞬間,我的整個(gè)軟

件開(kāi)發(fā)流程的視野開(kāi)闊了。這種暗喻是非常有力和精確的。現(xiàn)在,我們已經(jīng)理解軟件開(kāi)發(fā)是

如何類似于其他的建造過(guò)程,并開(kāi)始隨意地使用其他的暗喻,如規(guī)格說(shuō)明、構(gòu)件裝備、腳手

架(測(cè)試平臺(tái))(specifications, assembly of components, and?scaffolding)。

?

如何培養(yǎng)杰出的設(shè)計(jì)人員?限于篇幅,不允許進(jìn)行較長(zhǎng)的介紹,但有些步驟是顯而易

見(jiàn)的。

‰ 盡可能早地、有系統(tǒng)地識(shí)別頂級(jí)的設(shè)計(jì)人員。最好的通常不是那些最有經(jīng)驗(yàn)的人員。

‰ 為設(shè)計(jì)人員指派一位職業(yè)導(dǎo)師,負(fù)責(zé)他們技術(shù)方面的成長(zhǎng),仔細(xì)地為他們規(guī)劃職業(yè)

生涯。

‰ 為每個(gè)方面制訂和維護(hù)一份職業(yè)計(jì)劃,包括與設(shè)計(jì)大師的、經(jīng)過(guò)仔細(xì)挑選的學(xué)習(xí)過(guò)

程、正式的高級(jí)教育和以及短期的課程——所有這些都穿插在設(shè)計(jì)和技術(shù)領(lǐng)導(dǎo)能力的培養(yǎng)安

排中。

為成長(zhǎng)中的設(shè)計(jì)人員提供相互交流和學(xué)習(xí)的機(jī)會(huì)。

?

……昨天的復(fù)雜性是今天的規(guī)律。分子的無(wú)序性啟迪了氣體動(dòng)力學(xué)理論和熱力學(xué)的三

大定律?,F(xiàn)在,軟件沒(méi)有揭示類似的規(guī)律性原理,但是解釋為什么沒(méi)有的重?fù)?dān)在你的身上。

我不是遲鈍和好辯的。我相信有一天軟件的“復(fù)雜性”將以某種更高級(jí)的規(guī)律性概念來(lái)表達(dá)

(就像物理學(xué)家的不變式)

?

《沒(méi)有銀彈》提出了全力解決復(fù)雜性問(wèn)題的方法,這種方法可以在現(xiàn)實(shí)中取得十分樂(lè)觀的進(jìn)展。它倡導(dǎo)向軟件系統(tǒng)增加必要的復(fù)雜性:

‰ 層次化,通過(guò)分層的模塊或者對(duì)象。

‰ 增量化,從而系統(tǒng)可以持續(xù)地運(yùn)行。

?

數(shù)學(xué)軟件領(lǐng)域有著軟件重用的長(zhǎng)期傳統(tǒng):

我們推測(cè)重用的障礙不在生產(chǎn)者一邊,而在消費(fèi)者一邊。如果一個(gè)軟件工程師,潛在

的標(biāo)準(zhǔn)化軟件構(gòu)件消費(fèi)者,覺(jué)得尋找能滿足他需要的構(gòu)件,進(jìn)行驗(yàn)證,比自行編寫(xiě)的代價(jià)更

加昂貴時(shí),重復(fù)的構(gòu)件就會(huì)產(chǎn)生。注意我們上面提到的“覺(jué)得”。它和重新開(kāi)發(fā)的真正投入

無(wú)關(guān)。

數(shù)學(xué)軟件上重用成功的原因有兩個(gè):(1)它很晦澀難懂,每行代碼需要大量高智商的

輸入;(

2)存在豐富的標(biāo)準(zhǔn)術(shù)語(yǔ),也就是用數(shù)學(xué)來(lái)描述每個(gè)構(gòu)件的功能。因此,重新開(kāi)發(fā)數(shù)

學(xué)軟件構(gòu)件的成本很高,而查找現(xiàn)有構(gòu)件功能的成本很低。數(shù)學(xué)軟件界存在一些長(zhǎng)期的傳統(tǒng)

——例如,專業(yè)期刊和算法搜集,用適度成本提供算法,出于商業(yè)考慮開(kāi)發(fā)的高質(zhì)量算法(盡

管成本有些高,但依舊適度)等——使查找和發(fā)現(xiàn)滿足某人需要的構(gòu)件比其他很多領(lǐng)域要容

易。其他領(lǐng)域中,有時(shí)甚至不可能簡(jiǎn)潔地提出明確的要求。這些因素合在一起,使數(shù)學(xué)軟件

的重用比重新開(kāi)發(fā)更有吸引力。

?

?

?

1 章 焦油坑

1.1 編程系統(tǒng)產(chǎn)品(Programming Systems Product)開(kāi)發(fā)的工作量是供個(gè)人使用的、

獨(dú)立開(kāi)發(fā)的構(gòu)件程序的九倍。我估計(jì)軟件構(gòu)件產(chǎn)品化引起了 3 倍工作量,將軟件構(gòu)件整合成

完整系統(tǒng)所需要的設(shè)計(jì)、集成和測(cè)試又強(qiáng)加了 3 倍的工作量,這些高成本的構(gòu)件在根本上是

相互獨(dú)立的。

1.2 編程行業(yè)“滿足我們內(nèi)心深處的創(chuàng)造渴望和愉悅所有人的共有情感”,提供了五種

- 134 - 樂(lè)趣:

‰ 創(chuàng)建事物的快樂(lè)

‰ 開(kāi)發(fā)對(duì)其他人有用的東西的樂(lè)趣

‰ 將可以活動(dòng)、相互嚙合的零部件組裝成類似迷宮的東西,這個(gè)過(guò)程所體現(xiàn)出令人

神魂顛倒的魅力

‰ 面對(duì)不重復(fù)的任務(wù),不間斷學(xué)習(xí)的樂(lè)趣

‰ 工作在如此易于駕馭的介質(zhì)上的樂(lè)趣——純粹的思維活動(dòng),其存在、移動(dòng)和運(yùn)轉(zhuǎn)

方式完全不同于實(shí)際物體

1.3 同樣,這個(gè)行業(yè)具有一些內(nèi)在固有的苦惱:

‰ 將做事方式調(diào)整到追求完美,是學(xué)習(xí)編程的最困難部分

‰ 由其他人來(lái)設(shè)定目標(biāo),并且必須依靠自己無(wú)法控制的事物(特別是程序);權(quán)威

不等同于責(zé)任

‰ 實(shí)際情況看起來(lái)要比這一點(diǎn)好一些:真正的權(quán)威來(lái)自于每次任務(wù)的完成

‰ 任何創(chuàng)造性活動(dòng)都伴隨著枯燥艱苦的勞動(dòng),編程也不例外

‰ 人們通常期望項(xiàng)目在接近結(jié)束時(shí),(bug、工作時(shí)間)能收斂得快一些,然而軟件

項(xiàng)目的情況卻是越接近完成,收斂得越慢

‰ 產(chǎn)品在即將完成時(shí)總面臨著陳舊過(guò)時(shí)的威脅

2 章 人月神話

2.1 缺乏合理的時(shí)間進(jìn)度是造成項(xiàng)目滯后的最主要原因,它比其他所有因素加起來(lái)影響

還大。

2.2 良好的烹飪需要時(shí)間,某些任務(wù)無(wú)法在不損害結(jié)果的情況下加快速度。

2.3 所有的編程人員都是樂(lè)觀主義者:“一切都將運(yùn)作良好”。

2.4 由于編程人員通過(guò)純粹的思維活動(dòng)來(lái)開(kāi)發(fā),所以我們期待在實(shí)現(xiàn)過(guò)程中不會(huì)碰到困

- 135 - 難。

2.5 但是,我們的構(gòu)思是有缺陷的,因此總會(huì)有 bug。

2.6 我們圍繞成本核算的估計(jì)技術(shù),混淆了工作量和項(xiàng)目進(jìn)展。人月是危險(xiǎn)和帶有欺騙

性的神話,因?yàn)樗凳救藛T數(shù)量和時(shí)間是可以相互替換的。

2.7 在若干人員中分解任務(wù)會(huì)引發(fā)額外的溝通工作量——培訓(xùn)和相互溝通。

2.8 關(guān)于進(jìn)度安排,我的經(jīng)驗(yàn)是為 1/3 計(jì)劃、1/6 編碼、1/4 構(gòu)件測(cè)試以及 1/4 系統(tǒng)測(cè)

試。

2.9 作為一個(gè)學(xué)科,我們?nèi)狈?shù)據(jù)估計(jì)。

2.10

因?yàn)槲覀儗?duì)自己的估計(jì)技術(shù)不確定,所以在管理和客戶的壓力下,我們常常缺

乏堅(jiān)持的勇氣。

2.11 Brook 法則:向進(jìn)度落后的項(xiàng)目中增加人手,只會(huì)使進(jìn)度更加落后。

2.12

向軟件項(xiàng)目中增派人手從三個(gè)方面增加了項(xiàng)目必要的總體工作量:任務(wù)重新分

配本身和所造成的工作中斷;培訓(xùn)新人員;額外的相互溝通。

3 章 外科手術(shù)隊(duì)伍

3.1 同樣有兩年經(jīng)驗(yàn)而且在受到同樣的培訓(xùn)的情況下,優(yōu)秀的專業(yè)程序員的工作效率是

較差程序員的十倍。(Sackman、Erikson 和 Grand)

3.2 Sackman、Erikson 和 Grand 的數(shù)據(jù)顯示經(jīng)驗(yàn)和實(shí)際表現(xiàn)之間沒(méi)有相互聯(lián)系。我懷

疑這種現(xiàn)象是否普遍成立。

3.3 小型、精干隊(duì)伍是最好的——盡可能的少。

3.4 兩個(gè)人的團(tuán)隊(duì),其中一個(gè)項(xiàng)目經(jīng)理,常常是最佳的人員使用方法。[留意一下上帝

對(duì)婚姻的設(shè)計(jì)。]

3.5 對(duì)于真正意義上的大型系統(tǒng),小型精干的隊(duì)伍太慢了。

3.6 實(shí)際上,絕大多數(shù)大型編程系統(tǒng)的經(jīng)驗(yàn)顯示出,一擁而上的開(kāi)發(fā)方法是高成本、速

度緩慢、不充分的,開(kāi)發(fā)出的產(chǎn)品無(wú)法進(jìn)行概念上的集成。

- 136 - 3.7 一位首席程序員、類似于外科手術(shù)隊(duì)伍的團(tuán)隊(duì)架構(gòu)提供了一種方法——既能獲得由

少數(shù)頭腦產(chǎn)生的產(chǎn)品完整性,又能得到多位協(xié)助人員的總體生產(chǎn)率,還徹底地減少了溝通的

工作量。

4 章 貴族專制、民主政治和系統(tǒng)設(shè)計(jì)

4.1 “概念完整性是系統(tǒng)設(shè)計(jì)中最重要的考慮因素”。

4.2 “功能與理解上的復(fù)雜程度的比值才是系統(tǒng)設(shè)計(jì)的最終測(cè)試標(biāo)準(zhǔn)”,而不僅僅是豐

富的功能。[該比值是對(duì)易用性的一種測(cè)量,由簡(jiǎn)單和復(fù)雜應(yīng)用共同驗(yàn)證。]

4.3 為了獲得概念完整性,設(shè)計(jì)必須由一個(gè)人或者具有共識(shí)的小型團(tuán)隊(duì)來(lái)完成。

4.4 “對(duì)于非常大型的項(xiàng)目,將設(shè)計(jì)方法、體系結(jié)構(gòu)方面的工作與具體實(shí)現(xiàn)相分離是獲

得概念完整性的強(qiáng)有力方法?!盵同樣適用于小型項(xiàng)目。]

4.5 “如果要得到系統(tǒng)概念上的完整性,那么必須控制這些概念。這實(shí)際上是一種無(wú)需

任何歉意的貴族專制統(tǒng)治?!?

4.6 紀(jì)律、規(guī)則對(duì)行業(yè)是有益的。外部的體系結(jié)構(gòu)規(guī)定實(shí)際上是增強(qiáng),而不是限制實(shí)現(xiàn)

小組的創(chuàng)造性。

4.7 概念上統(tǒng)一的系統(tǒng)能更快地開(kāi)發(fā)和測(cè)試。

4.8 體系結(jié)構(gòu)(architecture)、設(shè)計(jì)實(shí)現(xiàn)(implementation)、物理實(shí)現(xiàn)(realization)

的許多工作可以并發(fā)進(jìn)行。[軟件和硬件設(shè)計(jì)同樣可以并行。]

5 章 畫(huà)蛇添足

5.1 盡早交流和持續(xù)溝通能使結(jié)構(gòu)師有較好的成本意識(shí),以及使開(kāi)發(fā)人員獲得對(duì)設(shè)計(jì)的

信心,并且不會(huì)混淆各自的責(zé)任分工。

5.2 結(jié)構(gòu)師如何成功地影響實(shí)現(xiàn):

‰ 牢記是開(kāi)發(fā)人員承擔(dān)創(chuàng)造性的實(shí)現(xiàn)責(zé)任;結(jié)構(gòu)師只能提出建議。

‰ 時(shí)刻準(zhǔn)備著為所指定的說(shuō)明建議一種實(shí)現(xiàn)的方法,準(zhǔn)備接受任何其他可行的方

- 137 - 法。

‰ 對(duì)上述的建議保持低調(diào)和平靜。

‰ 準(zhǔn)備對(duì)所建議的改進(jìn)放棄堅(jiān)持。

‰ 聽(tīng)取開(kāi)發(fā)人員在體系結(jié)構(gòu)上改進(jìn)的建議。

5.3 第二個(gè)系統(tǒng)是人們所設(shè)計(jì)的最危險(xiǎn)的系統(tǒng),通常的傾向是過(guò)分地進(jìn)行設(shè)計(jì)。

5.4 OS/360 是典型的畫(huà)蛇添足(second-system effect)的例子。[Windows NT 似乎是

90 年代的例子。]

5.5 為功能分配一個(gè)字節(jié)和微秒的優(yōu)先權(quán)值是一個(gè)很有價(jià)值的規(guī)范化方法。

6 章 貫徹執(zhí)行

6.1 即使是大型的設(shè)計(jì)團(tuán)隊(duì),設(shè)計(jì)結(jié)果也必須由一個(gè)或兩個(gè)人來(lái)完成,以確保這些決定

是一致的。

6.2 必須明確定義體系結(jié)構(gòu)中與先前定義不同的地方,重新定義的詳細(xì)程度應(yīng)該與原先

的說(shuō)明一致。

6.3 出于精確性的考慮,我們需要形式化的設(shè)計(jì)定義,同樣,我們需要記敘性定義來(lái)加

深理解。

6.4 必須采用形式化定義和記敘性定義中的一種作為標(biāo)準(zhǔn),另一種作為輔助措施;它們

都可以作為表達(dá)的標(biāo)準(zhǔn)。

6.5 設(shè)計(jì)實(shí)現(xiàn),包括模擬仿真,可以充當(dāng)一種形式化定義的方法;這種方法有一些嚴(yán)重

的缺點(diǎn)。

6.6 直接整合是一種強(qiáng)制推行軟件的結(jié)構(gòu)性標(biāo)準(zhǔn)的方法。[硬件上也是如此——考慮內(nèi)

建在 ROM 中的 Mac WIMP 接口。]

6.7 “如果起初至少有兩種以上的實(shí)現(xiàn),那么(體系結(jié)構(gòu))定義會(huì)更加整潔,會(huì)更加規(guī)

范?!?

6.8 允許體系結(jié)構(gòu)師對(duì)實(shí)現(xiàn)人員的詢問(wèn)做出電話應(yīng)答解釋是非常重要的,并且必須進(jìn)行

- 138 - 日志記錄和整理發(fā)布。[電子郵件是一種可選的介質(zhì)。]

6.9 “項(xiàng)目經(jīng)理最好的朋友就是他每天要面對(duì)的敵人——獨(dú)立的產(chǎn)品測(cè)試機(jī)構(gòu)/小組?!?

7 章 為什么巴比倫塔會(huì)失???

7.1 巴比倫塔項(xiàng)目的失敗是因?yàn)槿狈涣鳎约敖涣鞯慕Y(jié)果——組織。

交流

7.2 “因?yàn)樽笫植恢烙沂衷谧鍪裁?,從而進(jìn)度災(zāi)難、功能的不合理和系統(tǒng)缺陷紛紛出

現(xiàn)?!庇捎趯?duì)其他人的各種假設(shè),團(tuán)隊(duì)成員之間的理解開(kāi)始出現(xiàn)偏差。

7.3 團(tuán)隊(duì)?wèi)?yīng)該以盡可能多的方式進(jìn)行相互之間的交流:非正式、常規(guī)項(xiàng)目會(huì)議,會(huì)上進(jìn)

行簡(jiǎn)要的技術(shù)陳述、共享的正式項(xiàng)目工作手冊(cè)。[以及電子郵件。]

項(xiàng)目工作手冊(cè)

7.4 項(xiàng)目工作手冊(cè)“不是獨(dú)立的一篇文檔,它是對(duì)項(xiàng)目必須產(chǎn)生的一系列文檔進(jìn)行組織

的一種結(jié)構(gòu)?!?

7.5 “項(xiàng)目所有的文檔都必須是該(工作手冊(cè))結(jié)構(gòu)的一部分?!?

7.6 需要盡早和仔細(xì)地設(shè)計(jì)工作手冊(cè)結(jié)構(gòu)。

7.7 事先制訂了良好結(jié)構(gòu)的工作手冊(cè)“可以將后來(lái)書(shū)寫(xiě)的文字放置在合適的章節(jié)中”,

并且可以提高產(chǎn)品手冊(cè)的質(zhì)量。

7.8 “每一個(gè)團(tuán)隊(duì)成員應(yīng)該了解所有的材料(工作手冊(cè))?!盵我想說(shuō)的是,每個(gè)團(tuán)隊(duì)成

員應(yīng)該能夠看到所有材料,網(wǎng)頁(yè)即可滿足要求。]

7.9 實(shí)時(shí)更新是至關(guān)重要的。

7.10

工作手冊(cè)的使用者應(yīng)該將注意力集中在上次閱讀后的變更,以及關(guān)于這些變更

重要性的評(píng)述。

- 139 - 7.11 OS/360 項(xiàng)目工作手冊(cè)開(kāi)始采用的是紙介質(zhì),后來(lái)?yè)Q成了微縮膠片。

7.12

今天[即使在 1975 年],共享的電子手冊(cè)是能更好達(dá)到所有這些目標(biāo)、更加低

廉、更加簡(jiǎn)單的機(jī)制。

7.13

仍然需要用變更條和修訂日期[或具備同等功能的方法]來(lái)標(biāo)記文字;仍然需要

后進(jìn)先出(LIFO)的電子化變更小結(jié)。

7.14 Parnas 強(qiáng)烈地認(rèn)為使每個(gè)人看到每件事的目標(biāo)是完全錯(cuò)誤的;各個(gè)部分應(yīng)該

被封裝,從而沒(méi)有人需要或者允許看到其他部分的內(nèi)部結(jié)構(gòu),只需要了解接口。

7.15 Parnas 的建議的確是災(zāi)難的處方。[Parnas 讓我認(rèn)可了該觀點(diǎn),使我徹底地改

變了想法。]

組織架構(gòu)

7.16

團(tuán)隊(duì)組織的目標(biāo)是為了減少必要的交流和協(xié)作量。

7.17

為了減少交流,組織結(jié)構(gòu)包括了人力劃分(division of labor)和限定職責(zé)

范圍(specialization of function)。

7.18

傳統(tǒng)的樹(shù)狀組織結(jié)構(gòu)反映了權(quán)力的結(jié)構(gòu)原理——不允許雙重領(lǐng)導(dǎo)。

7.19

組織中的交流是網(wǎng)狀,而不是樹(shù)狀結(jié)構(gòu),因而所有的特殊組織機(jī)制(往往體現(xiàn)

成組織結(jié)構(gòu)圖中的虛線部分)都是為了進(jìn)行調(diào)整,以克服樹(shù)狀組織結(jié)構(gòu)中交流缺乏的困難。

7.20

每個(gè)子項(xiàng)目具有兩個(gè)領(lǐng)導(dǎo)角色——產(chǎn)品負(fù)責(zé)人、技術(shù)主管或結(jié)構(gòu)師。這兩個(gè)角

色的職能有著很大的區(qū)別,需要不同的技能。

7.21

兩種角色中的任意組合可以是非常有效的:

‰ 產(chǎn)品負(fù)責(zé)人和技術(shù)主管是同一個(gè)人。

‰ 產(chǎn)品負(fù)責(zé)人作為總指揮,技術(shù)主管充當(dāng)其左右手。

‰ 技術(shù)主管作為總指揮,產(chǎn)品負(fù)責(zé)人充當(dāng)其左右手。

- 140 - 8 章 胸有成竹

8.1 僅僅通過(guò)對(duì)編碼部分的估計(jì),然后乘以任務(wù)其他部分的相對(duì)系數(shù),是無(wú)法得出對(duì)整

項(xiàng)工作的精確估計(jì)的。

8.2 構(gòu)建獨(dú)立小型程序的數(shù)據(jù)不適用于編程系統(tǒng)項(xiàng)目。

8.3 程序開(kāi)發(fā)呈程序規(guī)模的指數(shù)增長(zhǎng)。

8.4 一些發(fā)表的研究報(bào)告顯示指數(shù)約為 1.5。[Boehm 的數(shù)據(jù)并不完全一致,在 1.05 和

1.2 之間變化。1 ]

8.5 Portman 的 ICL 數(shù)據(jù)顯示相對(duì)于其他活動(dòng)開(kāi)銷,全職程序員僅將 50%的時(shí)間用于編

程和調(diào)試。

8.6 IBM 的 Aron 數(shù)據(jù)顯示,生產(chǎn)率是系統(tǒng)各個(gè)部分交互的函數(shù),在 1.5K 千代碼行/人

年至 10K 千代碼行/人年的范圍內(nèi)變化。

8.7 Harr 的 Bell 實(shí)驗(yàn)室數(shù)據(jù)顯示對(duì)于已完成的產(chǎn)品,操作系統(tǒng)類的生產(chǎn)率大約是

0.6KLOC/人年,編譯類工作的生產(chǎn)率大約為 2.2KLOC/人年。

8.8 Brooks 的 OS/360S 數(shù)據(jù)與 Harr 的數(shù)據(jù)一致:操作系統(tǒng) 0.6~0.8KLOC/人年,編譯

器 2~3 KLOC/人年。

8.9 Corbato 的 MIT 項(xiàng)目 MULTICS 數(shù)據(jù)顯示,在操作系統(tǒng)和編譯器混合類型上的生產(chǎn)率

是 1.2KLOC/人年,但這些是 PL/I 的代碼行,而其他所有的數(shù)據(jù)是匯編代碼行。

8.10

在基本語(yǔ)句級(jí)別,生產(chǎn)率看上去是個(gè)常數(shù)。

8.11

當(dāng)使用適當(dāng)?shù)母呒?jí)語(yǔ)言時(shí),程序編制的生產(chǎn)率可以提高 5 倍。

9 章 削足適履

9.1 除了運(yùn)行時(shí)間以外,所占據(jù)的內(nèi)存空間也是主要開(kāi)銷。特別是對(duì)于操作系統(tǒng),它的

很多程序是永久駐留在內(nèi)存中。

9.2 即便如此,花費(fèi)在駐留程序所占據(jù)內(nèi)存上的金錢(qián)仍是物有所值的,比其他任何在配

置上投資的效果要好。規(guī)模本身不是壞事,但不必要的規(guī)模是不可取的。

- 141 - 9.3 軟件開(kāi)發(fā)人員必須設(shè)立規(guī)模目標(biāo),控制規(guī)模,發(fā)明一些減少規(guī)模的方法——就如同

硬件開(kāi)發(fā)人員為減少元器件所做的一樣。

9.4 規(guī)模預(yù)算不僅僅在占據(jù)內(nèi)存方面是明確的,同時(shí)還應(yīng)該指明程序?qū)Υ疟P(pán)的訪問(wèn)次

數(shù)。

9.5 規(guī)模預(yù)算必須與分配的功能相關(guān)聯(lián);在指明模塊大小的同時(shí),確切定義模塊的功能。

9.6 在大型的團(tuán)隊(duì)中,各個(gè)小組傾向于不斷地局部?jī)?yōu)化,以滿足自己的目標(biāo),而較少考

慮隊(duì)用戶的整體影響。這種方向性的問(wèn)題是大型項(xiàng)目的主要危險(xiǎn)。

9.7 在整個(gè)實(shí)現(xiàn)的過(guò)程期間,系統(tǒng)結(jié)構(gòu)師必須保持持續(xù)的警覺(jué),確保連貫的系統(tǒng)完整性。

9.8 培養(yǎng)開(kāi)發(fā)人員從系統(tǒng)整體出發(fā)、面向用戶的態(tài)度是軟件編程管理人員最重要的職

能。

9.9 在早期應(yīng)該制訂策略,以決定用戶可選項(xiàng)目的粗細(xì)程度,因?yàn)閷⑺鼈冏鳛檎w大包

能夠節(jié)省內(nèi)存空間。[常常還可以節(jié)約市場(chǎng)成本。]

9.10

臨時(shí)空間的尺寸,以及每次磁盤(pán)訪問(wèn)的程序數(shù)量是很關(guān)鍵的決策,因?yàn)樾阅苁?

規(guī)模的非線性函數(shù)。[這個(gè)整體決策已顯得過(guò)時(shí)——起初是由于虛擬內(nèi)存,后來(lái)則是成本低

廉的內(nèi)存?,F(xiàn)在的用戶通常會(huì)購(gòu)買能容納主要應(yīng)用程序所有代碼的內(nèi)存。]

9.11

為了取得良好的空間-時(shí)間折衷,開(kāi)發(fā)隊(duì)伍需要得到特定與某種語(yǔ)言或者機(jī)型

的編程技能培訓(xùn),特別是在使用新語(yǔ)言或者新機(jī)器時(shí)。

9.12

編程需要技術(shù)積累,每個(gè)項(xiàng)目需要自己的標(biāo)準(zhǔn)組件庫(kù)。

9.13

庫(kù)中的每個(gè)組件需要有兩個(gè)版本,運(yùn)行速度較快和短小精煉的。[現(xiàn)在看來(lái)有

些過(guò)時(shí)。]

9.14

精煉、充分和快速的程序。往往是戰(zhàn)略性突破的結(jié)果,而不僅僅技巧上的提高。

9.15

這種突破常常是一種新型算法。

9.16

更普遍的是,戰(zhàn)略上突破常來(lái)自于數(shù)據(jù)或表的重新表達(dá)。數(shù)據(jù)的表現(xiàn)形式是編

程的根本。

- 142 - 10 章 提綱挈領(lǐng)

10.1

“前提:在一片文件的汪洋中,少數(shù)文檔形成了關(guān)鍵的樞紐,每個(gè)項(xiàng)目管理的

工作都圍繞著它們運(yùn)轉(zhuǎn)。它們是經(jīng)理們的主要個(gè)人工具。”

10.2

對(duì)于計(jì)算機(jī)硬件開(kāi)發(fā)項(xiàng)目,關(guān)鍵文檔是目標(biāo)、手冊(cè)、進(jìn)度、預(yù)算、組織機(jī)構(gòu)圖、

空間分配、以及機(jī)器本身的報(bào)價(jià)、預(yù)測(cè)和價(jià)格。

10.3

對(duì)于大學(xué)科系,關(guān)鍵文檔類似:目標(biāo)、課程描述、學(xué)位要求、研究報(bào)告、課程

表和課程的安排、預(yù)算、教室分配、教師和研究生助手的分配。

10.4

對(duì)于軟件項(xiàng)目,要求是相同的:目標(biāo)、用戶手冊(cè)、內(nèi)部文檔、進(jìn)度、預(yù)算、組

織機(jī)構(gòu)圖和工作空間分配。

10.5

因此,即使是小型項(xiàng)目,項(xiàng)目經(jīng)理也應(yīng)該在項(xiàng)目早期規(guī)范化上述的一系列文檔。

10.6

以上集合中每一個(gè)文檔的準(zhǔn)備工作都將注意力集中在對(duì)討論的思索和提煉,而

書(shū)寫(xiě)這項(xiàng)活動(dòng)需要上百次的細(xì)小決定,正是由于它們的存在,人們才能從令人迷惑的現(xiàn)象中

得到清晰、確定的策略。

10.7

對(duì)每個(gè)關(guān)鍵文檔的維護(hù)提供了狀態(tài)監(jiān)督和預(yù)警機(jī)制。

10.8

每個(gè)文檔本身就可以作為檢查列表或者數(shù)據(jù)庫(kù)。

10.9

項(xiàng)目經(jīng)理的基本職責(zé)是使每個(gè)人都向著相同的方向前進(jìn)。

10.10 項(xiàng)目經(jīng)理的主要日常工作是溝通,而不是做出決定;文檔使各項(xiàng)計(jì)劃和決策在

整個(gè)團(tuán)隊(duì)范圍內(nèi)得到交流。

10.11 只有一小部分管理人員的時(shí)間——可能只有 20%——用來(lái)從自己頭腦外部獲

取信息。

10.12 出于這個(gè)原因,廣受吹捧的市場(chǎng)概念——支持管理人員的“完備信息管理系統(tǒng)”

并不基于反映管理人員行為的有效模型。

11 章 未雨綢繆

11.1

化學(xué)工程師已經(jīng)認(rèn)識(shí)到無(wú)法一步將實(shí)驗(yàn)室工作臺(tái)上的反應(yīng)過(guò)程移到工廠中,需

- 143 - 要一個(gè)實(shí)驗(yàn)性工廠(

pilot planet)來(lái)為提高產(chǎn)量和在缺乏保護(hù)的環(huán)境下運(yùn)作提供寶貴經(jīng)驗(yàn)。

11.2

對(duì)于編程產(chǎn)品而言,這樣的中間步驟是同樣必要的,但是軟件工程師在著手發(fā)

布產(chǎn)品之前,卻并不會(huì)常規(guī)地進(jìn)行試驗(yàn)性系統(tǒng)的現(xiàn)場(chǎng)測(cè)試。[現(xiàn)在,這已經(jīng)成為了一項(xiàng)普遍

的實(shí)踐,beta 版本。它不同于有限功能的原型,alpha 版本,后者同樣是我所倡導(dǎo)的實(shí)踐。]

11.3

對(duì)于大多數(shù)項(xiàng)目,第一個(gè)開(kāi)發(fā)的系統(tǒng)并不合用。它可能太慢、太大,而且難以

使用,或者三者兼而有之。

11.4

系統(tǒng)的丟棄和重新設(shè)計(jì)可以一步完成,也可以一塊塊地實(shí)現(xiàn)。這是個(gè)必須完成

的步驟。

11.5

將開(kāi)發(fā)的第一個(gè)系統(tǒng)——丟棄原型——發(fā)布給用戶,可以獲得時(shí)間,但是它的

代價(jià)高昂——對(duì)于用戶,使用極度痛苦;對(duì)于重新開(kāi)發(fā)的人員,分散了精力;對(duì)于產(chǎn)品,影

響了聲譽(yù),即使最好的再設(shè)計(jì)也難以挽回名聲。

11.6

因此,為舍棄而計(jì)劃,無(wú)論如何,你一定要這樣做。

11.7

“開(kāi)發(fā)人員交付的是用戶滿意程度,而不僅僅是實(shí)際的產(chǎn)品。”(Cosgrove)

11.8

用戶的實(shí)際需要和用戶感覺(jué)會(huì)隨著程序的構(gòu)建、測(cè)試和使用而變化。

11.9

軟件產(chǎn)品易于掌握的特性和不可見(jiàn)性,導(dǎo)致了它的構(gòu)建人員(特別容易)面臨

著永恒的需求變更。

11.10

目標(biāo)上(和開(kāi)發(fā)策略上)的一些正常變化無(wú)可避免,事先為它們做準(zhǔn)備總比假

設(shè)它們不會(huì)出現(xiàn)要好得多。

11.11 為變更計(jì)劃軟件產(chǎn)品的技術(shù),特別是細(xì)致的模塊接口文檔——非常地廣為人

知,但并沒(méi)有相同規(guī)模的實(shí)踐。盡可能地使用表驅(qū)動(dòng)技術(shù)同樣是有所幫助的。[現(xiàn)在內(nèi)存的

成本和規(guī)模使這項(xiàng)技術(shù)越來(lái)越出眾。]

11.12 高級(jí)語(yǔ)言的使用、編譯時(shí)操作、通過(guò)引用的聲明整合和自文檔技術(shù)能減少變更

引起的錯(cuò)誤。

11.13 采用定義良好的數(shù)字化版本將變更量子(階段)化。[當(dāng)今的標(biāo)準(zhǔn)實(shí)踐。]

- 144 - 為變更計(jì)劃組織架構(gòu)

11.14 程序員不愿意為設(shè)計(jì)書(shū)寫(xiě)文檔的原因,不僅僅是由于惰性。更多的是源于設(shè)計(jì)

人員的躊躇——要為自己嘗試性的設(shè)計(jì)決策進(jìn)行辯解。(Cosgrove)

11.15 為變更組建團(tuán)隊(duì)比為變更進(jìn)行設(shè)計(jì)更加困難。

11.16 只要管理人員和技術(shù)人才的天賦允許,老板必須對(duì)他們的能力培養(yǎng)給予極大的

關(guān)注,使管理人員和技術(shù)人才具有互換性;特別是希望能在技術(shù)和管理角色之間自由地分配

人手的時(shí)候。

11.17 具有兩條晉升線的高效組織機(jī)構(gòu),存在著一些社會(huì)性的障礙,人們必須警惕和

積極地同它做持續(xù)的斗爭(zhēng)。

11.18 很容易為不同的晉升線建立相互一致的薪水級(jí)別,但要同等威信的建立需要一

些強(qiáng)烈的心理措施:相同的辦公室、一樣的支持和技術(shù)調(diào)動(dòng)的優(yōu)先補(bǔ)償。

11.19 組建外科手術(shù)隊(duì)伍式的軟件開(kāi)發(fā)團(tuán)隊(duì)是對(duì)上述問(wèn)題所有方面的徹底沖擊。對(duì)于

靈活組織架構(gòu)問(wèn)題,這的確是一個(gè)長(zhǎng)期行之有效的解決方案。

前進(jìn)兩步,后退一步——程序維護(hù)

11.20 程序維護(hù)基本上不同于硬件的維護(hù);它主要由各種變更組成,如修復(fù)設(shè)計(jì)缺陷、

新增功能、或者是使用環(huán)境或者配置變換引起的調(diào)整。

11.21 對(duì)于一個(gè)廣泛使用的程序,其維護(hù)總成本通常是開(kāi)發(fā)成本的 40%或更多。

11.22 維護(hù)成本受用戶數(shù)目的嚴(yán)重影響。用戶越多,所發(fā)現(xiàn)的錯(cuò)誤也越多。

11.23 Campbell 指出了一個(gè)顯示產(chǎn)品生命期中每月 bug 數(shù)的有趣曲線,它先是下降,

然后攀升。

11.24 缺陷修復(fù)總會(huì)以(20-50)%的機(jī)率引入新的 bug。

11.25 在每次修復(fù)之后,必須重新運(yùn)行先前所有的測(cè)試用例,從而確保系統(tǒng)不會(huì)以更

隱蔽的方式被破壞。

11.26 能消除、至少是能指明副作用的程序設(shè)計(jì)方法,對(duì)維護(hù)成本有很大的影響。

- 145 - 11.27 同樣,設(shè)計(jì)實(shí)現(xiàn)的人員越少、接口越少,產(chǎn)生的錯(cuò)誤也就越少。

前進(jìn)一步,后退一步——系統(tǒng)熵隨時(shí)間增加

11.28 Lehman 和 Belady 發(fā)現(xiàn)模塊數(shù)量隨大型操作系統(tǒng)(OS/360)版本號(hào)的增加呈線

性增長(zhǎng),但是受到影響的模塊以版本號(hào)指數(shù)的級(jí)別增長(zhǎng)。

11.29 所有修改都傾向于破壞系統(tǒng)的架構(gòu),增加了系統(tǒng)的混亂程度。即使是最熟練的

軟件維護(hù)工作,也只是放緩了系統(tǒng)退化到不可修復(fù)混亂的進(jìn)程,從中必須要重新進(jìn)行設(shè)計(jì)。

[許多程序升級(jí)的真正需要,如性能等,尤其會(huì)沖擊它的內(nèi)部結(jié)構(gòu)邊界。原有邊界引發(fā)的不

足常常在日后才會(huì)出現(xiàn)。]

12 章 干將莫邪

12.1

項(xiàng)目經(jīng)理應(yīng)該制訂一套策略,以及為通用工具的開(kāi)發(fā)分配資源,與此同時(shí),他

還必須意識(shí)到專業(yè)工具的需求。

12.2

開(kāi)發(fā)操作系統(tǒng)的隊(duì)伍需要自己的目標(biāo)機(jī)器,進(jìn)行調(diào)試開(kāi)發(fā)工作。相對(duì)于最快的

速度而言,它更需要最大限度的內(nèi)存,還需要安排一名系統(tǒng)程序員,以保證機(jī)器上的標(biāo)準(zhǔn)軟

件是即時(shí)更新和實(shí)時(shí)可用的。

12.3

同時(shí)還需要配備調(diào)試機(jī)器或者軟件,以便在調(diào)試過(guò)程中,所有類型的程序參數(shù)

可以被自動(dòng)計(jì)數(shù)和測(cè)量。

12.4

目標(biāo)機(jī)器的使用需求量是一種特殊曲線:剛開(kāi)始使用率非常低,突然出現(xiàn)爆發(fā)

性的增長(zhǎng),接著趨于平緩。

12.5

同天文工作者一樣,系統(tǒng)調(diào)試總是大部分在夜間完成。

12.6

拋開(kāi)理論不談,一次分配給某個(gè)小組連續(xù)的目標(biāo)時(shí)間塊被證明是最好的安排方

法,比不同小組的穿插使用更為有效。

12.7

盡管技術(shù)不斷變化,這種采用時(shí)間塊來(lái)安排匱乏計(jì)算機(jī)資源的方式仍得以延續(xù)

20 年[在 1975 年],是因?yàn)樗纳a(chǎn)率最高。[在 1995 年依然如此]

- 146 - 12.8

如果目標(biāo)機(jī)器是新產(chǎn)品,則需要一個(gè)目標(biāo)機(jī)器的邏輯仿真裝置。這樣,可以更

快地得到輔助調(diào)試平臺(tái)。即使在真正機(jī)器出現(xiàn)之后,仿真裝置仍可提供可靠的調(diào)試平臺(tái)。

12.9

主程序庫(kù)應(yīng)該被劃分成(

1)一系列獨(dú)立的私有開(kāi)發(fā)庫(kù);(

2)正處在系統(tǒng)測(cè)試

下的系統(tǒng)集成子庫(kù);(

3)發(fā)布版本。正式的分離和進(jìn)度提供了控制。

12.10 在編制程序的項(xiàng)目中,節(jié)省最大工作量的工具可能是文本編輯系統(tǒng)。

12.11 系統(tǒng)文檔中的巨大容量帶來(lái)了新的不理解問(wèn)題[例如,看看 Unix],但是它比

大多數(shù)未能詳細(xì)描述編程系統(tǒng)特性的短小文章更加可取。

12.12

自頂向下、徹底地開(kāi)發(fā)一個(gè)性能仿真裝置。盡可能早地開(kāi)始這項(xiàng)工作,仔細(xì)地

聽(tīng)取 “它們表達(dá)的意見(jiàn)”。

高級(jí)語(yǔ)言

12.13 只有懶散和惰性會(huì)妨礙高級(jí)語(yǔ)言和交互式編程的廣泛應(yīng)用。[如今它們已經(jīng)在

全世界使用。]

12.14 高級(jí)語(yǔ)言不僅僅提升了生產(chǎn)率,而且還改進(jìn)了調(diào)試:bug 更少,以及更容易尋

找。

12.15 傳統(tǒng)的反對(duì)意見(jiàn)——功能、目標(biāo)代碼的尺寸、目標(biāo)代碼的速度,隨著語(yǔ)言和編

譯器技術(shù)的進(jìn)步已不再成為問(wèn)題。

12.16 現(xiàn)在可供合理選擇的語(yǔ)言是 PL/I。[不再正確。]

交互式編程

12.17 某些應(yīng)用上,批處理系統(tǒng)決不會(huì)被交互式系統(tǒng)所替代。[依然成立。]

12.18 調(diào)試是系統(tǒng)編程中很慢和較困難的部分,而漫長(zhǎng)的調(diào)試周轉(zhuǎn)時(shí)間是調(diào)試的禍

根。

12.19 有限的數(shù)據(jù)表明了系統(tǒng)軟件開(kāi)發(fā)中,交互式編程的生產(chǎn)率至少是原來(lái)的兩倍。

- 147 - 13 章 整體部分

13.1

第 4、5、6 章所意味的煞費(fèi)苦心、詳盡體系結(jié)構(gòu)工作不但使產(chǎn)品更加易于使用,

而且使開(kāi)發(fā)更容易進(jìn)行以及 bug 更不容易產(chǎn)生。

13.2 V.A.Vyssotsky 提出,“許許多多的失敗完全源于那些產(chǎn)品未精確定義的地

方?!?

13.3

在編寫(xiě)任何代碼之前,規(guī)格說(shuō)明必須提交給測(cè)試小組,以詳細(xì)地檢查說(shuō)明的完

整性和明確性。開(kāi)發(fā)人員自己不會(huì)完成這項(xiàng)工作。(Vyssotsky)

13.4

“十年內(nèi)[1965~1975],Wirth 的自頂向下進(jìn)行設(shè)計(jì)[逐步細(xì)化]將會(huì)是最重要

的新型形式化軟件開(kāi)發(fā)方法?!?

13.5 Wirth 主張?jiān)诿總€(gè)步驟中,盡可能使用級(jí)別較高的表達(dá)方法。

13.6

好的自頂向下設(shè)計(jì)從四個(gè)方面避免了 bug。

13.7

有時(shí)必須回退,推翻頂層設(shè)計(jì),重新開(kāi)始。

13.8

結(jié)構(gòu)化編程中,程序的控制結(jié)構(gòu)僅由支配代碼塊(相對(duì)于任意的跳轉(zhuǎn))的給定

集合所組成。這種方法出色地避免了 bug,是一種正確的思考方式。

13.9 Gold 結(jié)果顯示了,在交互式調(diào)試過(guò)程中,第一次交互取得的工作進(jìn)展是后續(xù)

交互的三倍。這實(shí)際上獲益于在調(diào)試開(kāi)始之前仔細(xì)地調(diào)試計(jì)劃。[我認(rèn)為在 1995 年依然如

此。]

13.10 我發(fā)現(xiàn)對(duì)良好終端系統(tǒng)的正確使用,往往要求每?jī)尚r(shí)的終端會(huì)話對(duì)應(yīng)于兩小

時(shí)的桌面工作:1 小時(shí)會(huì)話后的清理和文檔工作;1 小時(shí)為下一次計(jì)劃變更和測(cè)試。

13.11 系統(tǒng)調(diào)試(相對(duì)于單元測(cè)試)花費(fèi)的時(shí)間會(huì)比預(yù)料的更長(zhǎng)。

13.12 系統(tǒng)調(diào)試的困難程度證明了需要一種完備系統(tǒng)化和可計(jì)劃的方法。

13.13 系統(tǒng)調(diào)試僅僅應(yīng)該在所有部件能夠運(yùn)作之后開(kāi)始。(這既不同于為了查出接口

bug 所采取 “合在一起嘗試” 的方法;也不同于在所有構(gòu)件單元的 bug 已知,但未修復(fù)的

情況下,即開(kāi)始系統(tǒng)調(diào)試的做法。)[對(duì)于多個(gè)團(tuán)隊(duì)尤其如此。]

13.14 開(kāi)發(fā)大量的輔助調(diào)試平臺(tái)(

scaffolding 腳手架)和測(cè)試代碼是很值得的,代

- 148 - 碼量甚至可能會(huì)有測(cè)試對(duì)象的一半。

13.15 必須有人對(duì)變更進(jìn)行控制和文檔化,團(tuán)隊(duì)成員應(yīng)使用開(kāi)發(fā)庫(kù)的各種受控拷貝來(lái)

工作。

13.16 系統(tǒng)測(cè)試期間,一次只添加一個(gè)構(gòu)件。

13.17 Lehman 和 Belady 出示了證據(jù),變更的階段(量子)要么很大,間隔很寬;要

么小和頻繁。后者很容易變得不穩(wěn)定。[Microsoft 的一個(gè)團(tuán)隊(duì)使用了非常小的階段(量子)。

結(jié)果是每天晚上需要重新編譯生成增長(zhǎng)中的系統(tǒng)。]

14 章 禍起蕭墻

14.1

“項(xiàng)目是怎樣延遲了整整一年的時(shí)間?…一次一天。”

14.2

一天一天的進(jìn)度落后比起重大災(zāi)難,更難以識(shí)別、更不容易防范和更加難以彌

補(bǔ)。

14.3

根據(jù)一個(gè)嚴(yán)格的進(jìn)度表來(lái)控制項(xiàng)目的第一個(gè)步驟是制訂進(jìn)度表,進(jìn)度表由里程

碑和日期組成。

14.4

里程碑必須是具體的、特定的、可度量的事件,能進(jìn)行清晰能定義。

14.5

如果里程碑定義得非常明確,以致于無(wú)法自欺欺人時(shí),程序員很少會(huì)就里程碑

的進(jìn)展弄虛作假。

14.6

對(duì)于大型開(kāi)發(fā)項(xiàng)目中的估計(jì)行為,政府的承包商所做的研究顯示:每?jī)芍苓M(jìn)行

仔細(xì)修訂的活動(dòng)時(shí)間估計(jì),隨著開(kāi)始時(shí)間的臨近不會(huì)有太大的變化;期間內(nèi)對(duì)時(shí)間長(zhǎng)短的過(guò)

高估計(jì),會(huì)隨著活動(dòng)的進(jìn)行持續(xù)下降;過(guò)低估計(jì)直到計(jì)劃的結(jié)束日期之前大約三周左右,才

有所變化。

14.7

慢性進(jìn)度偏離是士氣殺手。[Microsoft 的 Jim McCarthy 說(shuō):“如果你錯(cuò)過(guò)了

一個(gè)最終期限(deadline),確保制訂下一條 deadline。2 ”]

14.8

進(jìn)取對(duì)于杰出的軟件開(kāi)發(fā)團(tuán)隊(duì),同優(yōu)秀的棒球隊(duì)伍一樣,是不可缺少的必要品

德。

- 149 - 14.9

不存在關(guān)鍵路徑進(jìn)度的替代品,使人們能夠辨別計(jì)劃偏移的情況。

14.10 PERT 的準(zhǔn)備工作是 PERT 圖使用中最有價(jià)值的部分。它包括了整個(gè)網(wǎng)狀結(jié)構(gòu)的

展開(kāi)、任務(wù)之間依賴關(guān)系的識(shí)別、各個(gè)任務(wù)鏈的估計(jì)。這些都要求在項(xiàng)目早期進(jìn)行非常專業(yè)

的計(jì)劃。

14.11 第一份 PERT 圖總是很恐怖的,不過(guò)人們總是不斷進(jìn)行努力,運(yùn)用才智制訂下

一份 PERT 圖。

14.12 PERT 圖為前面那個(gè)泄氣的借口,“其他的部分反正會(huì)落后”,提供了答案。

14.13 每個(gè)老板同時(shí)需要采取行動(dòng)的異常信息以及用來(lái)進(jìn)行分析和早期預(yù)警的狀態(tài)

數(shù)據(jù)。

14.14 狀態(tài)的獲取是困難的,因?yàn)橄聦俳?jīng)理有充分的理由不提供信息共享。

14.15 老板的不良反應(yīng)肯定會(huì)對(duì)信息的完全公開(kāi)造成壓制;相反,仔細(xì)區(qū)分狀態(tài)報(bào)告、

毫無(wú)驚慌地接收?qǐng)?bào)告、決不越俎代庖,將能鼓勵(lì)誠(chéng)實(shí)的匯報(bào)。

14.16 必須有評(píng)審的機(jī)制,從而所有成員可以通過(guò)它了解真正的狀態(tài)。出于這個(gè)目的,

里程碑的計(jì)劃和完成文檔是關(guān)鍵。

14.17 Vyssotsky:我發(fā)現(xiàn)在里程碑報(bào)告中很容易記錄“計(jì)劃(老板的日期)”和“估

計(jì)(最基層經(jīng)理的日期)”的日期。項(xiàng)目經(jīng)理必須停止對(duì)這些日期的懷疑?!?

14.18 對(duì)于大型項(xiàng)目,一個(gè)對(duì)里程碑報(bào)告進(jìn)行維護(hù)的計(jì)劃和控制(Plan and Control)

小組是非??少F的。

15 章 另外一面

15.1

對(duì)于軟件編程產(chǎn)品來(lái)說(shuō),程序向用戶所呈現(xiàn)的面貌與提供給機(jī)器識(shí)別的內(nèi)容同

樣重要。

15.2

即使對(duì)于完全開(kāi)發(fā)給自己使用的程序,描述性文字也是必須的,因?yàn)樗鼈儠?huì)被

用戶-作者所遺忘。

15.3

培訓(xùn)和管理人員基本上沒(méi)有能向編程人員成功地灌輸對(duì)待文檔的積極態(tài)度—

- 150 - —文檔能在整個(gè)生命周期對(duì)克服懶惰和進(jìn)度的壓力起促進(jìn)激勵(lì)作用。

15.4

這樣的失敗并不都是因?yàn)槿狈崆榛蛘哒f(shuō)服力,而是沒(méi)能正確地展示如何有效

和經(jīng)濟(jì)地編制文檔。

15.5

大多數(shù)文檔只提供了很少的總結(jié)性內(nèi)容。必須放慢腳步,穩(wěn)妥地進(jìn)行。

15.6

由于關(guān)鍵的用戶文檔包含了跟軟件相關(guān)的基本決策,所以它的絕大部分需要在

程序編制之前書(shū)寫(xiě),它包括了 9 項(xiàng)內(nèi)容(參見(jiàn)相應(yīng)章節(jié))。

15.7

每一份發(fā)布的程序拷貝應(yīng)該包括一些測(cè)試用例,其中一部分用于校驗(yàn)輸入數(shù)

據(jù),一部分用于邊界輸入數(shù)據(jù),另一部分用于無(wú)效的輸入數(shù)據(jù)。

15.8

對(duì)于必須修改程序的人而言,他們所需要程序內(nèi)部結(jié)構(gòu)文檔,同樣要求一份清

晰明了的概述,它包括了 5 項(xiàng)內(nèi)容(參見(jiàn)相應(yīng)章節(jié))。

15.9

流程圖是被吹捧得最過(guò)分的一種程序文檔。詳細(xì)逐一記錄的流程圖是一件令人

生厭的事情,而且高級(jí)語(yǔ)言的出現(xiàn)使它顯得陳舊過(guò)時(shí)。(流程圖是圖形化的高級(jí)語(yǔ)言。)

15.10 如果這樣,很少有程序需要一頁(yè)紙以上的流程圖。[在這一點(diǎn)上,MILSPEC 軍

用標(biāo)準(zhǔn)實(shí)在錯(cuò)得很厲害。]

15.11 即使的確需要一張程序結(jié)構(gòu)圖,也并不需要遵照 ANSI 的流程圖標(biāo)準(zhǔn)。

15.12 為了使文檔易于維護(hù),將它們合并至源程序是至關(guān)重要的,而不是作為獨(dú)立文

檔進(jìn)行保存。

15.13 最小化文檔負(fù)擔(dān)的 3 個(gè)關(guān)鍵思路:

‰ 借助那些必須存在的語(yǔ)句,如名稱和聲明等,來(lái)附加盡可能多的“文檔”信息。

‰ 使用空格和格式來(lái)表現(xiàn)從屬和嵌套關(guān)系,提高程序的可讀性。

‰ 以段落注釋,特別是模塊標(biāo)題的形式,向程序中插入必要的記敘性文字。

15.14 程序修改人員所使用的文檔中,除了描述事情如何以外,還應(yīng)闡述它為什么那

樣。對(duì)于加深理解,目的是非常關(guān)鍵的,但即使是高級(jí)語(yǔ)言的語(yǔ)法,也不能表達(dá)目的。

15.15 在線系統(tǒng)的高級(jí)語(yǔ)言(應(yīng)該使用的工具)中,自文檔化技術(shù)發(fā)現(xiàn)了它的絕佳應(yīng)

用和強(qiáng)大功能。

- 151 - 原著結(jié)束語(yǔ)

E.1 軟件系統(tǒng)可能是人類創(chuàng)造中最錯(cuò)綜復(fù)雜的事物(從不同類型組成部分?jǐn)?shù)量的角度出

發(fā))。

E.2 軟件工程的焦油坑在將來(lái)很長(zhǎng)一段時(shí)間內(nèi)會(huì)繼續(xù)地使人們舉步維艱,無(wú)法自拔。

?

核心觀點(diǎn):概念完整性和結(jié)構(gòu)師

概念完整性。一個(gè)整潔、優(yōu)雅的編程產(chǎn)品必須向它的每個(gè)用戶提供一個(gè)條理分明的概

念模型,這個(gè)模型描述了應(yīng)用、實(shí)現(xiàn)應(yīng)用的方法以及用來(lái)指明操作和各種參數(shù)的用戶界面使

用策略,。用戶所感受到的產(chǎn)品概念完整性是易用性中最重要的因素。(當(dāng)然還有其他因素。

Macintosh 上所有應(yīng)用程序界面的統(tǒng)一就是一個(gè)重要的例子。此外,有可能建立統(tǒng)一的接口,

盡管它可能很粗糙,就像 MS-DOS。)

有很多由一個(gè)或者兩個(gè)人設(shè)計(jì)的優(yōu)秀軟件產(chǎn)品例子。大多數(shù)純智力作品,像書(shū)籍、音

- 154 - 樂(lè)等都是采用這種方式創(chuàng)作出來(lái)的。不過(guò),很多產(chǎn)業(yè)的產(chǎn)品開(kāi)發(fā)過(guò)程無(wú)法負(fù)擔(dān)這種獲取概念

完整性的直接方法。競(jìng)爭(zhēng)帶來(lái)了壓力,很多現(xiàn)代工藝的最終產(chǎn)品是非常復(fù)雜的,它們的設(shè)計(jì)

需要很多人月的工作量。軟件產(chǎn)品十分復(fù)雜,在進(jìn)度上的競(jìng)爭(zhēng)也異常激烈。

結(jié)構(gòu)師。從第 4 到第 7 章,我一直不斷地在表達(dá)一個(gè)觀點(diǎn)——委派一名產(chǎn)品結(jié)構(gòu)師是

最重要的行動(dòng)。結(jié)構(gòu)師負(fù)責(zé)產(chǎn)品所有方面的概念完整性,這些是用戶能實(shí)際感受到的。結(jié)構(gòu)

師開(kāi)發(fā)用于向用戶解釋使用的產(chǎn)品概念模型,概念模型包括所有功能的詳細(xì)說(shuō)明以及調(diào)用和

控制的方法。結(jié)構(gòu)師是這些模型的所有者,同時(shí)也是用戶的代理。在不可避免地對(duì)功能、性

能、規(guī)模、成本和進(jìn)度進(jìn)行平衡時(shí),卓有成效地體現(xiàn)用戶的利益。這個(gè)角色是全職工作,只

有在最小的團(tuán)隊(duì)中,才能和團(tuán)隊(duì)經(jīng)理的角色合并。結(jié)構(gòu)師就像電影的導(dǎo)演,而經(jīng)理類似于制

片人。

?

特別的,他發(fā)現(xiàn):1、

?第一次發(fā)布的成本最優(yōu)進(jìn)度時(shí)間,T = 2.5(MM)1/3。即,月單位的最優(yōu)時(shí)間是估

計(jì)工作量(人月)的立方根,估計(jì)工作量則由規(guī)模估計(jì)和模型中的其他因子導(dǎo)出。最優(yōu)人員

配備曲線是由推導(dǎo)得出的。

2、?當(dāng)計(jì)劃進(jìn)度比最優(yōu)進(jìn)度長(zhǎng)時(shí),成本曲線會(huì)緩慢攀升。時(shí)間越充裕,花的時(shí)間也越長(zhǎng)。

3、?當(dāng)計(jì)劃進(jìn)度比最優(yōu)進(jìn)度短時(shí),成本曲線急劇升高。

4、?無(wú)論安排多少人手,幾乎沒(méi)有任何項(xiàng)目能夠在少于 3/4 的最優(yōu)時(shí)間內(nèi)獲得成功!當(dāng)

高級(jí)經(jīng)理向項(xiàng)目經(jīng)理要求不可能的進(jìn)度擔(dān)保時(shí),這段結(jié)論可以充分地作為項(xiàng)目經(jīng)理的理論依

據(jù)。

?

微型計(jì)算機(jī)革命改變了每個(gè)人使用計(jì)算機(jī)的方式。Schumacher 在 20 年前,陳述了面對(duì)

的挑戰(zhàn):

我們真正想從科學(xué)家和技術(shù)專家那里得到什么?我會(huì)回答:我們需要這樣的方法和設(shè)

備:

1、?價(jià)格足夠低廉,使幾乎所有人都能夠使用

2、?適合小型的應(yīng)用,并且

3、?滿足人們對(duì)創(chuàng)造的渴望

?

傳統(tǒng)軟件產(chǎn)業(yè)。在 1975 年,軟件產(chǎn)業(yè)擁有若干可識(shí)別的、但多少有些差異的組成部分,

如今他們依然存在:

1、?計(jì)算機(jī)提供商:提供操作系統(tǒng)、編譯器和一些實(shí)用程序

2、?應(yīng)用程序用戶:如公共事業(yè)、銀行、保險(xiǎn)、政府機(jī)構(gòu)等,他們?yōu)樽约菏褂玫能浖_(kāi)

發(fā)應(yīng)用程序包。

3、?定制程序開(kāi)發(fā)者:為用戶承包開(kāi)發(fā)私用軟件包,需求、標(biāo)準(zhǔn)和行銷步驟都是與眾不

同的。

4、?商業(yè)包開(kāi)發(fā)者:那個(gè)時(shí)候是為專業(yè)市場(chǎng)開(kāi)發(fā)大型應(yīng)用,如統(tǒng)計(jì)分析和 CAD 系統(tǒng)等

?

操作系統(tǒng)世界已經(jīng)統(tǒng)一了。在 1975 年,存在著很多操作系統(tǒng):每個(gè)硬件提供商每條產(chǎn)

品線最少有一種操作系統(tǒng),很多提供商甚至有兩個(gè)。如今是多么的不同??!開(kāi)放式系統(tǒng)是基

本原則。目前,人們主要在 5 大操作系統(tǒng)環(huán)境上行銷自己的應(yīng)用程序包(按照時(shí)間順序):

‰ IBM MVS 和 VM 環(huán)境

- 173 - ‰ DEC VMS 環(huán)境

‰ Unix 環(huán)境,某個(gè)版本

‰ IBM PC 環(huán)境,DOS、OS-2 或者 Windows

‰ Apple Macintosh 環(huán)境

?

塑料薄膜包裝的成品軟件產(chǎn)業(yè)。對(duì)于這個(gè)產(chǎn)業(yè)的開(kāi)發(fā)者,面對(duì)的是與傳統(tǒng)產(chǎn)業(yè)完全不

同的經(jīng)濟(jì)學(xué):軟件成本是開(kāi)發(fā)成本與數(shù)量的比值,包裝和市場(chǎng)成本非常高。在傳統(tǒng)內(nèi)部的應(yīng)

用開(kāi)發(fā)產(chǎn)業(yè),進(jìn)度和功能細(xì)節(jié)是可以協(xié)商的,開(kāi)發(fā)成本則可能不行;而在競(jìng)爭(zhēng)激烈的開(kāi)發(fā)市

場(chǎng)面前,進(jìn)度和功能支配了開(kāi)發(fā)成本。

?


人月神話讀書(shū)筆記的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
民县| 旺苍县| 临桂县| 罗江县| 屏南县| 郸城县| 丹江口市| 瓦房店市| 永康市| 炎陵县| 同心县| 盘山县| 晋中市| 梁河县| 鹿泉市| 会理县| 曲水县| 拉孜县| 麻栗坡县| 金塔县| 长乐市| 天长市| 广德县| 郁南县| 宜春市| 竹山县| 安吉县| 云和县| 山阴县| 东源县| 四平市| 新化县| 光山县| 拜泉县| 宜川县| 庆云县| 突泉县| 体育| 元氏县| 宁化县| 恩施市|