記一次Event Storming實(shí)戰(zhàn)經(jīng)歷


什么是Event Storming

在談?wù)揈vent Storming的時(shí)候,我們常常會(huì)把另外兩個(gè)概念放在一起談?wù)?,它們是DDD和微服務(wù)。所有有必要先把這三個(gè)概念區(qū)別一下。以下是從一個(gè)BA的視角出發(fā)來(lái)嘗試?yán)斫馑鼈冎g的關(guān)系。

Event Storming, DDD 和微服務(wù)的關(guān)聯(lián)性體現(xiàn)在它們都是為了解決同一個(gè)問(wèn)題,即軟件開(kāi)發(fā)的固有困難。

軟件其實(shí)是將物理世界的概念、關(guān)系、結(jié)構(gòu)、流程映射到計(jì)算機(jī)世界中,以便利用算力的優(yōu)勢(shì)解決現(xiàn)實(shí)世界中的問(wèn)題。那么在映射的過(guò)程中,就會(huì)存在兩個(gè)問(wèn)題:

1. 本質(zhì)問(wèn)題:打造由抽象軟件實(shí)體構(gòu)成的復(fù)雜概念結(jié)構(gòu);

2. 非本質(zhì)問(wèn)題:使用編程語(yǔ)言表達(dá)這些抽象實(shí)體,在空間和時(shí)間限制內(nèi)將它們映射成機(jī)器語(yǔ)言。

其中,非本質(zhì)問(wèn)題雖然也會(huì)一度造成軟件開(kāi)發(fā)的巨大困難,但隨著技術(shù)的改進(jìn),是可以被消除的。例如,高級(jí)語(yǔ)言的發(fā)明就徹底的解決了程序員需要直接編寫(xiě)匯編語(yǔ)言的困難。

相反,本質(zhì)問(wèn)題則是軟件開(kāi)發(fā)所固有的,在本質(zhì)上是不會(huì)被徹底解決的。因此,構(gòu)建復(fù)雜的概念結(jié)構(gòu)就成了軟件開(kāi)發(fā)的主要困難。

為了解決這個(gè)困難,微服務(wù)作為一種架構(gòu)風(fēng)格嘗試控制軟件復(fù)雜度,通過(guò)將單體應(yīng)用拆分為一個(gè)一個(gè)的微服務(wù)把應(yīng)用內(nèi)部的復(fù)雜度化解,并轉(zhuǎn)化到服務(wù)與服務(wù)之間。固有的復(fù)雜度雖然不會(huì)被消除,但是通過(guò)這樣的方式使其可以被很好地控制,從而更好地響應(yīng)業(yè)務(wù)變化。

而DDD作為一個(gè)理論體系指引了通向微服務(wù)的光明大道。DDD是在理論層面告訴我們?nèi)绾螌I(yè)務(wù)架構(gòu)和技術(shù)架構(gòu)保持一致性,如何進(jìn)行架構(gòu)設(shè)計(jì)。它是一種設(shè)計(jì)思想,設(shè)計(jì)原則和設(shè)計(jì)過(guò)程,也為真正實(shí)現(xiàn)微服務(wù)架構(gòu)提供了一套方法論。

以上并沒(méi)有解決具體該如何做的問(wèn)題,Event Storming則給出了一個(gè)答案。它將DDD落地到實(shí)踐層面,通過(guò)預(yù)設(shè)計(jì)的一系列工作坊,將技術(shù)人員和領(lǐng)域?qū)<掖楹显谝黄?,通過(guò)可視化、高互動(dòng)的方式一步一步將領(lǐng)域模型設(shè)計(jì)出來(lái)。

所以整體來(lái)看他們之間的關(guān)系大約是這樣的:


如果我們稍微類(lèi)比一下產(chǎn)品設(shè)計(jì)領(lǐng)域中的一些概念,會(huì)發(fā)現(xiàn)竟有類(lèi)似之處(并不準(zhǔn)確):



總結(jié)一下,Event storming是基于DDD思想的一套實(shí)踐工具,利用這套工具可以便捷地實(shí)現(xiàn)微服務(wù)劃分。

下面,通過(guò)近期我的一個(gè)項(xiàng)目經(jīng)歷來(lái)看看Event Storming一次具體實(shí)踐。(注:本文不涉及Event Storming的具體內(nèi)容和實(shí)踐步驟,如果不了解的可以閱讀Event Storming發(fā)明者Alberto Brandolini的《Introducing EventStorming》)


