電話機(jī)器人團(tuán)隊(duì)DDD實(shí)踐
簡介
DDD是一套方法論,一套思想。種類繁多的元模型和名詞概念。其本質(zhì)都是指導(dǎo)思想對應(yīng)的解決方案“之一”,初學(xué)者容易被表象所困。應(yīng)始終清醒保持認(rèn)知“DDD各種元模型都是為解決實(shí)際開發(fā)中某類問題而起”。在接觸各類元模型時應(yīng)結(jié)合自身業(yè)務(wù)面臨問題來求證,這樣有助于避免被概念表象所困,回歸解決問題的本質(zhì)。
背景
數(shù)據(jù)架構(gòu)團(tuán)隊(duì)從18年開始,受業(yè)務(wù)需求驅(qū)動開發(fā)電話機(jī)器人,轉(zhuǎn)眼已近5年。目前,在該平臺下已搭建100+不同類型機(jī)器人,為公司經(jīng)銷商、二手車、主機(jī)廠、金融等多個BU業(yè)務(wù)提供外呼能力,日外呼量幾十萬通。電話機(jī)器人項(xiàng)目已初具規(guī)模,但過程中也遇到不少挑戰(zhàn)。為了應(yīng)對這些挑戰(zhàn),我們團(tuán)隊(duì)最終采用DDD思想進(jìn)行重構(gòu)和開發(fā)。
在應(yīng)用DDD的過程中,數(shù)據(jù)架構(gòu)團(tuán)隊(duì)落地了一些自己的開發(fā)規(guī)范。這里就把一些經(jīng)驗(yàn)和想法分享給大家,希望能起到拋磚引玉作用。這里解釋一下,篇幅中很多元模型沒有展開講,也沒有給出具體案例。一是考慮到篇幅長度問題。二是理解了DDD思想,結(jié)合各自業(yè)務(wù)來實(shí)現(xiàn)就好了,給出在我業(yè)務(wù)的例子意義并不大。此外這類案例很容易找的到。同時,覺得給出我們團(tuán)隊(duì)遇到的問題、解決方案,落地過程和我們形成的開發(fā)規(guī)范對大家來說更有價值。對DDD感興趣,想了解更多或?qū)Ρ疚挠幸蓡柕耐瑢W(xué),歡迎找我交流討論。
下面,我從這幾個部分來進(jìn)行分享:機(jī)器人項(xiàng)目中遇到的挑戰(zhàn)、為什么是DDD、DDD落地步驟、對團(tuán)隊(duì)帶來的提升、理論到實(shí)戰(zhàn)遇到的沖突以及未來在DDD應(yīng)用方面的改進(jìn)和總結(jié)。
1.遇到的挑戰(zhàn)
挑戰(zhàn)一:業(yè)務(wù)邏輯復(fù)雜度高。隨著各類業(yè)務(wù)的接入,為應(yīng)對不同場景下的特定業(yè)務(wù),不斷追加新邏輯。
如:流程中的意圖識別邏輯。
意圖識別需要依賴AI的多個模型識別,多個模型識別出來的意圖有可能是沖突的,需要對沖突的意圖配置規(guī)則做取舍。同時,對一些冷啟動或者緊急優(yōu)化的場景,需要支持通過配置規(guī)則實(shí)時生效的方式來意圖識別。并且在規(guī)則的意圖識別中需要支持匹配詞槽。詞槽的類型又有多種,從優(yōu)先級上區(qū)分有場景的全局詞槽、流程上的詞槽。從數(shù)據(jù)識別來源上區(qū)分,可以分為AI識別出來的,詞典規(guī)則匹配出來的,還可能是業(yè)務(wù)方傳遞進(jìn)來的。業(yè)務(wù)開展一段時間后,不同類型的詞槽又增加不同屬性,如車系的詞槽有本品、經(jīng)營范圍、非經(jīng)營等等;
挑戰(zhàn)二:代碼架構(gòu)結(jié)構(gòu)不清晰。隨著業(yè)務(wù)需求功能的追加,伴隨著代碼規(guī)模增大。加之邏輯復(fù)雜和團(tuán)隊(duì)開發(fā)人員代碼迥異,逐漸導(dǎo)致各種邏輯邊界變得混亂。
如:我們通常的開發(fā)方式,按功能模塊拆解,業(yè)務(wù)流程串聯(lián)協(xié)調(diào)各個模塊,共同完成業(yè)務(wù)需求。但是處理這類業(yè)務(wù)復(fù)雜的邏輯,這種方案設(shè)計(jì)有很大的弊端,模塊邊界很容易被穿透。
各模塊關(guān)系相互調(diào)用,原本作為模塊的隔離設(shè)計(jì),實(shí)際在實(shí)現(xiàn)過程被完完全全的打破了。使原本理想中垂直拆分的模塊,變成網(wǎng)狀的結(jié)構(gòu)。
模塊負(fù)責(zé)人中間環(huán)節(jié)開發(fā)出來的的屬性或方法,被外部其它模塊外依賴導(dǎo)致功能發(fā)散出去。導(dǎo)致后期需求變動時風(fēng)險增加,又或是發(fā)現(xiàn)被依賴了原本可以隨意更改的方法不能變動,不得不增加額外邏輯代碼來實(shí)現(xiàn)。造成了本就復(fù)雜的代碼更加復(fù)雜。
對業(yè)務(wù)需求拆解不合理,需求功能在實(shí)現(xiàn)時就近開發(fā),未嚴(yán)格按照模塊拆解,缺少統(tǒng)一思想作為指導(dǎo)。
挑戰(zhàn)三:產(chǎn)品需求多,難以辨別是否有真實(shí)價值。
挑戰(zhàn)四:邏輯變化快,不少需求導(dǎo)致需要代碼邏輯重新設(shè)計(jì)。
挑戰(zhàn)五:業(yè)務(wù)多,各業(yè)務(wù)表述不一致,溝通成本高。
垂直邊界被打破,代碼復(fù)雜度增加,加上業(yè)務(wù)流程頻繁調(diào)整。這些多重維度相互疊加,使得開發(fā)和維護(hù)難度指數(shù)增加。電話機(jī)器人這個一級應(yīng)用系統(tǒng)的穩(wěn)定性難以保障。即便技術(shù)同學(xué)都是資深的工程師,已經(jīng)按照所能理解的微服務(wù)思想設(shè)計(jì)、按照模塊拆解項(xiàng)目,即便代碼邏輯中已經(jīng)也引用不少設(shè)計(jì)模式來構(gòu)建與擴(kuò)展,即便已經(jīng)是接入了公司各個平臺質(zhì)量工具、寫了不少單元測試。但是在項(xiàng)目新需求迭代時,依舊出現(xiàn)不少“驚喜”,使整個團(tuán)隊(duì)很頭疼。
2.為什么是DDD
為什么是DDD?每天那么多技術(shù)棧,那么多思想,為什么就是DDD來應(yīng)對呢?首先DDD修飾的很好“軟件核心復(fù)雜性應(yīng)對之道”,使得不少人想一探究竟。所以來看看DDD是怎么來解決項(xiàng)目中遇到的挑戰(zhàn)。
首先,我們來看看DDD對復(fù)雜度的歸類,弄明白DDD要應(yīng)對的復(fù)雜度是否是我面臨的挑戰(zhàn)。DDD相關(guān)資料中,從理解能力和預(yù)測能力兩個維度來探索剖析復(fù)雜度的成因。
理解能力(就是軟件系統(tǒng)對開發(fā)人員來說復(fù)雜難以理解):
第一規(guī)模:影響理解能力的第一要素。幾百上千萬行的代碼,各需求點(diǎn)的關(guān)系相互影響。修改一處就會牽一發(fā)動全身。
第二結(jié)構(gòu):不合理甚至混亂的結(jié)構(gòu),導(dǎo)致開發(fā)人員對功能難以維護(hù)。
預(yù)測能力(就是業(yè)務(wù)的發(fā)展難以預(yù)測):
當(dāng)需求變化時,難以預(yù)測軟件實(shí)現(xiàn)的走向,會出現(xiàn)過度設(shè)計(jì)和設(shè)計(jì)不足問題。過度設(shè)計(jì),預(yù)留了很多接口,構(gòu)造了很多模式增加了代碼的實(shí)現(xiàn)復(fù)雜度,但后來發(fā)現(xiàn)用不到。設(shè)計(jì)不足,需求的實(shí)現(xiàn)沒考慮到后期的發(fā)展,當(dāng)變化來臨時需要推翻現(xiàn)有設(shè)計(jì)重新開發(fā),被產(chǎn)品抱怨設(shè)計(jì)能力差。
DDD對復(fù)雜度的成因歸結(jié)為:規(guī)模、結(jié)構(gòu)、變化;規(guī)模和結(jié)構(gòu)制造了理解能力障礙,變化制造了預(yù)測能力障礙,兩者相加形成了復(fù)雜度問題。
其次,DDD并不僅僅是對代碼設(shè)計(jì)階段的理論,而是還包含從需求分析、架構(gòu)映射和建模及實(shí)現(xiàn)的全流程設(shè)計(jì)指導(dǎo)。
需求分析階段,通過相關(guān)指導(dǎo)思想提前準(zhǔn)確獲知業(yè)務(wù)價值,捕獲未來變化方向。架構(gòu)映射階段,給出從需求到架構(gòu)過程的指導(dǎo)思想,增加了設(shè)計(jì)權(quán)重和規(guī)范。通過子領(lǐng)域拆分、系統(tǒng)分層和限界上下文業(yè)務(wù)歸類,給出指導(dǎo)規(guī)范,保障了系統(tǒng)架構(gòu)的清晰,并且降低系統(tǒng)復(fù)雜度。建模及實(shí)現(xiàn)階段,給出來領(lǐng)域驅(qū)動設(shè)計(jì)相關(guān)元模型,使各部分職能分工明確,快速響應(yīng)業(yè)務(wù)需求和未來功能變化。
再次,來看DDD給出的指導(dǎo)思想:
規(guī)模問題:拆邊界。以子領(lǐng)域、限界上下文對拆解分治。
針對分治思想,DDD給出兩個重要的設(shè)計(jì)元模型:限界上下文和上下文映射。
結(jié)構(gòu)問題:分層架構(gòu)+限界隔離。
分層起到了隔離業(yè)務(wù)邏輯和技術(shù)實(shí)現(xiàn)復(fù)雜度問題。DDD引入的分層架構(gòu),將業(yè)務(wù)邏輯封裝到領(lǐng)域?qū)樱螛I(yè)務(wù)邏輯的技術(shù)實(shí)現(xiàn)放到基礎(chǔ)設(shè)施層。在領(lǐng)域?qū)又系膽?yīng)用層封裝應(yīng)用服務(wù),粘合二者進(jìn)行協(xié)作。
變化問題:主動設(shè)計(jì)變化。
變化無法控制,只能擁抱變化。需求分析階段運(yùn)用5W思維識別變化規(guī)律,把控業(yè)務(wù)變化。DDD通過模型驅(qū)動設(shè)計(jì)元模型對限界上下文進(jìn)行領(lǐng)域建模,形成結(jié)合分析、設(shè)計(jì)和實(shí)現(xiàn)一體的領(lǐng)域模型。
最后,來看DDD給出的解決方案。其引入了一套提煉為模式的設(shè)計(jì)元模型,對業(yè)務(wù)軟件做到了對規(guī)模的控制、結(jié)構(gòu)的拆分以及變化的主動響應(yīng)。

