侧边栏壁纸
博主头像
梦幻世界博主等级

行动起来,活在当下

  • 累计撰写 23 篇文章
  • 累计创建 2 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

DDD之事件风暴Event Storming

梦幻世界
2024-05-31 / 0 评论 / 0 点赞 / 180 阅读 / 11204 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-05-31,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

官方地址

事件风暴官网

什么是事件风暴

官方定义

事件风暴是一种以协作探索复杂业务领域为目标的,灵活的工作坊(workshop)形式的活动。

它有不同的玩法,适用于多种不同的场景:

  1. 发掘现有的健康业务线中最有改进价值的地方

  2. 探索新业务模式的可行性

  3. 设想新的服务,为每个参与方带来最好的正向结果

  4. 设计整洁可维护的事件驱动型(Event-Driven)软件,以支持快速发展的业务

事件风暴的适应性,决定了它允许有不同背景的项目干系人进行复杂的,跨学科的沟通交流,提供了一种跨越信息孤岛和专业界限的新型协作方式。

本质

一套管理复杂软件系统多人协作的步骤和方法,最大可能的让所有人参与表达、专注、思考,促成有效沟通。

在DDD领域中的实践

事件风暴(Event Storming): 一种基于工作坊的DDD实践方法,可以快速发现业务领域中正在发生的事件,指导领域建模及程序开发。

  1. 事件:即事实,即在业务领域中那些已经发生的事件就是事实。

  2. 风暴:运用头脑风暴会议进行领域分析建模。

特点:

  1. 功能很强大:能够在数小时而不是数周内提出完整业务流程的综合模型。

  2. 很有吸引力:整个想法是将提出问题并将知道答案的人带到同一房间,并共同建立一个模型。

  3. 容易:符号非常简单。

核心概念

在事件风暴中分为8个核心概念

  • 事件Event

  • 热点Hotspot

  • 决策命令Command

  • 发起命令的参与者User/Actor

  • 外部系统External System

  • 规则Policy

  • 读模型Read Model

  • 聚合Aggregate

事件Event

事件即事实,即在业务领域中那些已经发生的事件就是事实,并可能需要保存下来或者让“别人”响应。

事件是对系统产生了业务上的影响的动作,相对的,如果仅仅是数据查询操作,则只会对系统产生技术上的影响,如CPU上升或者内存上升等。

注意:一般查询操作都不会触发事件的产生,所以查询操作不是事件,如点击了查询按钮显示了数据列表,一般情况下不会有类似于:数据已查询或列表已查询,这样的事件。

事件使用橙色便签表示,并且是过去式,如:用户已注册(User Registered),激活邮件已发送(ActivationEmail Sended)等。

热点Hotspot

热点表示不确定的点、有风险的点或者需要特别注意的点,一般贴在事件旁边,代表这件事情值得特别关注。

热点使用紫色便签表示,文字描述可以随意点,没有格式要求。

决策命令Command

决策命令产生了事件,可理解为产生事件的动作,与事件一一对应。代表行动、意图,命令在领域事件发生之前,表示事件的触发器。如用户已注册(User Registered)事件对应的决策命令就是注册用户(Register User)。

决策命令用正方形蓝色便签表示,在实践中只需要将事件“反过来”就行了。

发起命令的参与者User/Actor

前面的决策命令一定是由某个人或系统来发起的。比如:前面的注册用户这个命令,是由普通用户这个Actor发起的,进而可以联想到可能整个系统中还会有非普通用户,如管理员。

注意:在Big-Picture Event Storming workshop的实践中,不将决策命令贴出来

使用小黄色便签,结合Command和Event。

外部系统External System和规则Policy

Event不一定由前面所说的某个Actor触发Command而产生,也可能是由外部系统或者某种规则自动触发Command而产生。

  • 外部系统使用粉色便签表示。

  • 规则Policy使用紫色便签表示。

读模型Read Model

