構(gòu)架是涉眾進(jìn)行交流的手段 軟件系統(tǒng)的涉眾--客戶、用戶、項(xiàng)目經(jīng)理、程序員、測(cè)試人員等--分別關(guān)注系統(tǒng)的不同特征,而這些特征都受構(gòu)架影響。例如,用戶關(guān)心的是系統(tǒng)的可靠性和可用性;客戶關(guān)心的是構(gòu)架能否在規(guī)定時(shí)間內(nèi)實(shí)現(xiàn),并且開(kāi)支不超出預(yù)算;項(xiàng)目經(jīng)理關(guān)心的是如果按此構(gòu)架進(jìn)行開(kāi)發(fā),能否保證各小組的任務(wù)在很大程度上都獨(dú)立完成,各部分的交互方式是否規(guī)范、可控;而設(shè)計(jì)師所關(guān)心的則是實(shí)現(xiàn)構(gòu)架的所有這些目標(biāo)的策略。
構(gòu)架提供了一種共同語(yǔ)言,有關(guān)各方可借助它表達(dá)和協(xié)商各自的需求,并理性地找到解決方案,即使對(duì)大型、復(fù)雜系統(tǒng)的開(kāi)發(fā)也是如此。如果沒(méi)有這樣一種語(yǔ)言,要想充分理解大型系統(tǒng)并理智地做出對(duì)系統(tǒng)質(zhì)量和易用性都具有重要影響的早期決策將十分困難。構(gòu)架分析不僅依賴(lài)于而且促進(jìn)了這個(gè)層次上的交流。
構(gòu)架是早期設(shè)計(jì)決策的體現(xiàn) 構(gòu)架明確了對(duì)系統(tǒng)實(shí)現(xiàn)的約束條件。如果系統(tǒng)實(shí)現(xiàn)遵循構(gòu)架設(shè)計(jì)中所做出的關(guān)于系統(tǒng)結(jié)構(gòu)的決策,則系統(tǒng)實(shí)現(xiàn)將能夠體現(xiàn)出構(gòu)架的特色。
資源分配方面的決策也制約著系統(tǒng)實(shí)現(xiàn)。這些決策對(duì)從事各元素開(kāi)發(fā)的實(shí)現(xiàn)人員來(lái)說(shuō)可能是不可見(jiàn)的。這些限制條件使將各方關(guān)心的問(wèn)題分離開(kāi)成為可能,從而使管理者能夠做出科學(xué)的決策,最大限度地利用人才和計(jì)算資源。各元素的開(kāi)發(fā)者對(duì)自己所從事的開(kāi)發(fā)任務(wù)的要求必須十分清楚,但沒(méi)有必要了解在構(gòu)架上所做的權(quán)衡。相反,構(gòu)架設(shè)計(jì)師未必要精通算法設(shè)計(jì)或編程語(yǔ)言的各個(gè)方面,但必須能夠做出構(gòu)架上的合理權(quán)衡。
構(gòu)架決定了開(kāi)發(fā)組織的組織結(jié)構(gòu)。因?yàn)橄到y(tǒng)的構(gòu)架中包含了對(duì)系統(tǒng)的最高層次的分解,因而一般被作為工作分解結(jié)構(gòu)的基礎(chǔ);這反過(guò)來(lái)也規(guī)定了計(jì)劃、調(diào)度及預(yù)算的單元,組內(nèi)交流的渠道,配置控制和文件系統(tǒng)的組織,集成與測(cè)試計(jì)劃和規(guī)程,甚至提出了對(duì)一些瑣事的要求。各開(kāi)發(fā)小組根據(jù)構(gòu)架中各主要元素的接口規(guī)范進(jìn)行交流。一旦進(jìn)入維護(hù)階段,維護(hù)活動(dòng)也會(huì)反映出軟件的結(jié)構(gòu),常由不同的小組分別負(fù)責(zé)各具體部分的維護(hù)。
建立工作分解結(jié)構(gòu)的一個(gè)副作用:它限定了軟件構(gòu)架的某些方面。如果已經(jīng)將某個(gè)子系統(tǒng)的開(kāi)發(fā)交由某個(gè)小組完成,則該小組會(huì)對(duì)將此任務(wù)分派給其他小組提出異議。如果這種責(zé)任劃分已經(jīng)用合同的形式確定下來(lái),則改變?nèi)蝿?wù)分配的代價(jià)可能是昂貴的。對(duì)分配到各小組的任務(wù)的進(jìn)展情況的跟蹤也要困難得多。
因此,一旦對(duì)構(gòu)架達(dá)成一致,不管是由于管理上的還是商業(yè)傷的原因,想要對(duì)它進(jìn)行修改,幾乎都是不可能的。這也是為什么在確定某個(gè)大型系統(tǒng)的構(gòu)架之前必須進(jìn)行全面分析的原因之一。
構(gòu)架阻止或支持系統(tǒng)的質(zhì)量屬性的實(shí)現(xiàn)。 系統(tǒng)能否具有所期望的質(zhì)量屬性主要是由其構(gòu)架決定的。第5章將詳細(xì)討論構(gòu)架和質(zhì)量屬性之間的關(guān)系,現(xiàn)在僅需牢記以下幾點(diǎn):
- 如果您的系統(tǒng)要求高性能,就需要管理元素基于時(shí)間的行為以及元素間通信的頻率和數(shù)量。
- 如果可修改性很重要,就需要給元素分配責(zé)任,以使對(duì)系統(tǒng)的修改不會(huì)產(chǎn)生很大的影響。
- 如果系統(tǒng)必須非常安全,就需要管理和保護(hù)元素間的通信以及允許哪些元素訪問(wèn)哪些信息。可能還需要在構(gòu)架中引入專(zhuān)門(mén)的元素(如受信的內(nèi)核)
- 如果您認(rèn)為系統(tǒng)需要可擴(kuò)展性,就必須仔細(xì)定位資源的使用,以有利于引入容量更高的更換組件。
- 如果項(xiàng)目需要交付系統(tǒng)的增量式子集,就必須仔細(xì)管理組件間的使用。
- 如果希望可以在其他系統(tǒng)中重要該系統(tǒng)的元素,就需要限制元素間的耦合,以便提取元素時(shí),它能發(fā)揮作用,且不會(huì)與當(dāng)前環(huán)境有過(guò)多依賴(lài)。
這些和其他質(zhì)量屬性策略都與構(gòu)架有很大關(guān)系。然而,僅靠構(gòu)架也無(wú)法保證系統(tǒng)功能和質(zhì)量屬性的實(shí)現(xiàn),理解這一點(diǎn)非常重要。
通過(guò)研究構(gòu)架來(lái)預(yù)測(cè)系統(tǒng)質(zhì)量。能否在系統(tǒng)開(kāi)發(fā)和部署前就知道做出了適當(dāng)?shù)臉?gòu)架決策(也就是系統(tǒng)是否將表現(xiàn)出所期望的質(zhì)量屬性)? 所幸的是,僅僅依靠對(duì)構(gòu)架的評(píng)估來(lái)預(yù)測(cè)系統(tǒng)未來(lái)的質(zhì)量屬性是可能的。
構(gòu)架使推理判斷和控制更改更簡(jiǎn)單。每個(gè)構(gòu)架都將可能的更改劃分為3類(lèi):本地的、非本地的和構(gòu)架上的。本地更改只需修改某一個(gè)元素就可以實(shí)現(xiàn)。非本地更改的實(shí)現(xiàn)則需對(duì)多個(gè)元素進(jìn)行修改,但并不改動(dòng)構(gòu)架。構(gòu)架的更改會(huì)影響各元素之間交互的基本方式--即構(gòu)架模式--并很可能要求系統(tǒng)做全面的修改。顯然,僅做本地更改是最理想的。所以,一個(gè)富有生命力的構(gòu)架應(yīng)該是這樣的:最有可能發(fā)生的更改也是最容易進(jìn)行的更改。 構(gòu)架有助于循序漸進(jìn)的原型設(shè)計(jì)。一旦確定了構(gòu)架,就可以對(duì)其進(jìn)行分析,并將其原型構(gòu)造為一個(gè)骨架系統(tǒng)。這從兩個(gè)方面協(xié)助開(kāi)發(fā)過(guò)程的順利進(jìn)行:
- 在產(chǎn)品生命期的早期就能得到一個(gè)可執(zhí)行的系統(tǒng)。隨著原型中的各部分逐漸被真實(shí)系統(tǒng)各部分的最終實(shí)現(xiàn)所代替,原型的這種真實(shí)性將越來(lái)越明顯地體現(xiàn)出來(lái)。原型的各組成部分可能與系統(tǒng)的最終實(shí)現(xiàn)有較大差異,也可能能夠比較逼真地處理和產(chǎn)生數(shù)據(jù)。
- 使系統(tǒng)在早期執(zhí)行的一個(gè)特例就是在產(chǎn)品生命期的早期確定潛在的性能問(wèn)題。
可以通過(guò)構(gòu)架進(jìn)行更準(zhǔn)確的成本和進(jìn)度估計(jì)。 成本和進(jìn)度估計(jì)是一個(gè)重要的管理工具,它能夠使管理人員獲得必要的資源并了解項(xiàng)目開(kāi)發(fā)中是否遇到了困難。與了解整個(gè)系統(tǒng)相比,了解系統(tǒng)的某些部分本質(zhì)上可以使成本估計(jì)更加準(zhǔn)確。正如我們已經(jīng)說(shuō)過(guò)的,項(xiàng)目的組織結(jié)構(gòu)基于它的構(gòu)架。與項(xiàng)目經(jīng)理相比,每個(gè)小組能夠?qū)ζ渌_(kāi)發(fā)的部分進(jìn)行更準(zhǔn)確的估計(jì),并且在使估計(jì)成為現(xiàn)實(shí)的過(guò)程中,擁有強(qiáng)烈的主人翁責(zé)任感。第二,構(gòu)架的最初定義意味著已經(jīng)評(píng)審了系統(tǒng)的需求,從某種意義上來(lái)說(shuō),已經(jīng)對(duì)需求進(jìn)行了驗(yàn)證。對(duì)系統(tǒng)范圍了解的越多,估計(jì)就會(huì)越準(zhǔn)確。
構(gòu)架是可傳遞、可重用的模型 在整個(gè)生命期中,重要的越早,收益就越大。代碼的重用能帶來(lái)極大的便利,而在構(gòu)架層次上的重用則為具有類(lèi)似需求的系統(tǒng)開(kāi)發(fā)提供了有利的手段。不僅可以實(shí)現(xiàn)代碼的重用,還可以實(shí)現(xiàn)決定構(gòu)架選用的系統(tǒng)需求及構(gòu)建構(gòu)架的經(jīng)驗(yàn)的重用。如果構(gòu)架決策能夠在多個(gè)系統(tǒng)中得到重用,則也可以獲得上面講到的早期決策所帶來(lái)的所有好處。 產(chǎn)品線共享一個(gè)公共的構(gòu)架。 軟件產(chǎn)品線或家族是一組軟件密集型系統(tǒng),這些系統(tǒng)共享一個(gè)公共的、可管理性的特性集,滿足了待定市場(chǎng)或任務(wù)的具體需要,是 按照規(guī)定的方式根據(jù)一組公共的核心資產(chǎn)開(kāi)發(fā)的。在這些核心資產(chǎn)中,主要部分就是設(shè)計(jì)用來(lái)處理整個(gè)家族需要的構(gòu)架。產(chǎn)品線設(shè)計(jì)師通過(guò)制定在早期適用與整個(gè)家族的設(shè)計(jì)決策,以及在后期僅適用于單個(gè)成員的其他決策,來(lái)選擇一個(gè)滿足產(chǎn)品線的所有預(yù)想成員的構(gòu)架。該構(gòu)架定義了對(duì)產(chǎn)品線的所有成員來(lái)說(shuō),什么是固定的,什么是可變的。對(duì)多系統(tǒng)開(kāi)發(fā)來(lái)說(shuō),軟件產(chǎn)品線是一種強(qiáng)大的開(kāi)發(fā)方法,它可以在上市時(shí)間、成本、生產(chǎn)率和產(chǎn)品質(zhì)量方面實(shí)現(xiàn)極大的回報(bào)。構(gòu)架的強(qiáng)大源于范例的核心。與其他資本投資類(lèi)似,產(chǎn)品線的構(gòu)架將成為開(kāi)發(fā)組織的核心資產(chǎn)。 系統(tǒng)開(kāi)發(fā)可以使用大型的、由其他組織開(kāi)發(fā)的元素。以前的軟件范例總是將編程作為最根本的任務(wù),把編寫(xiě)了多少行代碼作為衡量項(xiàng)目進(jìn)展情況的依據(jù)。基于構(gòu)架的開(kāi)發(fā)則更強(qiáng)調(diào)對(duì)各元素的組合或裝配,而這些元素很可能已分別甚至是完全獨(dú)立地開(kāi)發(fā)實(shí)現(xiàn)了。由于構(gòu)架定義了可以集成到系統(tǒng)中的元素,因此,這種組合是可能的。構(gòu)架從元素與環(huán)境的交互、對(duì)控制的接收和釋放、所能使用或產(chǎn)生的數(shù)據(jù)、訪問(wèn)數(shù)據(jù)的方式、通信方式以及用于通信和資源共享的協(xié)議等方面對(duì)可能做的更換做了種種約定。 元素結(jié)構(gòu)、接口和操作概念的組織是構(gòu)架的一個(gè)重要方面。互換性是這種組織的最重要的原則。 商業(yè)組件、子系統(tǒng)、兼容的通信接口都是基于互換性原則的。 少就是多:限制選擇范圍是值得的。隨著所積累的構(gòu)架模式和設(shè)計(jì)模式越來(lái)越多,我們將會(huì)越來(lái)越清楚地認(rèn)識(shí)到:雖然計(jì)算機(jī)程序可以以近乎無(wú)限的方式來(lái)組合,但涉及到程序的協(xié)調(diào)和交互時(shí),有意識(shí)地限制在一定范圍內(nèi)選擇將使我們受益匪淺。也就是說(shuō),我們希望使所構(gòu)建系統(tǒng)的設(shè)計(jì)盡可能簡(jiǎn)單。這種方法的優(yōu)勢(shì)包括:重用程度更高、更易于理解和交流的簡(jiǎn)單規(guī)范的設(shè)計(jì)、更為透徹的分析、更短的選擇時(shí)間、更強(qiáng)的可互操作性。 軟件設(shè)計(jì)的特性來(lái)自于構(gòu)架模式的選擇。那些更適用于某個(gè)特定問(wèn)題的構(gòu)架模式將改善設(shè)計(jì)方案的實(shí)現(xiàn),這可能通過(guò)更輕松地在相沖突的設(shè)計(jì)要求之間進(jìn)行權(quán)衡、提高對(duì)設(shè)計(jì)環(huán)境的人認(rèn)識(shí)和/或使需求描述中的不一致性更為突出等方式體現(xiàn)出來(lái)。 系統(tǒng)構(gòu)架與軟件構(gòu)架。在過(guò)去的5到10年中,我們?cè)诤芏鄨?chǎng)合對(duì)軟件構(gòu)架進(jìn)行了討論。每次總會(huì)有人提出如下問(wèn)題:為什么談?wù)撥浖?gòu)架?系統(tǒng)構(gòu)架是否同軟件構(gòu)架一樣重要?或者說(shuō)軟件構(gòu)架和系統(tǒng)構(gòu)架之間的區(qū)別是什么? 在創(chuàng)建軟件構(gòu)架時(shí),通常很少考慮系統(tǒng)。 如果您想讓構(gòu)架具有很高的性能,就需要了解該系統(tǒng)將運(yùn)行的硬件平臺(tái)的物理特性以及該系統(tǒng)將與之交互的任何設(shè)備的特性,您通常還會(huì)關(guān)注網(wǎng)絡(luò)的特性。如果您需要構(gòu)架具有很高的可靠性,也需要關(guān)注硬件,在這種情況下就是關(guān)心其故障率和冗余處理或網(wǎng)絡(luò)設(shè)備的可用性。如此等等,不一而足。設(shè)計(jì)師很少考慮硬件。 因此,設(shè)計(jì)軟件構(gòu)架時(shí),大概需要考慮整個(gè)系統(tǒng)--硬件和軟件,否則就是蠻干。當(dāng)僅規(guī)定了系統(tǒng)的一部分時(shí),任何一個(gè)工程師都不可能預(yù)測(cè)系統(tǒng)的特性。 但我們主要談?wù)摰娜匀皇擒浖?gòu)架而非系統(tǒng)構(gòu)架。這是為什么呢?因?yàn)榇蠖鄶?shù)設(shè)計(jì)師在軟件方面都可以做出選擇,而在硬件方面則沒(méi)有這種自由。 構(gòu)架使基于模板的開(kāi)發(fā)成為可能。構(gòu)架體現(xiàn)了關(guān)于元素交互方式的設(shè)計(jì)決策。這些決策雖然是每個(gè)元素的實(shí)現(xiàn)中體現(xiàn)出來(lái)的,但卻能夠局部化,只需編寫(xiě)一次即可。可以在某處用模板將元素間的交互機(jī)制描述清楚。 構(gòu)架可以做為培訓(xùn)的基礎(chǔ)。 在對(duì)項(xiàng)目新成員介紹所開(kāi)發(fā)的系統(tǒng)時(shí)間,可以首先介紹系統(tǒng)的結(jié)構(gòu),以及對(duì)組件之間如何交互從而實(shí)現(xiàn)系統(tǒng)需求的高層次的描述。我們?cè)?jīng)指出,軟件構(gòu)架的重要用途之一就是支持并促進(jìn)各涉眾之間的交流,這進(jìn)一步印證了我們的觀點(diǎn)。構(gòu)架是一個(gè)公共的參考點(diǎn)。