簡單介紹下這張圖,整體分為兩個大部分。第一部分是下面虛線圈出來的部分,不涉及具體技術(shù)實(shí)現(xiàn)。在需求分析階段進(jìn)行的,應(yīng)對問題空間的一些元模型方案。另外部分,在第一部分的基礎(chǔ)上,做具體系統(tǒng)架構(gòu)分層、對象抽離聚合、服務(wù)拆解環(huán)節(jié),這個階段做對應(yīng)的設(shè)計(jì)落地。
我的理解是這樣,這套設(shè)計(jì)元模型給出了從需求分析、設(shè)計(jì)和實(shí)現(xiàn)一體整套解決方案。需求分析階段的系統(tǒng)拆解(對應(yīng)圖中子領(lǐng)域元模型)。再拆到更新粒度的限界上下文。并給出各限界的協(xié)同關(guān)系方案(對應(yīng)圖中上下文映射元模型)。設(shè)計(jì)實(shí)現(xiàn)階段給出模型驅(qū)動設(shè)計(jì)的設(shè)計(jì)元方案,通過系統(tǒng)的分層架構(gòu)、領(lǐng)域服務(wù)、聚合等粒度的設(shè)計(jì)。給出一套完善的、有理論支撐的、可落地有標(biāo)準(zhǔn)的解決方案。
上述DDD對問題復(fù)雜度的剖析定位,完全就是電話機(jī)器人系統(tǒng)中的痛點(diǎn)。給出的解決方案,也完美解決業(yè)務(wù)面臨的各類挑戰(zhàn)。認(rèn)識到其價值后,團(tuán)隊(duì)很快達(dá)成共識在后續(xù)的項(xiàng)目中進(jìn)行落地。
3. DDD落地步驟
元模型細(xì)節(jié)、業(yè)務(wù)限界的拆解不展開講了,直接給出我們團(tuán)隊(duì)實(shí)戰(zhàn)中的步驟和產(chǎn)物。
3.1第一步預(yù)研階段
這部分我們的經(jīng)驗(yàn)是團(tuán)隊(duì)中有人充當(dāng)先行者,先花費(fèi)精力做深入學(xué)習(xí)DDD相關(guān)理念,然后同步到整個團(tuán)隊(duì)。就我們團(tuán)隊(duì)來講,調(diào)研階段時間比較零碎不好評估用時多久,團(tuán)隊(duì)科普階段前后4次用時8小時。之后,團(tuán)隊(duì)內(nèi)同學(xué)在有概念指導(dǎo)的基礎(chǔ)上,已具備快速深入學(xué)習(xí)能力。并組織團(tuán)隊(duì)成內(nèi)相互探討印證理解。
3.2第二步引入指導(dǎo)思想和落地規(guī)范
3.2.1 需求分析階段引入5W模型理論支撐,有助辨識出真實(shí)需求,主動把控變化方向和排除無意義需求。
這部分就是5W理論作為跟產(chǎn)品分析需求的理論的支撐,非常有助于識別出真實(shí)的需求,更好的分析出業(yè)務(wù)的發(fā)展方向。也能從源頭上縮減無效需求,直接上圖;

