什么是架構(gòu)?

Ralph Johnson 說架構(gòu)是 『Architecture is about the important stuff. Whatever that is.』,中文的意思就是『重要的東西』,架構(gòu)師的工作就是理解權(quán)衡『重要的東西』。理解,即理解業(yè)務(wù)需求;權(quán)衡,即取舍之道。這點正如,企業(yè)初創(chuàng)通常我們都是『單體應(yīng)用』來快速構(gòu)建,快速的推進業(yè)務(wù),而隨著業(yè)務(wù)發(fā)展,我們只能根據(jù)業(yè)務(wù)形態(tài)來不斷的改進架構(gòu)。以時間的維度思考架構(gòu)的連續(xù)性變化,即是演進式架構(gòu)。
物種的演進方式大致有兩種:一種是漸進式,一種是爆發(fā)式。對于架構(gòu)的演進同樣如此,在此我們不區(qū)分漸進還是爆發(fā),關(guān)注點是原始架構(gòu)到漸進或爆發(fā)后的架構(gòu)演進能力。(某些爆發(fā)式突變應(yīng)該不在演進支撐的范疇)
我們的人生是取舍,架構(gòu)何嘗不是取舍。而取舍的關(guān)鍵是,重要度的排序,我們必然選擇最重要的來做,而忽略不重要的。人生要做當下最重要的事,公司要做價值最大的事,架構(gòu)也是要解決最大的業(yè)務(wù)問題。
架構(gòu)為什么不是一成不變的?其實很好解釋,從生死的角度來看,一個事物有誕生就會有死亡,架構(gòu)這個人為的事物也是如此,誕生就一定有死亡,不想死掉,所以要演進。即在時間維度下,架構(gòu)的比特衰減在所難免。
架構(gòu)劃分的維度可以多種多樣,按照技術(shù)、數(shù)據(jù)、安全、運維劃分是一種方式;按照不同視圖劃分:邏輯視圖、開發(fā)視圖、進程視圖和物理視圖;也可以單獨針對具體需求設(shè)計性能、安全、合法性、伸縮性等維度劃分。無論那個維度,都需要考慮時間的維度疊加的考量。演進式架構(gòu)中的三個重要元素則為 “增量式變更”,“適應(yīng)度函數(shù)” 以及 “適當?shù)鸟詈稀薄?/p>
架構(gòu)不是單純的軟件需求任務(wù)也要考慮人員的組成來進行思考,因為『康威定律』寫到『Organizations which design systems … are constrained to produce designs which are? copies of the communication structures of these organizations.』,即『設(shè)計系統(tǒng)的架構(gòu)受制于產(chǎn)生這些設(shè)計的組織的溝通結(jié)構(gòu)。』所以軟件架構(gòu)必須考慮落地的人的組織形式,這里會引入兩點思考:
一、軟件架構(gòu)要考慮現(xiàn)有的團隊劃分,能夠適應(yīng)現(xiàn)在的團隊組織形式;
二、軟件架構(gòu)考慮打破現(xiàn)有的架構(gòu),在軟件架構(gòu)層面設(shè)計,并考慮落地的人員組織形式。可以看出后者明顯優(yōu)于前者,當然在能力有限時,只能做前者的選擇,而且要把組織結(jié)構(gòu)看做需求的限制條件之一。
在我眼里架構(gòu)師其實做的事情就是『庖丁解牛』過程,『?!皇侵赣龅降男枨?,『解?!粍t是對需求的拆解,其過程必然要『依乎天理』,什么是天理,天理就是『道也,進乎技矣』,就是合理的拆分形成技術(shù)架構(gòu)。怎么算合理呢?『實踐是檢驗真理的唯一標準』。不同的需求就會有不同的『牛』、『虎』、『蛇』....,這就需要不同的『解法』。再說的直白一點,把需求的結(jié)果看做是個假想的系統(tǒng),架構(gòu)就是把系統(tǒng)進行合理的(即合道)分拆,可以是子系統(tǒng)、模塊、組件、構(gòu)件等等。"系統(tǒng)絕不是其組成部分的總和,而是各部分相互作用的產(chǎn)物。"
架構(gòu)的考量
適應(yīng)度函數(shù):針對架構(gòu)特征進行客觀評估的能力。即你說『高可用』,驗證『高可用』的可靠方式或方法。

增量變更:針對架構(gòu)的變更,能夠快速的在原有基礎(chǔ)上進行變更,設(shè)置能夠并行。例如:功能向前兼容,多版本支持;DevOps的落地,藍綠部署,金絲雀部署、feature toggles等。
適當?shù)鸟詈希?/b>是指模塊建會存在一定的耦合。例如都使用了同樣的工具、框架、庫等等。
架構(gòu)量子:系統(tǒng)最小的可部署單元(代碼+數(shù)據(jù)...)。架構(gòu)量子越小,架構(gòu)的演進能力越強,例如FaaS
一些摘要:
假設(shè)驅(qū)動開發(fā)的假設(shè)是根據(jù)假設(shè)來檢驗的,什么試驗可以確定結(jié)果以及用什么驗證假設(shè)意味著應(yīng)用開發(fā)的走向。
演進的速度和生產(chǎn)周期成正比,生產(chǎn)周期越短,演進越快。
積極地更新框架依賴,消極地更新庫。
要選擇出高效的架構(gòu),他們必須仔細了解對應(yīng)的問題域并選擇最合適的架構(gòu),這樣才能提供最理想的能力并且破壞性約束最小。當然,除非架構(gòu)師陷入了簡歷驅(qū)動開發(fā)的陷阱——為了用這些知識豐富自己的簡歷而選擇框架和庫
事不過三,三則重構(gòu):第一次做某件事時,你盡管去做。第二次做類似的事時,你會對重復(fù)猶豫,但無論如何你還是重復(fù)這件事。第三次再處理類似的事時,你應(yīng)該將其重構(gòu)

參考:
https://www.thoughtworks.com/insights/blog/microservices-evolutionary-architecture
https://gist.github.com/scottwd9/ada88f963aac95893e1eba10d4ad8f6d