浅谈 DDD 领域驱动设计
文章简介
在B端产品研发及项目实施中,DDD带给我们哪些思考?我们是如何应用的?本文不是科普贴,旨在分享我们的经历和思考。
背景
Domain Driven Design(简称 DDD),又称为领域驱动设计,起源于杰出软件建模专家Eric Evans在2003年发表的书籍《DOMAIN-DRINEN DESIGN —TACKLING COMPLEXITY IN THE HEART OF SOFTWARE》(中文译名《领域驱动设计—软件核心复杂性应对之道》)。随着2014年Martin Flower和James Lewis的《Microservice》出版,微服务概念为业界所接受,DDD也被重新提起。人们发现,DDD里的领域、限界上下文、领域模型等理念,和微服务的高内聚、低耦合理念有着天然契合,越来越多的人把DDD作为指导微服务划分的方法论之一,也有越来越多的人认为,掌握DDD才是一名优秀的架构师。
DDD工作流程 - 图片来自于网络
限界上下文 - 图片来自于网络
为什么我们要开始DDD?
笔者所在团队于2015年左右开始进行公司自主产品的研发,当时,DDD主要应用在我们的微服务划分、代码分层中,对我们当时从技术角度出发、搭建统一的微服务技术框架,有着重要的指导意义。而真正开始思考将DDD应用在具体的业务领域与业务场景中,是在2018年末。那时,我们面临着自主产品实施的项目越来越多、需要帮助客户从0到1构建业务应用的情况,如何在企业甚至行业的复杂业务场景中找到合适的架构方案,是当时我们期望借助DDD去更体系化回答的问题。
我们是如何应用DDD的?
在DDD的实践中,大多数人应该都会面临一个问题:名词太多!“领域”、“子域”、“限界上下文”、“聚合”、“实体”、“值对象”等等名词,令人眼花缭乱。并且,DDD的理论虽然告诉了我们名词的定义和处理原则,但是具体场景之下,到底如何基于原则去分析,好像并没有标准答案。
这也是我们在应用DDD时的最大困境,我们也在反复思考:如何在团队内统一语言、如何把DDD原则融入到具体可执行的工作事项中?
接下来,我们将从人和事两个方面来分享我们的经历与思考。
人:
DDD里强调,领域专家和开发团队共同工作。
领域专家的加入,其本质在于让一切的设计回归业务本身,从业务价值出发,聚焦业务核心域,避免过度设计。
希望领域专家和开发团队共同工作,往往是实践中的第一个难题,如何找到合格的领域专家?如何保障领域专家的时间投入?如何最大化发挥领域专家的“价值”?
- 关于合格的领域专家:领域专家不是指某一个特定的人,可以是很多人,可相互补充,但同时也不建议过多。在寻找领域专家时,企业可以从自身的业务领域出发,在每个业务领域寻找到有丰富经验的人员。这里的“经验丰富”并不仅仅是一线实战经验丰富,更是对业务要有深度的理解和认知。
- 关于领域专家时间投入的保障:在实践中会发现,有各种各样的“客观”原因,导致领域专家无法有效投入。虽然有很多客观的情况,但是不管有多么困难,保障领域专家的时间投入都是必须要做的。如果领域专家都不参与,我们怎么有信心讲我们交付的是业务价值而不是一堆代码呢?
- 如何最大化发挥领域专家的“价值”:把抽象的问题具象化,通过聆听和引导,更多地从企业的领域专家处获得信息,放弃“我是专家”的执念。
开发团队:在多数的信息化项目中,常见的分工是需求分析师进行需求收集与设计,技术人员负责开发和实现,需求分析师进行测试验收。在DDD实践时,建议开发团队的业务架构师、技术架构师、测试架构师从一开始便共同工作,这样才能够发挥每个角色在各自专业领域的长处、逐步统一语言、快速达成共识。
事:
DDD区分了战略设计与战术设计两个层次,提出了聚焦核心域、创造性协作、统一语言的三个原则。很多人在刚开始应用DDD的时候,会感觉自己都“不会说话”、“不会做事儿”了。这其实是因为过于关注名词本身,陷于对名词的理解和解释上,因此,在“事”上,我们认为,需要抓住两个要点。
- 找到更舒服的方式
DDD通过战略设计解决业务边界划分的问题,通过战术设计实现领域模型的抽象,解决的是从业务到技术的过渡。
在谈DDD的时候,一定绕不开事件风暴。“事件风暴(Event Storming)是一种快速的设计技术,让领域专家和开发人员都可以参与到这个快节奏的学习过程中。它聚焦于业务和业务流程,而非名词概念和数据。”(摘自Vaughn Vernon《领域驱动设计精粹》)。事件风暴为DDD战略与战术落地,提供了一种非常有逻辑、有体系的方法,那么在这个方法之外,还有没有其他的方法呢?答案是,有的。尤其在B端企业的信息化建设中,瀑布实施方法论、敏捷开发等等非常多优秀的方法与工具,都可以为我们所用。
在DDD的落地过程中,我们核心的是要抓住最终要获得的结果,在过程中所采取的方式,可以根据实际情况进行调整,关键是要找到一个让大多数团队成员都舒服的方式。以笔者的经历为例,有一家客户习惯了以流程图的方式进行业务梳理,在这种情况下,使用事件风暴的方式会对客户的习惯造成冲击,甚至让客户不知道如何输出。此时,我们就应该及时调整,思考流程图与事件风暴如何融合,既能以客户习惯的方式推进,同时也能拿到我们想要的结果。
- 将原则与概念形成模板与具体工作任务
一千个人有一千个哈姆雷特,每个人对DDD原则、概念都有自己的解读。为了更快速地在团队内达成DDD落地方法的“统一语言”,建议以具体的工作任务、产出物模板来承载,让团队更聚焦在目标与任务的达成上。
通过在自主产品的研发和实施项目中应用DDD并持续迭代其应用方法,我们不仅有效地完成了中台项目的实施、为客户构建了合理地应用架构,也逐步完善了项目实施方法论体系,为更广泛地项目交付和产品研发提供了助力。DDD帮助解决了产品架构设计中的一部分问题,在架构设计之后,如何保障设计的落地、高效地交付,是每个团队会面临的下一个问题。在这里,笔者推荐使用猪齿鱼这款数智化效能平台,它可以有效管理架构设计所形成的微服务或模块,拉通设计与开发,通过提供协作、测试、DevOps、容器工具,提高团队效能。
猪齿鱼数智化效能平台
现在我们是如何理解DDD的?
DDD首先是一种思想,“聚焦核心域、创造性协作、统一语言”,是关于价值发现、价值认定、讨论、聆听、共识、迭代。这种思想不仅适用于软件设计,也适用于日常工作、个人生活、家庭教育等等方面。我们不可能在每个方面都做到完美,需要识别关键要务、聚焦投入;我们也不可能独自存在,需要与人连接、深度聆听、积极反馈;我们欣喜于共识默契,也有勇气接受差异,因为正是这些差异让我们不断碰撞、更好地学习与成长。
其次,DDD是一种方法,它区分了战略设计与战术设计的,引入了限界上下文与统一语言,提供了实体、值对象、聚合、工厂、资源库等。同时,业界也有很多DDD的相关著作,可以帮助我们更有效地去理解这些概念与具体应用方法。当然,你本身所在的领域与你的过往经验,也是应用这些方法时非常值得参考的。
软件的架构,究其根本是物理世界在数字世界的映射。在DDD的应用中,我们不仅汲取DDD的思想与方法,也学习敏捷、DevOps、测试、微服务等领域知识,同时结合我们既往的经验,逐步总结和迭代了适合我们的一套架构设计体系与方法。正如Eric Evans所说的,“DDD还未结束”,我们也在持续实践与持续调整。
本文是基于笔者当前的认知与理解所形成的,欢迎留言讨论。
本文由猪齿鱼技术团队原创,转载请注明出处
浅谈 DDD 领域驱动设计的更多相关文章
- 浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...
- (转载)浅谈我对DDD领域驱动设计的理解
原文地址:http://www.cnblogs.com/netfocus/p/5548025.html 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来 ...
- DDD 领域驱动设计-三个问题思考实体和值对象
消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...
- DDD领域驱动设计的理解
DDD领域驱动设计的理解 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能 ...
- [转] DDD领域驱动设计(三) 之 理论知识收集汇总
最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...
- 关于DDD领域驱动设计的理论知识收集汇总
原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...
- DDD领域驱动设计落地实践(十分钟看完,半小时落地)
一.引子 不知今年吹了什么风,忽然DDD领域驱动设计进入大家视野.该思想源于2003年 Eric Evans编写的"Domain-Driven Design领域驱动设计"简称DDD ...
- DDD 领域驱动设计-商品建模之路
最近在做电商业务中,有关商品业务改版的一些东西,后端的架构设计采用现在很流行的微服务,有关微服务的简单概念: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独 ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...
- DDD 领域驱动设计-两个实体的碰撞火花
上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...
随机推荐
- 2021云栖大会丨阿里云发布第四代神龙架构,提供业界首个大规模弹性RDMA加速能力
简介: 10月20日,2021年杭州栖大云会上,阿里云发布第四代神龙架构,升级至全新的eRMDA网络架构,是业界首个大规模弹性RDMA加速能力. 10月20日,2021年杭州栖大云会上,阿里云发布第 ...
- [FAQ] Win10 WSL Ubuntu 根目录实际位置
1. 运行(win+R),直接输入 \\wsl$ 进入Ubuntu的目录. 2. 或者文件夹里同样输入 \\wsl$ 进行查找. Refer:Win10 WSL 路径 Link:https://ww ...
- [FAQ] Goland 始终没有包代码的提示 ?
表现:import 引入的包始终是红色的,表示没有找到引入的包. 注意,在这里开启Go Modules: 然后在 Exteneral Libraries 里看到 Go Modules 即可. Refe ...
- dotnet 使用 windbg 运行脚本方式自动批量调试处理 dump 文件
本文将和大家介绍一个简单且实际用途不大的使用 windbg 配合脚本的方式,进行自动化的大批量对 dotnet 系应用的 dump 进行自动化分析调试处理,可以自动根据调试需求输出 dump 文件的一 ...
- WPF 简单判断主线程界面是否卡顿的方法
本文来告诉大家如何使用简单的代码判断当前的软件的 UI 线程或界面是否卡顿 在后台线程调用如下代码即可用来判断是否卡顿 private static async Task<bool> Ch ...
- 2.生产环境k8s-1.28.2集群小版本升级到1.28.5
环境:https://www.cnblogs.com/yangmeichong/p/17956335 # 流程:先升级master,再升级node # 1.备份组件参考:https://kuberne ...
- vue-axios设置公共的请求ip
1.安装axios,网上找方法 2.src->network->request.js并复制: import axios from 'axios' export function reque ...
- docker / compose 的安装 和 体验
文档 官网文档 视频 视频 简介 课程内容 1.Docker Compose 容器编排 2.Docker Swarm #集群 热扩容 需要在阿里上买服务器,至少冲100+以上的人民币 文档: 集群方式 ...
- 显示器AVG、DVI、HDMI、DisplayPort、Type-C、雷电接口
在近十年的发展,显示设备的接口发生了巨大的改变.以前使用比较多的是蓝色VGA接口,接著出现了白色的DVI接口,当遇到不同接口时,还得买转接头进行转接.后来,又有了HDMI等接口,现在则出现DP和USB ...
- Ubuntu 上安装 Docker
步骤 1:删除任何现有的 Docker 包 但在跳到安装部分之前,有必要删除所有以前安装的 Docker. 要 卸载以前的 Docker,请使用以下命令. sudo apt remove docker ...