之前文章提到了對(duì)項(xiàng)目中使用MongoDB的思考肢础,里面寫(xiě)了一些由于數(shù)據(jù)庫(kù)導(dǎo)致了項(xiàng)目中領(lǐng)域模型設(shè)計(jì)的問(wèn)題音瓷,有必要采用DDD的方法和相關(guān)實(shí)踐對(duì)項(xiàng)目進(jìn)行領(lǐng)域建模和梳理姓迅。馬上般甲,下個(gè)月要去客戶現(xiàn)場(chǎng)做工作坊肋乍,如何設(shè)計(jì)好工作坊, 通過(guò)良好的引導(dǎo)幫助我們與客戶順暢協(xié)作,全面地梳理業(yè)務(wù)概念敷存,并基于業(yè)務(wù)概念進(jìn)行抽象和聚合住拭,完成領(lǐng)域建模和域劃分是這次工作坊的主要內(nèi)容之一。那么在去之前,很有必要回顧一下事件風(fēng)暴的建模方法論滔岳,為工作坊順利完成做好準(zhǔn)備杠娱。
什么是事件風(fēng)暴?
EventStorming是一種用于復(fù)雜業(yè)務(wù)領(lǐng)域協(xié)作探索的靈活工作坊模式谱煤。它可以按照不同的形式開(kāi)展摊求,并適用于以下場(chǎng)景:
評(píng)估現(xiàn)有業(yè)務(wù)運(yùn)行狀況和發(fā)現(xiàn)有效提升業(yè)務(wù)狀況的措施
探索新創(chuàng)業(yè)務(wù)模型的可行性
設(shè)想新的服務(wù),最大限度地提高每個(gè)參與方的積極成果
幫助設(shè)計(jì)整潔可維護(hù)的事件驅(qū)動(dòng)軟件來(lái)支撐迅速發(fā)展的業(yè)務(wù)
事件風(fēng)暴建模過(guò)程
通常事件風(fēng)暴工作坊需要熟悉熟悉方法論的主持人引導(dǎo)刘离,業(yè)務(wù)顧問(wèn)和技術(shù)顧問(wèn)以及客戶熟悉業(yè)務(wù)的領(lǐng)域?qū)<液褪煜は到y(tǒng)的技術(shù)專(zhuān)家一起參與室叉。工作坊在一個(gè)開(kāi)放空間開(kāi)展,需要有足夠長(zhǎng)的墻來(lái)貼上白紙方便所有參與者按業(yè)務(wù)的時(shí)間順序貼上建模需要的關(guān)鍵信息硫惕,足夠的便利貼和事件風(fēng)暴建模方法中關(guān)鍵要點(diǎn)的指導(dǎo)說(shuō)明茧痕。這些信息將作為領(lǐng)域建模的重要輸入。
工作坊由添加領(lǐng)域事件開(kāi)始恼除,領(lǐng)域事件一般用橘色的便利貼表示踪旷,書(shū)寫(xiě)領(lǐng)域?qū)嵺`的規(guī)則是使用被動(dòng)語(yǔ)態(tài),并按照時(shí)間順序貼在白紙上豁辉。剛開(kāi)始令野,一些參與者對(duì)具體怎么寫(xiě)事件便利貼還是會(huì)有疑惑,這時(shí)可以關(guān)注一些行動(dòng)更快的參與者徽级,將他們作為模板气破,這時(shí)其它參與者會(huì)迅速的開(kāi)始模仿,這時(shí)我們可以讓大家快速的進(jìn)入狀態(tài)餐抢。在大家的討論中现使,我們也會(huì)發(fā)現(xiàn)大家可能也只了解局部,這個(gè)工作坊也是第一次將各個(gè)局部信息組織到一起旷痕,也有人描述出領(lǐng)域事件但是也不了解背后的細(xì)節(jié)碳锈,或者給出“流程總是阻塞在這里”之類(lèi)的描述。這些信息也很關(guān)鍵苦蒿,我們也需要將其記錄下來(lái)殴胧,為我們?nèi)媪私鈽I(yè)務(wù)模型提供更多的細(xì)節(jié)渗稍,通常我們用紫色的便利貼記錄這類(lèi)信息佩迟,并將其與領(lǐng)域?qū)嵺`關(guān)聯(lián)起來(lái)。對(duì)于疑問(wèn)和告警比較集中的領(lǐng)域事件竿屹,也會(huì)是后續(xù)需要重點(diǎn)優(yōu)化的部分报强。
在工作坊中拱燃,我們會(huì)聽(tīng)到一些客戶的領(lǐng)域/技術(shù)專(zhuān)家談到某處秉溉,會(huì)發(fā)散開(kāi)來(lái)提到一些很有洞見(jiàn)的觀點(diǎn)和我們不曾預(yù)料到的領(lǐng)域復(fù)雜性,每當(dāng)這些話題出現(xiàn)時(shí),也會(huì)使用便于區(qū)分的便利貼來(lái)記錄這些上下文召嘶。這些上下文不需要刨根問(wèn)底父晶,只需要準(zhǔn)確的描述當(dāng)時(shí)的對(duì)話中的內(nèi)容即可。很多時(shí)候弄跌,這些對(duì)話會(huì)以開(kāi)放式的問(wèn)題結(jié)束甲喝,這也問(wèn)后續(xù)進(jìn)一步的討論提供了方向。
隨著我們對(duì)業(yè)務(wù)認(rèn)識(shí)的不斷加深铛只,可以隨時(shí)回顧和總結(jié)之前添加的內(nèi)容埠胖,對(duì)于有問(wèn)題的描述進(jìn)行更正,對(duì)于表述不清楚的內(nèi)容可以進(jìn)行重寫(xiě)淳玩。
在收集完領(lǐng)域?qū)ο笾笾背罚覀兛梢赃M(jìn)一步開(kāi)始探索系統(tǒng)核心事件的運(yùn)行機(jī)制。這時(shí)我們?cè)谥暗念I(lǐng)域事件的基礎(chǔ)上加入指令和角色的概念蜕着。指令代表系統(tǒng)中用戶的意圖谋竖、動(dòng)作和決定,一般用藍(lán)色的便利貼表示侮东;角色表一類(lèi)特定用戶圈盔,一般用黃色便利貼表示。它們之間的關(guān)系是“角色”發(fā)送“指令”產(chǎn)生了“領(lǐng)域事件”(指令也可由外部系統(tǒng)觸發(fā)悄雅,外部系統(tǒng)通常用粉色的便利貼表示)驱敲。
在加入指令和角色后,會(huì)觸發(fā)更多關(guān)于為什么用戶會(huì)產(chǎn)生這個(gè)操作的討論宽闲。關(guān)于指令和角色有意思的是众眨,指令作為用戶決定的結(jié)果,當(dāng)我們?cè)谒伎际鞘裁丛驅(qū)е掠脩糇鲞@個(gè)決定時(shí)容诬,我們會(huì)產(chǎn)生類(lèi)似“能讓用戶更容易的作出決定嗎娩梨?”,“能幫助用戶作出更好的決定嗎览徒?”的問(wèn)題狈定。這些問(wèn)題將幫助我們思考與用戶做決定相關(guān)的數(shù)據(jù)模型。這時(shí)习蓬,我們會(huì)將這類(lèi)數(shù)據(jù)模型記錄在綠色的便利貼上纽什。
更有意思的是,在探究用戶作出決定的動(dòng)機(jī)時(shí)躲叼,我們會(huì)發(fā)現(xiàn)同類(lèi)型角色的用戶并不相同芦缰。即使做出了相同的決定,背后的動(dòng)機(jī)也會(huì)有很大區(qū)別枫慷。隨著討論的深入让蕾,我們會(huì)用一組更加貼切的用戶畫(huà)像來(lái)表示角色浪规,這也幫助我們?cè)跇?gòu)建MVP時(shí)更有效的捕獲用戶角色。隨著我們更深入的了解領(lǐng)域事件的內(nèi)部機(jī)制探孝,我們也會(huì)越來(lái)越多的討論到領(lǐng)域事件發(fā)生后引起的系統(tǒng)變化笋婿。這種變化通常通過(guò)“當(dāng)...發(fā)生時(shí)...”的句式描述出來(lái),比如“當(dāng)用戶通過(guò)新的設(shè)備登入時(shí)顿颅,系統(tǒng)會(huì)發(fā)送提醒通知”萌抵。通常,我們將這種系統(tǒng)的行為邏輯稱為策略,通常記錄在紫丁香色的便利貼上元镀。
在一個(gè)將要新創(chuàng)建的系統(tǒng)中,越早捕獲這些策略對(duì)構(gòu)建系統(tǒng)越有利栖疑,因?yàn)樗鼈兛梢詭臀覀儽苊庖蕾嚰僭O(shè)而實(shí)現(xiàn)系統(tǒng)讨永。當(dāng)我們收集完業(yè)務(wù)中相關(guān)的信息之后,這時(shí)也是業(yè)務(wù)中關(guān)鍵聚合涌現(xiàn)之時(shí)遇革。我們把跟一個(gè)概念相同的指令和事件集合到一起卿闹,并用黃色的較大的便利貼表示:
現(xiàn)在我們有了事件,指令萝快,角色锻霎,視圖,策略和聚合的概念揪漩,它們之間的關(guān)系總結(jié)起來(lái)如下圖的關(guān)系所示:
事件風(fēng)暴建模的技巧
在收集領(lǐng)域事件的過(guò)程中旋恼,由于參與方眾多,一開(kāi)始大家寫(xiě)的領(lǐng)域事件會(huì)比較發(fā)散奄容,也有很多類(lèi)似的描述冰更。前期我們需要抑制內(nèi)心想要統(tǒng)一它們的想法,因?yàn)椴煌谋磉_(dá)背后可能意味著大家不同的理解昂勒,我們可以做的是把相關(guān)的事件放在一起蜀细,一遍后續(xù)進(jìn)一步分析。為了方便按照時(shí)間去組織, 我們可以在眾多事件中戈盈,找到一些大家沒(méi)有分歧的關(guān)鍵事件奠衔,然后給予關(guān)鍵事件來(lái)做參照,然后在關(guān)鍵事件標(biāo)記的范圍里塘娶,按照不同的組織和上下文來(lái)組織領(lǐng)域事件归斤。
在對(duì)領(lǐng)域事件進(jìn)行分類(lèi)時(shí),由于事件之間有不同的邏輯關(guān)系血柳,可能需要對(duì)不同事件段內(nèi)的事件進(jìn)行分類(lèi)官册。分組能讓我們?cè)谂帕袝r(shí)的邏輯更清晰生兆,也方便我們對(duì)事件的上下文進(jìn)行劃分难捌。最后膝宁,基于關(guān)鍵事件的領(lǐng)域事件分組會(huì)形成下圖的結(jié)構(gòu):
通過(guò)時(shí)間線,我們可以更好的與眾多的業(yè)務(wù)人員和領(lǐng)域?qū)<疫M(jìn)行協(xié)同根吁,發(fā)掘領(lǐng)域事件员淫。但當(dāng)我們尋找聚合時(shí),由于聚合是對(duì)業(yè)務(wù)規(guī)則的封裝击敌,保證數(shù)據(jù)的一致性介返,它會(huì)跨越領(lǐng)域事件的時(shí)間線。
結(jié)語(yǔ)
事件風(fēng)暴建模沒(méi)有固定的過(guò)程沃斤,它是根據(jù)具體情況而裁減的圣蝎。通過(guò)事件風(fēng)暴建模方法,能更好的引導(dǎo)我們與業(yè)務(wù)人員和領(lǐng)域?qū)<液献骱馄浚ㄟ^(guò)激發(fā)他們發(fā)表不同的觀點(diǎn)和協(xié)調(diào)他們之間的沖突徘公,幫助我們了解復(fù)雜業(yè)務(wù)的全景,更準(zhǔn)確的建立業(yè)務(wù)模型哮针。建模方法中的概念有限关面,但是通過(guò)這些概念,怎么能更好的挖掘描繪出業(yè)務(wù)模型是需要在不斷的實(shí)踐中學(xué)習(xí)和提升的十厢。