Event Storming的一次實(shí)戰(zhàn)

項(xiàng)目背景

國(guó)內(nèi)某PC生產(chǎn)廠(chǎng)商的IT部門(mén),希望對(duì)其訂單狀態(tài)跟蹤系統(tǒng)進(jìn)行服務(wù)化改造。因?yàn)楝F(xiàn)有遺留系統(tǒng)由于本身架構(gòu)設(shè)計(jì)等原因已經(jīng)難以承接業(yè)務(wù)部門(mén)的新需求了,加之原來(lái)的產(chǎn)品開(kāi)發(fā)團(tuán)隊(duì)人員流失,導(dǎo)致現(xiàn)在的系統(tǒng)成了一個(gè)黑盒,沒(méi)人能搞清楚里面的邏輯,也沒(méi)人敢碰里面的代碼。

IT拿著B(niǎo)U給的一筆預(yù)算,名義上是做產(chǎn)品的二期特性增強(qiáng),其實(shí)訴求是對(duì)一期產(chǎn)品做服務(wù)化改造。現(xiàn)在這已經(jīng)成了業(yè)界大廠(chǎng)商IT部門(mén)的一個(gè)不成文的套路。

Inception

在接到這樣的需求之后,我和一個(gè)Tech Lead入場(chǎng),開(kāi)展了為期兩周的Inception(注:這里的Inception泛指項(xiàng)目啟動(dòng)過(guò)程,所以也包括后面要介紹的Event Storming工作坊)。

這種類(lèi)型的項(xiàng)目不涉及太多新功能和頁(yè)面設(shè)計(jì),主要是對(duì)現(xiàn)有業(yè)務(wù)流程的梳理和技術(shù)架構(gòu)的重新設(shè)計(jì)。所以,微服務(wù)項(xiàng)目的Inception一般無(wú)需UX參與,視業(yè)務(wù)復(fù)雜度的情況,配備1BA+1TL,或者1BA+2TL即可。

Inception前半段走標(biāo)準(zhǔn)流程,與一般項(xiàng)目沒(méi)有太大差異:項(xiàng)目啟動(dòng)-愿景梳理-干系人分析-用戶(hù)畫(huà)像-用戶(hù)旅程。以這個(gè)項(xiàng)目為例,最后的用戶(hù)旅程的產(chǎn)出如下。


通過(guò)以上的幾個(gè)步驟,基本對(duì)于業(yè)務(wù)全景有了理解,并且以從系統(tǒng)外向系統(tǒng)內(nèi)的視角,將整個(gè)產(chǎn)品端到端的使用場(chǎng)景串聯(lián)了一遍,對(duì)產(chǎn)品的核心功能,核心業(yè)務(wù)邏輯梳理了一遍。

Event Storming啟動(dòng)

用戶(hù)旅程的產(chǎn)出是Event Storming的輸入。基于用戶(hù)旅程,我們可以將其拆分為幾個(gè)主要場(chǎng)景,并分別針對(duì)每個(gè)場(chǎng)景開(kāi)展Event Storming工作坊。鑒于篇幅有限,這里主要以用戶(hù)注冊(cè)的場(chǎng)景為例。

Event Storming是一個(gè)需要客戶(hù)高參與度的工作坊。因此在正式開(kāi)始之前,該做的準(zhǔn)備工作一定要做好,目的是讓客戶(hù)明白,這個(gè)工具解決什么問(wèn)題?這個(gè)工具怎么用?我將如何參與?為什么是這個(gè)工具,而不是其他的?可以采取的做法比如:

????1. 先花點(diǎn)時(shí)間介紹一下DDD,以及Event Storming和DDD的關(guān)系。

????2. 串講一下Event Storming的整個(gè)過(guò)程,明確告訴客戶(hù)需要他們做的是什么,以及最后期望的產(chǎn)出物。最好能舉個(gè)例子,以便所有人理解。

????3. 把需要用到的工具可視化,比如把用來(lái)表示事件、命令、角色、外部系統(tǒng)的不同顏色的sticker貼在白板上,把大致步驟寫(xiě)出來(lái)。

? ? 4. 分享這套工具在其他客戶(hù)那里的應(yīng)用效果,當(dāng)然主要挑正面的說(shuō),而且最好是同一行業(yè)的對(duì)標(biāo)企業(yè)。

工作坊的引導(dǎo)可以由TL來(lái),也可以由BA。但是個(gè)人覺(jué)得對(duì)于沒(méi)有技術(shù)背景的BA來(lái)說(shuō)挑戰(zhàn)比較大,難點(diǎn)在于:

