《架构之美》摘录一
架構(gòu)之美
譯者:王海鵬
第一章 架構(gòu)概述
1.1 簡介
(1).架構(gòu):“建造的藝術(shù)或科學(xué);特別是設(shè)計(jì)和建造人類使用的建筑時的藝術(shù)或?qū)嵺`,同時考慮到美學(xué)因素和實(shí)用因素。”
(2).我們談到交響樂的“構(gòu)架”,反過來,又將架構(gòu)稱為“凝固的音樂”。
(3).當(dāng)代的架構(gòu)師可以會說,待構(gòu)建的對象或系統(tǒng)必須具有以下特征:
<1>.具備客戶要求的功能;
<2>.能夠在要求的工期內(nèi)安全地構(gòu)建;
<3>.性能足夠好;
<4>.可靠的;
<5>.可用的,并且使用時不會造成傷害;
<6>.安全的;
<7>.成本是可以接受的;
<8>.符合法規(guī)標(biāo)準(zhǔn);
<9>.將超越前人及其競爭者。
1.1.1 建筑師的角色
音樂作曲與軟件架構(gòu)
雖然人們常用建筑架構(gòu)設(shè)計(jì)來類比軟件架構(gòu),但音樂作曲可能是更好的類比。建筑師創(chuàng)建的是相對靜止的結(jié)構(gòu)(該架構(gòu)必須考慮到人員和服務(wù)在建筑內(nèi)的移動,以及承重結(jié)構(gòu))的靜態(tài)描述(藍(lán)圖或其他圖紙)。
在音樂作曲和軟件設(shè)計(jì)中,作曲家(軟件架構(gòu)師)創(chuàng)建一段音樂的靜態(tài)描述(架構(gòu)描述和代碼),這段音樂以后將演奏(執(zhí)行)許多次。在音樂和軟件中,設(shè)計(jì)都依靠許多組件的交互來得到期望的效果,結(jié)構(gòu)依賴于演奏者、演奏環(huán)境,以及演奏者所做的詮釋。
1.1.2 軟件架構(gòu)師的角色
軟件架構(gòu)師的職責(zé):
<1>.建筑師可以回顧幾千年的歷史,看看過去的建筑師都做過些什么,他們可以參觀并研究那些矗立了幾百年的建筑,有時甚至有上千年歷史的建筑,而它們?nèi)栽谑褂谩T谲浖I(yè),我們只有幾十年的歷史,并且我們的設(shè)計(jì)常常是不公開的。
此外,建筑師擁有并利用標(biāo)準(zhǔn)來描述他們制作的圖紙和規(guī)格說明,這讓現(xiàn)在的建筑師能夠從記錄下來的架構(gòu)歷史中受益。
<2>.建筑是有形的產(chǎn)品,在建筑師制作的規(guī)劃和工人修造的建筑之間存在著明顯的區(qū)別。
1.1.3 軟件架構(gòu)的含義
一個程序或計(jì)算系統(tǒng)的軟件架構(gòu)是系統(tǒng)的一種結(jié)構(gòu)或一組結(jié)構(gòu),它包含軟件元素,這些元素的外部可見的屬性,以及元素之間的關(guān)系。“外部可見”的屬性是其他元素對該元素可以做出的假定,諸如它提供的服務(wù)、執(zhí)行時的特征、錯誤處理、共享資源的使用等。
1.1.4 架構(gòu)與設(shè)計(jì)
架構(gòu)是系統(tǒng)設(shè)計(jì)的一部分,它突出了某些細(xì)節(jié),并通過抽象省略掉另一些細(xì)節(jié)。所以架構(gòu)是設(shè)計(jì)的一個子集。關(guān)注實(shí)現(xiàn)系統(tǒng)組件的開發(fā)者可能不會特別關(guān)心所有組件如何裝配在一起,而是主要關(guān)注少數(shù)組件的設(shè)計(jì)和開發(fā),包括他們必須遵守的架構(gòu)約束和可以應(yīng)用的規(guī)則。因此,開發(fā)者和架構(gòu)師面對的是系統(tǒng)設(shè)計(jì)的不同方面。
1.2 創(chuàng)建軟件架構(gòu)
(1).軟件架構(gòu)師的首要關(guān)注點(diǎn)不是系統(tǒng)的功能。
(2).一個“基于WEB的應(yīng)用”,你首先問頁面布局和導(dǎo)航樹,還是問下面這些問題:
<1>.誰提供應(yīng)該主機(jī)托管?托管的環(huán)境有什么技術(shù)限制嗎?
<2>.你想運(yùn)行在Windows服務(wù)器上還是在LAMP棧上?
<3>.你想支持多少并發(fā)用戶?
<4>.應(yīng)用需要怎樣的安全性?有需要保護(hù)的數(shù)據(jù)嗎?應(yīng)用將運(yùn)行在公網(wǎng)上還是私有的內(nèi)部網(wǎng)上?
<5>.你能為這些答案排列優(yōu)先級嗎?例如,用戶數(shù)是否比響應(yīng)時間更重要? 根據(jù)我們對這些問題和一些其他問題的回答,你就可以畫出系統(tǒng)架構(gòu)的草圖。
(3).品質(zhì)關(guān)注點(diǎn)指明了功能必須以何種方式交付,才能被系統(tǒng)的利益相關(guān)人所接受,系統(tǒng)的結(jié)果包含這些人的既定利益。
成功架構(gòu)師的兩項(xiàng)關(guān)鍵實(shí)踐:讓利益相關(guān)人參與以及同時關(guān)注功能和品質(zhì)。作為一名架構(gòu)師,你首先問我們想從系統(tǒng)中得到什么,有怎樣的優(yōu)先級。在實(shí)際項(xiàng)目中,你會找出其他的利益相關(guān)人。典型的利益相關(guān)人和他們的關(guān)注點(diǎn)包括:
<1>.投資人,他們想知道項(xiàng)目是否能夠在給定的資源和進(jìn)度約束下完成。
<2>.架構(gòu)師、開發(fā)人員和測試人員,他們首先考慮的是最初的構(gòu)建和以后的維護(hù)與演進(jìn)。
<3>.項(xiàng)目經(jīng)理,他們需要組織團(tuán)隊(duì),制定迭代計(jì)劃。
<4>.市場人員,他們想通過品質(zhì)特點(diǎn)實(shí)現(xiàn)與競爭者的差異化。
<5>.企業(yè)用戶,包括最終用戶、系統(tǒng)管理員,以及安裝、部署、準(zhǔn)備、配置人員。
<6>.技術(shù)支出人員,他們關(guān)注幫助平臺電話呼入的數(shù)目和復(fù)雜性。 每個系統(tǒng)都有自己的品質(zhì)關(guān)注點(diǎn)。有些關(guān)注點(diǎn)可能定義得很好,如性能、安全、可伸縮性等。但是,另一些同樣主要的關(guān)注點(diǎn)卻可能沒有詳細(xì)規(guī)定,如可變性、可維護(hù)性和可用性等。
(4).架構(gòu)師的第一項(xiàng)任務(wù),就是與利益相關(guān)人協(xié)作,理解這些品質(zhì)關(guān)注點(diǎn)和約束,并為他們排列優(yōu)先級。為什么不從功能需求開始?因?yàn)橥ǔS性S多種可能的系統(tǒng)分解方式。架構(gòu)師通常必須進(jìn)行架構(gòu)層面的系統(tǒng)重構(gòu)。
(5).架構(gòu)團(tuán)隊(duì)的挑戰(zhàn)在于,在創(chuàng)建架構(gòu)時保持同一種思考方式和同一種哲學(xué)。讓團(tuán)隊(duì)保持盡可能小,讓他們在充分溝通、高度協(xié)作的環(huán)境工作,讓一兩個“首席架構(gòu)師”擔(dān)任仁慈的獨(dú)裁者,最終做出所有決定。這種架構(gòu)模式常見于成功的團(tuán)隊(duì),不論是公司開發(fā)還是開源開發(fā),由此得到的概念完整性是美麗架構(gòu)的一種特性。
(6).每個關(guān)注點(diǎn)都以問題的方式表述,架構(gòu)師在項(xiàng)目過程中可能需要考慮它。當(dāng)然,具體系統(tǒng)會有其他關(guān)鍵的關(guān)注點(diǎn):
<1>.功能性(Functionality) 產(chǎn)品向它的用戶提供哪些功能?
<2>.可變性(Changeability) 軟件將來可能需要哪些變化?哪些變化不可能發(fā)生,不需要特別容易進(jìn)行這些改變?
<3>.性能(Performance) 產(chǎn)品將達(dá)到怎樣的性能?
<4>.容量(Capacity) 多少用戶將并發(fā)使用該系統(tǒng)?該系統(tǒng)將為用戶保存多少數(shù)據(jù)?
<5>.生態(tài)系統(tǒng)(Ecosystem) 在部署的生態(tài)環(huán)境中,該系統(tǒng)將與其他系統(tǒng)進(jìn)行那些交互?
<6>.模塊化(Modularity) 如何將編寫軟件的任務(wù)分解為工作指派(模塊),特別是這些模塊可以獨(dú)立的開發(fā),并能夠準(zhǔn)確而容易的滿足彼此的需要?
<7>.可構(gòu)建性(Buildability) 如何將軟件構(gòu)建為一組組件,并能夠獨(dú)立實(shí)現(xiàn)和驗(yàn)證這些組件?那些組件應(yīng)該復(fù)用其他的產(chǎn)品,那些應(yīng)該從外部供應(yīng)商處得到?
<8>.產(chǎn)品化(Producibility) 如果產(chǎn)品將以幾種變體的形式存在,如何開發(fā)一個產(chǎn)品線,并利用這些變體的共性?產(chǎn)品線中的產(chǎn)品以怎樣懂得步驟開發(fā)?在創(chuàng)建一條軟件產(chǎn)品線時,要進(jìn)行哪些投資?開發(fā)產(chǎn)品線中不同變體的選擇,預(yù)期會得到怎樣的回報?特別是,是否可能先開發(fā)最小的有用產(chǎn)品,然后再添加(擴(kuò)展)組件,在不改變以前編寫的代碼的情況下,開發(fā)產(chǎn)品線的其他成員?
<9>.安全性(Security) 產(chǎn)品是否需要用戶認(rèn)證,或者必須限制對數(shù)據(jù)的訪問?數(shù)據(jù)的安全性如何得到保證?如何抵擋“拒絕服務(wù)”攻擊或其他攻擊?
最后,一個好的架構(gòu)師會認(rèn)識到,架構(gòu)會影響組織機(jī)構(gòu)。
1.3 架構(gòu)結(jié)構(gòu)
一個好的架構(gòu)師如何處理這些關(guān)注點(diǎn)?我們曾經(jīng)提到過,需要將系統(tǒng)組織成一些結(jié)構(gòu),每種結(jié)構(gòu)都定義了特定類型的組件之間的具體關(guān)系。架構(gòu)師的主要關(guān)注點(diǎn)就是對系統(tǒng)進(jìn)行組織,讓每種結(jié)構(gòu)有助于解答一個關(guān)注點(diǎn)所定義的問題。關(guān)鍵的結(jié)構(gòu)決定將產(chǎn)品劃分為組件,并定義了這些組件之間的關(guān)系。
1.3.1 信息隱藏結(jié)構(gòu)
<1>.組件與關(guān)系:主要組件是一些“信息隱藏模塊”,每個模塊都是針對一組開發(fā)人員的工作指派,每個模塊都包含了一種設(shè)計(jì)決定。如果一項(xiàng)決定可以改變,同時又不影響任何其他模塊,我們就說這項(xiàng)設(shè)計(jì)就是一個模塊的秘密。模塊間最基本的關(guān)系是“整體-部分”關(guān)系。
<2>.“整體-部分”結(jié)構(gòu)是層次狀的。在這個層次結(jié)構(gòu)的葉節(jié)點(diǎn)上的模塊不包含可識別的子模塊。“包含”結(jié)構(gòu)也是層次狀的,因?yàn)槊總€程序都只包含在一個模塊之中。“依賴”關(guān)系不一定是層次狀的,因?yàn)閮蓚€模塊可能互相依賴,要么是這屆互相依賴,要么是通過一個較長的“依賴”關(guān)系形成的環(huán)。請注意“依賴”不應(yīng)該與后面小節(jié)中定義的“使用”混淆。
<3>.信息隱藏結(jié)構(gòu)是面向?qū)ο笤O(shè)計(jì)方法的基礎(chǔ)。如果一個信息隱藏模塊設(shè)計(jì)為一個類,這個類的公有方法就屬于該模塊的接口。 滿足的關(guān)注點(diǎn):信息隱藏結(jié)構(gòu)的設(shè)計(jì)應(yīng)該能滿足可變性、模塊化和可構(gòu)建性的要求。
1.3.2 使用結(jié)構(gòu)
<1>.組件與關(guān)系:信息隱藏模塊包含一個或多個程序。當(dāng)且僅當(dāng)兩個程序共享一個秘密時,它們才屬于同一個模塊。“使用結(jié)構(gòu)”的組件是一些可以單獨(dú)調(diào)用的程序。只有在相同綁定時間操作的程序之間,我們才考慮形成一種使用結(jié)構(gòu)。首先只考慮運(yùn)行時操作的程序可能最容易。以后,我們也可以考慮那些編譯時或載入時操作的程序之間的使用關(guān)系。
<2>.通常大型的軟件系統(tǒng)包含太多的程序,這讓程序間使用關(guān)系的描述不容易理解。在這種情況下,使用關(guān)系可以用于程序的組合,如模塊、類或包。這樣的組合描述喪失了重要的信息,但有助于展示“全局”。
<3>.在某些項(xiàng)目中,系統(tǒng)的使用關(guān)系開始并沒有完全確定,要到系統(tǒng)實(shí)現(xiàn)時才能確定,因?yàn)殚_發(fā)者會在實(shí)現(xiàn)過程中決定他們使用哪些程序。但是系統(tǒng)的架構(gòu)師可能在設(shè)計(jì)時創(chuàng)建一種“允許使用”關(guān)系,約束開發(fā)者的選擇。定義良好的使用結(jié)構(gòu)將創(chuàng)建系統(tǒng)的適當(dāng)子集,可以用于驅(qū)動迭代式或增量式的開發(fā)模式。 滿足的關(guān)注點(diǎn):產(chǎn)品化和生態(tài)系統(tǒng)。
1.3.3 進(jìn)程結(jié)構(gòu)
(1).組件與關(guān)系:信息隱藏模塊結(jié)構(gòu)和使用結(jié)構(gòu)是靜態(tài)的結(jié)構(gòu),存在于設(shè)計(jì)時和編碼時。現(xiàn)在轉(zhuǎn)向運(yùn)行時結(jié)構(gòu),參與進(jìn)行結(jié)構(gòu)的組件是進(jìn)程。進(jìn)程是運(yùn)行時的事件序列,由程序控制。每個程序都作為一個或多個進(jìn)行的一部分執(zhí)行。一個事件序列的執(zhí)行獨(dú)立于另一個進(jìn)程中的事件序列,除非這兩個進(jìn)程彼此同步。
(2).進(jìn)程是幾種不同關(guān)系中的組件:
<1>.進(jìn)程提供工作 一個進(jìn)程可能會創(chuàng)建工作,該項(xiàng)工作必須由其他進(jìn)程完成,這種結(jié)構(gòu)在確定系統(tǒng)是否死鎖時是很重要的。
<2>.進(jìn)程取得資源 在動態(tài)分配資源的系統(tǒng)中,一個進(jìn)程可能控制由另一個進(jìn)程使用的資源,后者必須請求并歸還這些資源。
<3>.進(jìn)程共享資源 兩個進(jìn)程可能共享資源,如打印機(jī)、內(nèi)存或端口等。如果兩個進(jìn)程共享一項(xiàng)資源,就需要通過同步來防止使用沖突。每一種資源可能有不同的關(guān)系。
<4>.進(jìn)程包含在模塊中 每個進(jìn)程由一個程序控制,正如前面提到的,每個程序包含在一個模塊中。
因此,我們可以認(rèn)為進(jìn)程包含在模塊之中。 滿足的關(guān)注點(diǎn):性能和容量。
1.3.4 訪問結(jié)構(gòu)
系統(tǒng)中的數(shù)據(jù)可能劃分成具有屬性的段,如果程序?qū)Χ沃械娜魏螖?shù)據(jù)擁有訪問權(quán),就對該段中的所有數(shù)據(jù)有了訪問權(quán)。請注意,為了簡化描述,我們應(yīng)該讓段的規(guī)模最大化,具體做法是添加一個條件,即如果兩個段被同一組程序訪問,這兩個段就應(yīng)該合并。 數(shù)據(jù)訪問結(jié)構(gòu)包含兩種類型的組件:程序和段。
這種關(guān)系被命名“有權(quán)訪問”,它是程序和數(shù)據(jù)段之間的關(guān)系。如果這種結(jié)構(gòu)讓程序訪問的權(quán)限最小,并且嚴(yán)格執(zhí)行,我們就認(rèn)為系統(tǒng)更安全。
滿足的關(guān)注點(diǎn):安全性。
1.4 好的架構(gòu)
(1).我們曾提到,架構(gòu)師玩的是折中的游戲。對于一組給定的功能需求和品質(zhì)需求,沒有唯一的正確架構(gòu)和唯一的“正確答案”。我們從經(jīng)驗(yàn)中得知,應(yīng)該對架構(gòu)進(jìn)行評估,確定它是否滿足其需求,然后再投入資金來構(gòu)建、測試和部署這個系統(tǒng)。
(2).架構(gòu)評估的兩種方式。
<1>.第一種評估方式是確定架構(gòu)的屬性,通常通過建模或模擬系統(tǒng)的一個或多個方面。如性能建模來評估吞吐量和伸縮性,通過失效樹模型來評估可靠性和可訪問性。其他類型的模型包括復(fù)雜性和耦合指標(biāo),用于評估可變性和可維護(hù)性。
<2>.第二種評估方式,也是最廣泛使用的方式,就是通過對架構(gòu)師提出質(zhì)詢來評估該架構(gòu)。有許多結(jié)構(gòu)化的質(zhì)詢方法。如:軟件架構(gòu)復(fù)查委員會(Software Architecture Review Board,SARB)
(3).質(zhì)詢方法
<1>.質(zhì)詢方法的另一種變體是架構(gòu)折中分析方法(Architecture Trade-off Analysis Method,ATAM),它尋找架構(gòu)不能滿足品質(zhì)關(guān)注點(diǎn)的風(fēng)險。ATAM使用了場景分析,每種場景都描述了特定的利益相關(guān)人對系統(tǒng)的品質(zhì)關(guān)注點(diǎn)。架構(gòu)師然后解釋該架構(gòu)如何支持每一種場景。
<2>.主動復(fù)審是另一種質(zhì)詢方法,它改變了復(fù)審過程的開始方式,要求架構(gòu)師向復(fù)審者提供架構(gòu)師認(rèn)為重要而需要回答的問題。然后,復(fù)查者利用已有的架構(gòu)文檔和描述來回答這些問題。(可以試試查找“Software Architecture Review Checklist(軟件架構(gòu)復(fù)審檢查清單)”)。
1.5 美麗的架構(gòu)
(1).所有前面的方法都有助于我們判斷一個架構(gòu)是否“足夠好”---也就是說,是否有可能知道開發(fā)者和測試者構(gòu)建一個系統(tǒng),并滿足系統(tǒng)的利益相關(guān)人的功能和質(zhì)量關(guān)注點(diǎn)。“軟件架構(gòu)名人堂”進(jìn)行“軟件產(chǎn)品線名人堂”的條件包括獲得商業(yè)上的成功、影響其他產(chǎn)品線的架構(gòu)(其他產(chǎn)品線可能“借用、復(fù)制、竊取”這個架構(gòu))、擁有足夠的文檔從而讓其他人“不必通過道聽途說”就能夠理解該架構(gòu)。
(2).“架構(gòu)名人堂”或“美麗架構(gòu)藝術(shù)館”
<1>.架構(gòu)的實(shí)用性。好的架構(gòu)應(yīng)該每天被許多人使用。
<2>.架構(gòu)的可構(gòu)建性。具有定義良好的使用結(jié)構(gòu)的架構(gòu),支持增量式構(gòu)建,構(gòu)建的過程是透明的、可見的。
<3>.架構(gòu)的持久性。好的架構(gòu)要經(jīng)得起時間考驗(yàn),可以預(yù)期到變更的需要,允許期望的修改能夠容易而有效的進(jìn)行。
<4>.架構(gòu)的客戶滿意度。好的架構(gòu)要讓開發(fā)人員、測試人員、使用該軟件的客戶由衷的高興。
<5>.架構(gòu)的概念完整性。架構(gòu)概念完整性是一項(xiàng)跨越所有領(lǐng)域的特征,一致的架構(gòu)學(xué)習(xí)起來更容易、更快,代碼更干凈,測試集更小。
?
總結(jié)
- 上一篇: Visual Studio 2008 可
- 下一篇: Eclipse-配置workspace路