本节摘要:软件复杂度并非铁板一块,它由本质复杂性、偶然复杂性与协作复杂性三层叠加而成。DDD 针对的正是最顽固的第三层——人与人之间对业务知识的理解偏差。本节沿时间线复盘 DDD 从 2003 年蓝皮书到微服务时代的演化路径,帮你在动手之前先看清这场方法论的来路。
1990 年代末,青柚商城这样的电商公司还不存在,但它们未来会遇到的问题已经被反复讨论过了。1986 年,Fred Brooks 在他那篇著名的《没有银弹》里给软件复杂性下过一个冷峻的判断:软件的本质复杂性来自业务领域本身,这部分无法消除,只能组织。他把其他部分称为偶然复杂性——由工具、语言、平台带来的额外负担,这部分随技术进步不断被压缩。
Brooks 的二分法在单体时代够用,但放到今天缺了一块。青柚商城大促故障复盘会上的那句"规则理解不一致",既不是业务本身固有的(规则本身一句话就说完),也不是工具强加的(每个系统都用着主流框架),它是第三种:协作复杂性——业务专家、产品经理、几拨开发团队,对同一句话各自脑补出了不同版本。这种人跟人之间的认知损耗,不随技术进步自动消失,反而随团队规模超线性增长。
把三层拆开看,对策完全不同:
| 复杂性来源 | 典型表现 | 传统对策 | 局限 |
|---|---|---|---|
| 本质复杂性 | 优惠规则、风控策略本身盘根错节 | 建模、抽象、分而治之 | 无法消除,只能组织 |
| 偶然复杂性 | 框架配置、序列化、环境差异 | 更好的框架与工具 | 持续被技术进步压缩 |
| 协作复杂性 | 同名异义、口径不一、改一处动四处 | 会议、文档、流程规范 | 规模越大越失控 |
事务脚本和贫血模型在前两层表现尚可——它们简单直接,本质复杂性不高时甚至更快。但协作复杂性是它们的盲区:代码里只有"怎么存、怎么算",没有"这条规则谁负责、这个词在哪个范围内有效"。DDD 的全部设计,几乎都冲着第三层来的。
理解 DDD 最忌讳的是把它当成一套孤立的术语表。它是一条二十多年没断流的河,每个阶段都在回应当时最痛的问题。
2003 年之前:对象建模的失意年代。九十年代,面向对象社区相信 UML 图画得好,软件就好。结果发现:图归档在Wiki上,代码该什么样还是什么样,模型和实现是两张皮。建模成了一锤子买卖的"分析阶段活动",没有进入日常开发的反馈循环。
2003 年:蓝皮书出场。Eric Evans 出版《Domain-Driven Design: Tackling Complexity in the Heart of Software》,后人称"蓝皮书"。这本书真正的新意不是实体、值对象这些名词,而是一个立场的翻转:模型不该在代码之外,模型就是代码要表达的东西本身。Evans 为此搭了一整套让"模型—代码"持续互相修正的机制:通用语言保证说和写一致,分层架构保证领域逻辑不被技术细节淹没,仓储保证对象生命周期的管理方式不污染模型。同年前后,青柚商城的前身们正在用 JSP 和 Servlet 快速堆着第一代电商系统,事务脚本正是那个年代的主流答案。
2006 到 2013 年:从理念到施工图。蓝皮书被公认为难读——思想清晰,操作指引不足。Jim Shore、Greg Young 等人先在社区里补齐实践,随后 Vaughn Vernon 在 2013 年出版《Implementing Domain-Driven Design》("红皮书"),把聚合、仓库、防腐层这些模式给了可落地的工程定义。同期,CQRS 与事件溯源由 Greg Young 大力推广,把领域事件从配角推到了台前。
2014 年前后:借微服务翻红。微服务兴起后,业界第一个集体困惑是:服务边界怎么切?按技术层切出来的团队互相等待、联调地狱。人们重新发现康威定律,也重新发现 DDD 里早备好了答案:限界上下文。那一阵流传的说法是"微服务是 DDD 的分布式执行器"——话有点过,但限界上下文确实是当时能找到的唯一一套成熟的边界划分语言。青柚商城后来拆服务时,正是靠这套语言避免了按表拆服务的悲剧。
2018 年至今:从书斋走向组织设计。事件风暴工作坊被提炼成标准协作流程,Team Topologies 等组织设计著作把上下文映射进一步接到团队拓扑上,DDD 从"架构师的阅读作业"变成了"业务与技术共同参与的谈判流程"。它如今更像一门设计语言,而非某本书的教条。

看完这条时间线,有两个推论值得记下。其一,DDD 解决的问题(协作复杂性)在今天不是变轻了而是变重了:微服务把一个系统拆成几十个团队的产品,词不统一的代价从"改四处代码"放大为"四个团队排期"。其二,DDD 的演化方向始终是"降低实践门槛"——从只可意会的蓝皮书,到可执行的施工图,再到可以拉上业务专家一起做的工作坊。所以今天学 DDD,不必从啃蓝皮书开始,从协作实践切入反而是更符合演化顺序的路径。青柚商城团队后来正是从一次事件风暴入门,而不是从读书会入门的。
时间线读完,顺手拆三条流传最广的误读,它们都源于把 DDD 的某个局部当成了整体。
误读一:DDD 就是一堆设计模式。实体、值对象、聚合这些名词确实来自蓝皮书,但把书读成模式目录是最常见的买椟还珠。Evans 自己在书里反复强调的是绑定与反馈:模式只是让模型在代码里活下来的支撑结构,没有"模型是核心资产"这个立场,模式用得再熟练也只是换了名字的数据访问层。判别方法很简单:一个团队可以用全套战术模式写出贫血系统,1.4 的实验会替你揭穿它。
误读二:DDD 必须配微服务。这条误读来自 2014 年之后的营销叙事。事实上蓝皮书比微服务早诞生十一年,它针对的是单体内部的复杂性组织。青柚商城至今主体仍是模块化单体,第 4 章会展开这个选择的依据。反过来才成立:决定拆微服务的团队,几乎必须先会 DDD——不然服务边界无从谈起。
误读三:入门必须先啃完蓝皮书。蓝皮书的思想密度配得上它的名气,但它的写作年代没有今天这些成熟实践。本教程的章节顺序就是刻意按演化逻辑反着排的:从协作实践(工作坊、谈判)切入,用战术模式练手,蓝皮书当作深化时回头校准的参照系。按阅读难度入门,等于按出版顺序学习——演化给了我们更平缓的坡道,不必自讨苦吃。