日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在重構(gòu)業(yè)務(wù)系統(tǒng)中的實(shí)踐

 xujin3 2019-05-13

韓宇斌,現(xiàn)就職于羅輯思維得到后端,曾效力于好大夫在線、云智慧等。一線負(fù)責(zé)過(guò)傳統(tǒng)軟件公司ToB類(lèi)和互聯(lián)網(wǎng)公司ToC類(lèi)的業(yè)務(wù)系統(tǒng),理解體會(huì)過(guò)其中的相同與不同,擅長(zhǎng)利用DDD和OO思想對(duì)業(yè)務(wù)需求進(jìn)行分析建模與設(shè)計(jì)開(kāi)發(fā)。

張逸老師推薦:倘若說(shuō)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)難,我認(rèn)為其中的癥結(jié)是沒(méi)有打通業(yè)務(wù)與開(kāi)發(fā)溝通的橋梁,各自為政,導(dǎo)致開(kāi)發(fā)對(duì)業(yè)務(wù)傻傻不了解,業(yè)務(wù)對(duì)開(kāi)發(fā)則怨言滿(mǎn)滿(mǎn)。本文來(lái)自得到后端開(kāi)發(fā)工程師的一線經(jīng)歷,通過(guò)引入領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)解決了前期讓人絕望的問(wèn)題。

編者按:領(lǐng)域建模首先要解決業(yè)務(wù)領(lǐng)域問(wèn)題,而這不是翻譯過(guò)來(lái)的一個(gè)個(gè)需求和用例,是需要挖掘背后的專(zhuān)業(yè)領(lǐng)域,以及客戶(hù)真實(shí)的需求。本文就是很好的一個(gè)案例。

學(xué)習(xí)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)相關(guān)的知識(shí)有一段時(shí)間了,但是一直苦惱于其中的一些概念無(wú)法理解透徹,導(dǎo)致無(wú)法落地實(shí)現(xiàn)甚至生根發(fā)芽。機(jī)緣巧合,不久前的工作內(nèi)容中,需要把之前分散在若干個(gè)業(yè)務(wù)系統(tǒng)中(微服務(wù))的購(gòu)買(mǎi)相關(guān)功能進(jìn)行梳理重構(gòu),在這個(gè)重構(gòu)的過(guò)程中,充分運(yùn)用了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中戰(zhàn)略設(shè)計(jì)部分的思想,達(dá)成了目標(biāo)。

本文將結(jié)合一些文字和圖片,圍繞著領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中戰(zhàn)略部分的三個(gè)核心概念:領(lǐng)域通用語(yǔ)言(UBIQUITOUS LANGUAGE),領(lǐng)域模型(Domain)和限界上下文(Bounded Context),來(lái)分享下心得。

1

系統(tǒng)居然不能完全解決業(yè)務(wù)的問(wèn)題

訂單化系統(tǒng)的前世

入職得 到后端不久,團(tuán)隊(duì)交給我一份設(shè)計(jì)文檔和排期計(jì)劃,要求完成個(gè)開(kāi)發(fā)任務(wù),實(shí)現(xiàn)一個(gè)“訂單化”系統(tǒng)。文檔中,該系統(tǒng)的設(shè)計(jì)目標(biāo)是:

實(shí)現(xiàn)一個(gè)代理服務(wù),對(duì)接商城平臺(tái)組的訂單系統(tǒng)和基礎(chǔ)平臺(tái)組的支付系統(tǒng),然后推動(dòng)近若干個(gè)業(yè)務(wù)系統(tǒng)改造,把原來(lái)直接調(diào)用外部系統(tǒng)的方式,改成調(diào)用這個(gè)新的代理服務(wù)。

讓我們看下文檔中的架構(gòu)圖,簡(jiǎn)潔明了,而我的工作也似乎就是個(gè)“體力活”。

如果是剛出道那會(huì),拿到設(shè)計(jì)文檔,也許我早就不管三七二十一地敲代碼了。但是,經(jīng)歷過(guò)多年在業(yè)務(wù)開(kāi)發(fā)線上摸爬滾打,加上對(duì)學(xué)習(xí)OO和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的一些領(lǐng)悟,直覺(jué)告訴我沒(méi)那么簡(jiǎn)單,我應(yīng)該了解清楚來(lái)龍去脈再動(dòng)手……

經(jīng)過(guò)調(diào)研,我終于明白了“訂單化”是什么?顧名思義,就是把得到app內(nèi)所有的虛擬商品在交付時(shí)用標(biāo)準(zhǔn)的訂單號(hào)關(guān)聯(lián)起來(lái)?你也許會(huì)好奇,一個(gè)電商平臺(tái)居然沒(méi)有訂單?我相信“存在即合理”,當(dāng)時(shí)這么做肯定有當(dāng)時(shí)的原因和背景,說(shuō)白了一切都是為了快速上線,快速驗(yàn)證得到app的商業(yè)模式,活下去比設(shè)計(jì)實(shí)現(xiàn)一個(gè)完美的系統(tǒng)優(yōu)先級(jí)更高。

沒(méi)有訂單的購(gòu)買(mǎi)機(jī)制運(yùn)行了一年多后,商城平臺(tái)組實(shí)現(xiàn)了訂單系統(tǒng),經(jīng)過(guò)財(cái)務(wù)核算部門(mén)的“努力”推動(dòng),若干后端業(yè)務(wù)方把虛擬商品的購(gòu)買(mǎi)對(duì)接了訂單系統(tǒng)的三個(gè)接口(創(chuàng)建、支付、簽收),這就是最初的訂單化的“萌芽”。

如下圖,以精品課系統(tǒng)舉例,要實(shí)現(xiàn)精品課的售賣(mài),該系統(tǒng)要和若干個(gè)外部系統(tǒng)直接打交道,如果把別的幾個(gè)業(yè)務(wù)系統(tǒng)的調(diào)動(dòng)關(guān)系也畫(huà)上,腦補(bǔ)一下這個(gè)圖會(huì)成為什么樣子。不管怎樣,財(cái)務(wù)核算部門(mén)的第一步要求是實(shí)現(xiàn)了,那就是用訂單號(hào)串起來(lái)了所有的購(gòu)買(mǎi)信息,實(shí)現(xiàn)了原始樸素的“訂單化”要求。

如此復(fù)雜的調(diào)用關(guān)系,和“高內(nèi)聚低耦合”背道而馳,很快就暴露了問(wèn)題:業(yè)務(wù)方要求在訂單簽收的時(shí)候增加一個(gè)簽收時(shí)間字段,并且要求傳遞寫(xiě)入已購(gòu)數(shù)據(jù)表的實(shí)際時(shí)間。這個(gè)很小的需求,據(jù)參與的同事說(shuō),投入了20多人/日,將近一個(gè)月才上線,因?yàn)橐礁臄?shù)個(gè)業(yè)務(wù)系統(tǒng)呢!

團(tuán)隊(duì)嘗到了痛苦,決定改變,于是下決心做一個(gè)“訂單化”系統(tǒng),同時(shí)把財(cái)務(wù)要求的數(shù)據(jù)校驗(yàn)規(guī)則加上。

訂單化系統(tǒng)不能完全解決業(yè)務(wù)的問(wèn)題

分析業(yè)務(wù)規(guī)則并讀了一些代碼后,整理出了訂單化系統(tǒng)的一些分析和設(shè)計(jì)文檔,經(jīng)過(guò)了團(tuán)隊(duì)內(nèi)部確認(rèn)理解正確,找業(yè)務(wù)方在溝通一下就可以開(kāi)工了。如下圖,是其中在第三方支付(微信和支付寶)這個(gè)場(chǎng)景下的時(shí)序圖:

開(kāi)發(fā)工作眼看著就要開(kāi)始了,我?guī)е莆盏膬?nèi)容,滿(mǎn)懷信心的去和合作部門(mén)(關(guān)注訂單化系統(tǒng)的一些“老板”們)交流,卻感覺(jué)大家關(guān)注的點(diǎn)甚至方向都常常不一致,越交流內(nèi)心越分裂。

我作為訂單化系統(tǒng)的負(fù)責(zé)人是乙方,最關(guān)心的是:基于現(xiàn)有確定的需求,如何盡快上線訂單化系統(tǒng)。

而他們甲方關(guān)心的是:一定要正確的記賬(面向現(xiàn)在),能夠高效準(zhǔn)確的算賬(面向未來(lái)),把過(guò)去的賬給解釋清楚(面向過(guò)去),似乎對(duì)“訂單化”系統(tǒng)并不是那么“感興趣”。

