版權(quán)聲明:本作品采用【知識(shí)共享署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際許可協(xié)議】進(jìn)行許可。
前言
2019年茎毁,在我對(duì)DDD進(jìn)行基準(zhǔn)化的過(guò)程中匹中,遇到過(guò)非常多的挑戰(zhàn),其中一個(gè)便是:
DDD的設(shè)計(jì)過(guò)程淑掌,到底應(yīng)該分為多少個(gè)階段?每個(gè)階段做什么事情蝶念?
這個(gè)困惑來(lái)自于書(shū)本上抛腕,以及其他咨詢師在咨詢過(guò)程中對(duì)于DDD設(shè)計(jì)和操作的差異:
- 有的人會(huì)從電梯演講和用戶地圖開(kāi)始做設(shè)計(jì)和分析;
- 有的人會(huì)從事件風(fēng)暴開(kāi)始做設(shè)計(jì)和分析媒殉;
- 有的人會(huì)從子域開(kāi)始做設(shè)計(jì)和分析担敌;
- 有的人會(huì)從限界上下文開(kāi)始做設(shè)計(jì)和分析;
- 有的人會(huì)直接從領(lǐng)域建模的聚合廷蓉、實(shí)體全封、值對(duì)象開(kāi)始做設(shè)計(jì)和分析;
- 當(dāng)然,還有的人會(huì)使用“名詞動(dòng)詞法”直接從用例描述開(kāi)始做設(shè)計(jì)和分析刹悴。
對(duì)于實(shí)際的學(xué)習(xí)者和使用者來(lái)說(shuō)行楞,這種混亂的操作手法所形成的不一致和不流暢體驗(yàn),對(duì)于堅(jiān)持進(jìn)行DDD設(shè)計(jì)和減少吵架來(lái)說(shuō)土匀,簡(jiǎn)直是一種毀滅性的影響子房。
在這個(gè)過(guò)程中,最讓我感觸深刻的恒削,是在于大家在落地DDD的時(shí)候池颈,使用了大量具有“二義性”的詞匯,諷刺的是钓丰,這與DDD所強(qiáng)調(diào)的統(tǒng)一語(yǔ)言是背道而馳的躯砰。
其中對(duì)于上述混亂影響最大的因素之一,就是大家對(duì)于DDD的“戰(zhàn)略設(shè)計(jì)”和“戰(zhàn)術(shù)設(shè)計(jì)”認(rèn)知不一致(甚至說(shuō)是混沌)的問(wèn)題携丁。
所以琢歇,這篇文章,就是圍繞這兩個(gè)概念梦鉴,來(lái)說(shuō)一說(shuō)我是如何在基準(zhǔn)化的過(guò)程中解決這個(gè)問(wèn)題李茫,統(tǒng)一并形成較為流暢的分段式的設(shè)計(jì)過(guò)程的。
混亂的戰(zhàn)略設(shè)計(jì)和戰(zhàn)術(shù)設(shè)計(jì)
一談起“戰(zhàn)略設(shè)計(jì)”和“戰(zhàn)術(shù)設(shè)計(jì)”肥橙,你一定會(huì)聽(tīng)到“問(wèn)題域”魄宏、“方案域”、“實(shí)現(xiàn)域”等名詞存筏。
我的同事肖然在經(jīng)過(guò)反復(fù)理解和提煉之后宠互,曾經(jīng)提出過(guò)一個(gè)用于解釋“問(wèn)題與方案”、“戰(zhàn)略與戰(zhàn)術(shù)”的“元模型”:
這個(gè)模型其實(shí)對(duì)于具備多維思維和對(duì)DDD有著深入理解的人來(lái)說(shuō)椭坚,是一種不錯(cuò)的可視化輔助理解手段(劃分的合理性僅供參考)予跌。但是在成為更多的咨詢師做DDD咨詢或培訓(xùn)時(shí)開(kāi)篇必用的材料之后,事情就變得詭異了善茎。因?yàn)檫@個(gè)元模型對(duì)于咨詢師或者培訓(xùn)師是一個(gè)比較好的記憶工具券册,而不是用來(lái)給別人解釋的適合的工具。
當(dāng)沒(méi)有意識(shí)到這一點(diǎn)的人在使用這個(gè)模型給客戶解釋的時(shí)候垂涯,會(huì)向客戶描述成:“問(wèn)題域的戰(zhàn)略設(shè)計(jì)”烁焙、“問(wèn)題域的戰(zhàn)術(shù)設(shè)計(jì)”、“解決方案域的戰(zhàn)略設(shè)計(jì)”以及“解決方案的戰(zhàn)術(shù)設(shè)計(jì)”耕赘。
經(jīng)過(guò)實(shí)戰(zhàn)證明骄蝇,這種方式不到1分鐘,就能讓客戶及對(duì)DDD理論沒(méi)有深入了解的人暈菜鞠苟,屢試不爽。
它們是從哪兒來(lái)的?
在搞清楚這個(gè)問(wèn)題之前当娱,我們先要追本溯源吃既,看看這些概念是從哪里來(lái)的。
問(wèn)題域 / 方案域 / 實(shí)現(xiàn)域
什么是問(wèn)題域跨细?什么是方案域鹦倚?什么是實(shí)現(xiàn)域?
非常有意思的是冀惭,以上名詞在我搜索的過(guò)程中震叙,能夠搜到的結(jié)果絕大多數(shù)都是和軟件系統(tǒng)的業(yè)務(wù)分析及領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)相關(guān)的,當(dāng)然他們還有很多不同的翻譯或者別稱(chēng)散休。具體到底最初是哪里定義了這三個(gè)詞匯媒楼,我目前還無(wú)從查證。但僅從字面上來(lái)說(shuō)戚丸,這是其實(shí)是一個(gè)非常自然的划址,人類(lèi)解決問(wèn)題的過(guò)程。
我不想用書(shū)本上或者別人博客里的概念進(jìn)行重復(fù)介紹限府,我更喜歡用我在做咨詢的時(shí)候總是會(huì)用一個(gè)屢試不爽的小測(cè)試來(lái)讓大家體會(huì)夺颤。
首先,我會(huì)問(wèn):
我:“我餓了胁勺∈览剑”
然后,我會(huì)讓大家根據(jù)這個(gè)問(wèn)題來(lái)接一句話去將對(duì)話接下去署穗,這時(shí)候很多人會(huì)這樣說(shuō):
客戶A:“你吃什么寥裂?”
客戶B:“走,一起吃飯去蛇捌?”
客戶C:“你想什么時(shí)候吃抚恒?”
……
以上就是絕大多數(shù)人所習(xí)慣的基于方案而非問(wèn)題進(jìn)行回答的方式。但一個(gè)更正確的络拌,體現(xiàn)問(wèn)題驅(qū)動(dòng)的答法應(yīng)該是:
某善于問(wèn)題驅(qū)動(dòng)的客戶:“你為什么餓了俭驮?”
這時(shí)候,接下來(lái)我的回答有可能是:
我:“我中午加班開(kāi)會(huì)春贸,時(shí)間比較緊混萝,下午還要來(lái)給大家做工作坊,所以中午沒(méi)吃飯萍恕,現(xiàn)在感覺(jué)有些低血糖逸嘀。”
最后允粤,得到的答案往往就會(huì)跟之前有很大不同:
客戶A:“要不要我給你找點(diǎn)吃的你先墊一墊崭倘?”
客戶B:“要不我們先暫停工作坊你去吃點(diǎn)東西翼岁?”
……
在這個(gè)例子中,包含幾個(gè)不同的部分:
- 待解決問(wèn)題:我餓了
- 問(wèn)題澄清的結(jié)果:中午加班開(kāi)會(huì)司光,時(shí)間比較緊琅坡,下午還要來(lái)給大家做工作坊,所以中午沒(méi)吃飯残家,現(xiàn)在感覺(jué)有些低血糖
- 解決方案:先墊一墊 or 暫停工作坊去吃東西
- 實(shí)現(xiàn)細(xì)節(jié):先吃塊兒巧克力 or 去外面吃快餐
讓我給予一個(gè)簡(jiǎn)單而非嚴(yán)謹(jǐn)?shù)目偨Y(jié):
問(wèn)題需要被澄清榆俺,問(wèn)題澄清的結(jié)果決定解決方案,問(wèn)題往往會(huì)有多種解決方案坞淮,每種解決方案的落地過(guò)程是實(shí)現(xiàn)細(xì)節(jié)茴晋。
那么,所謂的“問(wèn)題域”無(wú)非就是“待解決問(wèn)題的集合”回窘,“方案域”便是“解決方案的集合”诺擅,“實(shí)現(xiàn)域”便是“實(shí)現(xiàn)細(xì)節(jié)的集合”。而“領(lǐng)域驅(qū)動(dòng)”毫玖,其實(shí)就是“問(wèn)題驅(qū)動(dòng)”——從澄清關(guān)鍵業(yè)務(wù)問(wèn)題開(kāi)始掀虎,逐漸尋找適合的解決方案,再到確定實(shí)現(xiàn)細(xì)節(jié)的過(guò)程付枫。
戰(zhàn)略設(shè)計(jì) / 戰(zhàn)術(shù)設(shè)計(jì)
說(shuō)到“戰(zhàn)略設(shè)計(jì)”和“戰(zhàn)術(shù)設(shè)計(jì)”烹玉,這兩個(gè)詞的來(lái)源也非常有意思,讓我們來(lái)說(shuō)說(shuō)阐滩。
(以下僅以國(guó)內(nèi)翻譯過(guò)的書(shū)籍來(lái)介紹)
Eric Evans最初的解釋
“戰(zhàn)略設(shè)計(jì)(strategic design)”一詞最早來(lái)自于2004年Eric Evans最初的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對(duì)之道》一書(shū)的最后一個(gè)部分(第四部分:戰(zhàn)略設(shè)計(jì))二打。
他的原意是:
戰(zhàn)略設(shè)計(jì):一種針對(duì)系統(tǒng)整體的建模和設(shè)計(jì)決策。這樣的決策影響整個(gè)項(xiàng)目掂榔,而且必須由團(tuán)隊(duì)來(lái)制定继效。
在Eric Evans的書(shū)中,戰(zhàn)略設(shè)計(jì)會(huì)優(yōu)先關(guān)注限界上下文以及限界上下文之間的協(xié)作關(guān)系装获,然后通過(guò)精煉的方式得到核心域和通用域等“模式”瑞信。而在整個(gè)書(shū)中,其實(shí)有關(guān)于統(tǒng)一語(yǔ)言和建模的細(xì)節(jié)都是在全書(shū)的前三個(gè)部分討論的穴豫,
也就是說(shuō)凡简,在最初的這本書(shū)中,并沒(méi)有“戰(zhàn)術(shù)設(shè)計(jì)”一詞精肃,而Eric Evans是先說(shuō)的“戰(zhàn)術(shù)”后說(shuō)的“戰(zhàn)略”秤涩。因?yàn)樗J(rèn)為:
隨著系統(tǒng)的增長(zhǎng),它會(huì)變得越來(lái)越復(fù)雜司抱,當(dāng)我們無(wú)法通過(guò)分析對(duì)象來(lái)理解系統(tǒng)的時(shí)候筐眷,就需要掌握一些操縱和理解大模型的技術(shù)了。本書(shū)的這一部分將介紹一些原則习柠。遵循這些原則匀谣,就可以對(duì)非常復(fù)雜的領(lǐng)域進(jìn)行建模照棋。大部分這樣的決策都需要由團(tuán)隊(duì)來(lái)制定,甚至需要多個(gè)團(tuán)隊(duì)共同協(xié)商制定武翎。這些決策往往是把設(shè)計(jì)和策略綜合到一起的結(jié)果必怜。
換句話說(shuō),其實(shí)他先是介紹的“簡(jiǎn)單”的系統(tǒng)的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)和建模方法后频,而在最后才介紹的是“復(fù)雜”的系統(tǒng)的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)和分析方法。
Vaughn Vernon的發(fā)展
2013年暖途,Vaughn Vernon在實(shí)施了很長(zhǎng)時(shí)間以“實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”為核心內(nèi)容的工作坊之后卑惜,出版了《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書(shū),在這本書(shū)中驻售,他按照從宏觀到微觀露久,從問(wèn)題到方案再到實(shí)現(xiàn)的方式進(jìn)行了敘述,發(fā)展并完善了DDD的理論和概念欺栗,當(dāng)然也引入了“問(wèn)題空間”和“解決方案空間”這兩個(gè)詞毫痕。
他認(rèn)為,在DDD的“戰(zhàn)略設(shè)計(jì)中”迟几,還需要考慮“問(wèn)題空間”和“解決方案空間”這樣的維度消请,其中子域(他在“核心域”和“通用域”之間加入“支撐域”來(lái)避免兩個(gè)極端)屬于“戰(zhàn)略設(shè)計(jì)”對(duì)于“問(wèn)題空間”的分析方式,而限界上下文則是屬于“戰(zhàn)略設(shè)計(jì)”對(duì)于“解決方案空間”的分析方式类腮。
至于“戰(zhàn)術(shù)設(shè)計(jì)”一詞臊泰,hum……當(dāng)時(shí)還沒(méi)出現(xiàn)呢……
那么“戰(zhàn)術(shù)設(shè)計(jì)”這個(gè)詞,到底是什么時(shí)候才出現(xiàn)的呢蚜枢?
Scott Millett與Nick Tune被“忽略”的澄清
說(shuō)實(shí)話缸逃,“戰(zhàn)術(shù)設(shè)計(jì)”這個(gè)大家看到現(xiàn)在基本都已經(jīng)感受到是什么了的東西,到底什么時(shí)候由誰(shuí)提出的厂抽,已經(jīng)難以追溯需频,但是,至少有一本書(shū)出現(xiàn)了……
在2015年筷凤,Scott Millett和Nick Tune出版了《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)模式昭殉、原理與實(shí)踐》一書(shū),這本書(shū)更加全面和細(xì)致的介紹了在實(shí)現(xiàn)DDD的過(guò)程中的思考和方法嵌施。
然而很可惜的是,這一本書(shū)的中文版已經(jīng)“絕版了”吗伤,說(shuō)明至少在中國(guó)吃靠,大家的注意力都被《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》帶跑了,逢人便提IDDD(書(shū)名的縮寫(xiě))足淆,卻很少有人提到前述的這一本(當(dāng)然巢块,我強(qiáng)烈建議對(duì)照看英文版礁阁,中文版翻譯的實(shí)在是……)。
在這本書(shū)中族奢,作者將全書(shū)分為了四個(gè)部分:
- 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的原則與實(shí)踐
- 戰(zhàn)略模式:在限界上下文之間通信
- 戰(zhàn)術(shù)模式:創(chuàng)建有效的領(lǐng)域模型
- 有效應(yīng)用程序的設(shè)計(jì)模式
至此姥闭,在DDD的系列書(shū)籍中,終于出現(xiàn)了“戰(zhàn)術(shù)設(shè)計(jì)/模式”一詞越走,Scott Millett和Nick Tune把領(lǐng)域模型的設(shè)計(jì)全部清晰的納入到了“戰(zhàn)術(shù)設(shè)計(jì)”之中棚品。
為什么大多數(shù)人會(huì)難以理解?
好吧廊敌,大家能看到這里已經(jīng)很不容易了铜跑,讓我來(lái)為大家做總結(jié)并回答一下為什么大多數(shù)人會(huì)難以理解前述的兩個(gè)維度的概念呢?
我是這么看的骡澈,之所以難以理解锅纺,問(wèn)題來(lái)自于兩個(gè)方面,讓我們分別來(lái)說(shuō)肋殴。
DDD“依然年輕”
DDD雖然從2014年開(kāi)始囤锉,截止到剛剛過(guò)去的2019年,已經(jīng)有15年的發(fā)展护锤,但是15年來(lái)官地,雖然軟件架構(gòu)和設(shè)計(jì)的新思想層出不窮,復(fù)雜度也越來(lái)越高烙懦。
直到2014年区丑,以Martin Fowler為代表,在博客上徹底點(diǎn)燃微服務(wù)設(shè)計(jì)這個(gè)“燎原之火”之后修陡,微服務(wù)所帶來(lái)的軟件系統(tǒng)的復(fù)雜度成倍提升才使得人們又重新關(guān)注沧侥,并開(kāi)始根據(jù)新的形勢(shì)認(rèn)真思考DDD如何落地(到如今,幾乎逢領(lǐng)微服務(wù)設(shè)計(jì)的書(shū)魄鸦,必談DDD)宴杀。
從前面的介紹和幾本書(shū)的內(nèi)容發(fā)展我們可以看到,DDD思想發(fā)展的時(shí)間跨越很大拾因,語(yǔ)言和理解的統(tǒng)一也并不順暢旺罢,很多概念的清晰化都是最近幾年才密集出現(xiàn)。
尤其在中國(guó)绢记,發(fā)展更為滯后扁达。這個(gè)圈子里,有機(jī)會(huì)深入思考和深耕DDD規(guī)拇老ǎ化落地的人也不多跪解。
概念理解有難度
讓我們回顧這些概念和抽取其中的關(guān)鍵詞語(yǔ),我們會(huì)看到這兩波東西是完全不同維度的東西:
- 解決問(wèn)題的層次:戰(zhàn)略签孔、戰(zhàn)術(shù)
- 解決問(wèn)題的步驟:?jiǎn)栴}叉讥、方案窘行、實(shí)現(xiàn)
之所以難以理解,是因?yàn)檫@些概念在現(xiàn)有的書(shū)籍图仓、文章和實(shí)際操作中罐盔,是交織在一起的(可以想象一個(gè)概念的“大泥球”),而絕大多數(shù)人并不擅長(zhǎng)(或者說(shuō)并不熟練)以下三種思維方式:
- 問(wèn)題驅(qū)動(dòng)的思考
- 分層思維
- 多維思考
所以我們需要更加清晰的階段劃分和漸進(jìn)式的梳理以降低門(mén)檻救崔,從而讓大多數(shù)人能夠更加容易的理解和入門(mén)惶看。
更合理的“DDD分段式設(shè)計(jì)”
為了更好的對(duì)DDD的設(shè)計(jì)過(guò)程進(jìn)行優(yōu)化,我們必須要重新審視DDD希望解決的問(wèn)題:
軟件核心復(fù)雜性
所謂復(fù)雜(Complex)六孵,按照Cynefin框架的解釋是這樣的(這里使用了我的同事李彤欣的版本):
“復(fù)雜系統(tǒng):代表可能有碳竟,也可能沒(méi)有解決方案的系統(tǒng),充滿未知和不確定性狸臣。因果關(guān)系往往在事后才能感知,剛開(kāi)始可能毫無(wú)頭緒昌执。應(yīng)對(duì)方式是探索 - 感知 - 響應(yīng)烛亦。在允許試錯(cuò)的前提下,先做小范圍實(shí)驗(yàn)和嘗試懂拾,等待某些規(guī)律和指導(dǎo)涌現(xiàn)出來(lái)后煤禽,再來(lái)認(rèn)知和評(píng)估,然后響應(yīng)岖赋∶使”
而從我的觀察和理解來(lái)說(shuō),這種復(fù)雜問(wèn)題最直接的影響就是:其復(fù)雜程度已經(jīng)超出了個(gè)人所能夠理解唐断、分析和解決的范圍选脊。我總結(jié)了三個(gè)針對(duì)“復(fù)雜性”的典型特征:
- 業(yè)務(wù)流程長(zhǎng)
- 業(yè)務(wù)場(chǎng)景多
- 業(yè)務(wù)概念多
要想解決復(fù)雜的問(wèn)題,首當(dāng)其沖的不是如何進(jìn)行分析脸甘,而是引入更多的人恳啥,利用更多的大腦來(lái)共同解決復(fù)雜問(wèn)題。當(dāng)從一個(gè)人變成多個(gè)人的時(shí)候丹诀,那么問(wèn)題就來(lái)了:別人的大腦長(zhǎng)在別人的腦袋里钝的,我怎么知道他想的是什么?他所理解的和我理解的一樣嗎铆遭?
正因?yàn)槎嗳斯餐鍪虑闀r(shí)硝桩,會(huì)出現(xiàn)溝通和理解上的障礙,所以枚荣,DDD給出了一個(gè)關(guān)鍵思想:統(tǒng)一語(yǔ)言(Ubiquitous Language)碗脊。
而統(tǒng)一語(yǔ)言的方式,則是通過(guò)領(lǐng)域?qū)<遗c技術(shù)專(zhuān)家通力合作橄妆,針對(duì)業(yè)務(wù)問(wèn)題進(jìn)行協(xié)作分析和設(shè)計(jì)望薄,通過(guò)迭代式的探索疟游、發(fā)現(xiàn)和碰撞得來(lái)的。
所以痕支,以統(tǒng)一語(yǔ)言為核心颁虐,通過(guò)協(xié)作設(shè)計(jì)的方式,對(duì)業(yè)務(wù)問(wèn)題進(jìn)行分析和澄清卧须,就應(yīng)該是DDD設(shè)計(jì)過(guò)程的第一個(gè)階段另绩。在這個(gè)階段中,我們圍繞業(yè)務(wù)問(wèn)題花嘶、場(chǎng)景和流程來(lái)進(jìn)行探索笋籽,通過(guò)限界上下文尋找概念二義性的邊界,劃分問(wèn)題子域椭员,從而在宏觀(戰(zhàn)略)層面降解系統(tǒng)理解上的復(fù)雜度车海。
所以,我將這第一個(gè)階段稱(chēng)之為:DDD分段式協(xié)作設(shè)計(jì)的戰(zhàn)略設(shè)計(jì)階段隘击。
在這個(gè)過(guò)程中侍芝,我們首先需要使用“事件風(fēng)暴工作坊”的方式,對(duì)業(yè)務(wù)流程進(jìn)行系統(tǒng)實(shí)現(xiàn)視角下的抽象分析埋同。然后州叠,根據(jù)分析的結(jié)果,對(duì)領(lǐng)域概念的二義性邊界進(jìn)行識(shí)別凶赁,最終劃定問(wèn)題子域咧栗。
當(dāng)這一宏觀層的分析和設(shè)計(jì)結(jié)束后,我們就需要降低(細(xì)化)一個(gè)層面虱肄,對(duì)問(wèn)題子域和限界上下文內(nèi)部進(jìn)行更細(xì)化的分析和抽象致板,通過(guò)領(lǐng)域建模的方式,將業(yè)務(wù)抽象為以“聚合(Aggregate)”進(jìn)行封裝和隔離的一系列領(lǐng)域模型進(jìn)行承載咏窿。然后可岂,基于系統(tǒng)實(shí)現(xiàn)的高階視角出發(fā),參考云原生的彈性邊界需求等輸入翰灾,初步識(shí)別出業(yè)務(wù)服務(wù)的劃分缕粹,并且識(shí)別每個(gè)業(yè)務(wù)服務(wù)的對(duì)外接口能力尿瞭。
我將這第二個(gè)階段挨队,稱(chēng)之為:DDD分段式協(xié)作設(shè)計(jì)的戰(zhàn)術(shù)設(shè)計(jì)階段。
需要注意的是瞭稼,在前兩個(gè)階段咽块,我們都依然是通過(guò)從宏觀到微觀(從戰(zhàn)略到戰(zhàn)術(shù))的方式绘面,對(duì)業(yè)務(wù)問(wèn)題進(jìn)行了分層的分析和設(shè)計(jì)。所以在這兩個(gè)階段中,我們是忽略了一切技術(shù)實(shí)現(xiàn)細(xì)節(jié)揭璃,以防止技術(shù)實(shí)現(xiàn)細(xì)節(jié)干擾“領(lǐng)域驅(qū)動(dòng)”的晚凿。
同時(shí),由于“協(xié)作設(shè)計(jì)”需要投入一定的人天進(jìn)行集中式的封閉設(shè)計(jì)瘦馍,所以在成本上難以長(zhǎng)時(shí)間進(jìn)行投入歼秽,而技術(shù)實(shí)現(xiàn)的維度和方式又是種類(lèi)繁多和及其詳細(xì)的(例如API詳細(xì)設(shè)計(jì)、UML設(shè)計(jì)情组、數(shù)據(jù)庫(kù)設(shè)計(jì)燥筷、運(yùn)維與部署方案……等等)。
所以院崇,可以將前兩個(gè)階段的產(chǎn)出肆氓,交由根據(jù)“逆康威定律”劃分的不同特性/產(chǎn)品團(tuán)隊(duì),由這些團(tuán)隊(duì)進(jìn)行進(jìn)一步的詳細(xì)分析和設(shè)計(jì)底瓣,最終予以實(shí)現(xiàn)谢揪。
我將這第三個(gè)階段,稱(chēng)之為:DDD分段式協(xié)作設(shè)計(jì)的技術(shù)實(shí)現(xiàn)階段捐凭。
至此拨扶,便有了更加平順的DDD設(shè)計(jì)方法。
總結(jié)
根據(jù)實(shí)踐中的思考柑营,以“統(tǒng)一語(yǔ)言”為解決復(fù)雜問(wèn)題的核心目標(biāo),以“協(xié)作設(shè)計(jì)”為關(guān)鍵手段村视,我將DDD的設(shè)計(jì)過(guò)程重新梳理和優(yōu)化為了以下三個(gè)階段:
- 戰(zhàn)略設(shè)計(jì)階段:對(duì)業(yè)務(wù)問(wèn)題進(jìn)行宏觀分析和設(shè)計(jì)官套。
- 戰(zhàn)術(shù)設(shè)計(jì)階段:根據(jù)戰(zhàn)略設(shè)計(jì)分析結(jié)果進(jìn)行細(xì)化和建模。
- 技術(shù)實(shí)現(xiàn)階段:根據(jù)實(shí)現(xiàn)需要進(jìn)行細(xì)化分析和設(shè)計(jì)蚁孔。
在這個(gè)過(guò)程中奶赔,主要的改進(jìn)方式,首先就是利用分層的手法杠氢,通過(guò)聚焦從宏觀到微觀再到具體的方式站刑,降低對(duì)抽象的分類(lèi)方法的關(guān)注,化解對(duì)兩類(lèi)概念維度的交叉鼻百。然后绞旅,再通過(guò)定義每個(gè)階段要解決的問(wèn)題,內(nèi)聚相關(guān)的分析方法温艇,使得每個(gè)階段都能有一些在階段內(nèi)閉環(huán)性的產(chǎn)出因悲。
這樣的話,因?yàn)殡A段目標(biāo)清晰且產(chǎn)出內(nèi)聚勺爱,所以可以根據(jù)實(shí)際需要選擇協(xié)作設(shè)計(jì)的深入程度——我遇到過(guò)有些客戶晃琳,因?yàn)榉N種原因,只希望能夠先快速的知道我需要根據(jù)DDD的思想拆分多少個(gè)模塊,那么就可以先只做戰(zhàn)略設(shè)計(jì)階段卫旱。如果其中某個(gè)模塊希望進(jìn)一步細(xì)化指導(dǎo)建模和接口設(shè)計(jì)人灼,那么就可以繼續(xù)局部進(jìn)入到戰(zhàn)術(shù)設(shè)計(jì)階段。最后顾翼,再根據(jù)實(shí)際需要去分團(tuán)隊(duì)進(jìn)行技術(shù)實(shí)現(xiàn)投放。
我們一定要記住:DDD是通過(guò)協(xié)作來(lái)達(dá)成統(tǒng)一語(yǔ)言從而應(yīng)對(duì)復(fù)雜性的暴构,組織背景下的軟件開(kāi)發(fā)是一種團(tuán)隊(duì)集體運(yùn)動(dòng)跪呈。
所以基于以上觀點(diǎn),我會(huì)比較刻意的不提倡以下幾種DDD的設(shè)計(jì)過(guò)程:
- 先分析子域 / 先分析限界上下文:業(yè)務(wù)都未澄清取逾,理解和語(yǔ)言都還沒(méi)統(tǒng)一耗绿,怎么能拆明白?
- 名詞動(dòng)詞法 / 直接進(jìn)行領(lǐng)域建模:大規(guī)模吵架和拍腦袋……
對(duì)于以上的分段式設(shè)計(jì)方法砾隅,經(jīng)過(guò)了一年多的實(shí)戰(zhàn)檢驗(yàn)误阻,證明能夠被在絕大多數(shù)場(chǎng)景下適配和快速?gòu)?fù)用。在這里給大家分享了我在這個(gè)過(guò)程中的思考晴埂,拋磚引玉究反,希望能夠有更多DDD的推動(dòng)者提出寶貴的建議,共同推動(dòng)DDD在中國(guó)的成熟和發(fā)展儒洛。