你有沒(méi)有聽(tīng)過(guò)四維架構(gòu)?
在程序員界流傳著很多傳說(shuō),這些傳說(shuō)由于歷史太過(guò)久遠(yuǎn),漸漸被人們遺忘,只剩下一些流行的名詞,比如架構(gòu),銀彈,程序員三大愛(ài)好,重構(gòu),人月,設(shè)計(jì)模式等等。今天我們就來(lái)講講架構(gòu),而且不是普通的架構(gòu),是一個(gè)可能你聽(tīng)都沒(méi)聽(tīng)說(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)存在的理由
- 交流的需要
人類(lèi)使用語(yǔ)言來(lái)交流的只能是概念和抽象,我們實(shí)際上無(wú)法使用語(yǔ)言傳達(dá)一個(gè)真實(shí)存在的事物,所以你跟一個(gè)沒(méi)有桌子這個(gè)概念的人是無(wú)法交流桌子的,而你要傳達(dá)桌子這個(gè)概念時(shí),也只能使用柱子,平面等等這些概念。
所以當(dāng)我們?cè)谟懻撘粋€(gè)系統(tǒng)時(shí),通常討論的是概念模型或抽象。如果討論的是一些類(lèi)型系統(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ì)有兩種方式。拿畫(huà)畫(huà)來(lái)做比喻,你即可以直接開(kāi)始畫(huà),也可以先構(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í),還是具體開(kāi)發(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)整。以得到滿(mǎn)足目標(biāo)架構(gòu)約束的一種架構(gòu)風(fēng)格(也可以是具體的架構(gòu))
- 分析目標(biāo)架構(gòu)的各種約束條件,根據(jù)約束條件選擇模式,通過(guò)模式組合形成一種滿(mǎn)足所有(或者大部分)約束條件的目標(biāo)架構(gòu)。(具體模式和約束條件的對(duì)應(yīng)關(guān)系,以及論證可以參見(jiàn)論文)
另外還有 RUP 的 4+1 的視圖方法?;蛘摺盾浖軜?gòu)設(shè)計(jì)》上說(shuō)的五視圖方法。都有討論架構(gòu)設(shè)計(jì)的方法,感興趣的可以找相應(yīng)的書(shū)籍來(lái)看。
四維又是什么
上面說(shuō)了這么多關(guān)于架構(gòu)的東西,那么四維又是什么呢?四維其實(shí)就是比三維多一維(時(shí)間緯度)。所謂四維架構(gòu)就是隨著時(shí)間會(huì)成長(zhǎng)的構(gòu)架。
這個(gè)世界上唯一不變的就是變化,架構(gòu)會(huì)隨著時(shí)間變化不是一句廢話(huà)嘛。其實(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ō)兩句
感覺(jué)這篇文章被我寫(xiě)爛了,后面實(shí)在編不下去了。但是我又不想去掉四維,把它變成一篇單純寫(xiě)架構(gòu)的文章,因?yàn)槲覍?xiě)它的目的就是為了寫(xiě)四維,可能這個(gè)概念在我腦中還沒(méi)完全成型吧。