為什么選擇DSL(下)

軟件和組織架構(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è)好處就越明顯橘洞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捌袜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炸枣,更是在濱河造成了極大的恐慌虏等,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件适肠,死亡現(xiàn)場(chǎng)離奇詭異霍衫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)侯养,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)敦跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沸毁,你說(shuō)我怎么就攤上這事峰髓。” “怎么了息尺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵携兵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我搂誉,道長(zhǎng)徐紧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任炭懊,我火速辦了婚禮并级,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侮腹。我一直安慰自己嘲碧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布父阻。 她就那樣靜靜地躺著愈涩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪加矛。 梳的紋絲不亂的頭發(fā)上履婉,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音斟览,去河邊找鬼毁腿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛苛茂,可吹牛的內(nèi)容都是我干的已烤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼味悄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼草戈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起侍瑟,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唐片,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后涨颜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體费韭,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年庭瑰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了星持。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弹灭,死狀恐怖督暂,靈堂內(nèi)的尸體忽然破棺而出揪垄,到底是詐尸還是另有隱情,我是刑警寧澤逻翁,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布饥努,位于F島的核電站,受9級(jí)特大地震影響八回,放射性物質(zhì)發(fā)生泄漏酷愧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一缠诅、第九天 我趴在偏房一處隱蔽的房頂上張望溶浴。 院中可真熱鬧,春花似錦管引、人聲如沸士败。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拱烁。三九已至,卻和暖如春噩翠,著一層夾襖步出監(jiān)牢的瞬間戏自,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工伤锚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擅笔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓屯援,卻偏偏與公主長(zhǎng)得像猛们,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狞洋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一弯淘、生命周期 一個(gè)事物一旦出生,就必然會(huì)長(zhǎng)大吉懊,變異庐橙,一旦長(zhǎng)大,就面臨著衰老借嗽,接下來(lái)就是消亡了态鳖,這個(gè)過(guò)程就稱(chēng)為一個(gè)事...
    ZyBlog閱讀 2,651評(píng)論 1 11
  • 閱讀提示:本文是讀 kimmking 在 GitChat 上分享的文章 「軟件架構(gòu)發(fā)展歷程分享」后的一些總結(jié),黑體...
    米茶餓了閱讀 1,094評(píng)論 0 3
  • 如何針對(duì)當(dāng)前需求邦泄,選擇合適的應(yīng)用架構(gòu)删窒,如何面向未來(lái),保證架構(gòu)平滑過(guò)渡顺囊,這個(gè)是軟件開(kāi)發(fā)者易稠,特別是架構(gòu)師,都需要深入思...
    java高級(jí)分享閱讀 795評(píng)論 0 13
  • 一企量、兒時(shí) 那年秋天测萎,他們兩個(gè)十三歲,她九歲届巩。 河邊硅瞧,小草黃了,柳條枯了恕汇,秋高氣爽腕唧。他第一次見(jiàn)到她。 “涵...
    灝雯閱讀 558評(píng)論 3 3
  • 又要天黑瘾英,手上滴傷呀~不疼枣接,不疼,不疼…… 有微笑缺谴,就有陽(yáng)光但惶!
    寒冰0601閱讀 99評(píng)論 0 0