SoftwareMill实现领域驱动设计的经验


现代软件开发不仅需要对技术有扎实的理解,还需要对驱动软件的业务有全面的掌握。这包括操作领域和组织结构的知识。幸运的是,软件开发行业已经开发了各种技术来帮助完成这项任务。

包含众所周知的模式和工具的常见保护伞是领域驱动设计(DDD)。

背景
在 SoftwareMill,我们专注于协助各种规模的企业完成数字化转型之旅。我们的产品组合包含广泛的项目,每个项目都涉及多个行业的复杂业务领域。我们的专业知识包括端到端项目,涉及分析和收集需求、制定和实施解决方案,以及持续的维护和支持。

然而,这些项目大多数都受到保密协议 (NDA) 的保护,这限制了我们公开分享细节的能力。尽管如此,由于我们致力于传播知识和经验,我们正在探索如何在软件开发过程中展示我们与客户合作的方式。这就是这个项目的想法的诞生。

我们的目标是传播领域驱动设计的知识和经验,以及我们在客户项目中经常使用的多种补充工具和技术。通过展示它,我们的目标是与社区分享我们的经验和知识,同时展示我们在领域驱动设计的某些方面的独特方法,这些方法源自 SoftwareMill 在远程工作中的经验。

采取的行动
意识到这是一件大事,我们决定将我们的项目分为几个部分。在此阶段,我们的目标是从现实生活领域选择一个示例,并将其分解为基本元素,以理解这个特定业务方面的运作方式。

那么,我们计划如何实现这一目标呢?通过采用与现实生活中的客户相同的方法。

当客户寻求我们的帮助时,我们首先需要帮助来充分掌握需求。我们也可能不清楚他们的业务如何运作、如何产生收入以及使该业务成功的其他关键方面。要开发可靠、精心设计的解决方案,对这些要素进行深入彻底的了解至关重要。

因此,我们通常从一系列研讨会开始,旨在了解客户的业务、需求和要求。有趣的是,这些会议有时甚至可以帮助客户更好地了解自己的业务或在研讨会流程中找到潜在的改进之处。

我们在此阶段采用各种技术,但最有效的技术之一是(大局)事件风暴研讨会。这种方法对于探索其中涉及的业务领域、流程和参与者特别有用。

事件风暴研讨会是我们希望在该项目的第一阶段向您展示的技术,它有两个目标。

  • 首先是定义标准并选择我们将在整个项目中处理的领域。
  • 第二个目标是组织和开展大局事件风暴会议,这将有助于我们更深入地了解所选领域。

什么是领域驱动设计?
虽然本文的主要目标不是彻底解释 DDD,但对该术语代表的含义有一个基本的了解对于更好地掌握该项目至关重要。因此,我将简短地解释这种方法。

在DDD中,代码的结构、逻辑和语言与业务领域相匹配,通常用所谓的通用语言来表达,使软件更加相关、直观、更能适应业务变化。这种方法对于业务概念和规则发挥关键作用的复杂领域特别有价值。

领域驱动设计非常重视领域模型的开发,该模型作为概念框架来捕获业务领域的细微差别、操作和规则。该模型通过开发人员和领域专家之间的协作不断完善,确保它仍然忠实地代表了领域的复杂性。

领域模型成为系统的基础,指导功能的设计和实现,并确保软件能够随着业务环境的变化而不断发展。

选择复杂的业务领域
我们花了一些时间来寻找合适的域。一方面,我们希望避免出现过于琐碎的问题,因为这会将我们的任务简化为基本的 CRUD(创建、读取、更新、删除)操作。另一方面,选择过于复杂的领域可能会削弱我们有效展示它的能力,因为需要付出很大的努力来解释其复杂性。

另一个考虑因素是我们对领域知识的获取;我们不能选择一个我们完全陌生的领域,或者我们缺乏专业知识的联系,因为执行这样的项目即使不是不可能,也是极具挑战性的。此外,我们必须留意所有已落实的保密协议。

最后,我们决定重点关注我们公司内部完善且我们拥有丰富领域专业知识的流程:设备/设备管理流程。每当我们的同事需要新设备时,无论是需要计算机的新加入者,还是由于设备损坏或根本性能不足以满足我们的日常软件开发需求,此过程都会发挥作用。

我们的管理团队在处理这一过程中发挥着关键作用。他们管理可用设备的库存,包括备用设备和紧急设备,还确定何时订购新设备或退役现有设备。

乍一看,这似乎并不太复杂。然而,我们在这个过程中发现了一些细微差别,我们的目的是在本博客文章系列中强调这些细微差别。我们对这个选择感到满意,因为该过程足够简单,可以演示,但超出了基本的 CRUD 操作。此外,每个人都或多或少地了解这个过程是如何运作的,至少在高水平上,这使得掌握我们开发的无处不在的语言变得相当容易。

团队
在选择了我们想要解决的业务流程之后,是时候深入研究这个领域了。作为开发人员,我们对库存流程的理解仅限于用户的角度(是的,我们需要计算机和其他设备)并且非常肤浅。因此,我们需要专家的帮助来进行大局事件风暴会议,以更深入地了解该领域。

选择合适的事件风暴参与者对于本次研讨会的成功至关重要。在没有适当专家的情况下进行可能会导致时间浪费。这些“合适的人”是谁?他们通常是能够回答开发人员或建模人员问题的人。这些人可能是作为执行者、用户、主管或设计者参与流程的人。

包括对正在探索的领域具有不同观点的人也是有益的。更多的多样性意味着更好的结果,但参与者太多也会导致混乱。

在我们的例子中,选择合适的参与者相对简单。我们邀请了来自管理部门的亲爱的同事,他们既是 SoftwareMill 设备管理流程的用户又是设计者。请认识一下马尔戈西亚和乔安娜。

所以,我们找到了有答案的人。
接下来,我们需要能够提出正确问题的人。
我的同事 Michał 和我自己恰如其分地担任了这个角色

每个事件风暴会议都需要一个人来确保会议目标的实现。此人负责维持参与者的参与度和精力。我们的会议由 Mateusz 熟练地主持,他擅长管理混乱并非常有效地引导团队动态。

事件风暴研讨会策划
在启动会议之前,我们采取了一些措施来提高会议的成功机会。首先,我们向管理专家介绍了事件风暴研讨会形式。我们解释了他们在会议期间可以期待什么、如何进行以及如何为此做好准备(设置 Miro 帐户、确保良好的耳机设置等)。这并不是事件风暴的详尽概述,而是一些关键的预告片。通常,主持人会在研讨会期间详细阐述细节。

值得一提的是,会议是使用Miro在线进行的。大多数关于事件风暴的资源,包括其创建者阿尔贝托·布兰多里尼(Alberto Brandolini),都建议在一个房间里进行会议,房间里有真正的便利贴和一张巨大的空白纸,以便在墙上提供无限的建模空间(这种方法在大流行期间发生了变化)。虽然我同意在同一房间见证彼此的情绪对于此类研讨会是有利的,但在 SoftwareMill,我们在远程工作方面拥有丰富的经验。

作为一家自成立以来完全远程的公司,在线会议自然是我们的首选。我们在远程工具方面的丰富经验极大地帮助我们减轻了远程研讨会的挑战。这种方法是我们通常与客户合作的方式,我们希望展示这一方面。

然后,我们安排了第一场会议。我们知道会议时间不宜太长,以保持每个人的注意力。因此,我们分配了 5 小时的时间段,预计在特定研讨会部分之后休息并继续进行另一场会议。这是远程事件风暴的好处:将研讨会分成几个较短的会议要容易得多,因为不需要将所有参与者聚集在一个位置。这种方法有助于让参与者保持专注并保持良好的心情。

最后,Mateusz 设置了 Miro 板。他邀请所有参与者参加 Google Meet 会议,我们都热切地等待着第一次事件风暴会议。