我的目標(biāo)在財(cái)務(wù)生態(tài)圈里只是個(gè)過(guò)程!怎么達(dá)到真正的目標(biāo)?我該怎么辦?那個(gè)時(shí)間段感受到了雙重的壓力,一面來(lái)自于業(yè)務(wù)方,因?yàn)榻唤o我的開(kāi)發(fā)任務(wù)居然不能完全解決業(yè)務(wù)的問(wèn)題,一面來(lái)自于開(kāi)發(fā)團(tuán)隊(duì)內(nèi)部,領(lǐng)導(dǎo)們不理解為什么訂單化系統(tǒng)遲遲不能取得顯著進(jìn)展……

轉(zhuǎn)折點(diǎn)

帶著問(wèn)題,我參與了財(cái)務(wù)審計(jì)對(duì)賬工作。開(kāi)始時(shí),可以用“身陷重圍,十面埋伏”來(lái)形容,因?yàn)閹缀趺刻於紩?huì)被“拷問(wèn)”,為什么這么多問(wèn)題數(shù)據(jù)?誰(shuí)是對(duì)應(yīng)的產(chǎn)品經(jīng)理呢?得到端誰(shuí)對(duì)權(quán)益數(shù)據(jù)準(zhǔn)確性負(fù)責(zé)呢?讓你們老大招個(gè)懂財(cái)務(wù)的產(chǎn)品經(jīng)理吧!誰(shuí)都能聽(tīng)出來(lái),是對(duì)我能否勝任工作的擔(dān)憂和不信任……

終于順利出關(guān),完成了公司的要求,自己直接和業(yè)務(wù)方的伙伴們,面對(duì)面的工作近一個(gè)月,讓我收獲頗豐:

  • 從財(cái)務(wù)角度,理解了和體會(huì)了正確記錄數(shù)據(jù)的重要性

  • 推進(jìn)已知問(wèn)題的止損,理解了得到“訂單化”在全局的地位

  • “提煉”了一些“統(tǒng)一語(yǔ)言”

  • 自己下決心:不能為了“訂單化”而實(shí)現(xiàn)“訂單化”

  • 收獲了些許財(cái)務(wù)思維,和財(cái)務(wù)相關(guān)的數(shù)據(jù)變動(dòng)和規(guī)則結(jié)論,要“記在小本本上”

  • 收獲了財(cái)務(wù)生態(tài)圈的信任。信任很關(guān)鍵,一個(gè)團(tuán)隊(duì)或者跨團(tuán)隊(duì)協(xié)作時(shí),信任本身就是生產(chǎn)力。

2

“訂單化”系統(tǒng)演變?yōu)榱恕坝唵谓桓丁?系統(tǒng)

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)思想指導(dǎo)的開(kāi)發(fā)過(guò)程,是一個(gè)全程強(qiáng)調(diào)“領(lǐng)域模型”的開(kāi)發(fā)過(guò)程,首先開(kāi)發(fā)團(tuán)隊(duì)要和領(lǐng)域?qū)<胰メ槍?duì)業(yè)務(wù)需求進(jìn)行充分的討論溝通,才能確定真正的問(wèn)題域和業(yè)務(wù)期望。

主動(dòng)與業(yè)務(wù)的溝通

下面的圖,是一次找財(cái)務(wù)方向的產(chǎn)品經(jīng)理溝通討論時(shí)給我畫(huà)的,產(chǎn)品經(jīng)理說(shuō)第一次有技術(shù)主動(dòng)和她聊財(cái)務(wù)相關(guān)的業(yè)務(wù),一高興就給我講了很多。

為了讓自己的理解和產(chǎn)品經(jīng)理想要表達(dá)的不產(chǎn)生太大的偏差,當(dāng)天結(jié)合這個(gè)草圖,趕緊畫(huà)了一個(gè)自己理解的圖,第二天又去給產(chǎn)品經(jīng)理講了一遍。反述的過(guò)程,自己明白訂單化在全局的位置,雖然貌似不起眼但是卻擔(dān)負(fù)著得到所有虛擬商品的交付。

經(jīng)過(guò)和業(yè)務(wù)方的多次交流后,我們逐漸提煉和理解了一些“統(tǒng)一語(yǔ)言”,舉例如下:

  • 訂單完整的生命周期:下單,支付,已支付待交付,交付(發(fā)貨),簽收

  • 確收:收入和交付數(shù)據(jù)核對(duì)無(wú)誤,可以確認(rèn)為財(cái)務(wù)收入

  • 權(quán)益:用戶(hù)購(gòu)買(mǎi)虛擬商品后,獲得可以學(xué)習(xí)對(duì)應(yīng)課程的權(quán)利

  • 補(bǔ)償:該給權(quán)益的時(shí)候沒(méi)給,要補(bǔ)上權(quán)益