? ? 1.流程形式容易走,但是由于沒(méi)有深入理解背后的思想,所以對(duì)工作坊的執(zhí)行效果和產(chǎn)出物的把控會(huì)欠缺。

? ? 2.會(huì)面臨客戶(hù)IT提出的一些技術(shù)問(wèn)題,難以應(yīng)對(duì)。

? ? 3. 整個(gè)方法雖然希望拉通業(yè)務(wù)和技術(shù),但是還是技術(shù)導(dǎo)向的。一些工作坊中的操作細(xì)節(jié)都是從技術(shù)思維出發(fā),所以本身對(duì)于BA而言,比較難以理解。比如,為什么要先梳理出事件?聚合又到底是什么東西?吐槽一句,聚合這個(gè)叫法本身就對(duì)于業(yè)務(wù)非常不友好。

Event Storming進(jìn)行中

Event Storming的過(guò)程按照:事件風(fēng)暴-命令風(fēng)暴-識(shí)別聚合-劃分限界上下文,來(lái)進(jìn)行。整個(gè)過(guò)程圍繞領(lǐng)域事件來(lái)驅(qū)動(dòng),因此基本上工作坊70%的時(shí)間都會(huì)花在事件風(fēng)暴這個(gè)步驟上。識(shí)別事件也是整個(gè)過(guò)程的一個(gè)基石。

引導(dǎo)者將規(guī)則介紹完之后,就會(huì)讓客戶(hù)頭腦風(fēng)暴,將識(shí)別出來(lái)的事件寫(xiě)在sticker上,然后貼在白板上。對(duì)于沒(méi)有參加過(guò)這個(gè)過(guò)程的客戶(hù)來(lái)說(shuō),不論事先將規(guī)則解釋的多么完備,放心,最后板上貼的一定是五花八門(mén)。這也是正常的情況,因?yàn)榇蠹覍?duì)于這個(gè)工具的認(rèn)知不同,對(duì)于業(yè)務(wù)的理解不同,自己所處的上下文不同,大家的語(yǔ)言不統(tǒng)一。這時(shí)候需要引導(dǎo)者在第一個(gè)場(chǎng)景的實(shí)踐過(guò)程中預(yù)留更多的時(shí)間來(lái)引導(dǎo)客戶(hù)思考,澄清業(yè)務(wù),統(tǒng)一認(rèn)知,統(tǒng)一語(yǔ)言。所以第一個(gè)場(chǎng)景其實(shí)是在練習(xí),以便后續(xù)的過(guò)程更加順利。所以建議從一個(gè)非核心域的業(yè)務(wù)場(chǎng)景來(lái)開(kāi)始,一般我們可以選用支持域的,比如用戶(hù)注冊(cè)的場(chǎng)景。

第一步-事件風(fēng)暴的結(jié)果


第二步-命令風(fēng)暴的結(jié)果


第三步-尋找聚合的結(jié)果

在第一個(gè)場(chǎng)景的練習(xí)過(guò)程中,客戶(hù)會(huì)提出各種各樣的問(wèn)題,比如:

1. 打開(kāi)一個(gè)網(wǎng)頁(yè)算不算一個(gè)事件。 應(yīng)對(duì):注意區(qū)分讀模型和領(lǐng)域事件。

2.?郵件是系統(tǒng)自動(dòng)發(fā)的,但是我想知道這個(gè)狀態(tài),因?yàn)槿绻]件沒(méi)有發(fā)出去,我可以追溯原因。 應(yīng)對(duì):注意區(qū)分系統(tǒng)log和領(lǐng)域事件。

3.?如果事件記錄不全對(duì)之后的開(kāi)發(fā)會(huì)不會(huì)有什么影響。應(yīng)對(duì):事件風(fēng)暴的最終目的是識(shí)別服務(wù),一小部分事件的缺失并不會(huì)影響最終產(chǎn)出。

4.?事件的粒度如何把控,是否要抓細(xì)節(jié)?應(yīng)對(duì):取決于業(yè)務(wù)規(guī)模和時(shí)間限制,還有最終服務(wù)的粒度。

5. Event Storming 是項(xiàng)目啟動(dòng)的時(shí)候做一次就可以了,還是之后每個(gè)迭代開(kāi)始的時(shí)候都要做。應(yīng)對(duì):需要?jiǎng)澐址?wù)的時(shí)候就可以做。

