DDD专家张逸:构建领域驱动设计知识体系

2023-11-20

张逸

读完需要

5

分钟

速读仅需 2 分钟

领域驱动设计专家,曾就职于 ThoughtWorks,作为 Lead Consultant 为客户提供架构设计、大数据分析、持续交付、代码质量、敏捷管理等咨询服务。著译作包括《软件设计精要与模式》、《WCF 服务编程》、《Java 设计模式》、《恰如其分的软件架构》、《人件》等。新书《解构领域驱动设计》即将完稿。

本次演讲是张逸老师创作 GitChat 课程「领域驱动战略设计实践」和「领域驱动战术设计实践」这两年来,随着对领域驱动设计的深度理解,结合自身项目经验总结的领域驱动设计知识体系。

本次演讲内容分为四个部分:

  • 领域驱动设计的历史回顾

  • 对领域驱动设计的新定位

  • 领域驱动设计参考过程模型

  • 领域驱动设计能力评估模型

1

   

领域驱动设计的历史回顾

从 2004 年 Eric Evans 的经典著作《领域驱动设计》出版开始,在这十五年间,我个人认为有四个重要的里程碑值得重视。

里程碑之一:领域驱动设计的诞生

里程碑之二:领域事件的引入

它的重要意义在于拓宽了领域驱动设计的建模范式,引入了以“事件”和“函数”为核心的新的领域驱动设计模式,如 Event Store、Event Sourcing、Pure Function 等:

架构模式也发生了变化:

里程碑之三:微服务的引入

毫无疑问,微服务概念以及该架构模式的产生与发展,对领域驱动设计产生了深远的影响。它的引入对企业应用系统的设计与开发带来了各方面的影响。

首先是设计理念的改变。传统的数据模型驱动设计并不适合微服务架构。例如,那种以数据库 SQL 或存储过程操作数据的方式,在微服务架构下已经不具备优势:

其次,领域驱动设计引入的限界上下文边界与聚合边界更适合微服务架构:

通过防腐层(ACL)与开放主机服务(OHS)维护好限界上下文的边界,有利于单体架构向微服务架构的迁移:

领域驱动设计强调领域模型与数据模型的分离,在从单库单表的数据结构迁移到多库多表时,领域模型受到的影响较小,同样有利于单体架构到微服务架构的迁移。

在 2017 年的 DDD 中国峰会,我对肖然笑称是“微服务拯救了领域驱动设计”,但这个说法其实比较过分,因为领域驱动设计并没有岌岌可危,只是并未成为国内软件开发的主流而已,因而我改为一个更加温柔的说法:微服务让领域驱动设计焕发了青春。

但是,到了 2019 年的今天,我却要改变这一说法:不是微服务让领域驱动设计焕发青春,而是微服务“爱上了”领域驱动设计,二者其实是天作之合。

里程碑之四:中台战略的引入

ThoughtWorks 的王健将微服务定义为:企业级能力复用平台。我很认同这一定义,如果仔细分析这九个字的定义,也可以从领域驱动设计中找到映射。

首先,领域驱动设计中问题空间的子领域和解决方案空间的限界上下文就体现了企业级能力:

其次,领域驱动设计强调将领域层独立出来,即可形成对领域模型的复用:

领域驱动设计的四重边界与整洁架构思想的遵循,可以帮助我们更好地完成平台的沉淀:

中台战略(Zhongtai Strategy)是否能够更好地与领域驱动设计结合,或许答案还未可知,但我们可以对其进行探索。

2

   

对领域驱动设计的新定位

我认为领域驱动设计从最初的一种技术体系,到现在已经发展成了一种设计哲学:

为此,我建立了领域驱动设计魔方,分别从 X、Y、Z 三个维度对领域驱动设计进行了梳理:

我基于 Y 轴划分的宏观层次、微观层次与纳米层次分别介绍了领域驱动设计魔方:

