可以促进微服务设计的DDD事件风暴建模技巧 - Nick Tune


EventStorming是一种非常流行的技术,它使我们比传统技术更有效地探索,分析和建模业务领域。由此我们可以创建与设计更好的软件系统和问题解决方案。
明智地使用EventStorming,我们可以发现有关我们的域和业务的足够信息,以便我们可以使用它来设计微服务,有界上下文甚至我们的团队组织。
在公共培训课程中和为客户私下举办过许多EventStorming会议之后,我们注意到,可以将EventStorming应用于次优状态,从而使人们质疑其价值,并使他们感到浪费时间。
另一方面,有效地应用EventStorming时,我们已经看到了许多成功的会议,其中许多团队已将EventStorming用作其微服务设计的基础
在本文中,我们将分享一些易于学习的技术,这些技术将帮助您充分利用EventStorming的功能,从而可以设计更多与领域保持一致的软件系统。

1.避免过早抽象
EventStorming开始时可能会采取的错误做法之一是建模过高。在许多EventStorming会话中,通过在更深层次上对域进行建模,可以释放出杀手级领域的见解。在这里,您可以打破幻想,检验假设并了解您的领域的实际运作方式。这使您能够从单纯的软件模型扩展到真正的域驱动设计。
以在线职位公告板为例:
招聘人员登入系统、创建了招聘要求、发布招聘、求职者申请职位、面试安排。

域就是这样工作的,它是如此简单,也是很肤浅的抽象,对我们没有任何帮助。这个建模事件太普通了,太通用了,是一种抽象了的通用流程,并不是具体化。

2.从特定方案开始
为避免过早抽象,请从建模单个粒度流开始。例如,特定类型的用户在特定时间以特定价格购买特定产品。
对单个流建模之后,在流中查找子分支,然后分解为相邻的流。
在上面职位发布领域案例中,我们可以从外部招聘者注册发布职位开始建模。针对购买大型招聘计划的外部招聘人员,然后针对购买轻型招聘计划的外部招聘人员。
我们需要根据要招聘的业务来组织招聘广告。而且,招聘政策有一个意见:如果您要招募多家公司来你这里招聘,则必须采用不同的招聘模式,这会影响您的计费方式以及收到的报告的类型。
特定的招聘流程是这样的:
外部招聘人员登入系统、分别购买大型招聘计划和轻型招聘计划、根据大型和轻量招聘策略将相应要求发给招聘者、招聘人员挑选一些。
外部招聘人员要遵守不同的招聘计划,需要特殊的工具来组织其工作,需要不同的报告类型,在进行这样更细化的建模时,您将开始看到流程分支,输入,输出以及各种方式的处理模式。
发现领域中极为重要的线索:自然所有和共同变化的部件,这些部件看起来相同,但关系松散得多。这是信息的类型,是架构域驱动软件系统的关键。

3.捕捉隐藏的意图
我们看到许多初学者在将Form Submitted表单提交事件添加到他们的EventStorm时犯了错误。这不是领域事件,而是领域事件的技术实现。重要的是为什么要提交表单:用户的意图是什么?
除了使用Form Submitted之外,您还可以添加更多以域为中心的名称,例如Job Post。

不要写的技术事件:表单提交、按钮点按、数据库保存;
业务事件的领域术语:广告发布;工作陈列;支付接受。

后者才是领域术语,但仍然不够。在为您的域中的数据提交建模时,可以使用以下技术来获取更深入的域见解:

  1. 列出每个单独的数据(即表单上的每个字段)
  2. 列举每个数据的可能值
  3. 了解不同值的意义
  4. 将重大差异建模为单独的流程

可以通过一个示例更好地证明这一点:发布工作时,表单提交中包含以下字段:就业类型。它可以是永久或合同。该选择具有很高的领域意义,导致业务流程发生变化,从而影响业务成果。
因此,在这种情况下,可能有两个事件更好:永久职位发布,合同职位发布。然后为每个流程建模-寻找流程中的差异并寻找相似之处。您将获得大量有关设计系统(尤其是设计微服务边界)的最佳方法的见解。