3.2.2 引入服務(wù)規(guī)約,以文檔型對照代碼業(yè)務(wù)功能實(shí)現(xiàn)。有助于開發(fā)及后續(xù)需求梳理,同時也能作為單元測試覆蓋度的考量。
- 3.2.2.1 團(tuán)隊(duì)成員共識,需求先寫服務(wù)規(guī)約,再做開發(fā)。寫服務(wù)規(guī)約的時間,其實(shí)就是技術(shù)對需求理解的梳理,理清了思路,后續(xù)寫代碼時把這部分時間賺回來。
 - 3.2.2.2 服務(wù)規(guī)約及需求,服務(wù)規(guī)約即對應(yīng)單測。順帶解決了先前單測沒有標(biāo)準(zhǔn)(我理解的代碼、方法覆蓋率這類,不能稱作為標(biāo)準(zhǔn))的問題。
 
這里給出我們團(tuán)隊(duì)采用的服務(wù)規(guī)約模板:
編號:標(biāo)記業(yè)務(wù)服務(wù)的唯一編號。
名稱:動詞短語形式的業(yè)務(wù)服務(wù)名。
描述:
作為<角色>
我想要<服務(wù)功能>
以便于<服務(wù)價值>
觸發(fā)事件:
角色主動觸發(fā)的該業(yè)務(wù)服務(wù)事件,可以是點(diǎn)擊UI的控件、具體的策略或伴生系統(tǒng)發(fā)送的消息等。
基本流程:
用于表現(xiàn)業(yè)務(wù)服務(wù)的主流程,即執(zhí)行成功的業(yè)務(wù)場景。也可以稱之為“主成功場景”。
替代流程:
用于表現(xiàn)業(yè)務(wù)服務(wù)的擴(kuò)展流程,即執(zhí)行失敗的業(yè)務(wù)場景。
驗(yàn)收標(biāo)準(zhǔn):
一系列可以接受的條件或業(yè)務(wù)規(guī)則,以要點(diǎn)形式列舉。
3.3第三步確定架構(gòu)方案
學(xué)習(xí)DDD中模型驅(qū)動設(shè)計(jì)元模型的方案。主要是劃分職責(zé)邊界,也就是限界上下文,達(dá)到從傳統(tǒng)網(wǎng)狀結(jié)構(gòu)關(guān)系變?yōu)榇怪鼻蟹株P(guān)系,減少彼此依賴。整體采用限界上線文拆解加菱形驅(qū)動設(shè)計(jì),形成整體思想指導(dǎo)。系統(tǒng)采用分層架構(gòu) COLA 4.0

