Event Storming
Flexible workshop format for collaborative exploration of complex business domains
Event Storming provides a shared language that bridges the gap between business experts and technical teams.
![Event Storming](/static/DLES-Brandolini-transparent-4440ac0f69a76514aff4d7acf91e4078.png)
Event Storming
It was created by Alberto Brandolini, and is described in his book Introducing EventStorming.
Event Storming is a collaborative workshop technique used to explore complex business domains.
Its primary goal is to create a shared understanding among stakeholders, including business experts and technical teams.
It helps to make complex processes more tangible.
Events represent significant occurrences in the domain that trigger changes or reactions.
Commands and Policies are also used to represent actions and rules within the domain.
Design Level Event Storming helps in identifying Aggregates and Entities within the domain. Aggregates are clusters of related objects that are treated as a single unit.
ZDL ~ A Domain Modeling Language for DDD and Event Storming
ZenWave Domain Language (ZDL) is a Domain Specific Language that maps Event Storming discoveries with DDD principles in mind into a developer friendly format.
It works as an Ubiquitous Language, retaining the language of the domain and because is machine friendly it propagates automatically to documentation, code and tests.
![Event-Storming to ZDL Mapping](/static/EventStorming-ZDL-Mapping-cb9c987d5d0aff110c5890481034ae20.png)
Jump to Bounded Context Canvas for details about how to map Event-Storming concepts into ZDL format.
From Vision To Detail
![Event Storming from Vision to Detail](/static/event-storming-from-vision-to-detail-2a3e4ad48045d0078658e24e2aea3f3e.png)
(Source: https://es.slideshare.net/ziobrando/50000-orange-stickies-later)
Big Picture EventStorming
![Big Picture EventStorming](/static/event-storming-timeline-narratives-4183fade8af44c506a31bb3b5a75da73.png)
Big Picture EventStorming is ideal for Analysis of a whole Business Domain or Subdomain. Beyond silos, it requires the participation of business experts
(Source: https://medium.com/@springdo/a-facilitators-recipe-for-event-storming-941dcb38db0d)
Design Level EventStorming for Designing Event-Driven Systems for a Bonded Context
![Design Level EventStorming](/static/event-storming-design-canvas-4c147ef01bd41e1f36254819d30c038a.png)
Design Level EventStorming is ideal for Designing Event-Driven Systems for a given Bonded Context and while it can be performed by the development team alone, it is recommended to request feedback and validation from domain experts.
(Source: https://mrpicky.dev/design-level-event-storming-with-examples/)
Event Storming Elements
Events
Events play a central role in Event Storming. They represent significant occurrences in the domain that trigger changes or reactions.
![Event Storming - Event](/static/event.light-01ded35c60c4edf5af34550129f33a47.png)
Commands and Policies
Commands and Policies are used to represent actions and rules within the domain.
![Event Storming - Command](/static/command.light-187a558a5ccb7d1737cb2989be5577df.png)
User Initiated Command Produces Event
Commands can be initiated by users.
![Event Storming - User Initiated Command Produces Event](/static/user-command-event.light-d07dcd11a810729c1d27aece6e3a7c55.png)
Policy Initiated Command
Commands can also be initiated by policies. Rules triggering in the background, spanning for other systems events, temporal triggers, external systems, etc.
![Event Storming - Policy Initiated Command](/static/policies.light-261fd366afd210b30dab53d4b21b0b59.png)
Command invoked on System produces Event
Commands do not directly triggers events, but they are invoked on a system, which in turn produces events.
![Event Storming - Command invoked on System produces Event](/static/command-system-event.light-0cff30838dde43fa5f41526e2ff31416.png)
Command invoked on Aggregate produces Event
DDD systems are comprised of Aggregates, which are clusters of related objects that are treated as a single unit. Commands are invoked on Aggregates, which in turn produces events.
![Event Storming - Command invoked on Aggregate produces Event](/static/command-aggregate-event.light-43a4866438f885d28d34747927a655fb.png)
Read Models in Commands and Events
Read Models represents Value Objects associated to Commands and Events.
![Event Storming - Command invoked on Aggregate produces Event](/static/read-model-command-aggregate-event.light-628deadc98f742ffa4ed5cc7d5ea6d90.png)
Event Storming Steps
Establish the Timeline
First step is discover all relevant events that happened in the domain and sort them in a timeline from left to right.
Find pivotal events: those events where the flow splits into different paths or joins back together. These pivotal events would be good candidates for Context boundaries.
![Event Storming Timeline](/static/event-storming-timeline-65bd15d67f78aca35284d47d1f7e2125.png)
Join events with commands and policies
Next join events (facts) with commands and policies (actions and rules).
![Event Storming with Commands and Policies](/static/event-storming-with-commands-and-policies-317f2876473d40d0ae74fa2e7dd6684c.png)
Identify Aggregates
Identify Aggregates and Entities within the domain. Alternatively you can just identify Systems and leave Aggreate discovery for a posterior technical design phase.
![Event Storming with Aggregates](/static/event-storming-with-aggregates-3d9e30e886e25b216e259f54e34e4a67.png)
Split into Bounded Contexts
A Bounded Context is a self-contained entity with its own domain model and its own Ubiquitous Language that is not affected by the outside world.
They help in organizing the domain into manageable parts and in defining the interactions between different parts of the system.
![Event Storming with Bounded Contexts](/static/event-storming-bounded-contexts-8c06ed7f17e09561e5ab62d8bb9709b9.png)
Describe the Bounded Contexts using Bounded Context Canvas and ZDL Model Language
Use a Bounded Context Canvas to describe the inputs, outputs, aggregates and policies of Bounded Context.
You can describe the Bounded Context directly using the developer friendly and machine friendly ZDL Model Language.