Event Storming這套工具本身是一個(gè)新生兒,是否好用要經(jīng)歷時(shí)間的考驗(yàn),所以目前肯定會(huì)遇到各種各樣的問(wèn)題。在面對(duì)客戶(hù)問(wèn)題的時(shí)候,要注意引導(dǎo)客戶(hù)不要過(guò)多關(guān)注在工具本身,而是要關(guān)注背后的思想。

在識(shí)別出所有聚合之后,就可以基于這些聚合識(shí)別問(wèn)題域,劃分限界上下文。每個(gè)上下文即可對(duì)應(yīng)一個(gè)微服務(wù)。

所有聚合
劃分出的微服務(wù)

最后,最重要的一點(diǎn)是要為這些問(wèn)題域分類(lèi),它是一個(gè)核心域、通用域還是支持域?這雖然對(duì)于最終產(chǎn)出的微服務(wù)劃分沒(méi)有影響,但之所以重要是因?yàn)樗P(guān)乎產(chǎn)品定位和核心價(jià)值。

比如,該項(xiàng)目的產(chǎn)品是一個(gè)訂單信息追蹤系統(tǒng),最主要的功能就是發(fā)送訂單狀態(tài)更新郵件給用戶(hù)。但其實(shí),我們和客戶(hù)進(jìn)行討論后認(rèn)為:核心域并不是發(fā)郵件,而是訂單信息和郵件發(fā)送邏輯。這個(gè)產(chǎn)品獨(dú)一無(wú)二的競(jìng)爭(zhēng)力在于,基于訂單信息這樣的核心數(shù)據(jù)資產(chǎn),通過(guò)復(fù)雜的郵件發(fā)送邏輯,能夠準(zhǔn)確實(shí)時(shí)地推送客戶(hù)想要的信息。所以,一旦將這兩個(gè)問(wèn)題域識(shí)別為核心域就意味著,之后項(xiàng)目資源將向這兩個(gè)方面傾斜。

在做完event storming之后,建議將識(shí)別出來(lái)的各個(gè)問(wèn)題域和之前的產(chǎn)品愿景對(duì)照一下,看看是否一致。


Event Storming結(jié)束后的反思

在客戶(hù)現(xiàn)場(chǎng)實(shí)踐過(guò)后,還是遺留了很多問(wèn)題,比如:

1. Event Storming 中的元素:命令和角色,與User Journey中的元素:角色和行為,有些類(lèi)似。重復(fù)梳理他們的過(guò)程顯得比較冗余。

2. 整個(gè)Event Storming的過(guò)程以事件為中心,命令風(fēng)暴和尋找角色本身的意義顯得不是特別明確。

3. Event Storming 的思路是從內(nèi)部向外看系統(tǒng),先找事件,再找命令和用戶(hù)。這樣的思考方式比較反直覺(jué),且與業(yè)務(wù)人員的思考方式相反。所以對(duì)于大部分新客戶(hù),尤其是業(yè)務(wù)部門(mén),這個(gè)工作坊的學(xué)習(xí)成本較高,參與度可能會(huì)受影響。

不僅如此,還有更多的問(wèn)題可以引發(fā)思考:

1. Event Storming 在Inception中所扮演的位置,以及如何與Inception中的其他實(shí)踐很好的融合?

2. 我們是否可以考慮在其他非服務(wù)化項(xiàng)目的Inception中引入Event Storming, 如何說(shuō)服客戶(hù)為它買(mǎi)單?

3. 對(duì)于Event Storming的產(chǎn)出物,我們關(guān)注的是領(lǐng)域事件和劃分好的服務(wù), 還是只有服務(wù)?如果也關(guān)注事件,那么事件后續(xù)的應(yīng)用是什么?

Event Storming 還是一個(gè)新工具,相信會(huì)在未來(lái)的日子里不斷演進(jìn),至少現(xiàn)在我已經(jīng)能看到不同版本的呈現(xiàn)了。不管如何演變,只要領(lǐng)域建模對(duì)于軟件開(kāi)發(fā)是一個(gè)復(fù)雜問(wèn)題,那么那些能夠解決復(fù)雜問(wèn)題的優(yōu)良品質(zhì)一定會(huì)被保留下來(lái),比如統(tǒng)一語(yǔ)言,技術(shù)和業(yè)務(wù)的高度協(xié)作,不斷迭代。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,087評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,521評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,493評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,207評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,603評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,813評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,364評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,110評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,305評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,532評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,953評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,209評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,033評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,268評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容