3.4第四步共識命名標(biāo)準(zhǔn)形成團(tuán)隊(duì)編碼規(guī)范
團(tuán)隊(duì)內(nèi)共識包命名、類命名、出參入?yún)⒌南⑵跫s等規(guī)范。這里想說的是參考標(biāo)準(zhǔn)就是沒有標(biāo)準(zhǔn)。希望大家先能理解DDD思想,然后參照學(xué)習(xí)業(yè)內(nèi)共識性高的命名方案。同時需要兼顧團(tuán)隊(duì)內(nèi)成員編程風(fēng)格喜好,最終來制定自己團(tuán)隊(duì)的編碼規(guī)范。

依我們?nèi)雲(yún)?、出參消息命名來舉例。綜合各方考量,并沒有采用上圖粒度特別細(xì)的命名方式。而是團(tuán)隊(duì)內(nèi)簡單共識為入?yún)?request,出參*reponse命名標(biāo)準(zhǔn)。
3.5第五步結(jié)合業(yè)務(wù)特征識別出限界上下文
基于DDD思想,對業(yè)務(wù)進(jìn)行事件風(fēng)暴,在統(tǒng)一語言的指導(dǎo)下做全局需求分析、架構(gòu)映射設(shè)計(jì),識別出業(yè)務(wù)的限界上下文。
技術(shù)同學(xué)結(jié)合自身業(yè)務(wù)來設(shè)計(jì),參照Demo資料還是比較容易找的到,這里不再贅述。這里給出識別限界上下文的一個指導(dǎo)過程,V型映射過程。

