我們要如何描述一個系統呢? 可以從不同的角度觀察,好比瞎子摸象,你摸到甚麼部位,系統就像那一個局部,那就慘了,因此,建議不要局限於方法論,應該從各種視角去觀察系統。
圖一. 系統觀察的視角(Viewpoints)
從上一篇知道 DFD 是從資料的流動與處理的角度觀察系統的功能,Yourdon隨後提出的個案是以事件為出發點描述系統,而領域驅動設計則是以事件加上實體(物件)角度出發,並且都加強了一些內容描述與整合,下面就來介紹相關的作法。
領域驅動設計以下簡稱DDD。
事件風暴(Event Storming)是高階需求討論的一種手法,由 Alberto Brandolini 於2013年提出,它舉辦的方式類似IBM的Joint application design(JAD)、SCRUM的衝刺計劃會議(Sprint planning meeting),是一種敏捷(Agile)的手法,想法是儘早讓使用者參與專案,以免像傳統的瀑布型開發方式,到了系統開發末期,一翻兩瞪眼,使用者說『這不是我要的』,就前功盡棄了。一般作法就是邀請重要的利害關係人,包括領域專家、使用者、專案開發成員一起討論願景與需求,通常是先發散(Diverge)再收斂(Converge),先由所有人腦力激盪,天馬行空的提出各種想法,然後,再由主持人將想法合併歸類,事件風暴的作法是以事件為導向,整理出事件的觸發者、包含的實體及相關的訊息,包括參與的角色與權限等。
相關的手法可參考JAD、SCRUM,以下只列舉幾點說明:
圖二. SCRUM 白板,圖片來源:dreamstim
JAD訂定九項關鍵步驟(Key Steps),可以參考,每個步驟應該有哪些產出,不過,DDD在此階段最重要的產出應該是:
領域範圍(Bounded Context):有人直翻為【限界上下文】,界定整體系統的範圍,並劃分各個子系統的界線,如下圖。
圖三. 領域範圍(Bounded Context),圖片來源:Using domain analysis to model microservices
接著對每個領域範圍作進一步的分析,找出範圍內所有的事件,並清楚定義觸發者(Command)、Actor/User及處理流程,再從流程中提取實體(物件),進而聚合(Aggegate)。
事件的觸發者有很多種:
維基百科有非常棒的定義,最後整理成圖四,複雜一點可能變成圖五,圍繞整個辦公室。
圖四. 事件風暴的產出,圖片來源:Model Event Storming Results in Context Mapper
圖五. 事件風暴的產出奇觀,圖片來源:Make Collaboration Better with Event Storming
最後將事件風暴的產出整理成表格,或像DFD的Context Diagram,就是一份很完整的高階系統規劃書。
圖七. 領域範圍(Bounded Context) + 實體(Entity),圖片來源:How the Domain-Driven-Design is the ideal architecture to develop IoT Services?
透過以上的活動,我們就可以得到一個系統的全貌,接下來由上向下(Top Down)展開,逐步細緻化,就可以完成整個系統的設計與開發。