在领域驱动设计魔方中,我引入了业务架构、系统上下文、事件风暴、整洁架构、RAID 风暴、RUP 4+1 视图、康威定律、精益需求管理、敏捷过程管理、场景驱动设计、测试驱动开发和测试战略。这些内容在 PPT 中都有介绍,这里就不再赘述。

3

   

领域驱动设计参考过程模型

固化领域驱动设计的过程,提供简单有效的实践方法,建立具有目的性和可操作性的研发过程。

在全局分析阶段,参考过程模型的实践包括:

在战略设计阶段,参考过程模型的实践包括:

如果当前限界上下文属于核心子领域,则应该为该限界上下文开展领域模型驱动设计,这一阶段的参考过程模型包括:

4

   

领域驱动设计能力评估模型

借助领域驱动设计魔方与领域驱动设计参考过程模型引入的各种方法与模式,我建立了一套领域驱动设计能力评估模型。

领域驱动设计能力评估模型(Domain-driven design Capability Assesment Model, DCAM)是我个人对领域驱动设计经验的一个提炼,可以通过它指导团队进行能力的培养和提升。

DCAM 并非一个标准或一套认证体系,更非事先制定和强制执行的评估框架。建立这套模型的目的仅仅是为了更好地实施领域驱动设计,它是一个能够不断演化的评估框架。

该能力评估模型针对的能力维度包括:

  • 敏捷迭代能力

  • 领域建模能力

  • 架构设计能力

  • 整洁编码能力

敏捷迭代能力

领域建模能力

架构设计能力

整洁代码能力

领域驱动设计的落地取决于一个成熟的领域驱动设计团队。利用 DCAM 对团队进行评估,在发现团队成员的能力短板后进行针对性的培训,一旦提升了整个团队的成熟度,在领域驱动设计的精髓指导下,距离领域驱动设计的成功就不远了!

- EOF -

微服务架构~BFF和网关是如何演化出来的2020-10-06

这十年,阿里开发者毕玄的日常2020-10-05

天弘基金首席架构师李鑫:微服务接口限流的算法及架构实现2020-10-04

   END     
#架构师必备#

点分享点点赞点在看
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DDD专家张逸:构建领域驱动设计知识体系 的相关文章

随机推荐

  • 安装Python第三方库

    视频版教程 Python3零基础7天入门实战视频教程 在Python的标准安装中 包含了一组自带的模块 这些模块被成为 标准库 比如常用的math random datetime os json等等 此外 还有很多的第三方模块 或者叫做库也
  • 若以框架 vue富文本字符串中获取图片的存储路径

    若依的富文本 字符串是上述格式 我们要获取以下格式 就是图片的存储路径 有几个步骤 第一步 main js中添加两行代码 import axios from axios Vue prototype axios axios 第二步 Edit包
  • Python 笔记 — 单例模式和魔术方法

    目录 一 单例模式 1 概念 2 优点 3 使用 4 实现方法 5 运用 6 内存地址 7 通过 new 实现 8 通过 classmethod 9 通过装饰器实现 10 通过导入模块时实现 11 hasattr 函数 12 getattr
  • 内存管理——分页分段

    一 分页存储管理 1 页面与页框 1 页面 将一个进程的逻辑地址空间分成若干个大小相等的片 称为页面或页 并为各页加以编号 2 页框 相应于页面 把内存空间分成和页面相同大小的若干个存储块 称为 物理 块或页框 frame 3 页内碎片 在
  • Android中项目中各个文件夹的含义和用途详解

    1 src 存放所有的 java源程序 2 gen 为ADT插件自动生成的代码文件保存路径 里面的R java将保存所有的资源ID 3 assets 可以存放项目一些较大的资源文件 例如 图片 音乐 字体等 4 res 可以存放项目中所有的
  • IntelliJ IDEA 2022.3 版本 IDAE 的Java 编译器错误问题解决方法

    2022 2 3 版本 IDAE 的Java 编译器错误问题解决方法 如果这是按照以前的办法就是去更改下面 的内容就可以OK了 但是在最新版中无论怎么修改都是无用 不知道为啥 随后我就在这里 是的就是上面 的第二张图中 将11 versio
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp
  • 生产环境的域名地址与后端给的接口地址不一样时的配置(vue)

    1 找到 config dev env js 文件 module exports merge prodEnv NODE ENV development API ROOT http com 本地开发时用的域名 2 找到 config prod
  • 不在傻傻for循环!完美解决JPA批量插入问题

    前言 jpa在简单的增删改查方面确实帮助我们节省了大部分时间 但是面对复杂的情况就显得心有余而力不足了 最近遇到一个批量插入的情况 jpa虽然提供了saveAll方法 但是底层还是for循环save 如果遇到大量数据插入频繁与数据库交互必然
  • WIN11

    WIN11 安装WSL2 在WSL2上跑pytorch gpu 远程连接WSL2 个人电脑的关键配置 显卡是RTX3090 系统是WIN11 由于买的是整机 所以刚开机就装好了驱动 本人没有再进行显卡驱动 同时包含了wsl中的驱动 的安装
  • Android Log系统介绍 (基于Android N)

    原文使用有道云笔记创作 看这个 http note youdao com noteshare id 82f88b1c82652b80c27d54aad55af035 引言 gt Android 的log 从操作系统分层上来讲 可以分为 Ke
  • Linux内核驱动之GPIO子系统(一)GPIO的使用

    分类 Linux内核驱动 2012 10 31 21 12 162人阅读 评论 1 收藏 举报 目录 一 概述 Linux内核中gpio是最简单 最常用的资源 和 interrupt dma timer一样 驱动程序 应用程序都能够通过相应
  • Subwords Tokenizer方法介绍: BPE, Byte-level BPE, WordPiece, Unigram, SentencePiece

    参考于transformers tokenizer的文档 目录 Byte Pair Encoding BPE 1 出发点 原理 应用 Byte level BPE 2 出发点 原理 应用 WordPiece 3 原理 应用 Unigram
  • 一种踩内存的定位方法(C++)

    在嵌入式应用开发过程中 踩内存的问题常常让人束手无策 使用gdb调试工具 可以大幅加快问题的定位 不过 对于某些踩内存的问题 它的表现是间接的 应用崩溃的位置也是不固定的 这就给问题定位带来了更大的困难 笔者见过带有虚函数C 的类对象在试图
  • 2021春招已正式开启,阿里巴巴企业智能事业部内推,有意者看下文!

    前言 说一说已经拿到内推的两个朋友的面试经验 你们可以看一下准备一下 同事A阿里巴巴一面 55分钟 先介绍一下自己吧 说一下自己的优缺点 具体讲一下之前做过的项目 你觉得项目里给里最大的挑战是什么 Hashmap为什么不用平衡树 AQS知道
  • 程序员要不断学习

    2016 10 20 计算机技术的发展速度还是很快的 当个人电脑赶上10年前的超算时 我们不得不感叹硬件的发展编程开发带来了很大的影响 对世界带来了很大的影响 知识和工具的更新速度还是比较快的 这就要求程序员始终需要学习 我在知乎上看到一个
  • redis 配置与优化

    目录 一 关系数据库和非关系型数据库 二 关系型数据库和非关系型数据库区别 三 非关系型数据库产生背景 四 redis 1 概念 2 redis的优点 3 redis为什么这么快 五 redis安装与配置 一 关系数据库和非关系型数据库 关
  • Scrapy爬取图片自定义图片文件名时出现的问题

    目录 出现的问题 只下载了一张图片 图片的名称为最后一张图片的名称 但内容并不是最后一张图片的内容 在打印时 最后一张图片的相关信息出现多次 对应文件的相关信息 Items文件相关内容 Spider文件内容 Settings文件内容 Pip
  • 静态类(static class)、成员类(member class)、局部类(local class)、匿名类   (anonymous class)

    内部类定义 在一个类的内部定义一个类 内部类分为 静态类 static class 成员类 member class 局部类 local class 匿名类 anonymous class static class 作为类的静态成员存在于某
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式