老板要做DDD改造,我現(xiàn)在慌得一比!
原創(chuàng)【51CTO.com原創(chuàng)稿件】隨著微服務(wù)理論的盛行,沉寂了近二十年的 DDD 領(lǐng)域驅(qū)動設(shè)計的價值逐漸被越來越多的公司認可。
圖片來自 包圖網(wǎng)
但是 DDD 作為純方法論,在實際應(yīng)用中因缺乏類似框架的強約束性,如何有效指導(dǎo)業(yè)務(wù)落地實施,尤其是復(fù)雜系統(tǒng)架構(gòu)的優(yōu)化改造,都對研發(fā)團隊提出很高的要求。
采購平臺則通過溯源演進重放的方法,以“上帝視角”重新審視整個系統(tǒng)架構(gòu)和業(yè)務(wù)發(fā)展的歷程以及重要節(jié)點,以演進重放的方式進行領(lǐng)域模型設(shè)計。
一方面使復(fù)雜系統(tǒng)改造有了很好的切入點,另一方面使系統(tǒng)設(shè)計天生具備演進屬性,適應(yīng)當(dāng)下業(yè)務(wù)的同時也能更好的兼容未來業(yè)務(wù)的發(fā)展。
根據(jù)熵增定律,一切事物如果不加以約束都趨向從有序變?yōu)闊o序。系統(tǒng)作為一個獨立個體,其熵增趨勢也是無法避免的。
業(yè)務(wù)的橫向拓展和縱向深耕,架構(gòu)演進和技術(shù)創(chuàng)新都會導(dǎo)致系統(tǒng)復(fù)雜性越來越高。
畢竟個人的認知和接受能力是有上限的,當(dāng)系統(tǒng)的復(fù)雜性超出團隊大多數(shù)人的認知上限時,系統(tǒng)的任何一點微小的優(yōu)化或改動,都會讓研發(fā)團隊疲于奔命,也會給系統(tǒng)的穩(wěn)定性帶來很大的風(fēng)險或隱患!
所以提升開發(fā)效率和系統(tǒng)穩(wěn)定性成為技術(shù)研發(fā)團隊繞不開且必須解決的問題。
事件
通過對采購平臺系統(tǒng)發(fā)展歷程和重要節(jié)點的不斷審視,發(fā)現(xiàn)導(dǎo)致系統(tǒng)復(fù)雜性的主要原因還是業(yè)務(wù)的復(fù)雜性。
系統(tǒng)架構(gòu)設(shè)計中如果不能很好的解決業(yè)務(wù)領(lǐng)域的復(fù)雜性,技術(shù)架構(gòu)的優(yōu)化和演進再好也于事無補。
采購平臺自 15 年搭建伊始,業(yè)務(wù)橫向方面從最初單一的電器業(yè)態(tài),逐步拓展紅孩子,百貨再到近幾年的小店,迪亞,家樂福等大快消業(yè)態(tài)。同時縱向?qū)﹄娖鳂I(yè)態(tài)的深耕,如樣機,不良品,換異型等也在同步進行。
業(yè)態(tài),操作模式,經(jīng)營模式,業(yè)務(wù)模式等等相互穿插組合帶來了業(yè)務(wù)的靈活多變的同時,也帶來系統(tǒng)復(fù)雜度幾何級上升。
此時高效的開發(fā)效率更是無從談起,很難對業(yè)務(wù)的發(fā)展提供高效支撐,隨之而來的業(yè)務(wù)的埋怨和領(lǐng)導(dǎo)的不理解也給開發(fā)團隊帶來很大的心理負擔(dān),進而影響團隊穩(wěn)定性……環(huán)環(huán)相扣陷入惡性循環(huán)的泥潭。
如何破開困境?倡導(dǎo)保持概念完整性的領(lǐng)域驅(qū)動設(shè)計是個不錯的選擇。DDD 關(guān)注于精簡的業(yè)務(wù)模型和實現(xiàn)的匹配,其作為方法論指導(dǎo)系統(tǒng)架構(gòu)設(shè)計,是解決業(yè)務(wù)領(lǐng)域復(fù)雜性的利器。
通過領(lǐng)域驅(qū)動設(shè)計模式促使研發(fā)團隊將業(yè)務(wù)模型作為項目溝通的核心,使成員之間更容易理解彼此之間的工作,大大提升團隊溝通效率。
領(lǐng)域模型的高內(nèi)聚低耦合,大大降低不同業(yè)務(wù)模塊之間的影響有效提升系統(tǒng)穩(wěn)定性,同時領(lǐng)域驅(qū)動設(shè)計倡導(dǎo)概念完整性,注重模型和實現(xiàn)的匹配使系統(tǒng)更易于理解和擴展。
挑戰(zhàn)點(難點)
雖然領(lǐng)域驅(qū)動設(shè)計是個不錯的指導(dǎo)方法論,也正因為是通用的理論,在具體項目的落實中,因不存在相同業(yè)務(wù)的系統(tǒng),即使相似業(yè)務(wù)的系統(tǒng)因規(guī)模和產(chǎn)品生命周期差異,也只有一般意義上的參考價值。
所以都需要面臨如何進行領(lǐng)域建模的快速切入,以及預(yù)防模型在實現(xiàn)層面的腐化等諸多挑戰(zhàn)點。
主要體現(xiàn)在以下幾個方面:
①邏輯復(fù)雜,無從下手。系統(tǒng)經(jīng)過日積月累的迭代優(yōu)化,新的業(yè)務(wù)模塊和功能點與日俱增,且成發(fā)散趨勢。
再加上即使同業(yè)態(tài)下業(yè)務(wù)的深耕也有很多個性化需求,功能點相互穿拆耦合的現(xiàn)象非常普遍,千頭萬緒很難梳理。需要有個適合自身業(yè)務(wù),行之有效的方法去指導(dǎo)辨別合適的切入點。
②能力差異,邊界難定。領(lǐng)域驅(qū)動設(shè)計使開發(fā)團隊從面向數(shù)據(jù)庫編程轉(zhuǎn)為面向領(lǐng)域編程,一切都要求從業(yè)務(wù)角度出發(fā),對團隊成員業(yè)務(wù)理解能力要求大大提升。
實際上團隊成員的能力總是有差異的,其導(dǎo)致的理解偏差最終會逐漸反應(yīng)到實現(xiàn)層,進而影響整個業(yè)務(wù)領(lǐng)域藍圖。
特別是在領(lǐng)域邊界的建立,模糊的有交集的領(lǐng)域模型,最終會腐化整個架構(gòu)。這就需要有契合業(yè)務(wù)特性,簡易的界定方式,幫助團隊成員快速清晰的確認領(lǐng)域邊界。
③業(yè)務(wù)細化,粒度難分。明確了領(lǐng)域范圍也就是限界上下文,業(yè)務(wù)域做了合理的劃分也不代表領(lǐng)域驅(qū)動設(shè)計就會水到渠成。
隨之業(yè)務(wù)發(fā)展,原業(yè)務(wù)域或者子域可能又出現(xiàn)垂直細分的需求,細分的業(yè)務(wù)概念是否需要反應(yīng)到業(yè)務(wù)領(lǐng)域藍圖也是一個需要重點考慮的問題。
業(yè)務(wù)概念的完整性和模型精簡之間權(quán)衡的度的把握,同樣需要有個簡單易行的標(biāo)準(zhǔn)。
分析與解決過程
針對上述問題,主要分析和解決方案對應(yīng)如下:
①以始為本,回放演進
任何復(fù)雜的事物都是從簡單演化出來的,復(fù)雜的系統(tǒng)亦然??v覽采購平臺的演進歷程,系統(tǒng)搭建初期,無論是業(yè)務(wù)模式還是系統(tǒng)規(guī)模都是最簡單和最小的。
所以通過復(fù)盤溯源的方式以系統(tǒng)搭建初期業(yè)務(wù)和系統(tǒng)規(guī)模為基線,進行初始化領(lǐng)域模型搭建更具可行性。
一方面業(yè)務(wù)規(guī)模小,更容易梳理出業(yè)務(wù)主線。加上初期各業(yè)務(wù)域之間很少或不存在交叉情況,建立領(lǐng)域模型相對簡單也方便入手。
另一方面初始領(lǐng)域模型建立后,再以業(yè)務(wù)和系統(tǒng)的實際的演變過程對初始領(lǐng)域模型進行豐富和優(yōu)化,最終形成一個邊界清晰的完整的業(yè)務(wù)領(lǐng)域藍圖。
這一切都是在復(fù)盤過往業(yè)務(wù)發(fā)展和系統(tǒng)演進的基礎(chǔ)上進行的,貼合了業(yè)務(wù)和系統(tǒng)的發(fā)展曲線。
從概率的角度上看,用該方法完善的領(lǐng)域模型比單純依靠經(jīng)驗而建的模型更能好的契合當(dāng)前業(yè)務(wù)發(fā)展和兼容未來業(yè)務(wù)的變化。同時以上也都符合一個好的架構(gòu)的“簡單,合適,演進”特征。
②作用范圍,領(lǐng)域定界
提及領(lǐng)域驅(qū)動設(shè)計離不開“核心域”“聚合根”“實體”“值對象”“限界上下文”等,DDD 的各類文檔資料對上述名詞都有很明確的定義和解釋。
但是實際項目的落實中,仍然需要一個簡易可行的界定方法,為領(lǐng)域驅(qū)動設(shè)計在團隊內(nèi)部實施和演進掃清障礙。
“易則易知,簡則易行”簡易可行的方法才能更容易被團隊成員理解和接受。
結(jié)合采購平臺本身的業(yè)務(wù)特性,將采購執(zhí)行鏈路上產(chǎn)生的各種類型單據(jù)以及交互進行梳理,如訂單,預(yù)約單,作業(yè)指令,收發(fā)貨等實體化后作為一個對象,以此對象作為聚合根,凡是以該對象為主體的作用范圍都歸于一個領(lǐng)域。
一旦該對象在某個環(huán)節(jié)的業(yè)務(wù)邏輯中失去“主角”光環(huán),則需要根據(jù)實際業(yè)務(wù)確定新的“主角”進而決定是新建領(lǐng)域還是轉(zhuǎn)到已存的別的領(lǐng)域。
③維度固化,細化剝離
維護業(yè)務(wù)概念的完整性是衡量設(shè)計好壞的一個重要的參考指標(biāo)。好的設(shè)計從代碼層面清晰展現(xiàn)業(yè)務(wù)領(lǐng)域藍圖且易于理解,同時又能很好的隔離不同領(lǐng)域相互之間的影響。
實際項目中往往存在很多因業(yè)務(wù)需要在某一場景下進行細分的情況,按照維護業(yè)務(wù)概念完整性的要求就需要將細分場景進一步獨立進行隔離解耦。
但過多的細分場景增加了開發(fā)工作量也模糊了業(yè)務(wù)領(lǐng)域藍圖,同時加深了對業(yè)務(wù)整體的溝通和理解難度。
如采購平臺實際的收發(fā)貨業(yè)務(wù)場景,最初根據(jù)業(yè)務(wù)分類按照采購入庫,退廠出庫,調(diào)撥出庫,調(diào)撥入庫等進行分類場景處理。
后期隨著業(yè)務(wù)的拓展,采購入庫場景下進一步按類型維度細分出換異型入庫,不良品返廠維修入庫等完全個性化的處理邏輯。
根據(jù)鏈路上下游系統(tǒng)交互情況,以及團隊內(nèi)部對該業(yè)務(wù)域的認知,權(quán)衡后確定的原則是,以收發(fā)貨業(yè)務(wù)分類進行領(lǐng)域藍圖的展現(xiàn),以此作為該業(yè)務(wù)域下維護概念完整性的唯一且不變的維度。
特定業(yè)務(wù)分類下進一步按類型細化場景,作為一個子域,業(yè)務(wù)也獨立并以策略模式歸集于上一層的業(yè)務(wù)分類領(lǐng)域。
方法論(正向)
領(lǐng)域驅(qū)動設(shè)計作為指導(dǎo)架構(gòu)設(shè)計的一種有效思想,對復(fù)雜邏輯的業(yè)務(wù)系統(tǒng)的重構(gòu)和建設(shè)提供了很好的解決方案。
但再好的設(shè)計也必須通過實現(xiàn)層展現(xiàn),實現(xiàn)層質(zhì)量又嚴重依賴開發(fā)團隊的個人能力。
“簡易可行,契合業(yè)務(wù)”的方法和原則還是很有必要的,這是設(shè)計推行和架構(gòu)防腐的很有效的手段。
但同時也要看到領(lǐng)域驅(qū)動設(shè)計并不是解決系統(tǒng)復(fù)雜性的銀彈。對癥則是良藥,為了 DDD 而 DDD 則可能最終變成毒藥。
作者:胥磊
簡介:蘇寧易購供應(yīng)鏈 BU 采購管理研發(fā)中心采購中臺技術(shù)負責(zé)人,對復(fù)雜業(yè)務(wù)系統(tǒng)架構(gòu)的優(yōu)化和拓展有一定的經(jīng)驗。前后負責(zé)過蘇寧采購平臺的搭建,向采購中臺演進以及 DDD 改造的技術(shù)架構(gòu)設(shè)計。
編輯:陶家龍
征稿:有投稿、尋求報道意向技術(shù)人請聯(lián)絡(luò) editor@51cto.com
【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】