3.6最后進(jìn)入建模的實(shí)現(xiàn)階段
建議采測試驅(qū)動開發(fā)的方式進(jìn)行編碼,即用紅綠黃驅(qū)動;

該方式遵循其三定律,這樣能改善對需求的設(shè)計(jì)不足和過度設(shè)計(jì)問題。
定律一  | 一次只寫一個剛好失敗的測試,作為新加功能的描述。  | 
定律二  | 不寫任何產(chǎn)品代碼,除非它剛好能讓失敗的測試通過。  | 
定律三  | 只在測試全部通過的前提下做代碼重構(gòu),或開始新加功能。  | 
4.對團(tuán)隊(duì)帶來的提升
4.1被動接收需求到主動應(yīng)對
需求分析階段,運(yùn)用5W原則。剖析需求的合理性,能主動把控項(xiàng)目的變化方向。解決“挑戰(zhàn)三”對需求價值辨別和改善了“挑戰(zhàn)四”的把控業(yè)務(wù)發(fā)展變化方向。
4.2降低溝通成本
運(yùn)用統(tǒng)一語言思想溝通,降低“挑戰(zhàn)五”的各個環(huán)節(jié)的協(xié)作成本。
4.3架構(gòu)設(shè)計(jì)提升
通過設(shè)計(jì)元模型的子領(lǐng)域模型、限界上下文合理拆解代碼規(guī)模。通過DDD的分層思想,隔離業(yè)務(wù)邏輯與技術(shù)維度復(fù)雜度,清晰代碼結(jié)構(gòu)。同時項(xiàng)目采用菱形對稱結(jié)構(gòu),通過南北向網(wǎng)關(guān)與外部交互,避免了模塊的網(wǎng)狀情況滋生。解決了“挑戰(zhàn)二”問題和降低了“挑戰(zhàn)一”復(fù)雜度問題。
4.4技術(shù)實(shí)現(xiàn)提升
團(tuán)隊(duì)在開發(fā)業(yè)務(wù)功能時,會考慮需求放到那個限界合理。實(shí)現(xiàn)過程會考慮放到領(lǐng)域?qū)舆€是業(yè)務(wù)服務(wù)層,功能的實(shí)現(xiàn)上采用貧血模型還是充血。
4.5 文檔規(guī)范提升
文檔規(guī)范上,引入服務(wù)規(guī)約機(jī)制。既能作為梳理需求的工具,又能作為單測的依據(jù)。同時還為后期提供了服務(wù)說明的文檔。
4.6代碼實(shí)現(xiàn)提升
代碼實(shí)現(xiàn)上,從架構(gòu)到編碼實(shí)現(xiàn)、命名,形成了一套有標(biāo)注的規(guī)范。
總的來說,該模式下,團(tuán)隊(duì)的思維方式發(fā)生了轉(zhuǎn)變。通過應(yīng)用各類元模型,來應(yīng)對從需求分析到系統(tǒng)架構(gòu)、代碼實(shí)現(xiàn)不同環(huán)節(jié)帶來的挑戰(zhàn)。
5.理論到實(shí)戰(zhàn)遇到的沖突
5.1貧血模型 PK 充血模型
貧血模型:通俗來說,就是domain object只有屬性的getter/setter方法的純數(shù)據(jù)類,業(yè)務(wù)邏輯和應(yīng)用邏輯都放到服務(wù)層中,這種模型下的domain object被Martin Fowler稱之為“貧血的domain object”。
充血模型:反之,充血模型中不僅包含了對象的屬性,還包含了對象的行為,包括業(yè)務(wù)邏輯。
從面向?qū)ο蠼嵌确治?,對象是包含屬性和行為的,理?yīng)是使用充血模型,并且DDD原則上也是建議采用充血模型。但落地到具體開發(fā)現(xiàn)狀,即便是貧血模型有很多問題,但業(yè)內(nèi)存在這么多年、運(yùn)用這么普遍,總歸是有其存在的價值。加上JAVA應(yīng)用大部分采用Mybatis技術(shù)棧,很多對象是插件自動生成的貧血實(shí)體。所以問題來了,采用充血模型意味著一部分便利工具的廢棄。這個問題團(tuán)隊(duì)內(nèi)分歧比較大。最終我們的方式是這部分不做硬性標(biāo)準(zhǔn),但建議使用充血模式。
5.2嚴(yán)格遵守數(shù)據(jù)轉(zhuǎn)換約束
PK 精簡提效的外部數(shù)據(jù)直接使用
在DDD的思想中,為了確保領(lǐng)域服務(wù)的可靠性。要求領(lǐng)域服務(wù)依賴的數(shù)據(jù)為領(lǐng)域內(nèi)的實(shí)體、聚合數(shù)據(jù),不允許直接使用外部的消息鍥約數(shù)據(jù)。對應(yīng)到菱形對稱架構(gòu)的南北向網(wǎng)關(guān)獲取數(shù)據(jù)的轉(zhuǎn)換,會帶來額外的工作量。有團(tuán)隊(duì)同學(xué)建議某些相對穩(wěn)定的結(jié)構(gòu)可以不遵守該原則,理由是能提高開發(fā)速度,且認(rèn)為可能90%的數(shù)據(jù)都是如數(shù)據(jù)庫這類結(jié)構(gòu)較為穩(wěn)定的資源。但最終團(tuán)隊(duì)內(nèi)還是嚴(yán)格要求遵守該指導(dǎo)思想。
5.3緩存處理允許共享 PK 限界隔離
同一系統(tǒng)不同限界中緩存處理:允許共享 PK 各限界隔離。
就當(dāng)時場景來看,允許共享短期內(nèi)能減少部分工作量、節(jié)約資源等優(yōu)勢。但之所以要劃分限界,就是為了拆解關(guān)系防止過大。這里給到的建議是,首先考慮共用數(shù)據(jù)的服務(wù)是不是合并為一個限界比較合理。如果不能合并,必須隔離數(shù)據(jù)。
5.4服務(wù)規(guī)約對照需求的前端 PK 后端
指導(dǎo)理論思想很美好,需求分析時要求屏蔽技術(shù)實(shí)現(xiàn)思維。但終歸是要落地到技術(shù)棧的,落地到技術(shù)實(shí)現(xiàn)時就會受技術(shù)實(shí)現(xiàn)的干擾。當(dāng)時比較突出的一個問題,功能的實(shí)現(xiàn)可以放到前端,也可以后端服務(wù)實(shí)現(xiàn)。
舉例一:需求要求“id+名字”組合展示,但是后端接口返回的id、名字兩個字段,實(shí)際前端技術(shù)棧來組合,那面向前端與后端的服務(wù)規(guī)約不一致。
舉例二:需求要求驗(yàn)證參數(shù)非空。在一些內(nèi)部系統(tǒng)中,我們團(tuán)隊(duì)技術(shù)都是前后端全棧工程師,分工按需求模塊開發(fā)。往往不會特別嚴(yán)謹(jǐn)?shù)絻啥硕甲鲵?yàn)證。也導(dǎo)致服務(wù)規(guī)約面向哪端有沖突。
我們最終的取舍:團(tuán)隊(duì)采用面向后端服務(wù)層面。但同時做一些改進(jìn),如驗(yàn)證這類功能轉(zhuǎn)移到接口層面來實(shí)現(xiàn)。
5.5誰來確保服務(wù)規(guī)約編寫是否正確產(chǎn)品PK 技術(shù)
最開始階段理想狀態(tài)是由需求側(cè)產(chǎn)品來核驗(yàn),本著誰的需求誰確認(rèn)原則。但由于存在4.4的差異問題,我們實(shí)際落地是由技術(shù)負(fù)責(zé)人來審核。
6.未來在DDD應(yīng)用方面的改進(jìn)和總結(jié)
DDD的應(yīng)用,團(tuán)隊(duì)目前做到了從架構(gòu)和規(guī)范上面進(jìn)行落地。但一些細(xì)節(jié)如:聚合類、實(shí)體、值對象這些設(shè)計(jì),并沒有特別精細(xì)。后期會進(jìn)一步推進(jìn)在這些細(xì)粒度上面的改進(jìn)。同時,對一些在用的老項(xiàng)目,按照DDD思想進(jìn)行改造重構(gòu)。
有人認(rèn)為應(yīng)用DDD會降低開發(fā)效率,這個也是很多團(tuán)隊(duì)的一個顧慮。我們是這么看待這個問題的,應(yīng)用DDD的場景是解決復(fù)雜性業(yè)務(wù)問題的,確實(shí)是會增加代碼量。但不等于降低開發(fā)效率。清晰的架構(gòu)結(jié)構(gòu)、聚合的領(lǐng)域服務(wù)和規(guī)范的標(biāo)準(zhǔn),對后期需求升級、代碼維護(hù)、復(fù)雜度控制帶來的收益,遠(yuǎn)大于投入。并且,軟件行業(yè)給出的數(shù)據(jù),80%的時間是在需求分析和設(shè)計(jì),開發(fā)時間只占到20%。因此這部分損耗不是重點(diǎn)。
最后,陳述一下使用DDD的感受。DDD各種元模型種類繁多,大家可以根據(jù)業(yè)務(wù)面臨的痛點(diǎn)有目的來學(xué)習(xí)和采用。在實(shí)際的業(yè)務(wù)環(huán)境中,我們的領(lǐng)域模型或多或少的都有一定的“特殊性”,如果100%的要符合DDD規(guī)范可能成本會比較高,所以最主要的是理解DDD思想,最終選擇合適自身業(yè)務(wù)的方案。
作者簡介

李曉華
- 經(jīng)銷商事業(yè)部-經(jīng)銷商技術(shù)部。
 - 2016年加入汽車之家,目前任職于經(jīng)銷商數(shù)據(jù)架構(gòu)組團(tuán)隊(duì),負(fù)責(zé)電話機(jī)器人項(xiàng)目。
 















 
 
 







 
 
 
 