什么是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)景。
在第一個(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ù)。
最后,最重要的一點(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é)作,不斷迭代。