某个Actor做出决策Command的前提是需要看到某些信息,或者说,支撑Actor更容易做出决策命令Command的信息。读模型一般是通过Web页面(UI/UX)来展示更多的信息,以让用户更容易做出决策。

读模型用绿色便签表示。

聚合Aggregate

某个Actor在某个聚合调用某种Command产生了某个Event。

比如前面的用户已注册(User Registered)事件,是由普通用户(Normal User)在注册薄(Register)上调用注册用户(Register User)这个命令而产生。

聚合使用大黄色便签表示。

整体解释

根据下图中的名字将整体串起来解释下。

一个Actor根据看到的Query Model/Information,决定对External System或者Aggregate执行一个Command/Action,进而产生了某种Domain Event。此Domain Event可能触发了某种Policy,此Policy可能又对External System或者Aggregate执行一个Command/Action。此Domain Event也可能会导致Query Model/Information发生变化,从而给Actor提供更多信息以进行其他操作。

实践形式

事件风暴的灵活性决定了它有多种实践形式,这里主要介绍两种实践形式

Big-Picture Event Storming

What:一种进行业务全景探索的EventStorming形式

Who:产品经理或者开发Leader/架构师作为主持人,市场分析员、业务人员、财务、UX和其他需要配合的部门代表。总人数控制在8-12人。

When:当一个项目或者产品立项之后,并且业务人员(产品人员)已经基本有了项目/产品的构思。

Why:需要和所有的利益相关人(Stakeholders)一起探索发现业务全景,搭建一个平台让Stakeholder能贡献自己的专业知识,让所有人知道全景/边界、风险点、在此项目中的职责并发现产品/项目的逻辑漏洞。

Design-Level Event Storming

What:一种用于更细节的软件设计的EventStorming形式

Who:开发Leader/架构师作为主持人, 业务人员/产品经理,研发团队所有其他人员:测试、前端/后端、UI等。总人数控制在6-12人左右(为减少沟通成本,研发团队不宜过大)。

When:Big-Pic EventStorming之后,产品经理/业务人员自行进行了进一步业务梳理之后,或者某个业务的上下文需要研发团队介入研发之前。

Why:研发团队所有人都需要知道某个上下文的业务全景,需要学习更多的业务知识,以便开始研发工作;研发团队需要进行业务建模、统一业务语言以及知道业务优先级;业务/产品经理需要补充更多关于实现落地的细节,以便进行User Story的补充和优先级的调整。

两种形式的区别

  1. 人员

    1. Big-Picture Event Storming侧重在业务方,重点是所有的干系人(StakeHolders),含研发Leader或者架构师

    2. Design-level Event Storming侧重在研发团队内部,含研发Leader或者架构师

  2. 目的

    1. Big-Picture Event Storming侧重在探索业务全景,发现热点(风险点或值得特别关注的点),补充不同领域的知识(如财务、运营等),并让stakeholder了解整个项目以及自己在这个项目中的职责(后期需要配合)。

    2. Design-level Event Storming侧重在向研发团队传播业务知识,并进行业务建模,是研发和业务之间沟通的桥梁。

  3. 范围

    1. Big-Picture Event Storming侧重在业务全景

    2. Design-level Event Storming侧重在全景中的某个业务上下文

事件风暴能解决的问题

正如本文“实践形式”中描述的那样,事件风暴主要有两种形式用于解决不同的问题。总结来看,它打破了“部门墙”,能让所有人了解到业务的全貌,能让技术和业务在同一个游戏平台上解决真正的问题,能让所有人快速学习业务知识。

  • 当软件系统需要进行跨部门的协作与对齐时,能帮助所有相关人看到整个系统的全貌、让技术和业务在同一个问题上进行讨论、发现有价值的问题、定义与明确各相关人的职责、发现逻辑漏洞、划分系统上下文、统一语言。

  • 当软件系统开始研发之前,能帮助研发团队所有人看到系统的全貌或者一个上下文的全貌、协助进行业务建模,统一语言、非常适合项目研发的kickoff。

  • 当有新人入职时,能帮助新人快速的学习系统的全貌、边界以及统一的语言。

