Framework Deep Dive

Event Storming

把开发者、产品经理和领域专家聚在一起,用彩色便利贴拼出一个系统的完整真相。Event Storming 发现的不是代码,而是团队共同误解了多少年的隐性假设。

每个人都以为自己理解这个系统

工程团队壮大之后,一个奇怪的现象开始出现:每个人都有一张自己脑子里的系统地图,但没有人的地图和别人的完全一样。前端工程师理解的「订单」,和后端工程师理解的「订单」,有着细微但关键的不同。产品经理描述的「取消流程」,在工程实现里分裂成了三个不同的代码路径。

传统的需求文档无法解决这个问题——文档是静态的,系统是动态的,而人们对系统的理解是碎片化的。架构评审会上,大家讨论的往往不是系统真正是什么,而是各自脑子里那个不同版本的系统。

Event Storming 用一种激进的方式解决这个问题:把所有人聚在同一面墙前,用过去时描述系统里发生的事情(「订单已创建」),强迫每个人把隐性知识变成可见的便利贴。当矛盾出现在墙上,它就不再是「我的理解」和「你的理解」的分歧,而是一个必须解决的设计问题。

六种颜色,一面墙,一个共同语言

Event Storming 用颜色编码区分不同类型的领域概念。每种颜色代表一个特定的角色,所有颜色共同构成一个完整的领域模型。

橙色 — 领域事件已经发生的事情,过去时表达:「订单已支付」
蓝色 — 命令触发事件的动作:「提交订单」「取消订阅」
黄色 — 聚合/实体处理命令的领域对象:「订单」「用户」
紫色 — 策略业务规则:「当支付失败3次,锁定账户」
粉色 — 外部系统支付网关、短信服务、第三方 API
绿色 — 读模型用户看到的界面信息:「购物车页面」

以下是一个电商结账流程的简化 Event Storm 示例,展示从浏览到库存更新的完整链条:

电商结账流程 · Event Storm 示例(从左至右按时间顺序)
浏览上下文
触发
Read Model 商品列表页
命令
Command 添加到购物车
事件
Domain Event 商品已加入购物车
结账上下文
命令
Command 发起结账
聚合
Aggregate 订单
事件
Domain Event 结账已开始
支付上下文
外部
External System 支付网关
策略
Policy 失败3次 → 锁定
事件
Domain Event 支付已处理
履约上下文
聚合
Aggregate 库存
事件
Domain Event 订单已确认
事件
Domain Event 库存已更新

每个虚线框代表一个「有界上下文」(Bounded Context)——系统的自然边界,也是未来微服务拆分的候选单元。

什么时候该用它?

Event Storming 在复杂度高、跨团队协作密集的场景下价值最大。它不适合小型功能迭代,但对系统性问题几乎不可替代。

🏗️
微服务边界划分
当单体应用需要拆分成微服务时,Event Storming 产生的有界上下文提供了自然的拆分依据,比纯技术讨论更有说服力。
🔗
前后端深度对齐
当前端团队和后端团队对「同一个功能」有完全不同的理解时,一次 Event Storming 工作坊能在几小时内建立共同语言。
🗺️
复杂业务流程建模
金融、物流、医疗等复杂领域的业务流程往往涉及大量隐性规则,Event Storming 把这些规则从专家头脑中「提取」到白板上。
🆕
新系统从零设计
在写第一行代码之前,用 Event Storming 和领域专家共同建模,避免「先开发后发现理解错误」的高昂返工成本。
🔎
遗留系统梳理
面对一个没有人完全理解的老系统,Event Storming 帮助团队通过「发生了什么」来重建对系统行为的共同认知。
👥
新团队 Onboarding
新工程师加入后,一次领域 Event Storming 比阅读几百页文档更能快速建立对业务的整体理解。

Miro 的微服务迁移
Event Storming 重建架构蓝图

2019 年,Miro(协作白板工具)的工程团队面临一个经典的快速增长困境:团队从 5 人扩张到 50+ 人,但代码库依然是一个巨大的单体架构。不同团队修改同一个模块时会互相阻塞,部署风险越来越高,新功能的开发速度也随团队扩张反而下降。

更深层的问题是:没有人能说清楚系统的边界在哪里。工程师们各自理解一片代码,没有人对整体有清晰的认知。架构讨论往往陷入「我以为是这样的」与「我以为是那样的」的口角。

Miro
实时协作系统架构重构 · 2019–2021
2019 Workshop
6 小时 Event Storming 工作坊的三大发现
47
领域事件被识别
团队撒出 47 个橙色便利贴,其中 11 个是过去从未被明确命名的隐性事件——「存在于代码中,但从没有被讨论过」。
3
隐性聚合被命名
发现了三个没人明确定义过的核心聚合:Canvas(画布状态)、Presence(用户在线状态)、Session(协作会话)。这三者过去混在同一个代码模块中。
1
架构蓝图产出
工作坊的输出直接成为 Miro 微服务迁移的架构蓝图,定义了服务边界、数据所有权和接口协议。
6h
工作坊时长
2年
迁移完成(2021)
30M
迁移后支撑用户规模
为什么 Event Storming 有效
工作坊邀请了 8 名工程师 + 3 名 PM + 1 名实时同步架构专家,确保没有知识盲区
「撒事件」阶段不讨论结构,强制每个人把隐性知识外化为便利贴,而非保留在脑中
三个隐性聚合的发现,正是来自「同一区域出现大量无法归类的事件」这个信号
💡
关键启示
Alberto Brandolini 本人曾引用 Miro 作为 Event Storming 实践者案例
6 小时的工作坊投入,避免了可能长达数月的架构返工和团队摩擦
「问题点」(红色便利贴)的数量是系统复杂度的最诚实指标——问题越多,价值越大

