領(lǐng)域建模的常見(jiàn)問(wèn)題及解決方案
根據(jù)我個(gè)人的領(lǐng)域建模經(jīng)驗(yàn),總結(jié)了在領(lǐng)域建模過(guò)程中遇見(jiàn)的常見(jiàn)問(wèn)題及對(duì)應(yīng)的解決方案。
問(wèn)題一
問(wèn)題描述:業(yè)務(wù)專(zhuān)家與建模專(zhuān)家之間形成能力的“阻抗不匹配”。
就像對(duì)象和關(guān)系的“阻抗不匹配”一樣,業(yè)務(wù)專(zhuān)家精通業(yè)務(wù),卻往往不具備建模能力,而建模專(zhuān)家又往往不熟悉業(yè)務(wù)(如我,只能泛泛地了解業(yè)務(wù)知識(shí))。
這就是DDD為何強(qiáng)調(diào)領(lǐng)域?qū)<遗c開(kāi)發(fā)團(tuán)隊(duì)工作在一起的主要原因。
解決方案:除了讓業(yè)務(wù)專(zhuān)家和建模專(zhuān)家共同工作,取長(zhǎng)補(bǔ)短之外,還有一個(gè)辦法,就是向企業(yè)的業(yè)務(wù)專(zhuān)家開(kāi)展領(lǐng)域建模的培訓(xùn),以提升他們的建模能力;同時(shí),盡可能采用團(tuán)隊(duì)成員共同參與的協(xié)作化可視化建模,以促進(jìn)有效溝通,快速反饋,有效形成業(yè)務(wù)專(zhuān)家與建模專(zhuān)家的合力。
圖片
為何事件風(fēng)暴得到大多數(shù)領(lǐng)域?qū)<业恼J(rèn)可,并成為一種主流的建模方法?其中一個(gè)原因就在于它通過(guò)可視化工作坊的形式,為業(yè)務(wù)專(zhuān)家和建模專(zhuān)家營(yíng)造了良好的溝通氛圍和高效的溝通機(jī)制。所謂的“糊墻”游戲,使得參與者可以釋放自己,交頭接耳,大聲討論,清晰地表達(dá)各自的想法。大家協(xié)同建模,通過(guò)即時(shí)貼展現(xiàn)業(yè)務(wù)流程與事件流,一旦將它們掛在墻上,就很容易發(fā)現(xiàn)大家對(duì)業(yè)務(wù)問(wèn)題理解不一致的地方,通過(guò)發(fā)現(xiàn)差異統(tǒng)一認(rèn)識(shí),也起到了傳播業(yè)務(wù)知識(shí)的目的。
可視化工作坊的形式可以有效杜絕“閉門(mén)造車(chē)”的專(zhuān)家建模,即便你不熟悉事件風(fēng)暴,你也可以采用其他的頭腦風(fēng)暴形式。
問(wèn)題二
問(wèn)題描述:在開(kāi)展領(lǐng)域建模時(shí),缺乏一套行之有效的方法與過(guò)程,導(dǎo)致“拍腦袋”建模和隨意建模成為常態(tài),無(wú)法穩(wěn)定地輸出高質(zhì)量的領(lǐng)域模型。
解決方案:通過(guò)引入DDD方法,建立適合團(tuán)隊(duì)的固化建模過(guò)程,是成功建模的必要條件。
下圖是我總結(jié)的服務(wù)風(fēng)暴12步驟,要求團(tuán)隊(duì)嚴(yán)格按照它規(guī)定的步驟逐步開(kāi)展建模。
圖片
遵循我總計(jì)的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)統(tǒng)一過(guò)程,共分為三個(gè)階段:
- 全局分析階段
- 架構(gòu)映射階段
- 領(lǐng)域建模階段
每個(gè)階段都有4個(gè)步驟,并給出了每個(gè)步驟的執(zhí)行過(guò)程與輸出結(jié)果。前一個(gè)步驟的輸出結(jié)果,又會(huì)成為后續(xù)步驟的重要輸入。
例如,我規(guī)定了全局分析階段的交付物包括業(yè)務(wù)流程圖、業(yè)務(wù)服務(wù)圖、業(yè)務(wù)服務(wù)規(guī)約和業(yè)務(wù)架構(gòu)視圖。
圖片
圖片
圖片
圖片
架構(gòu)映射階段的交付物包括系統(tǒng)上下文圖、限界上下文組件圖、API契約定義、服務(wù)調(diào)用時(shí)序圖和應(yīng)用架構(gòu)視圖。
圖片
圖片
圖片
圖片
圖片
領(lǐng)域建模階段的交付物包括限界上下文的代碼模型、靜態(tài)領(lǐng)域模型和動(dòng)態(tài)領(lǐng)域模型。
圖片
圖片
圖片
問(wèn)題三
問(wèn)題描述:面對(duì)業(yè)務(wù)復(fù)雜度高,規(guī)模龐大的問(wèn)題空間,難以保證建模的質(zhì)量,也無(wú)法有效控制復(fù)雜度。
解決方案:需要遵循“分而治之”的思想,在各個(gè)層次開(kāi)展抽象與分解的工作。
DDD提出的子領(lǐng)域可以有效分解問(wèn)題空間,限界上下文和聚合在不同層次上完成對(duì)解空間的分解,都是建模的重要支點(diǎn)。下圖是我總結(jié)的DDD各層邊界控制的內(nèi)容。
圖片
無(wú)論從問(wèn)題空間到解空間,還是從戰(zhàn)略設(shè)計(jì)推進(jìn)到戰(zhàn)術(shù)設(shè)計(jì),領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)一直強(qiáng)調(diào)的核心思想,就是對(duì)邊界的界定與控制。
控制了模型(戰(zhàn)略層次和戰(zhàn)術(shù)層次)的邊界后,不僅因?yàn)榭s小規(guī)模而降低了建模的復(fù)雜度,還能夠在規(guī)定好各個(gè)單元之間的協(xié)作機(jī)制后,將它們分配給不同的領(lǐng)域特性團(tuán)隊(duì),確定好職責(zé)邊界,開(kāi)展并行建模,如此也可以極大提升建模的效率。
問(wèn)題四
問(wèn)題描述:容易出現(xiàn)大而全的領(lǐng)域模型,看起來(lái)很美,一旦落地,會(huì)發(fā)現(xiàn)得到的領(lǐng)域模型存在很大的問(wèn)題。
解決方案:遵循“迭代建模”的原則。迭代的過(guò)程是兩個(gè)方向不斷迭代的過(guò)程。
一個(gè)方向是在更高層次上追求“廣度優(yōu)先”,把建模工作盡可能覆蓋得更廣,形成統(tǒng)一而清晰的業(yè)務(wù)藍(lán)圖,包括主要的業(yè)務(wù)流程、劃分子領(lǐng)域、確定子領(lǐng)域與業(yè)務(wù)服務(wù)之間的關(guān)系,進(jìn)而確定限界上下文、定義限界上下文外部的接口,明確限界上下文之間的協(xié)作關(guān)系。
另一個(gè)方向是選擇核心子領(lǐng)域追求“深度優(yōu)先”,深入到這些核心子領(lǐng)域映射的限界上下文內(nèi)部,編寫(xiě)業(yè)務(wù)服務(wù)規(guī)約,迭代地開(kāi)展領(lǐng)域分析建模和領(lǐng)域設(shè)計(jì)建模,甚至嘗試針對(duì)核心主流程對(duì)應(yīng)的限界上下文開(kāi)展實(shí)現(xiàn)建模,輸出功能不完整,但具有可用特性的可運(yùn)行代碼。
融合廣度優(yōu)先與深度優(yōu)先的迭代建模方式,和DDD結(jié)合起來(lái),簡(jiǎn)單來(lái)說(shuō)就是戰(zhàn)略設(shè)計(jì)采用廣度優(yōu)先,戰(zhàn)術(shù)設(shè)計(jì)采用深度優(yōu)先。
這種迭代建模方式需遵循MVP(Minimal Viable Product,最小可用產(chǎn)品)思想。在確定了解空間的限界上下文,可以開(kāi)展如下圖所示的領(lǐng)域建模方式:
圖片
遵循MVP思想開(kāi)展的迭代建模具有兩個(gè)優(yōu)勢(shì):
- 最小可用的領(lǐng)域模型:每次迭代獲得的領(lǐng)域模型都是可運(yùn)行的,功能可驗(yàn)證的,即在每次小步成功的基礎(chǔ)上開(kāi)展增量式的迭代建模
- 分析設(shè)計(jì)實(shí)現(xiàn)的分離與統(tǒng)一:分析建模、設(shè)計(jì)建模和實(shí)現(xiàn)建模的主導(dǎo)者不同,目標(biāo)不同,方法不同,卻又都是在前者基礎(chǔ)上開(kāi)展的,從而保證了三個(gè)步驟的分離與統(tǒng)一,既降低了復(fù)雜度,又避免了模型的不一致
我特別害怕企業(yè)搞轟轟烈烈的“建模運(yùn)動(dòng)”,從上到下打雞血,定任務(wù),高呼“奮戰(zhàn)30天,多快好省地打造企業(yè)級(jí)領(lǐng)域模型”,然后,集中核心成員加班加點(diǎn)完成一個(gè)貌似完整詳細(xì)、巨細(xì)無(wú)靡、規(guī)模龐大的超級(jí)領(lǐng)域模型,卻沒(méi)有產(chǎn)出哪怕一行可以工作的代碼。在得到這么一個(gè)超級(jí)領(lǐng)域模型之后,企業(yè)又召集許多業(yè)務(wù)專(zhuān)家和建模專(zhuān)家對(duì)它進(jìn)行幾天封閉式的模型評(píng)審。這一做法雖然利用了團(tuán)隊(duì)的力量,做了充分的溝通和協(xié)作,但和“閉門(mén)造車(chē)”的專(zhuān)家建模一樣,缺乏及時(shí)反饋與快速驗(yàn)證,得到的大而全的領(lǐng)域模型很有可能只是一個(gè)看起來(lái)很美的空中樓閣。