本文主要介绍了领域驱动设计(DDD)在传统软件工程与AI赋能软件工程(AI4SE)中的双重价值。包括领域驱动设计的核心价值体系,如统一语言、限界上下文和聚合模式,以及其在AI时代的应用和价值。
统一语言是跨越认知鸿沟的破冰之刃,追求描述和概念的一致性与正确性;限界上下文是领域驱动设计的核心战略模式,有效解决了康威定律的负面效应;聚合模式则是复杂业务规则的封装范式。
领域驱动设计能够助力AI在需求结构化沉淀、架构设计智能化增强和软件智能研发范式突破等方面的发展。通过统一语言、限界上下文和领域模型为AI提供结构化的训练数据,加速传统软件工程的研发流程,为AI系统注入领域思维的基因。
领域驱动设计不仅提供了方法论,更扮演了人类智慧与机器智能交互的基石角色。在AI重塑软件工程的进程中,领域驱动设计将持续发挥作用,并与AI共同推动软件工程迈向智能化研发的新纪元。
在软件行业面临AI技术浪潮冲击的今天,领域驱动设计(Domain-Driven Design,DDD)的价值正在被重新审视。本文将通过深度技术剖析揭示DDD在传统软件工程与AI赋能软件工程(AI4SE)中的双重价值。
8.1.
领域驱动设计的核心价值体系
8.1.1.
统一语言:跨越认知鸿沟的破冰之刃(独有价值)
统一语言最早由Eric Evans提出,它通过领域模型建立了业务概念与软件实现的同构映射,这种精确的语义对齐机制正是复杂系统开发的核心痛点。
个人认为,统一语言不仅仅可以认为是一种模式,更是研发团队在研发业务系统时描述领域知识需要遵循的
最高原则
,它的应用
贯穿整个问题空间到解空间
,进而体现为文本化的需求规格、图形化的领域模型和代码化的领域层代码:
统一语言的核心思想就是
追求描述和概念的一致性与正确性,并强调优先传递业务含义
。这一模式不仅用于领域驱动设计,甚至可以用于任何需要团队协作和交流的场景。它的价值不言而喻。例如某跨境电商平台在实施领域驱动设计时,遵循统一语言原则,发现业务团队口中的"订单"与开发团队理解的"Order"存在11项语义差异。团队通过建立包含137个核心术语的统一语言字典,有效地提升了需求沟通效率,同时降低了功能缺陷率。
领域驱动设计提出的限界上下文(Bounded Context)不仅仅是模块,而是运用业务语言对子领域进行的语言边界划分。我对它的定义为:
封装了领域知识的领域对象在知识语境的界定下,扮演不同的角色,执行不同的活动,共同对外公开内聚的业务能力。
与传统模块不同之处在于它通过语言边界构成所谓的“上下文”,并在该上下文内部维持一份“统一语言”,形成一个更小更内聚也更准确的领域概念,如下图所示的Product:
限界上下文是领域驱动设计的核心战略模式
,它的分治策略有效解决了康威定律的负面效应,其边界划分方法论至今仍是微服务设计的黄金标准。虽说这两年微服务已经褪去了最热的温度,但不可否认,微服务架构模式依然是分布式系统的主流模式,在识别微服务和重构遗留系统时,领域驱动设计的价值依旧不可低估。
尤其在重构核心系统时,运用限界上下文结合上下文映射(Context Mapping)定义由限界上下文构成的应用架构,再根据对质量属性(如并发、性能、安全等)的梳理,将其映射为微服务,从而完成从单体架构到微服务架构的重构。例如某商业银行在对核心系统进行下沉改造时,就通过限界上下文对整个系统进行边界划分,识别出6个核心限界上下文,然后逐步运用绞杀者模式,将原本500万行代码的巨石应用拆分为账户管理、交易清算等微服务,提升了系统的吞吐量与故障隔离率。
8.1.3.
聚合模式:复杂业务规则的封装范式(独有价值)
可以认为,聚合的引入是领域驱动设计对面向对象设计的有力补充,把聚合作为最小设计单元,可以更好地应对OO的设计,有效支持ORM。
如上图所示,遵循面向对象设计思想,即“一切皆对象”的原则,在进行领域建模时,无论领域概念是大还是小,都应该建模为“对象”,如此才可极大程度地利用对象的封装性与可复用性,进而提升代码的可扩展性。
然而,这种“一切皆对象”的设计原则为领域模型带来了复杂度,其原因在于:
通过引入“聚合”即其建立的约束条件,就可以把多个细小的领域概念封装为一个大的具有领域完备性(封装了相对完备的领域概念、数据与规则)的聚合概念。例如,在航空订票系统中,通过将座位预留、价格计算等业务规则封装为聚合根,使航段组合的库存管理逻辑复杂度从O(n²)降至O(n)。
此外,聚合模式通过强一致性边界和事务性封装,将领域知识转化为可维护的代码结构,这也是传统CRUD架构难以企及的。我们可以把聚合看做是一个驻留在内存中的小型对象社区,在这个社区内,对象之间可以自由无碍地交流,而它的边界保护又能有效避免社区之间出现不必要的依赖。资源库(Repository)是维护这个内存社区的重要关卡。
8.2.
领域驱动设计对AI4SE的赋能之道
当下的AI时代,基于LLM的AI事实上还不能完全替代开发人员,更不能替代架构师和需求分析师,也不能替代领域建模人员。除非AI产生了突破传统软件工程的理论体系,否则就可以认为:无论是否使用AI,对于软件系统的研发始终不能绕开瀑布规定的几个阶段:需求分析、概要设计(架构)、详细设计、编码、测试和交付。
基于这个前提,领域驱动设计就能在AI时代发挥属于自己的价值。
8.2.1.
领域知识的结构化沉淀
根据统一语言、限界上下文以及以聚合为核心的领域模型,可以为AI提供结构化的训练数据,使LLM能够理解业务语义而非单纯语法模式。例如,电商平台可以通过沉淀电商领域的领域知识,构建由领域概念节点构成的DDD知识图谱,然后通过微调后的Codex模型实现需求文档到领域模型的自动转化。
8.2.2.
架构设计的智能化增强
无论采用事件风暴,还是我在《解构领域驱动设计》提出的领域驱动设计统一过程,都可以通过对领域事件(业务服务或用户故事)进行语义分析,进而以分类和归纳方式获得初步的限界上下文。
随着大模型推理能力的提升,对语义的理解能力不断增强,且具有较强的归纳能力,只要我们遵循统一语言获得整个软件系统用于描述功能需求的业务载体(领域事件、业务服务或用户故事,我称之为
业务分析单元
),大模型就完全有可能帮助研发团队自动识别构成应用架构的架构单元——限界上下文。
8.2.3.
软件智能研发的范式突破
DDD提供了相对固化的从需求到代码的完整设计过程,如下图所示:
事件风暴对该研发设计过程进行进一步细化。当然,它更强调可视化的协作模式。我在《解构领域驱动设计》提出的领域驱动设计统一过程基础上,总结出以体现领域知识的业务服务作为驱动的设计过程——“服务风暴”,获得如下图所示的十二个步骤: