我们团队是如何落地DDD的(1)
最近发现文章老是被窃取,有些平台举报了还没有用。请识别我的id方丈的寺院
。
摘要
DDD领域驱动设计,起源于2004年著名建模专家Eric Evans发表的他最具影响力的著名书籍:Domain-Driven Design –Tackling Complexity in the Heart of Software(中文译名:领域驱动设计,之后进行了很多迭代和演化,不过大多没有脱离这本书讨论的范围。因为Eric Evans在该书中只是提供了一套原始理论,并没有提供一套方法论,更别说可落地。所以十几年,对于DDD争论不休,毁誉参半,喜欢的人觉得他解决了软件设计的复杂性,不喜欢的人觉得他使得代码设计更加复杂了。
关于DDD的理论讨论,案例分析的博客也浩如烟海,但是关于他应该如何被引进团队,一步步实施下去,却很少见,导致很多人想从0开始的人,不知道如何开始。所以我在写DDD系列开始前,先写一下DDD是如何在我们团队落地,希望能够对你有所启发。
DDD落地为什么这么难
敏捷迭代,放弃建模
现代互联网产研团队的构成一般是市场/运营、产品、UI交互、前端、后端、测试。这些角色的分工是将一个产品开发上线的各个过程拆分出来,然后每个过程专人负责,可以有效提高生产效率,这一套流程是标准的流水线作业。这样做的好处毋庸置疑,坏处也很明显,每个人只盯着自己那一块,而忽略整体了。
再来看DDD,领域建模设计核心有两个
- 统一语言(软件的开发人员/使用人员都使用同一套语言,即对某个概念,名词的认知是统一的)
- 面向领域(以领域去思考问题,而不是模块)
为了实现这两个核心,需要一个关键的角色,领域专家。他负责问题域,和问题解决域,他应该通晓研发的这个产品需要解决哪些问题,专业术语,关联关系。这个角色一般团队是没有配备的。最接近这个角色的就是产品了,但实际上产品并不是干这个活的。在我们团队落地过程中,有一段时间苦于没有领域专家,我想push产品成为领域专家,担当起这个角色。 最后不了了之,产品很配合,但是内驱力不强。为什么内驱力不强,因为给他带来的收益不够。
前面已经提到敏捷迭代后,每个角色都是流水线上的螺丝钉,大家都只盯着自己这一块。对自己有利的去参与,和自己无关的不管。
我们先看统一语言与面向领域的好处
- 因为大家都使用统一的一套通用语言,所以沟通成本会大大减小,不会在讨论A的时候以为是B。
- 对使用产品的用户有好处,他能在产品不断更新过程中,有一套统一流畅的体验。用户不用在每次软件更新时都要抱怨为什么之前的一个数据保存后没有用到了。
- 面向领域去开发产品有助于我们深入分析产品的内在逻辑,专注于解决当前产品的核心问题,而不是冗余的做很多功能模块,或者几个用户/运营反馈的问题就去更改产品逻辑,完了上线后用户不用,你还在那边骂用户朝三暮四,乱提需求。
这些好处粗看一下,其实对产品研发的各个角色都有意义。但细看一下呢,沟通成本大大减小,对于运营,产品,UI交互没啥问题。一个问题理解的不一致,组织个会议,大家好好聊聊就行了。用户体验一致对产研团队有啥好处呢,反正用户骂的不是我,是客户和运营。深入分析产品的内在逻辑有啥用呢?一款产品的成功有很多因素,主要靠上面,我只是一个小兵,我管不了那么多。有空我多研究研究我的专业领域,多去看几篇面试文章。产品黄了,我好跳槽。
因为本人是后端研发,所以这里不对其他角色过多展开。只想对研发说,你跳槽换个公司就好了吗?还是crud boy。还是重复着写着很多冗余的功能,冗余的代码。需求方让你写什么,你就写什么,最后在一天天的加班中丧失了对代码的兴趣,没有了梦想。
我们都知道改变别人很难,所以先从改变自己开始,先让自己变优秀了,才能影响他人
框架易学,思想难学
如果抛开其他角色,单从研发角度考虑DDD呢。开发进行领域建模,然后遵从康威定律,将软件架构设计映射到业务模型中。(虽然这个领域,开发可能识别的不对,暂且忽略这个问题)
康威(梅尔·康威)定律
任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上 都与该组织的沟通结构保持一致。
纯研发实施DDD,为什么也这么难呢?
没有标准
DDD是一套思想,一套领域建模设计,一套在特定上下文环境中使用的。所以在1千个团队中实行DDD,可能有1千套不同的方案。一个实行DDD多年的人,换了一个公司,换了一个团队,把他原有的那套带过去,推行下去,一般都不适用。
所以DDD的学习和实践不像学习一个函数,API,框架那样有直接的反馈效果,他需要结合团队的实际情况去实行,才能达到效果。
期待DDD解决所有的问题
程序员都是很实际的,没有好处的东西是不会去做的。你必须能够有效的帮助他提升,他才会去接受。
比如当初有团队成员提出来,
我们实行了这一套后,是不是不用加班了,或者加班时间可以减小。
有测试提出
实行这一套后,bug率能降低多少。
研发需要一个可以量化的效果,抱歉DDD做不到。没有哪个团队实行了DDD后,解决了软件开发的所有问题。关于这一点,可以读一下驱动方法不能改变任何事情
DDD落地的目标
结合我们团队的实际情况,经过上面一系列的讨论,我们首先确定了我们期待的DDD落地的目标
- 结合DDD的理论支持,使得微服务架构能够落地,将一个单体应用很好的拆分成各个微服务,能够快速迭代,快速发布满足业务需求。
- 团队成员写出来的代码风格比较统一
每个人知道代码往哪个地方写,新人来了,能够很快上手。
之后我们就围绕着这个目标,开始实行DDD,欲知后事如何,请听下回分解。
关注【方丈的寺院】,第一时间收到文章的更新,与方丈一起开始技术修行之路
我们团队是如何落地DDD的(1)的更多相关文章
- DDD-CQRS的落地案例
摘要 在之前的文章DDD-CQRS能解什么问题中,阐述了什么是CQRS.但是并没有业务需求可以应用CQRS.最近需要处理一个文本增量更新的业务,经过需求分析后,尝试使用CQRS来解这个问题 问题分析 ...
- 跨越DDD从理论到工程落地的鸿沟
摘要:本文从DDD的核心概念讲起,重点放在如何把理论落地成代码,期望给那些正在探索DDD的同学一些指引和启发. 本文分享自华为云社区<跨越DDD从理论到工程落地的鸿沟>,作者:敏捷小智. ...
- 可落地的DDD(7)-战术设计上的一些误区
背景 几年前我总结过DDD战术设计的一些落地经验可落地的DDD(5)-战术设计,和一次关于聚合根的激烈讨论最近两年有些新的落地体验,回过头来发现,当初对这些概念的理解还是没有深入,这篇文章重新阐述下. ...
- 在单体应用的一些DDD实践经验
阅读此文需要一定的DDD基础,如果你是第一次接触DDD读者,建议先去阅读一些DDD相关的书籍或者文章之后再来阅读本文. 背景 自从我在团队中推行DDD以来,我们团队经历了一系列的磨难--先是把核心项目 ...
- DDD:架构思想的旧瓶新酒
DDD.DSL 和 DCI DDD 概念最早提出于 2004 年,作为一种软件开发的指导思想,DDD 对软件开发带来了诸多可能与方向,张晓龙认为 DDD 为软件开发带来的好处主要有以下几点: 首先,最 ...
- 解读中兴通信在物联网行业如何践行DDD
此前,在由 ThoughtWorks 举办的领域驱动设计峰会 DDD-China 2019 上,InfoQ 记者就开发团队为何需要 DDD.目前业界实践 DDD 的挑战等问题对中兴通讯资深软件架构师张 ...
- 网易新闻App架构重构实践:DDD正走向流行
网易新闻App架构重构实践:DDD正走向流行 https://mp.weixin.qq.com/s/FdwrT_xn3CQqpWoRVBttvQ 小智 InfoQ 2020-05-14 作者 | 小智 ...
- DDD领域驱动设计-概述-Ⅰ
如果我看得更远,那是因为我站在巨人的肩膀上.(If I have seen further it is by standing on ye shoulder of Giants.) ...
- MASA Framework - DDD设计(1)
目录 MASA Framework - 整体设计思路 MASA Framework - EventBus设计 MASA Framework - MASA Framework - DDD设计(1) DD ...
随机推荐
- 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸
该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供 ...
- hdu5325 树的思维题
pid=5325">http://acm.hdu.edu.cn/showproblem.php? pid=5325 Problem Description Bobo has a tre ...
- 数据解析,懒加载,代理ip
在前面的requests流程中,还缺少了一步重要的流程,就是在持久化存储之前需要进行制定的数据解析.因为在大多数情况下,我们都会使用聚焦爬虫,也就是爬取页面中的指定部分数据值,而不是整个页面的数据. ...
- HDU - 4990 Reading comprehension 【矩阵快速幂】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4990 题意 初始的ans = 0 给出 n, m for i in 1 -> n 如果 i 为奇 ...
- java.util.ResourceBundle国际化用法详解
java.util.ResourceBundle国际化用法详解 初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说 ...
- MVC+Ext.net零基础学习记录(五)
继MVC+Ext.net零基础学习记录(四),在后面我在既有的项目上又添加了一个子项目,还用前面提到的方法,进行主项目中引用DLL,然后子项目中生成事件中使用mkdir 进行拷贝 发现一个下午就总是报 ...
- 【css学习整理】浮动,清除
css内边距属性: padding padding-top right bottom left 如果是两个数字,指的是上下,左右 padding: 10px 20px 上下10 左右20 如果是三 ...
- 分享知识-快乐自己:intellij Idea报错Could not autowire. No beans of...
intellig idea 使用@Resource或者@Autowire报错,出现红色波浪线: 虽然不影响使用,但是看着很不爽,所以还是解决了下: 报错提示: Could not autowire. ...
- struts2框架xml验证
struts2验证分为3步: 1.获取需要验证的信息,使用同名属性,提供getter,setter方法.然后框架使用反射将值自动注入. 2.对信息进行验证,成功失败作出对应的选择. xml验证和手动验 ...
- listen 76
Flavors Fluctuate With Temperature Does an ice-cold drink actually taste better than the same bevera ...