回到領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),扣一下字眼。首先,一個(gè)領(lǐng)域,解決一個(gè)核心問(wèn)題,任何一個(gè)系統(tǒng)都會(huì)屬于某個(gè)特定的領(lǐng)域;確定了系統(tǒng)所屬的領(lǐng)域,相當(dāng)于確定了系統(tǒng)的核心目標(biāo);確定了系統(tǒng)的核心業(yè)務(wù),那么要解決的關(guān)鍵問(wèn)題、問(wèn)題的范圍邊界就基本確定了。驅(qū)動(dòng),我理解的是回答優(yōu)先級(jí)和孰輕孰重,前面的“訂單化”系統(tǒng)之所以不能解決業(yè)務(wù)的問(wèn)題,就是因?yàn)橄萑肓苏`區(qū)之一“還沒(méi)有確定自己要干什么,就陷入技術(shù)細(xì)節(jié)”。

訂單化系統(tǒng)演變?yōu)椤坝唵谓桓断到y(tǒng)”

經(jīng)過(guò)繼續(xù)深入調(diào)研后,把“訂單化”要完成的內(nèi)容,劃分成了支付和交付兩部分,如下圖。

重新確定的領(lǐng)域問(wèn)題是:訂單簽約和履約,正確的交付權(quán)益。從全局角度看,就是交易與訂單。交易是行為,訂單是契約,交付是履約。得到后端的角度看,核心領(lǐng)域問(wèn)題是“訂單交付”,所以一個(gè)“訂單交付”系統(tǒng)就呼之欲出了。幾乎在同時(shí),公司也確定了要做一個(gè)交易中心的中臺(tái)服務(wù),去和若干支付系統(tǒng)對(duì)接,我把他們起名為“交易生態(tài)圈”。

下面這個(gè)圖,用來(lái)說(shuō)明訂單交付系統(tǒng)和其它系統(tǒng)的關(guān)系,在整個(gè)得到app中用戶(hù)發(fā)生購(gòu)買(mǎi)行為后,一起確保用戶(hù)的購(gòu)買(mǎi)權(quán)益及時(shí)交付,一起履約訂單這個(gè)合同。

“訂單交付系統(tǒng)”的設(shè)計(jì)建模

從前面的內(nèi)容中我們可以看到,“訂單化”系統(tǒng)的設(shè)計(jì),依然沒(méi)有使得各個(gè)業(yè)務(wù)系統(tǒng)(諸如精品課、訂閱專(zhuān)欄等)從購(gòu)買(mǎi)交付的商品售賣(mài)場(chǎng)景擺脫出來(lái),導(dǎo)致各個(gè)業(yè)務(wù)系統(tǒng)各自為戰(zhàn)的重復(fù)實(shí)現(xiàn)了自己不擅長(zhǎng)的商品購(gòu)買(mǎi)交付邏輯,由于缺乏領(lǐng)域知識(shí)敏感度,產(chǎn)生的交付數(shù)據(jù)達(dá)不到財(cái)務(wù)核算的精確要求。

這個(gè)其實(shí)在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)思想中也有理論依據(jù),原有的建模方法陷入了“以用戶(hù)為中心”的誤區(qū)。DDD的思想認(rèn)為,建模不能以用戶(hù)為中心作為出發(fā)點(diǎn),在人機(jī)交互系統(tǒng)面前,各個(gè)系統(tǒng)的領(lǐng)域模型將變得沒(méi)有差別,職責(zé)會(huì)不明,因?yàn)闊o(wú)論什么都可以歸結(jié)為“用戶(hù)的行為”,以用戶(hù)為中心來(lái)思考領(lǐng)域模型的思維只是停留在需求的表面,而沒(méi)有挖掘出真正的需求的本質(zhì)。

借助DDD的建模思想指導(dǎo),進(jìn)行了重新建模,新模型面對(duì)的核心領(lǐng)域模型是“商品”,核心限界上下文是“訂單交付”。

實(shí)現(xiàn)后的訂單交付系統(tǒng),使得從下單到交付,業(yè)務(wù)系統(tǒng)無(wú)需關(guān)注,感覺(jué)不到訂單的存在。

3

用限界上下文保護(hù)領(lǐng)域

確定了領(lǐng)域后,就要保護(hù)領(lǐng)域不能隨意被“侵犯”,而保護(hù)的依據(jù),就是“限界上下文”。如下圖,Eric Evans 用細(xì)胞來(lái)形容限界上下文,因?yàn)椤凹?xì)胞之所以能夠存在,是因?yàn)榧?xì)胞膜限定了什么在細(xì)胞內(nèi),什么在細(xì)胞外,并且確定了什么物質(zhì)可以通過(guò)細(xì)胞膜。”這里,細(xì)胞代表上下文,而細(xì)胞膜代表了包裹上下文的邊界。

對(duì)業(yè)務(wù)上下文和限界的理解不足,很容易切換到以用戶(hù)為中心去建立領(lǐng)域模型的心流模式。

例如,人去乘坐飛機(jī),要強(qiáng)調(diào)出'機(jī)場(chǎng)登機(jī)流程管理'這個(gè)上下文的重要性,不管到機(jī)場(chǎng)之前是什么角色,人到了登機(jī)這個(gè)場(chǎng)景就是乘客,是屬于“登機(jī)流程”這個(gè)上下文的,要遵守這個(gè)場(chǎng)景上下文的業(yè)務(wù)規(guī)則和規(guī)范,接受“登機(jī)流程”的調(diào)度指揮,而不是由著自己“肆意妄為”。

由機(jī)場(chǎng)“登機(jī)流程上下文”業(yè)務(wù)規(guī)則調(diào)度,和乘客去主動(dòng)觸發(fā)登記所需要的動(dòng)作,完全可以表現(xiàn)為兩種設(shè)計(jì),偽代碼如下。

前者

登機(jī)流程上下文.排隊(duì)(乘客)

登機(jī)流程上下文.安檢(乘客)

登機(jī)流程上下文.擺渡(乘客,航班)

登機(jī)流程上下文.登機(jī)(乘客,航班)

后者

乘客.排隊(duì)(機(jī)場(chǎng))

乘客.我要安檢(機(jī)場(chǎng))

乘客.我要坐擺渡車(chē)(擺渡車(chē))

乘客.我要上飛機(jī)(航班)

前者是有序的安全的,不會(huì)給機(jī)場(chǎng)制造意外,后者機(jī)場(chǎng)是不可控的。

在“訂單交付系統(tǒng)”推進(jìn)的過(guò)程中,由于大家立場(chǎng)不同,所以遇到一些來(lái)破壞領(lǐng)域的事情也就不足為奇,例如我推進(jìn)了如下的一些動(dòng)作來(lái)保衛(wèi)領(lǐng)域,其中有些動(dòng)作已經(jīng)完全超越了一名“開(kāi)發(fā)人員”的職責(zé)范圍。一名技術(shù)人員敢于對(duì)業(yè)務(wù)內(nèi)容做決策,離不開(kāi)對(duì)領(lǐng)域知識(shí)的把握。

4

總結(jié)

DDD思想指導(dǎo)的開(kāi)發(fā)過(guò)程,首先是開(kāi)發(fā)團(tuán)隊(duì)要和領(lǐng)域?qū)<胰メ槍?duì)業(yè)務(wù)需求進(jìn)行充分的討論溝通,這一點(diǎn)很重要,業(yè)務(wù)線的開(kāi)發(fā)人員有個(gè)不好的習(xí)慣:被動(dòng)接受需求,回頭再來(lái)抱怨業(yè)務(wù)人員或者產(chǎn)品經(jīng)理沒(méi)有表述清楚,人非圣賢孰能無(wú)過(guò),合作的就是要互相補(bǔ)位。

在一個(gè)DDD的一個(gè)討論群里,有一位伙伴問(wèn),領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的價(jià)值到底在什么地方?筆者在公司內(nèi)做了一次關(guān)于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的分享后,同樣有小伙伴問(wèn)我,學(xué)習(xí)DDD到底能給工作帶來(lái)什么?

有的伙伴說(shuō),DDD難是因?yàn)樗鼪](méi)有固定的招式!這不是一個(gè)好回答的問(wèn)題,因?yàn)槿绻没卮穑苍SDDD早就像敏捷思想、OO(面向?qū)ο螅┧枷?、MVC、微服務(wù)那樣火遍大江南北甚至五湖四海了……但是如果你些許認(rèn)真的學(xué)習(xí)過(guò)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),便會(huì)發(fā)現(xiàn),到處都有DDD的思想。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多