如何使用事件风暴来实现领域驱动设计?

19-06-09 banq
                   

本文是Google产品技术经理 Steven A. Lowe编写:事件风暴是一种快速,轻量级且未得到充分认可的群体建模技术,它对于加速开发团队而言非常强大,有趣且有用。作为Alberto Brandolini的心血结晶,它是Gamestorming领域驱动设计(DDD)原则的综合学习实践。该技术不限于软件开发。您可以将其应用于几乎任何技术或业务领域,尤其是那些大型,复杂或两者兼而有之的领域。

事件风暴催化并加速小组学习,通常在几小时或几天内实现更传统的建模技术从未做过的事情 - 对软件必须运行的领域的共同理解。

要了解事件风暴,您首先需要了解两个关键术语:一个是领域事件是什么,这是领域专家对其业务领域感兴趣的、发生的情况。领域专家不感兴趣数据库,网络插座,或设计模式,但关注会发生的事情的业务领域。领域事件以不指定特定实现的方式捕获这些事实。

(banq注:维根斯坦说:世界是由事态(发生的事实+发生时的上下文背景)组成。前者就是领域事件,后者就是有界上下文!)

事件风暴如何运作

  1. 开一场事件风暴会议,每个人都参与其中,协调人必须使团队保持专注和参与,指导进展到完整的域模型。
  2. 从领域事件开始,向前和向后遍历模型,以确保涵盖所有内容。
  3. 添加导致事件的命令或触发器,并考虑所有命令溯源(ES:EventSoucring),包括用户,外部系统甚至时间。
  4. 识别聚合接受命令和完成事件,并将聚合组在一起成为有界上下文。
  5. 识别关键测试场景、用户和目标并将其合并到模型中。
  6. 添加有界上下文之间的关系以创建上下文映[url=http://www.infoq.com/articles/ddd-contextmapping]射[/url]。
  7. 最后用代码对所得模型进行挑战,以验证组学习并验证模型。

主持人必须是DDD从业者才能指导小组走向完整的模型。包括非技术产品所有者在内的每个人都可以参与对领域的理解和建模。整个团队了解域越好,软件实施越有可能反映域,这是DDD的主要目的。

提高效率

小组学习速度慢是软件开发过程中的主要制约因素。正如Brandolini 所说,“软件开发是一个学习过程;工作代码是一个副作用。”

域事件有助于构建域模型; 它们起到了骨骼的作用。这不是一个设计,它是一个关于领域的模型 - 一个视角。您使用域事件来推动建模,因为技术人员和领域专家都很容易理解。领域事件几乎没有关于设计的说明,也没有关于实现的内容,这正是你想要的一个好的域模型。

不同于其他建模

如果您从数据建模开始,您的思考和对话将很快转移到模式,事务和其他与业务领域无关的事情。

如果从行为建模开始,当您将行为分解为任务并将其链接到流程时,您会分心。

这些是实现概念,而不是业务领域概念。虽然有很多选择来表示数据和实现行为,但域事件没有其他选择。由于域事件表示域的事实,因此这些事件仅在基础业务发生更改时才会发生显着变化。因此,域事件是您模型的更稳定和更具弹性的脚手架。

这种方法有一个更令人信服的理由:将初始讨论限制在域事件中会迫使每个人,尤其是开发人员,专注于域的无处不在的语言。他们必须学习它,定义它,改进它,并在有关模型的对话中专门使用它。

虽然以域事件为中心的模型可能会自然地导致事件驱动的系统设计,例如事件源或命令查询责任隔离,但这是一种选择,而不是义务。实现模型的软件不必是事件驱动的,甚至不是面向对象的(尽管这些通常是很好的选择)。

加速小组学习

当项目完成后,接手的开发人员必须做些什么才能理解域模型并构建系统?在了解领域故事的过程中,开发人员可能会在域专家,解决方案架构师,测试用户和其他团队成员之间穿梭。

虽然这个过程可能会导致所有团队成员对整个域的共同理解,但这不太可能高效。

这种领域知识过于稀疏,过于分离,过于孤立,而且过于分散,无法在任何单个开发人员的脑海中产生完整的模型,更不用说整个团队理解的常见模型。

相反,这些对话可以在事件风暴会话期间发生。通常这些对话会按顺序发生,但是在事件发生时,它们都会立即发生。通过这种方式,您可以解决域中任何部分的任何冲突或不连续性,同时所涉及的每个人都在场并参与其中。

DDD最大的障碍是开发人员倾向于专注于他们非常了解的事情 - 软件开发概念 ,但不是业务领域。当非技术人员(例如产品所有者或用户拥护者)与开发人员会面并开始用编程术语而不是业务术语描述系统时,可以看到这种情况的一个症状。如果开发人员不了解业务领域,则无法正确建模。

何时何地使用事件风暴

使用事件风暴最明显的时间是在项目开始时,因此团队可以从对域模型的共同理解开始。使用事件风暴的另一个高回报时间是项目结束后,用于捕获和分享团队在构建软件过程中学到的知识。

这很重要,因为没有任何一个开发人员可能因为偶然的发现,修改以及对其他区域的有限暴露而了解整个域。使用较小规模的事件风暴也是有利的,例如当您考虑改变某些事物,开始新故事或制定不同的场景或替代方案时。

尝试一下

事件风暴旨在创建和分享对域模型的共同理解; 它不是设计文档,流程图,UML图,部署计划,体系结构图或与实现相关的任何其他内容的替代品。可以将其视为低保真,临时信息辐射器,用于与其他人共享和确认域模型。