你有沒(méi)有聽過(guò)四維架構(gòu)搔扁?
在程序員界流傳著很多傳說(shuō)涂炎,這些傳說(shuō)由于歷史太過(guò)久遠(yuǎn)垫竞,漸漸被人們遺忘重贺,只剩下一些流行的名詞,比如架構(gòu)
,銀彈
针余,程序員三大愛好
,重構(gòu)
驱负,人月
,設(shè)計(jì)模式
等等宇挫。今天我們就來(lái)講講架構(gòu)橡疼,而且不是普通的架構(gòu)历帚,是一個(gè)可能你聽都沒(méi)聽說(shuō)過(guò)的四維架構(gòu)。
架構(gòu)是什么
行業(yè)里并沒(méi)有一個(gè)明確標(biāo)準(zhǔn)的關(guān)于架構(gòu)的定義,有些人按照系統(tǒng)的組成結(jié)構(gòu)來(lái)定義架構(gòu),有些人根據(jù)系統(tǒng)設(shè)計(jì)遵循的決策來(lái)定義架構(gòu)灰追。這里我們采用關(guān)于 rest 那個(gè)著名的論文里的定義:架構(gòu)是系統(tǒng)運(yùn)行時(shí)的高層抽象
架構(gòu)存在的理由
- 交流的需要
人類使用語(yǔ)言來(lái)交流的只能是概念和抽象堵幽,我們實(shí)際上無(wú)法使用語(yǔ)言傳達(dá)一個(gè)真實(shí)存在的事物狗超,所以你跟一個(gè)沒(méi)有桌子
這個(gè)概念的人是無(wú)法交流桌子
的,而你要傳達(dá)桌子
這個(gè)概念時(shí)朴下,也只能使用柱子
努咐,平面
等等這些概念。
所以當(dāng)我們?cè)谟懻撘粋€(gè)系統(tǒng)時(shí)殴胧,通常討論的是概念模型或抽象渗稍。如果討論的是一些類型系統(tǒng)時(shí),比如分布式
团滥,大數(shù)據(jù)處理
竿屹,我們通常會(huì)使用概念模型,比如分布式事務(wù)
惫撰,兩階段提交
就是兩個(gè)概念模型羔沙。當(dāng)我們?cè)谟懻撘粋€(gè)具體的系統(tǒng)時(shí),我們通常使用的是抽象厨钻。網(wǎng)上搜到某某系統(tǒng)的架構(gòu)圖扼雏,其實(shí)就是系統(tǒng)的高層抽象,所以至少為了交流夯膀,我們也需要架構(gòu)诗充。
- 設(shè)計(jì)的需要
我們最終的目標(biāo)是要實(shí)現(xiàn)一個(gè)存在指定功能集并且實(shí)際可運(yùn)行的系統(tǒng)。為了達(dá)到這個(gè)目標(biāo)诱建,我們通常會(huì)有兩種方式蝴蜓。拿畫畫來(lái)做比喻,你即可以直接開始畫俺猿,也可以先構(gòu)圖茎匠。基本上來(lái)說(shuō)押袍,如果你胸有成竹了诵冒,那就可以直接上,如果沒(méi)有谊惭,那還是先做設(shè)計(jì)比較好( TDD 倡導(dǎo)的簡(jiǎn)單設(shè)計(jì)汽馋,也是設(shè)計(jì)的一種)。
假設(shè)我們選擇了先進(jìn)行設(shè)計(jì)(這個(gè)也是大部分非個(gè)人項(xiàng)目的實(shí)際選擇)圈盔,那么我們進(jìn)行的就是架構(gòu)設(shè)計(jì)豹芯。所以要有架構(gòu)這個(gè)概念的存在,才能做架構(gòu)設(shè)計(jì)驱敲。
- 決策的需要
無(wú)論是上層設(shè)計(jì)時(shí)铁蹈,還是具體開發(fā)過(guò)程中,我們常常需要面對(duì)一些選擇众眨,比如通訊方式選擇那一種木缝,又比如執(zhí)行方式應(yīng)該是同步還是異步便锨,又或者應(yīng)該返回空還是拋出異常。當(dāng)我們面對(duì)多種選擇時(shí)我碟,需要一個(gè)準(zhǔn)則來(lái)指導(dǎo)我們做出正確(至少是一致)的選擇放案。而這個(gè)準(zhǔn)則就來(lái)自于架構(gòu)。
架構(gòu)設(shè)計(jì)的原則
《大道至易》里說(shuō)架構(gòu)設(shè)計(jì)通常是帶有架構(gòu)意圖的矫俺,而架構(gòu)意圖則是架構(gòu)師分析完一個(gè)系統(tǒng)之后產(chǎn)生的吱殉。面對(duì)不同的系統(tǒng),產(chǎn)生的架構(gòu)意圖也會(huì)不同厘托,當(dāng)然設(shè)計(jì)的架構(gòu)也不同友雳。然而我們依然可以總結(jié)出一組較為通用的原則來(lái)設(shè)計(jì)架構(gòu),就像程序設(shè)計(jì)領(lǐng)域的 solid 原則一樣铅匹。 Stephen Mellor 在《架構(gòu)之美》里討論了7個(gè)架構(gòu)原則押赊。
- 概念完整性
- 功能多樣性
- 增長(zhǎng)適應(yīng)性
- 修改獨(dú)立性
- 熵增抵抗性
- 可構(gòu)架性
- 自動(dòng)傳播
架構(gòu)設(shè)計(jì)的方法
Roy Thomas Fielding 在他的博士論文里介紹了兩個(gè)架構(gòu)設(shè)計(jì)的方法。
- 根據(jù)已存在的一組架構(gòu)風(fēng)格做為基礎(chǔ)進(jìn)行修改調(diào)整包斑。以得到滿足目標(biāo)架構(gòu)約束的一種架構(gòu)風(fēng)格(也可以是具體的架構(gòu))
- 分析目標(biāo)架構(gòu)的各種約束條件流礁,根據(jù)約束條件選擇模式,通過(guò)模式組合形成一種滿足所有(或者大部分)約束條件的目標(biāo)架構(gòu)罗丰。(具體模式和約束條件的對(duì)應(yīng)關(guān)系神帅,以及論證可以參見論文)
另外還有 RUP 的 4+1 的視圖方法∶鹊郑或者《軟件架構(gòu)設(shè)計(jì)》上說(shuō)的五視圖方法找御。都有討論架構(gòu)設(shè)計(jì)的方法,感興趣的可以找相應(yīng)的書籍來(lái)看绍填。
四維又是什么
上面說(shuō)了這么多關(guān)于架構(gòu)的東西霎桅,那么四維
又是什么呢?四維
其實(shí)就是比三維
多一維(時(shí)間緯度)讨永。所謂四維架構(gòu)
就是隨著時(shí)間會(huì)成長(zhǎng)的構(gòu)架滔驶。
這個(gè)世界上唯一不變的就是變化,架構(gòu)會(huì)隨著時(shí)間變化不是一句廢話嘛住闯。其實(shí)不然,變化不等于成長(zhǎng)澳淑。不同的架構(gòu)熵增抵抗性
是不同的比原,大部分架構(gòu)隨著時(shí)間流逝,以不同的速度腐爛老去杠巡,最后死亡量窘。另外一些好的架構(gòu),則隨著時(shí)間不停的變化以適應(yīng)新的情況氢拥。
是不是這些好的架構(gòu)就是我想說(shuō)的四維架構(gòu)
呢蚌铜?雖然也可以說(shuō)這些好的構(gòu)架確實(shí)是隨著時(shí)間“成長(zhǎng)”的架構(gòu)锨侯。但是通常這種“成長(zhǎng)”是隨機(jī)的,不可測(cè)的冬殃。其結(jié)果就是雖然一年后這個(gè)系統(tǒng)還是一個(gè)運(yùn)行良好并且擁有良好架構(gòu)的系統(tǒng)囚痴,但這個(gè)架構(gòu)一定跟一年前很不一樣了,甚至不太認(rèn)得出來(lái)了审葬。
一條小狗長(zhǎng)大后深滚,不可能變成一只貓,所以四維架構(gòu)
就是一個(gè)架構(gòu)在成型的那一刻就確定了它永遠(yuǎn)的樣子涣觉。通俗點(diǎn)說(shuō)就是四維架構(gòu)
是擁有基因的架構(gòu)痴荐。那么怎么設(shè)計(jì)一個(gè)擁有基因的架構(gòu)呢?
最后說(shuō)兩句
感覺這篇文章被我寫爛了官册,后面實(shí)在編不下去了生兆。但是我又不想去掉四維
,把它變成一篇單純寫架構(gòu)的文章膝宁,因?yàn)槲覍懰哪康木褪菫榱藢?code>四維鸦难,可能這個(gè)概念在我腦中還沒(méi)完全成型吧。