如何主持一次 Event Storming 工作坊

Event Storming 是一个高度物理化的工作坊——它需要真实的空间、真实的便利贴、和真实的人。以下是完整的引导手册,适用于 4–8 人的工作坊。

01
提前
30 min
准备物料与空间
主持人 环境准备
需要:足够长的白板或至少 10 米的白纸墙、6 种颜色便利贴(橙/蓝/黄/紫/粉/绿)、粗头马克笔(每人一支)、红色便利贴(标记问题点)。邀请:1 名主持人、2–3 名开发者、2 名领域专家(熟悉业务的人,不必是技术人员)、1 名 PM。清场——这是一个站立工作坊,移走所有椅子。
关键原则:不允许使用 Miro 或任何数字工具代替物理便利贴(除非完全无法线下)。物理便利贴创造的「争夺墙面空间」动态是 Event Storming 能量的来源,数字工具会弱化这一效果。
02
60 min
撒出领域事件
全员 橙色便利贴
所有人同时写橙色便利贴——不讨论、不等待、不组织。规则只有一个:事件必须是过去时动词(「用户已注册」「订单已取消」)。以大致的时间顺序放置在墙上。重复是被允许的,矛盾是被欢迎的。这个阶段的目标是产生足够多的素材,而非正确性。
主持人提示:当室内安静下来(每个人都在写,没有讨论声),说明这个阶段进入了正确状态。如果有人在讨论而不写,提醒他先写再讨论。
03
45 min
梳理时间线
全员 排序 + 问题标记
作为一组,把便利贴按时间顺序排列。移除真正的重复(措辞不同但含义相同)。对于任何引发争议或不清晰的事件,贴一张红色「问题点」便利贴——不解决,只标记。这个阶段会产生大量讨论,这是正常的。问题点越多,工作坊越有价值。
重要规则:红色问题点不在这个阶段解决,只是被看见和标记。急于解决问题会打断整个时间线的梳理节奏,而且很多问题会在后续步骤中自然得到答案。
04
60 min
添加命令与聚合
开发者主导 蓝色 + 黄色
对每个领域事件:在它的左边加一张蓝色便利贴(命令:是什么触发了这个事件?);识别处理这个命令的黄色聚合(哪个领域实体负责处理?)。开始时每个事件独立处理,之后把有相同聚合的命令-事件对聚拢在一起。聚合的位置显示了系统的责任边界。
识别聚合的信号:如果多个命令都指向「差不多同一个东西」,那个「东西」就是一个聚合。给它起一个名字——这个命名过程本身往往就能解决大量的概念混乱。
05
45 min
识别策略与边界
领域专家主导 紫色 + 边界线
为业务规则添加紫色便利贴(「当 X 发生时,执行 Y」)。然后观察整个墙面:哪些命令、聚合、事件自然地聚集在一起?用马克笔在这些自然簇群周围画出虚线框——这些就是有界上下文,也是潜在的微服务边界或团队边界。
边界识别技巧:如果两个区域之间的连接「感觉脆弱」或「需要很多说明」,那条线可能就是一个边界。领域专家的直觉在这里非常有价值——他们对哪些事情「属于一类」有天然的感知。
06
60 min
解决问题点
全员 最高价值环节
回到所有红色「问题点」便利贴,逐一讨论。这是整个工作坊最有价值的部分——每一个问题点背后都是一个团队长期共存的隐性分歧或未解决的设计问题。有些问题会在讨论中立刻解决,有些会成为需要进一步调研的行动项。记录所有决定和待办。
期望校准:不是所有问题点都必须在当天解决。问题点被看见、被命名、被分配负责人,就已经是巨大的进步。「我们今天发现了这个问题的存在」本身就是工作坊的成功。

用便利贴风暴打碎复杂业务的黑盒

事件风暴(EventStorming)由意大利软件设计师阿尔贝托·布兰多里尼(Alberto Brandolini)于 2012 年前后创造,脱胎于领域驱动设计(DDD)社区,是一种高度协作的业务流程建模工作坊形式。它将技术人员和业务人员拉到同一张白纸前,用橙色便利贴代表「领域事件」,快速对齐系统边界和业务规则,在微服务架构设计中尤其受到欢迎。

2003
领域驱动设计奠基
Eric Evans 出版《领域驱动设计》(Domain-Driven Design),提出限界上下文、聚合根等核心概念,为业务建模建立语言基础。DDD 社区由此形成,持续探索更轻量、更协作的建模实践。
2012
布兰多里尼提出事件风暴
Alberto Brandolini 在博客和社区中首次描述事件风暴工作坊形式,以「领域事件」为核心粒子,用彩色便利贴在大幅纸面上构建业务流,打破了 UML 图表对业务讨论的垄断,引发 DDD 社区强烈共鸣。
2016
与微服务架构深度结合
随着微服务架构热潮兴起,事件风暴成为划定服务边界的主流工作坊方法。团队用它识别「限界上下文」,将业务领域的自然边界映射为微服务的技术边界,受到 Netflix、Spotify 等工程团队的推广。
2017
《事件风暴》书籍出版
布兰多里尼出版《EventStorming》一书,系统整理了工作坊的操作规则、便利贴颜色体系和主持技巧,使事件风暴从社区实践升级为有文档支撑的正式方法论,进入企业培训课程。

与这些工具搭配效果更好