軟件和組織架構(gòu)的一致性
先做一個(gè)小結(jié)牢硅,軟件面臨的核心問(wèn)題是功能擴(kuò)展時(shí)的成本(人力、時(shí)間芝雪、故障等綜合考慮)减余。解決的基本思路,其一惩系、引入各種軟件設(shè)計(jì)方法來(lái)管理復(fù)雜性佳励,過(guò)程大體上都可以視為基于抽象的拆分和組合; 其二、分解職責(zé)到不同的人蛆挫,定義明確的邊界和運(yùn)作方式,以獲得分工的效率妙黍。
正如康威定理指出的悴侵,軟件架構(gòu)決定組織架構(gòu)。軟件的復(fù)雜性管理方式和人員職責(zé)拆分及組織架構(gòu)應(yīng)該是同構(gòu)的拭嫁。換言之可免,要么組織混亂、多頭管理做粤、大部分人力都是同時(shí)進(jìn)行多個(gè)任務(wù)浇借,同時(shí)代碼亂成一團(tuán)。要么組織結(jié)構(gòu)清晰怕品,任務(wù)優(yōu)先級(jí)明確妇垢,大部分人專(zhuān)注于-兩件事,同時(shí)代碼質(zhì)量也還說(shuō)得過(guò)去。不太可能出現(xiàn)一好一壞闯估。其中灼舍,軟件架構(gòu)是決定性因素,這是任何研發(fā)組織和官僚組織最核心的區(qū)別涨薪。(這里沒(méi)有貶低官僚組織的意思骑素,研發(fā)組織和官僚組織的目標(biāo)不同,所以解決方案也不會(huì)相同)
基于模型刚夺、分層的軟件架構(gòu)
(下述討論献丑,不包括模塊化\組件化、組件間接口管理等問(wèn)題侠姑。這些問(wèn)題的直接體現(xiàn)業(yè)務(wù)本質(zhì)创橄,它們也是架構(gòu)設(shè)計(jì)的部分,也有一些拆分的原則结借,比如業(yè)務(wù)內(nèi)聚筐摘,相似的過(guò)程、依賴(lài)相同的數(shù)據(jù)船老,邊界清晰等等咖熟,但不是本文討論的核心。)
什么情況可以不考慮軟件設(shè)計(jì)?系統(tǒng)足夠簡(jiǎn)單并且看起來(lái)不會(huì)變得復(fù)雜;已經(jīng)有了針對(duì)這個(gè)領(lǐng)域的好用的框架和語(yǔ)言柳畔。也就是說(shuō)馍管,要么這個(gè)問(wèn)題太簡(jiǎn)單不值得解決,要么這個(gè)問(wèn)題已經(jīng)有了通解薪韩,否則就需要考慮設(shè)計(jì)問(wèn)題确沸。
如果一個(gè)復(fù)雜系統(tǒng)又使用相對(duì)低級(jí)(缺乏抽象機(jī)制,如C)的語(yǔ)言——通常是某些大型嵌入式系統(tǒng)俘陷, 異常注重性能硬件資源又沒(méi)法擴(kuò)展——那么設(shè)計(jì)問(wèn)題就會(huì)便得生死攸關(guān)罗捎。架構(gòu)是頂層設(shè)計(jì),它是業(yè)務(wù)(領(lǐng)域)復(fù)雜性的高度抽象拉盾,提供系統(tǒng)拆分和組合的基本方法桨菜,并提供機(jī)制以使得其他設(shè)計(jì)問(wèn)題可以延遲決策(最后一點(diǎn)是讀<clcanarchitecture>--書(shū)想到的,蠻有意思)捉偏。
架構(gòu)設(shè)計(jì)倒得,第一步做架構(gòu)級(jí)建模。
定義系統(tǒng)包含哪些聚合根(哪些核心的實(shí)體?)夭禽、聚合根之間的關(guān)系霞掺,以及哪些東西應(yīng)該作為核心概念顯式的體現(xiàn)在聚合根上。要避免聚合根關(guān)系復(fù)雜化讹躯,網(wǎng)狀化菩彬,否則系統(tǒng)從起點(diǎn)就已經(jīng)難以維護(hù)了缠劝。核心概念實(shí)際上是提供給后續(xù)設(shè)計(jì)做拆分的尺規(guī)。依據(jù)單一 職責(zé)原則做具體考量時(shí)挤巡,不同的角色(架構(gòu)剩彬,業(yè)務(wù)分析,開(kāi)發(fā))矿卑,不同的人之間理解往往相去萬(wàn)里乃至雞同鴨講喉恋。而核心概念就是要提供基本的共識(shí),它們往往是系統(tǒng)的痛點(diǎn)所在母廷,是降解系統(tǒng)復(fù)雜度的樞紐轻黑。比如如果一個(gè)系統(tǒng)有非常豐富的狀態(tài),且復(fù)雜的依據(jù)狀態(tài)擇路的代碼導(dǎo)致系統(tǒng)難以維護(hù)琴昆,那么“狀態(tài)”就應(yīng)該抽取出來(lái)氓鄙,作為核心概念顯式的聚合在聚合根上。狀態(tài)可以作為單一職責(zé)的一個(gè)標(biāo)準(zhǔn)业舍。比如一個(gè)抽象行為有多個(gè)實(shí)現(xiàn)抖拦,每個(gè)實(shí)現(xiàn)只應(yīng)該給為狀態(tài)的一個(gè)值服務(wù)。
下來(lái)應(yīng)該做分層設(shè)計(jì)舷暮。
典型的Evans給出一個(gè)四層模型态罪, 基礎(chǔ)設(shè)施層,領(lǐng)域?qū)酉旅妫瑧?yīng)用層复颈,用戶(hù)界面層×じ睿基礎(chǔ)設(shè)施必須有耗啦,沒(méi)有就會(huì)重復(fù)造輪子,一個(gè)造得比一個(gè)崎嶇机杜;有了基礎(chǔ)設(shè)施則需要部署某些控制點(diǎn)帜讲,避免團(tuán)隊(duì)自行開(kāi)發(fā)已有的工具。領(lǐng)域?qū)影瑯I(yè)務(wù)的核心知識(shí)椒拗。應(yīng)用層是關(guān)于領(lǐng)域知識(shí)的組合舒帮,定義軟件功能,提供具體的服務(wù)陡叠。但要分析關(guān)于領(lǐng)域知識(shí)的組合是否也是核心的領(lǐng)域知識(shí)?如果是的話(huà),領(lǐng)域?qū)涌梢钥紤]分成多個(gè)子層肢执,畢竟處理組合和般性的業(yè)務(wù)知識(shí)會(huì)采用不同的策略枉阵。
系統(tǒng)已經(jīng)從聚合根、核心概念(縱向)和分層(橫向)兩個(gè)方向拆分完畢了预茄,圖紙已經(jīng)畫(huà)好兴溜。如何保證按圖索驥就成了問(wèn)題的關(guān)鍵侦厚。靠提升人員能力拙徽、價(jià)值觀(guān)宣貫刨沦、編碼規(guī)范、培訓(xùn)膘怕、走查想诅、結(jié)對(duì)編程...這些都不夠。既不明確岛心,也不穩(wěn)定来破。
架構(gòu)落地由DSL切入
還是從軟件/架構(gòu)設(shè)計(jì)落地 和 人員職責(zé)定義兩個(gè)方向考慮。
支持軟件設(shè)計(jì)落地忘古。
DSL的語(yǔ)法元素中徘禁,應(yīng)該包括架構(gòu)建模中的聚合根和核心概念,并定義它們之間可能的組織和交互形式髓堪。這樣系統(tǒng)既能顯式的拆分到我們期望的基本粒度送朱,又能有一致的組合方式,一致很重要干旁。
有時(shí)DSL并不會(huì)完整的實(shí)現(xiàn)系統(tǒng)驶沼,而只是定義框架中的元素和組織形式,具體的實(shí)現(xiàn)形式并不關(guān)心疤孕,DSL會(huì)生成一組接口來(lái)約束需要用宿主語(yǔ)言具體實(shí)現(xiàn)的部分商乎,接口的職責(zé)和形式已經(jīng)是明確的了。這意味著分層結(jié)構(gòu)將中有一層與這部分職責(zé)對(duì)應(yīng)祭阀。好吧鹉戚,我說(shuō)的就是涉及復(fù)雜組合的那部分。
可以看出专控,DSL是一個(gè)非常具體的切入點(diǎn)抹凳,當(dāng)采取這套方法后,我們已經(jīng)抽象出來(lái)的概念和拆分的粒度會(huì)被形式化伦腐。而不會(huì)受個(gè)人(或組織)的偏好影響赢底,乃至最終腐化到渣都不剩。而采用DSL后柏蘑,架構(gòu)的意圖幸冻,如我佛所言,所得正覺(jué)(架構(gòu)知識(shí))咳焚,如沙中煉金洽损,一旦煉出,永不復(fù)歸于沙革半。
人員職責(zé)劃分
至少架構(gòu)師碑定、業(yè)務(wù)分析師(BA)流码、開(kāi)發(fā)基于DSL可以各司其職了。
架構(gòu)師的職責(zé)在系統(tǒng)建模延刘、分層之外漫试,增加DSL設(shè)計(jì)和維護(hù)的職責(zé),他交出的成果不再只有文檔和PPT,而是具有更強(qiáng)約束性和規(guī)定性的DSL語(yǔ)法碘赖。
BA用DSL來(lái)描述業(yè)務(wù)驾荣,他可以輸出DSL文件,這樣對(duì)開(kāi)發(fā)的約束是明確的崖疤,成果可以固化秘车,而且BA的意圖更難被扭曲。
開(kāi)發(fā)依據(jù)DSL生成的接口填空劫哼。
會(huì)增加一個(gè)新的角色叮趴,轉(zhuǎn)換器(編譯器)開(kāi)發(fā)者,無(wú)論內(nèi)部或外部DSL,這個(gè)職責(zé)都是需要的权烧,原則上架構(gòu)師可以承擔(dān)這個(gè)責(zé)任畢竟他最清楚語(yǔ)法的意圖眯亦,但很可能一個(gè)人做不完。
DSL的其他好處包括
在DSL可以描述的范圍內(nèi)大幅提高開(kāi)發(fā)效率般码;
統(tǒng)一風(fēng)格(減少編程實(shí)現(xiàn)模式層面選擇困難)妻率;
處理性能的非業(yè)務(wù)優(yōu)化(代碼實(shí)現(xiàn)方式和內(nèi)存排布導(dǎo)致的優(yōu)化可以由轉(zhuǎn)換器完成);
可以在轉(zhuǎn)換器內(nèi)嵌很多檢查項(xiàng)板祝,保證代碼本身的一致性宫静,而不必要做運(yùn)行時(shí)檢查。
可以想象券时,在轉(zhuǎn)換器身上能做的文章非常多孤里,規(guī)模越大,這個(gè)好處就越明顯橘洞。