事件风暴不能解决所有问题

不同的沟通形式和方法用于解决不同的问题,事件风暴不可能解决所有沟通问题。

不能解决Why的问题,更适合解决How的问题

事件风暴并不能解决“为什么做”的问题,更适合解决“怎么做”的问题。

一件事做与不做,取决于长期或者短期带来的价值。如对于企业中产品研发来说,一个产品的做与不做,取决于前期的市场调研与分析,有很多工具和方法论用于解决这个问题,比如SWOT、5 Force analysis、BRD,AWS的逆向工作法等。

不适合用做底层技术的讨论

实践证明,事件风暴并不适用于存储系统、API网关、网络通信等底层技术或基础设施的讨论。这些更多需要专业的技术能力,且落地的时候有标准或者最佳实践可以遵循。一般的做法是,架构师或者技术专家进行这些系统的设计,然后跟技术团队沟通并实施,沟通的更多是关于技术人员容易理解的技术上的问题,而不是业务知识。

事件风暴与DDD的关系

一般认为这两者的映射是这样的:

  • Big-Picture形式的事件风暴的产出对应战略设计中的领域分析,以划分领域边界和限界上下文。

  • Design-Level形式的事件风暴则继续细化,与DDD的战术设计可以联系起来,可以用来识别聚合根,实体等。

其中统一语言是贯穿始终的!

但两者可以映射起来并不代表他们之间有什么关系,DDD是以强调业务领域为核心的应对复杂业务系统研发的一套方法,而事件风暴只是探索业务领域的其中一种方式(也可以说是工具)。

事件风暴对应事件建模范式,是以事件为视角来观察真实世界,通过事件引起的领域对象状态迁移来驱动出领域模型,进而影响软件实现的整体架构。与之对应的是对象建模范式,是以对象为视角来观察世界,一切皆为对象。而DDD则不关心使用哪种建模范式,只要以业务为核心,对系统进行建模即可,也就是说,事件和对象都可以是业务模型。

事件风暴与头脑风暴的关系

事件风暴和头脑风暴相似但不相同。它们都是多人一起对一件事情进行思考,都有发散和集中的过程,但有以下不同:

目的和产出不同

  • 头脑风暴是大家需要创意的时候,将大家聚在一起进行idea的碰撞。一般产出是几个较好的点子,但并不知道怎么做。

  • 事件风暴强调体系,是业务建模的过程,将大家聚在一起对业务软件系统进行整体(部分上下文)的探索,风险点发现等。一般产出是整块业务系统的模型,所有人完成了知识的交换与学习。

范围不同

  • 头脑风暴的适用范围更广,几乎任何事情都可以大家一起“脑暴”一下。

  • 事件风暴则是明确的面向业务软件研发。

新零售电商中卖家补货参考

新零售电商中批发商城流程参考

领域模型-子域划分

根据批发商城的整个事件风暴建模总结来看,批发商城分为以下几个域

核心域

  • 商品域

  • 库存域

  • 订单域

支撑域

  • 购物车域

  • 仓储域

  • 司机域

  • 供应商域

  • 店铺域

通用域

  • 支付域

  • 结算域

  • 优惠券域

  • 计费域

  • 物流域

限界上下文

根据领域划为可以将限界上下文分为以下几个

  • 用户上下文(司机域、供应商域、店铺域)

  • 商品上下文(商品域)

  • 购物车上下文(购物车域)

  • 订单上下文(订单域)

  • 库存上下文(库存域、仓储域)

  • 物流上下文(物流域)

  • 支付上下文(支付域、结算域)

  • 计费上下文(计费域)

  • 营销上下文(优惠券域)

参考文章

DDD建模方法论之【事件风暴法】_事件风暴建模-CSDN博客

基于事件风暴的需求分析 | 方法案例一-阿里云开发者社区

DDD之事件风暴Event Storming

【DDD领域驱动设计】事件风暴_事件风暴ddd-CSDN博客

0

评论区