4.怀疑警惕CRUD命名
具有通用后缀(例如Created,Updated,Changed,Changed或Deleted)的事件表示您正在使用技术术语来描述您的域而不是真实的域术语。
更新Updated可能是最大的警告信号。更新是一个非常笼统的术语,基本上意味着已更改。当我们使用EventStorming时,我们试图捕获我们领域的丰富性,因此我们应该问“为什么更新了某些内容?”。
对CRUD命名的怀疑不仅会帮助您开发更丰富的领域词汇表,从而改善技术从业者与领域专家之间的协作,而且还将帮助您发现域内的其他流程。了解更改的每个不同原因,您将发现许多领域的见解。
例如取代”价格更改“,你可能会发现“价格折扣”,“最终季售价","圣诞促销价激活"或别的东西。

5.寻找状态机和关键事件
状态机几乎遍布每个领域。我们正在建模的概念经历了不同的生命周期阶段,即它们的状态。
如果您特别注重查找状态机,那么在发现域中的边界(将成为微服务的边界)方面会获得更大的成功。
有一种特殊的事件可以识别状态机状态之间的转换,称为“关键事件”。关键事件是域边界的有力指标。
在物联网设备领域,我们可能会发生以下关键事件:设备制造,已配置设备,已安装设备和已激活设备。尽管在整个过程中发生了数以百计的事件(例如,将设备从仓库中移出并安装在公共场所),但这几种关键事件是指示重大变化的关键业务事件。

6.到处问“如果?”
很容易陷入仅对域中常见路径或快乐路径场景建模的陷阱。但是,通过探索所有边缘情况,还有很多东西要学习。
要梳理您域中的边缘情况,请查看墙上的每个事件并询问“什么?”。“如果发生停电怎么办?”,“如果拒绝客户的信用卡怎么办?”,“如果仓库发生火灾怎么办?”。
对该领域具有浓厚的好奇心和好奇心,将带您提出探索性和挑战性的问题。这将带您获得有关该域的许多见解。

7.如果团队正在困惑,请切换到单线程模式
混乱的探索是EventStorming的标志之一,整个团队都在这里集体集思广益。每个人都可以随意将自己的想法,假设和疑虑用便签贴在墙上。
混乱的探索对于EventStorming提供的许多发现至关重要。但是,有时精力不足,团队感到困惑,或者由于许多可能的原因之一而没有取得进展。你能为这个做什么?
虽然在其他人观看的同时只有一个人将便签放在墙上是一种反模式,但是这种称为单线程EventStorming的方法可以有效地帮助团队达成一致并建立团队动量。
此模式有一些变体,但是您可以尝试以下方法:

  1. 选一个人将便签贴在墙上
  2. 其他人围坐在他周围
  3. 选择一个特定的用例模型
  4. 继续努力,一次添加一个事件,以确保小组在继续之前达成共识。如果小组陷入僵局,请做笔记并稍后返回
  5. 如果还有其他疑问或疑虑,请记录下来,稍后再返回-保持进度前进

在简短的单线程会话之后,该小组将有许多想法和他们想更详细地建模的其他方案。切换回混沌模式的好时机。

掌握事件存储和微服务设计
了解您的业务领域是设计最佳软件系统的关键。因此,提高对业务域进行建模的能力将增强您作为系统设计师的能力。
EventStorming是可用于对业务域进行建模的最佳工具之一。您对EventStorm的掌握越多,您就能构建出满足业务需求的软件系统,从而取得更大的成功。
五分钟内您将无法掌握MasterStorming。但是,您越早开始学习,越多地练习,就会越快到达那里。我们希望我们在本文中分享的技巧将有助于加速您的精通学习之路。

(banq评:事件风暴会议本身就是一种探索问题和答案是否存在的各种可能性,突破舒适区,追问原因,拥抱不确定性,用好奇心驱使创新: https://www.jdon.com/53327