从DDD到Ontology:当数字员工不再认"限界上下文"这堵墙

核心观点:DDD解决的是人和代码之间的语义一致性问题。Ontology解决的是人和机器之间的语义一致性问题。当执行主体从人变成数字员工,DDD的"限界上下文"从保护墙变成了认知盲区。
引言:一个"32.4万"的扎心案例
某大型集团上线了基于OpenClaw.NET的智能数字员工系统。业务负责人以为,团队已经按照DDD领域驱动设计方法,完成了完整的业务建模——聚合根、领域事件、限界上下文,甚至把Entity和Value Object的定义都写进了Skill的Prompt约束里。
业务负责人问:"6月份新增有效客户有多少?"
数字员工秒回:32.4万,环比增长6.7%。SQL完整,图表漂亮。
业务负责人看了一眼,说:不对,我们经营会上报的是28.6万。
技术人员调出数字员工生成的SQL,语法没错,表也没选错,查的是正式生产库,权限没问题。问题在哪?
继续往下查才暴露:
- 数字员工按自然月统计,经营报表按账期统计
- 数字员工把重新入网的客户算成新增,经营口径只认首次成为客户
- 数字员工按账户编号去重,业务按统一客户编号去重
- 数字员工还把内部测试号码、员工体验号码算了进去
每一个字段都是真的,每一条数据都能在数据库里找到。 但数字员工理解的"新增有效客户",不是这家企业经营管理中使用的"新增有效客户"。
项目负责人说:"看来我们缺一层语义层。"
这句话没有解决问题,反而让会议更乱。BI团队说事实表维度表度量值都建好了,这就是语义层;指标团队说应该是统一指标口径;数据治理团队说业务术语元数据血缘责任人都算;AI团队说要补同义词、标准问题、样例SQL、歧义处理规则和拒答策略;做数字员工的人又说还要补客户产品订单之间的关系以及可执行动作。
所有人说的都是"语义层"。但他们说的显然不是同一个东西。
这个案例揭示了一个DDD从未处理过的问题:当执行主体从人变成数字员工,业务语义的"解释权"必须被正式化、结构化、机器可读,否则同一个词就是四个答案。
第1章:DDD做了什么,没做什么
2003年,Eric Evans写下《Domain-Driven Design》,给出了一个承诺:如果开发者能和领域专家坐在一起,用同一套语言描述业务,软件就能忠实地映射现实。
二十年后,这个承诺在OpenClaw.NET的Skill系统里兑现了一半。
DDD确实解决了它要解决的问题。统一语言(Ubiquitous Language)让业务知识从会议室走进了Skill的代码,限界上下文(Bounded Context)让复杂的数字员工系统有了可管理的边界,聚合根(Aggregate Root)让事务一致性有了清晰的边界。在"人写Skill代码、人理解业务、人维护数字员工"的范式下,DDD是过去二十年最有效的建模范式,没有之一。
但DDD有天花板。这个天花板不是产品质量问题,是设计对象的边界问题。
DDD的载体是代码。 它的实体是C#类或结构体,行为是类的方法,规则是if-else和断言。这些代码运行在.NET运行时或容器里,由编译器保证语法正确性,由测试保证业务逻辑正确性,由团队内部的文档和口口相传保证语义一致性。
DDD解决的是人和代码之间的语义一致性问题。业务专家说"客户",开发者写成 Customer 类,测试用例验证它的行为——只要团队内部对得上,Skill就能正常运行。
但DDD有三个它不解决、也解决不了的问题:
第一,它不解决跨Skill的语义统一。 DDD的限界上下文是边界保护机制,不是跨边界统一机制。在物流Skill里,"订单"是发货计划;在财务Skill里,"订单"是应收依据。DDD告诉你"这两个订单不一样",但它不帮你建立"物流订单和财务订单之间的映射关系"。
第二,它不解决数字员工的可执行性问题。 DDD的领域模型是给人读的代码。一个数字员工拿到你的 Customer 聚合根,它能看到的只是字段列表和方法签名——它不理解 Customer.Status = 'VIP' 背后的业务含义,不知道什么时候调用 ApproveOrder(),更不知道为什么 Approve 之前必须先检查 CreditLimit。
第三,它不解决业务规则的精确表达问题。 DDD的规则写在代码里,分散在聚合根的方法体、领域服务的if-else、规约(Specification)的断言中。这些规则对开发者是清晰的,但对业务人员是黑盒。当业务规则变更时,你需要找开发者改代码、跑测试、发部署。
这三个"不解决"不是DDD的缺陷,是它的设计边界。DDD是为"人建模→人编码"的范式设计的,在这个范式里,它做得很好。
但2025年之后,执行主体变了。
OpenClaw.NET的DDD实践:三户模型
在OpenClaw.NET的电力行业数字员工场景中,有一个天然契合DDD的案例——"三户模型"。
"三户"指客户(Customer)、用电户(ServiceLocation/UsagePoint)、结算户(Account/Agreement)。源于电力行业国际标准IEC 61968/61970 CIM。
从DDD角度看,三户模型的设计几乎就是为聚合根而生的:
- 客户聚合根:管理客户全生命周期,聚合证件信息、联系人、合同关系。
- 用电户聚合根:管理物理计量点,聚合电表资产、采集关系、用电地址。
- 结算户聚合根:管理计费单元,聚合银行账户、增值税信息、缴费记录。
三个聚合根通过ID引用松耦合,通过领域事件保持最终一致性。
三户模型是DDD在电力行业最成功的实践之一。但它解决的仍然是"人和代码之间"的问题——让营销系统的开发者、业务分析师、测试人员对"客户""用电户""结算户"有统一的理解。
DDD让营销系统的代码理解了业务。但它没有让数字员工理解业务。
这是DDD的天花板。
第2章:DDD在数字员工时代的三个断裂
DDD的底层假设,在数字员工成为执行主体的那一刻,开始出现结构性裂缝。
不是因为它做错了什么,而是因为它的设计对象变了。DDD是为"人类建模者"设计的——人类会阅读文档、理解上下文、遵守约定。数字员工不会。
这不是渐进式优化能解决的问题,是结构性的失效。
断裂一:统一语言失去了统一的对象
DDD的核心机制是Ubiquitous Language(统一语言)。领域专家和开发者通过协商,建立一套共享的术语体系,然后这套体系同时存在于文档、对话和代码中。
这个机制有一个隐含前提:所有参与者都是人类,都能参与语言协商,都能理解术语背后的业务意图。
数字员工不参与语言协商。它接收Prompt,输出代码,但它不理解"订单"在你的业务中代表什么——它只理解token序列的统计相关性。
更致命的是跨限界上下文。一个金融数字员工无法区分"booking"(预订)和"booking"(入账),因为两个限界上下文中的同一个词被数字员工混为一谈,差点导致合规事故。这不是数字员工的bug,是DDD的结构性缺陷——Ubiquitous Language假设所有消费者都是语言协商的参与者,但数字员工是语言的消费者,不是协商者。
断裂二:限界上下文对数字员工没有约束力
Bounded Context是DDD的边界机制。它告诉开发者:在这个边界内,"客户"就是这个含义,出了这个边界,"客户"可能是另一个含义。
这个机制在人类开发者身上有效,因为人类会阅读文档、理解上下文、遵守约定。
数字员工不遵守约定。它不读你的领域文档,不理解你的上下文映射(Context Map),更不会在跨边界调用时主动使用防腐层(Anti-Corruption Layer)。
一个典型的涌现行为:一个优化物流成本的数字员工和一个优化交付速度的数字员工,各自在自己的限界上下文中运行良好,但它们的独立优化产生了冲突——一个要求低成本,一个要求高速度,最终把压力传导给了供应商。两个数字员工都"正确"地执行了自己的任务,但系统层面的结果是灾难性的。
Bounded Context是给人画的墙。数字员工不认墙,它只认Prompt中的指令和训练数据中的模式。
断裂三:SDLC的阶段划分在数字员工面前崩塌
DDD的实践深度绑定在传统软件开发生命周期上:需求分析→领域建模→架构设计→编码实现→测试验证。每个阶段都假设人类是执行主体。
数字员工打破了这种线性假设。一个AI编程数字员工可以在一次对话中同时完成需求理解、架构决策和代码生成。它不需要先画UML再写代码,不需要先写测试再写实现。你给它的是一条模糊的需求描述,它返回的是一个可直接运行的Skill——包括聚合根、领域事件、Repository接口。整个过程不超过十分钟。
这导致一个更深层的问题:DDD的领域模型是"设计时"的产物,它假设模型在编码之前就已经确定。但数字员工的工作方式是"运行时建模"——它在生成代码的过程中不断调整对领域的理解。设计时的静态模型无法约束运行时的动态生成,这就是执行偏差(Execution Drift)的根源。
一个结构性的原因
这三个断裂有一个共同的结构性原因:DDD的建模主体是人类,而数字员工时代的执行主体是机器。
抽象层级的差异决定了所有不同:
| DDD 抽象栈 | Ontology 抽象栈 |
|---|---|
| Skill代码(C#/.NET) | 语义层(Ontology DSL / JSON-LD / 元数据) |
| 编程语言(OOP/FP) | 平台(OpenClaw.NET / MetaSkill / Harness) |
| 运行时(.NET Runtime/容器) | 基础设施(TokenHub / 数据湖 / OLTP / OLAP) |
DDD的载体是"程序"——业务模型靠源代码表达,靠编译器和测试保证一致性。Ontology的载体是"平台"——业务模型靠元数据声明,由OpenClaw.NET平台保证一致性。
当执行主体从人变成数字员工,代码不再是核心产出。数字员工可以直接基于Ontology执行操作,代码只是Ontology的一种实现形式,甚至可能完全不需要。
DDD的领域模型是设计时的静态快照。Ontology是运行时的活领域模型——它随着数字员工的执行不断演化,是"定义→执行→反馈→修正"的闭环。
所以呢
三个断裂指向同一个结论:领域模型在数字员工时代不再扮演"桥梁"的角色。
过去,领域模型是连接业务和代码的翻译层——业务专家说"客户",开发者写成 Customer 类,测试保证它是对的。整个链条依赖人类的理解和协作。
现在,数字员工不需要这座桥。它不读你的领域文档,不理解你的限界上下文,更不会遵守你的防腐层约定。它走的是另一条路:直接从Ontology读取业务定义,然后执行操作。
Ontology不再是设计时的参考文档,而是运行时的操作手册。
这不是渐进式优化能解决的问题。旧结构无法解释新现象。DDD假设"人建模→人编码",而数字员工时代的现实是"人定义Ontology→数字员工执行"。
结语:旧地图找不到新大陆
回到"32.4万"的案例。
如果这家企业的数字员工基于DDD模型运行,它永远会犯同样的错误——因为DDD没有定义"新增有效客户"的精确语义,没有告诉数字员工"按账期统计""排除测试号码""按统一客户编号去重"。这些规则写在某个开发者的代码里,写在某份被遗忘的文档里,写在某个业务人员的脑子里——但就是没有写在数字员工能读的语义契约里。
DDD让代码理解了业务。但它没有让数字员工理解了业务。
当执行主体从人变成数字员工,我们需要的不只是"更好的DDD",而是"DDD之上的一层语义契约"。这层契约就是Ontology。
关于作者:OpenClaw.NET 开源社区。我们致力于构建AI时代的数字员工基础设施。
欢迎大家扫描下面二维码成为我的客户,扶你上云

浙公网安备 33010602011771号