对于软件开发,如何将业务问题转变为系统解决方案一直是困扰开发人员和架构师的一大难题。针对这一难题,业界诞生了一批系统建模方法论,其中领域驱动设计(Domain Driven Design,DDD)无疑是当下热门的建模方法之一。随着微服务架构大行其道,DDD已成为构建微服务系统的主流设计思想和模式。
总体来说,DDD提供的是一种开展业务建模和软件设计的方法论。与其他方法论的不同之处在于,DDD强调开发人员与业务领域专家高效协作,共同交付业务价值。从架构设计上说,DDD认为良好的系统架构应该是技术架构和业务领域相互融合的结果,不能脱离业务领域设计技术架构。
基于多年来对DDD的实施和培训经历,笔者充分认识到:虽然DDD能够帮助开发人员更好地完成业务建模和系统架构设计,但它是一种比较复杂的建模方法,其中包含一系列不易理解的概念。而在现实开发过程中实现这些概念,需要引入专门的设计方法和工作开展方式。很多时候,开发人员充分理解DDD中的设计思想和聚合、资源库、应用服务等概念已属不易,更不要说把它们应用到日常开发中。如何让DDD真正在自己负责的项目中落地,是摆在开发人员面前的一大难题。
面对这一难题,最好的解决方案是实践,而最好的实践是动手实操。工作坊(Workshop)就是这样一种可以让开发人员动手实操的学习和训练方式。它注重解决实际问题,通过引导开发人员思考和分析真实案例,提供解决问题的方法和技巧。笔者在实际开发中,通常采用这种方式启动并推进DDD的设计过程。这一过程已被国内外各大公司认为是一项实施DDD的优秀实践。笔者梳理了一套系统化的工作坊实施流程,并设计了一个贯穿整个流程的完整项目案例。
本书内容分为4篇,分别对应工作坊实施过程中的4个阶段。各篇的内容组织如下。
● 基础概念篇,包含第1章和第2章。在该篇中,我们将全面介绍DDD的基本概念和主流设计方法,同时引入贯穿全书的案例系统,并形成案例系统的基础设计,即产出案例系统V1.0。
● 战略设计篇,包含第3章~第6章。在该篇中,我们将围绕DDD的统一语言、子域和限界上下文展开讨论,探讨从问题空间进入解空间的解决方案。在工作坊实践中,我们将采用目前主流的“事件风暴”模式以完成对案例系统业务全景的探索并形成案例系统的第1版设计,即产出案例系统V2.0。
● 战术设计篇,包含第7章~第10章。在该篇中,我们将从领域建模范式讲起,详细分析实体、值对象、聚合、领域服务、应用服务和领域事件等DDD中与战术设计相关的核心概念,并给出各个组件的设计方法和使用技巧。在工作坊实践中,我们将基于战略设计篇中“事件风暴”模式产生的阶段性产物,结合本篇中的各个设计组件以完成对案例系统战略设计和战术设计的整合,从而形成案例系统的第2版设计,即产出案例系统V3.0。
● 架构设计篇,包含第11章和第12章。在该篇中,我们将围绕常见领域驱动架构模式及DDD架构考量,给出DDD的架构设计和整合方案。在工作坊实践中,我们将基于前面各篇中生成的阶段性产物,结合本篇采用的架构设计模式,完成案例系统的最终设计方案并产出案例系统V4.0,也就是最终版本。
本书适合广大业务设计人员、系统设计人员以及架构师阅读和参考。读者不需要具备技术开发能力,也不限于特定的行业和领域,但熟悉产品设计和技术研发工作流程并掌握一定系统设计基本概念有助于更好地理解本书的内容。同时,本书也适合团队管理人员阅读和参考。本书所阐述的DDD方法不仅适用于系统边界划分,同样适用于团队与组织边界的划分和管理,并能够从管理角度给出系统设计的一些指导性建议。
感谢我的家人特别是妻子章兰婷女士,在本书的撰写过程中,在我占用大量晚上和周末时间写作时给予的极大支持和理解;感谢以往和现公司的同事,身处业界领先的公司和团队,笔者得到了很多学习和成长的机会,没有大家的帮助这本书不可能诞生;感谢人民邮电出版社异步社区的编辑团队,你们的帮助使得本书得以顺利出版。
由于时间仓促,加上笔者水平和经验有限,书中难免有欠妥和错误之处,恳请读者批评指正。
郑天民
2024年于杭州钱江世纪城