不論是開(kāi)發(fā)人員還是架構(gòu)師,我們都一直在跟軟件系統(tǒng)打交道,架構(gòu)是在工作中出現(xiàn)最頻繁的術(shù)語(yǔ)之一。那么,到底什么是架構(gòu)?你可能有自己的答案,也有可能沒(méi)有答案。對(duì)“架構(gòu)”的理解需要我們不斷在實(shí)踐中思考、歸納、演繹,形成自己的認(rèn)知。
1 到底什么是軟件架構(gòu) ?
定義 ”架構(gòu)是什么“ 是件非常困難的事情,不同的組織對(duì)于軟件架構(gòu)有不同的定義,每個(gè)人心中也有自身對(duì)于系統(tǒng)架構(gòu)定義的認(rèn)知。就好比我們無(wú)法百分之百表述模型而只能產(chǎn)出模型不同維度的視圖,對(duì)架構(gòu)進(jìn)行完備的定義是不可能的。
“道可道,非常道。名可名,非常名”,道是如此,架構(gòu)亦是如此。
行業(yè)內(nèi)不同的組織和個(gè)人從不同的視角對(duì) “什么是架構(gòu)” 進(jìn)行了定義或闡述。
IEEE 關(guān)于架構(gòu)的定義
將系統(tǒng)架構(gòu)定義為:架構(gòu)是系統(tǒng)組織結(jié)構(gòu) + 組件及聯(lián)系(組件間以及組件和環(huán)境之間) + 原則的組合。通過(guò)圖形化的形式表述該架構(gòu)定義如下圖所示,這是一個(gè)非常簡(jiǎn)潔、概念清晰的定義,其言簡(jiǎn)意賅的表達(dá)了架構(gòu)的幾個(gè)核心要素:
系統(tǒng)的組織:表達(dá)系統(tǒng)的宏觀結(jié)構(gòu)
組件及聯(lián)系:組件化的思維,同時(shí)突出了環(huán)境要素。組件表達(dá)了系統(tǒng)的模塊化,組件相互之間及組件與環(huán)境之間的關(guān)聯(lián)表達(dá)元素間的相互作用。
原則:用于指導(dǎo)設(shè)計(jì)和系統(tǒng)演進(jìn)的原則
大師 Martin Fowler和Ralph Johnson對(duì)于架構(gòu)的定義有著類(lèi)似的、更加簡(jiǎn)潔和抽象,Martin Fowler 認(rèn)為軟件架構(gòu)是:重要并且難以改變的決策。架構(gòu)設(shè)計(jì)是關(guān)于權(quán)衡的藝術(shù),架構(gòu)設(shè)計(jì)過(guò)程中充滿了各種各樣的決策,這些決策也終將反應(yīng)系統(tǒng)架構(gòu)。
以上的定義從高層抽象視角對(duì)什么是架構(gòu)給予了自己的回答,相比之下,Neil Ford 在《軟件架構(gòu)基礎(chǔ)》一書(shū)中對(duì)架構(gòu)給出了更具象的闡述,其從架構(gòu)組成元素入手,從更偏向?qū)嵺`的角度對(duì)架構(gòu)進(jìn)行了闡述。核心思想是軟件系統(tǒng)的架構(gòu)包括以下組合元素:
結(jié)構(gòu):應(yīng)用系統(tǒng)所選擇的架構(gòu)風(fēng)格,比如微服務(wù)架構(gòu)、單體架構(gòu)還是SOA等
架構(gòu)屬性:系統(tǒng)的非功能性屬性,比如性能、可用性、可維護(hù)性等
架構(gòu)決策:系統(tǒng)設(shè)計(jì)過(guò)程中重要的架構(gòu)決策
設(shè)計(jì)原則:設(shè)計(jì)過(guò)程中的指導(dǎo)性原則
結(jié)構(gòu)
結(jié)構(gòu)是系統(tǒng)架構(gòu)的重要組成部分,其從宏觀上表述了系統(tǒng)的結(jié)構(gòu)組成。架構(gòu)設(shè)計(jì)的核心任務(wù)之一是為系統(tǒng)選擇合適的架構(gòu)風(fēng)格。比如,架構(gòu)師基于上下文的權(quán)衡,可以選擇模塊化單體架構(gòu)風(fēng)格,也可以選擇微服務(wù)架構(gòu)風(fēng)格。
架構(gòu)屬性
架構(gòu)屬性亦稱(chēng)質(zhì)量屬性,或非功能屬性,通常表示系統(tǒng)需要具備或滿足的某種 “能力”,比如高性能、可擴(kuò)展性、彈性、伸縮性、容錯(cuò)性、可測(cè)試性、可維護(hù)性等等。架構(gòu)設(shè)計(jì)的目標(biāo)需要關(guān)注系統(tǒng)需要滿足的架構(gòu)屬性,架構(gòu)最終要體現(xiàn)對(duì)架構(gòu)屬性支持的相關(guān)架構(gòu)決策。
架構(gòu)屬性眾多,系統(tǒng)需要關(guān)注的是這些架構(gòu)屬性的子集,具體的某次特定的架構(gòu)設(shè)計(jì)所需要關(guān)注的架構(gòu)屬性需要依據(jù)問(wèn)題域的上下文而具體分析。同時(shí),不同的架構(gòu)屬性間可能存在沖突,這種情況同樣需要架構(gòu)師的權(quán)衡和決策。
架構(gòu)決策
架構(gòu)決策是系統(tǒng)架構(gòu)設(shè)計(jì)過(guò)程中對(duì)解決方案的選擇,其描述了系統(tǒng)必須遵循的規(guī)則。架構(gòu)決策隨著權(quán)衡分析而自然存在,其是系統(tǒng)架構(gòu)設(shè)計(jì)的重要維度之一。
并不是所有的決策都是架構(gòu)決策,架構(gòu)決策應(yīng)該關(guān)注對(duì)系統(tǒng)有重要影響的部分。比如對(duì)架構(gòu)風(fēng)格的選擇對(duì)系統(tǒng)存在重要影響,其改變的成本較高,理當(dāng)屬于架構(gòu)決策的范疇。比較典型架構(gòu)決策包括但不限于:
直接影響高優(yōu)先級(jí)的架構(gòu)屬性
修改對(duì)外接口:對(duì)外提供的接口修改往往需要進(jìn)行充分影響分析
引入或者移除依賴(lài):依賴(lài)的加入和移除往往標(biāo)示著組件能力的引進(jìn)和廢棄
改變系統(tǒng)的通用結(jié)構(gòu):工程結(jié)構(gòu)是應(yīng)用架構(gòu)的重要維度之一
迫使研發(fā)人員改變開(kāi)發(fā)方式
接受戰(zhàn)略性技術(shù)債:重構(gòu)影響較大的技術(shù)債往往對(duì)現(xiàn)有系統(tǒng)會(huì)有較大影響
注:架構(gòu)決策建議以輕量級(jí)的文檔化形式進(jìn)行記錄,參考文章 《輕量級(jí)的架構(gòu)決策記錄機(jī)制》一文
設(shè)計(jì)原則
設(shè)計(jì)原則與架構(gòu)決策不同,其本質(zhì)區(qū)別是:設(shè)計(jì)原則是一種指導(dǎo),而非強(qiáng)制的規(guī)則。架構(gòu)決策需要遵守,設(shè)計(jì)原則提供參考性指引。
比如,設(shè)計(jì)原則可能是:在可能的情況下,跨系統(tǒng)間的通信盡可能使用異步消息機(jī)制以提高性能和降低耦合。
2 架構(gòu)設(shè)計(jì)的邊界
如果你是團(tuán)隊(duì)的架構(gòu)師,你是否有以下困惑:
系統(tǒng)的架構(gòu)應(yīng)該設(shè)計(jì)到什么粒度?
架構(gòu)設(shè)計(jì)是否要足夠詳細(xì)以便能直接指導(dǎo)開(kāi)發(fā)人員開(kāi)展編碼工作?
如果你是團(tuán)隊(duì)的核心開(kāi)發(fā)人員,你是否 “抱怨” 過(guò):
"架構(gòu)設(shè)計(jì)" 太過(guò)詳細(xì),涵蓋了實(shí)現(xiàn)的 “細(xì)枝末節(jié)”,自己除了CRUD沒(méi)有發(fā)揮的空間
"架構(gòu)設(shè)計(jì)" 太過(guò)宏觀,基于設(shè)計(jì)方案根本無(wú)法指導(dǎo)開(kāi)發(fā),自己還得重新設(shè)計(jì)
很多架構(gòu)師自身對(duì)架構(gòu)和設(shè)計(jì)的邊界缺乏深入認(rèn)知,相比于對(duì)架構(gòu)邊界的縮小,更多時(shí)候會(huì)出現(xiàn)架構(gòu)設(shè)計(jì)邊界放大的情況:
架構(gòu)師把架構(gòu)設(shè)計(jì)當(dāng)作詳細(xì)的技術(shù)方案設(shè)計(jì),牢牢把控系統(tǒng)實(shí)現(xiàn)的所有細(xì)節(jié),產(chǎn)出大量的設(shè)計(jì)文檔,然后交由核心開(kāi)發(fā)人員做代碼實(shí)現(xiàn)的執(zhí)行工作。
這種現(xiàn)象會(huì)導(dǎo)致如下問(wèn)題:
壓縮了團(tuán)隊(duì)核心開(kāi)發(fā)人員的設(shè)計(jì)發(fā)揮空間,不利于其技術(shù)水平及認(rèn)知的提升
作為架構(gòu)師你真的能講所有的細(xì)節(jié)都Cover住嗎?即使耗費(fèi)巨大精力完成了 “完備” 的設(shè)計(jì),來(lái)自一線開(kāi)發(fā)所面臨的各種場(chǎng)景是否能夠提前預(yù)知和捕獲?
如果需求迭代持續(xù)如此,作為核心開(kāi)發(fā)人員多半會(huì)有所 “怨言”
作為團(tuán)隊(duì)的架構(gòu)師精力有限,持續(xù)的細(xì)節(jié)輸出會(huì)耗費(fèi)巨大精力,而無(wú)法關(guān)注更加宏觀的層面
.......
以上問(wèn)題的根源是什么?不能明確架構(gòu)設(shè)計(jì)的邊界!
架構(gòu)設(shè)計(jì)與設(shè)計(jì)(實(shí)現(xiàn)相關(guān))的邊界或粒度問(wèn)題
團(tuán)隊(duì)架構(gòu)師與開(kāi)發(fā)人員間的職責(zé)邊界
判斷架構(gòu)邊界的前提之一是:明確架構(gòu)和設(shè)計(jì)的關(guān)系!
所有的架構(gòu)都是設(shè)計(jì),但設(shè)計(jì)不一定是架構(gòu)!
從架構(gòu)的定義看架構(gòu)設(shè)計(jì)的邊界,選取兩個(gè)視角:
架構(gòu)是系統(tǒng)中重要的東西!無(wú)論它是什么(之所以重要,是因?yàn)楦淖兊某杀靖撸?/p>
架構(gòu)設(shè)計(jì)涵蓋系統(tǒng)中重要的架構(gòu)決策
所以,架構(gòu)設(shè)計(jì)應(yīng)該涵蓋系統(tǒng)中重要的東西,這些 “重要的東西” 可能是:
應(yīng)用架構(gòu)風(fēng)格的選擇
子系統(tǒng)間信息通信的方式
工程采取的分層以及層間約束
工程應(yīng)該遵循的開(kāi)發(fā)規(guī)范
工程引入的三方類(lèi)庫(kù),或者三方框架
高優(yōu)先級(jí)的架構(gòu)屬性:比如某次需求建設(shè)非常關(guān)注系統(tǒng)的性能,或者擴(kuò)展性等架構(gòu)屬性
其它 "重要的東西"
架構(gòu)設(shè)計(jì)涵蓋了系統(tǒng)所需的重要的架構(gòu)決策,從宏觀層面對(duì)系統(tǒng)實(shí)現(xiàn)予以指引。而詳細(xì)的設(shè)計(jì)則為具體的開(kāi)發(fā)實(shí)現(xiàn)提供指導(dǎo),比如,詳細(xì)的E-R圖設(shè)計(jì)、具體的代碼級(jí)別的模式選擇、某個(gè)組件的具體實(shí)現(xiàn)等等。
架構(gòu)不是一成不變,需要持續(xù)演進(jìn),而實(shí)現(xiàn)相關(guān)的設(shè)計(jì)也可能在項(xiàng)目進(jìn)行中持續(xù)變化,因此,二者不能完全割裂,而是需要在實(shí)現(xiàn)過(guò)程中進(jìn)行雙向反饋:
架構(gòu)設(shè)計(jì)信息要高效的同步至開(kāi)發(fā)人員
實(shí)現(xiàn)過(guò)程中的變更同樣也要回向反饋至架構(gòu),以便對(duì)架構(gòu)設(shè)計(jì)進(jìn)行調(diào)整
在進(jìn)行架構(gòu)邊界判定時(shí)要注意一個(gè)至關(guān)重要的因子:上下文?。。∫陨系呐袛鄿?zhǔn)則必須要給定的上下文中才有價(jià)值。
比如:實(shí)現(xiàn)過(guò)程中大家經(jīng)常會(huì)適用一些設(shè)計(jì)模式,例如策略模式。那么,這種設(shè)計(jì)模式的選擇是屬于架構(gòu)設(shè)計(jì)還是詳細(xì)的實(shí)現(xiàn)設(shè)計(jì)?答案就是:It depends!!! 具體情況,具體分析。
如果當(dāng)前上下文,我們非常關(guān)注系統(tǒng)的擴(kuò)展性,該架構(gòu)屬性是我們高優(yōu)先級(jí)的架構(gòu)屬性,那么,核心模塊的策略模式的應(yīng)用可以看作是架構(gòu)設(shè)計(jì)的范疇。
而如果上下文中擴(kuò)展性不是我們關(guān)注的高優(yōu)先級(jí)的架構(gòu)屬性,相比我們更關(guān)注性能,那么,這種代碼級(jí)的設(shè)計(jì)模式選擇應(yīng)該屬于架構(gòu)設(shè)計(jì)的范疇之外了,而需要?jiǎng)澐值綄?shí)現(xiàn)設(shè)計(jì)層面,交由核心開(kāi)發(fā)自主決定。
3 架構(gòu)模式(Patterns)與架構(gòu)風(fēng)格(Styles)
架構(gòu)模式和架構(gòu)風(fēng)格是極容易混淆的兩個(gè)概念,很多開(kāi)發(fā)人員將其理解為同一事物,而實(shí)際上二者有本質(zhì)區(qū)別。
架構(gòu)風(fēng)格是系統(tǒng)設(shè)計(jì)的頂層抽象,從宏觀視角表述我們的系統(tǒng)組成。更進(jìn)一步,架構(gòu)風(fēng)格聚焦于系統(tǒng)的分層、模塊以及交互形式。
架構(gòu)模式聚焦于對(duì)重復(fù)出現(xiàn)問(wèn)題提供解決方案
二者概念不同,并不存在沖突,其聯(lián)系如下圖所示:
架構(gòu)模式可以應(yīng)用于架構(gòu)風(fēng)格,在同一架構(gòu)風(fēng)格上下文內(nèi)可以應(yīng)用一或多中架構(gòu)模式
架構(gòu)風(fēng)格可以組合以產(chǎn)生新的架構(gòu)風(fēng)格
比較典型的例子是CQRS:CQRS本身是一種模式,將命令和查詢(xún)的職責(zé)在不同維度進(jìn)行分離。該模式我們可以在單體架構(gòu)風(fēng)格中使用,也可以在微服務(wù)架構(gòu)風(fēng)格中使用,當(dāng)然也可以在SOA架構(gòu)中使用。
4 為什么要做架構(gòu)設(shè)計(jì) ?
至于 “為什么要做架構(gòu)設(shè)計(jì)” 也是一個(gè)古老且頻繁出現(xiàn)的問(wèn)題,有太多的文章闡述為社么要架構(gòu)設(shè)計(jì):有的宏觀,有的具體,有的“務(wù)實(shí)”,有的“務(wù)虛”。
我把這個(gè)問(wèn)題作為一個(gè)獨(dú)立章節(jié)闡述,并不是想進(jìn)行大篇幅的論述,只是想突出它的重要性,這個(gè)問(wèn)題值得耗費(fèi)一些精力去深入理解其背后的原因。但,在此不做展開(kāi)過(guò)多說(shuō)明,通過(guò)一句話來(lái)進(jìn)行概括:
之所以要進(jìn)行架構(gòu)設(shè)計(jì),是因?yàn)椋?strong>重要 !
做,收益高
不做,成本高
5 開(kāi)發(fā)人員和架構(gòu)師的知識(shí)模型
作為開(kāi)發(fā)人員,更加關(guān)注知識(shí)的深度,以便有足夠的知識(shí)儲(chǔ)備滿足工作需要。開(kāi)發(fā)人員在職業(yè)生涯的早期,應(yīng)該關(guān)注于自身知識(shí)儲(chǔ)備的增長(zhǎng),并保持技術(shù)深度。
作為架構(gòu)師,之所以技術(shù)的廣度比深度更重要,是因?yàn)榧軜?gòu)師的重要職責(zé)之一是進(jìn)行架構(gòu)決策。
系統(tǒng)架構(gòu)設(shè)計(jì)是關(guān)于權(quán)衡的藝術(shù),在特定的問(wèn)題域上下文下,架構(gòu)師需要在諸多可行的解決方案間進(jìn)行權(quán)衡和決策,這也對(duì)其技術(shù)廣度提出了要求。
開(kāi)發(fā)人員成長(zhǎng)為架構(gòu)師,應(yīng)該更加關(guān)注知識(shí)的廣度,并在幾個(gè)特定領(lǐng)域深耕,以便有足夠的知識(shí)支撐架構(gòu)決策。
雖然開(kāi)發(fā)人員和架構(gòu)師在知識(shí)域的關(guān)注點(diǎn)上存在差異,但在認(rèn)知層面都可以統(tǒng)一到Bloom認(rèn)知層次模型。該模型將認(rèn)知層次劃分為逐步遞進(jìn)的六個(gè)層次:
識(shí)記:識(shí)別和回溯事實(shí)性知識(shí)
理解:理解事實(shí)的內(nèi)涵
應(yīng)用:將事實(shí)、規(guī)則、概念、思想加以應(yīng)用
分析:將信息分解、關(guān)聯(lián)、區(qū)分、實(shí)驗(yàn)、測(cè)試
評(píng)估:將信息或思想的價(jià)值進(jìn)行評(píng)價(jià)
創(chuàng)造:整合不同的信息形成新的知識(shí)體系
不論是架構(gòu)師還是開(kāi)發(fā)人員,Bloom認(rèn)知層次模型都適用。通過(guò)不斷的學(xué)習(xí)擴(kuò)展自身的知識(shí)體系,在識(shí)記、理解和應(yīng)用的同時(shí),要持續(xù)的培養(yǎng)分析、評(píng)估和創(chuàng)造的能力,逐步向高層次的認(rèn)知水平提升。
但需要注意的是:知識(shí)不等于認(rèn)知,避免陷入知識(shí)學(xué)習(xí)的陷阱。知識(shí)是無(wú)限的,沒(méi)有人能夠以無(wú)限的精力去學(xué)習(xí)無(wú)限的知識(shí)。不論是開(kāi)發(fā)人員還是架構(gòu)師,又或者其他角色,不應(yīng)該只將精力投入在知識(shí)邊界的擴(kuò)充,而應(yīng)該注重從知識(shí)到認(rèn)知提升的轉(zhuǎn)變。
格物以致知,對(duì)表象不斷的歸納、演繹直至事物的本象,探尋事物背后的規(guī)律,建立更高層的認(rèn)知。這種認(rèn)知層次由下及上的躍升有兩種方式:
悟:由內(nèi)向外,通過(guò)不斷積累、持續(xù)思考,由量變到質(zhì)變,直至 “開(kāi)悟”
破:自外向內(nèi),高層次或不同的思想輸入碰撞,加速認(rèn)知層次的突破
6 結(jié)語(yǔ)
對(duì)架構(gòu)定義的探討實(shí)際上是一種樸素的 “格物” 的過(guò)程,每個(gè)人都應(yīng)該尋找自己的答案。跳脫對(duì)架構(gòu)定義探討的視野,大家的工作和學(xué)習(xí)何嘗不是如此呢 ?!大道至簡(jiǎn),殊途同歸,格物致知,與君共勉!
審核編輯:劉清
-
軟件架構(gòu)
+關(guān)注
關(guān)注
0文章
64瀏覽量
10497
原文標(biāo)題:探尋軟件架構(gòu)的本質(zhì),到底什么是架構(gòu)?
文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
大家都在用軟件架構(gòu)
軟件架構(gòu)存在的意義
軟件架構(gòu)的作用與設(shè)計(jì)思路
CMSIS軟件架構(gòu)概述?
軟件架構(gòu)存在的意義是什么
架構(gòu)到底是指什么?
SWE.2的軟件架構(gòu)設(shè)計(jì)
STM32軟件架構(gòu)設(shè)計(jì)

軟件架構(gòu)存在的意義

評(píng)論