如果想搭一個狗窩,備好木料、釘子和一些基本工具(如錘子、鋸和卷尺)之后,就可以開始工作了。從制定一點初步計劃到完成一個滿足適當(dāng)功能的狗窩,可能不用別人幫助,在幾個小時內(nèi)就能夠?qū)崿F(xiàn)。只要狗窩夠大且不太漏水,狗就可以安居。如果未能達到希望的效果,返工總是可以的,無非是讓狗受點委屈。
如果想為家庭建造一所房子,備好木料、釘子和一些基本工具之后,也能開始工作,但這將需要較長的時間,并且家庭對于房子的需求肯定比狗對于狗窩的需求要多。在這種情況下,除非曾經(jīng)多次建造過房子,否則就需要事先制定出一些詳細的計劃,再開始動工,才能夠成功。至少應(yīng)該繪制一些表明房子是什么樣子的簡圖。如果想建造一所能滿足家庭的需要并符合當(dāng)?shù)亟ㄖ?guī)范的合格房屋,就需要畫一些建筑圖,以便能想清楚房間的使用目的以及照明、取暖和水管裝置的實際細節(jié)問題。做出這些計劃后,就能對這項工作所需的時間和物料做出合理的估計。盡管自己也可能建造出這樣的房屋,但若有其他人協(xié)作,并將工程中的許多關(guān)鍵部分轉(zhuǎn)包出去或購買預(yù)制的材料,效率就會高得多。只要按計劃行事,不超出時間和財務(wù)的預(yù)算,家庭多半會對這新房感到滿意。如果不制定計劃,新房就不會完全令人滿意。因此,最好在早期就制定計劃,并謹(jǐn)慎地處理好所發(fā)生的變化。
如果你要建造一座高層辦公大廈,若還是先備好木料、釘子和一些基本工具就開始工作,那將是非常愚蠢的。因為你所使用的資金可能是別人的,他們會對建筑物的規(guī)模、形狀和風(fēng)格做出要求。同時,他們經(jīng)常會改變想法,甚至是在工程已經(jīng)開工之后。由于失敗的代價太高了,因此必須要做詳盡的計劃。負責(zé)建筑物設(shè)計和施工的是一個龐大的組織機構(gòu),你只是其中的一部分。這個組織將需要各種各樣的設(shè)計圖和模型,以供各方相互溝通。只要得到了合適的人員和工具,并對把建筑概念轉(zhuǎn)換為實際建筑的過程進行積極的管理,將會建成這座滿足使用要求的大廈。如果想繼續(xù)從事建筑工作,那么一定要在使用要求和實際的建筑技術(shù)之間做好平衡,并且處理好建筑團隊成員們的休息問題,既不能把他們置于風(fēng)險之中,也不能驅(qū)使他們過分辛苦地工作以至于精疲力盡。
奇怪的是,很多軟件開發(fā)組織開始想建造一座大廈式的軟件,而在動手處理時卻好像他們正在倉促地造一個狗窩。
有時你是幸運的。如果在恰當(dāng)?shù)臅r間有足夠的合適人員,并且其他一切事情都很如意,你的團隊有可能(僅是可能)推出一個令用戶眼花繚亂的軟件產(chǎn)品。然而,一般的情況下,不可能所有人員都合適(合適的人員經(jīng)常供不應(yīng)求),時間并不總是恰當(dāng)?shù)模ㄗ蛱炜偸歉茫渌氖虑橐膊⒉槐M如人意(常常由不得自己)。現(xiàn)在對軟件開發(fā)的要求正在日益增加,而開發(fā)團隊卻還是經(jīng)常單純地依靠他們唯一真正知道如何做好的一件事——編寫程序代碼。英雄式的編程工作成為這一行業(yè)的傳奇,人們似乎經(jīng)常認為更努力地工作是面對開發(fā)中出現(xiàn)的各種危機的正常反應(yīng)。然而,這未必能產(chǎn)生正確的程序代碼,而且一些項目是非常巨大的,無論怎樣延長工作時間,也不足以完成所需的工作。
如果真正想建造一個相當(dāng)于房子或大廈類的軟件系統(tǒng),問題可不是僅僅編寫許多軟件。事實上,關(guān)鍵是要編出正確的軟件,并考慮如何少寫軟件。要生產(chǎn)合格的軟件就要有一套關(guān)于體系結(jié)構(gòu)、過程和工具的規(guī)范。即使如此,很多項目開始看起來像狗窩,但隨后發(fā)展得像大廈,原因很簡單,它們是自己成就的犧牲品。如果對體系結(jié)構(gòu)、過程或工具的規(guī)范沒有作任何考慮,總有一天狗窩會膨脹成大廈,并會由于其自身的重量而倒塌。狗窩的倒塌可能使你的狗惱怒;同理,不成功的大廈則將對大廈的租戶造成嚴(yán)重的影響。
不成功的軟件項目失敗的原因各不相同,而所有成功的項目在很多方面都是相似的。成功的軟件組織有很多成功的因素,其中共同的一點就是對建模的采用。
建模是一項經(jīng)過檢驗并被廣為接受的工程技術(shù)。建立房屋和大廈的建筑模型,能幫助用戶得到實際建筑物的印象,甚至可以建立數(shù)學(xué)模型來分析大風(fēng)或地震對建筑物造成的影響。
建模不只適用于建筑業(yè)。如果不首先構(gòu)造模型(從計算機模型到物理風(fēng)洞模型,再到與實物大小一樣的原型),就裝配新型的飛機或汽車,那簡直是難以想像的。新型的電氣設(shè)備(從微處理器到電話交換系統(tǒng))需要一定程度的建模,以便更好地理解系統(tǒng)并與他人交流思想。在電影業(yè),情節(jié)串聯(lián)板是產(chǎn)品的核心,這也是建模的一種形式。在社會學(xué)、經(jīng)濟學(xué)和商業(yè)管理領(lǐng)域也需要建模,以證實人們??的理論或用最小限度的風(fēng)險和代價試驗新的理論。
那么,模型是什么?簡單地說:
模型是對現(xiàn)實的簡化。
模型提供了系統(tǒng)的藍圖。模型既可以包括詳細的計劃,也可以包括從很高的層次考慮系統(tǒng)的總體計劃。一個好的模型包括那些有廣泛影響的主要元素,而忽略那些與給定的抽象水平不相關(guān)的次要元素。每個系統(tǒng)都可以從不同的方面用不同的模型來描述,因而每個模型都是一個在語義上閉合的系統(tǒng)抽象。模型可以是結(jié)構(gòu)性的,強調(diào)系統(tǒng)的組織。它也可以是行為性的,強調(diào)系統(tǒng)的動態(tài)方面。
為什么要建模?一個基本理由是:
建模是為了能夠更好地理解正在開發(fā)的系統(tǒng)。
通過建模,要達到4個目的:
(1)模型有助于按照實際情況或按照所需要的樣式對系統(tǒng)進行可視化。
(2)模型能夠規(guī)約系統(tǒng)的結(jié)構(gòu)或行為。
(3)模型給出了指導(dǎo)構(gòu)造系統(tǒng)的模板。
(4)模型對做出的決策進行文檔化。 【第2章討論UML如何完成這4件事情。】
建模并不只是針對大的系統(tǒng)。甚至像狗窩那樣的軟件也能從一些建模中受益。然而,可以明確地講,系統(tǒng)越大、越復(fù)雜,建模的重要性就越大,一個很簡單的原因是:
因為不能完整地理解一個復(fù)雜的系統(tǒng),所以要對它建模。
人對復(fù)雜問題的理解能力是有限的。通過建模,縮小所研究問題的范圍,一次只著重研究它的一個方面,這就是Edsger Dijkstra幾年前講的“分而治之”的基本方法,即把一個困難問題劃分成一系列能夠解決的小問題;解決了這些小問題也就解決了這個難題。此外,通過建模可以增強人的智力。一個適當(dāng)選擇的模型可以使建模人員在較高的抽象層次上工作。
任何情況下都應(yīng)該建模的說法并沒有落到實處。事實上,一些研究指出,大多數(shù)軟件組織沒有做正規(guī)的建模,即使做了也很少。按項目的復(fù)雜性劃分一下建模的使用情況,將會發(fā)現(xiàn):項目越簡單,采用正規(guī)建模的就越少。
這里強調(diào)的是“正規(guī)”這個詞。實際上,開發(fā)者甚至對非常簡單的項目也要做一些建模工作,雖然很不正規(guī)。開發(fā)者可能在一塊黑板上或一小片紙上勾畫出他的想法,以對部分系統(tǒng)進行可視化表示,或者開發(fā)組可能使用CRC卡片描述一個場景或某種機制的設(shè)計。使用任何一種這樣的模型都沒有什么錯。如果它能行得通,就可以使用。然而,這些非正規(guī)的模型經(jīng)常是太隨意了,它沒有提供一種容易讓他人理解的共同語言。建筑業(yè)、電機工程業(yè)和數(shù)學(xué)建模都有通用的建模語言,在軟件開發(fā)中使用一種共同的建模語言進行軟件建模也能使開發(fā)組織獲益匪淺。
每個項目都能從一些建模中受益。即使在一次性的軟件開發(fā)中——由于可視化編程語言的支持,可以輕而易舉地扔掉不適合的軟件。建模也能幫助開發(fā)組更好地對系統(tǒng)計劃進行可視化,并幫助他們正確地進行構(gòu)造,使開發(fā)工作進展得更快。如果根本不建模,項目越復(fù)雜,就越有可能失敗或者構(gòu)造出錯誤的東西。所有實用系統(tǒng)都有一個自然趨勢:隨著時間的推移變得越來越復(fù)雜。雖然今天可能認為不需要建模,但隨著系統(tǒng)的演化,終將會對這個決定感到后悔,但那時為時已晚。