先有鸡还是先有蛋?这是领域驱动设计落地最大的困局

· 浏览次数 : 11

小编点评

本文主要讨论了领域驱动设计(DDD)的实践困境,特别是团队在实施DDD时面临的“先有鸡还是先有蛋”的问题。文章指出,问题的核心在于团队缺乏对“识别范围和边界是最重要的事”的认知。为了打破这个困局,文章提出了一系列建议,包括: 1. **决策者的观念转变**:决策者需要认识到清晰界定问题和范围的重要性,并在决策过程中充分考虑这一点。 2. **明确的决策依据**:在需求分析、功能设计和业务模型等方面,所有相关方都需要对边界有明确的认识。 3. **沟通与讨论**:决策者应直接或授权团队就这些问题进行充分的沟通和讨论,确保决策的明确性。 4. **能力模型**:文章还提出了关键角色的能力模型,包括对业务与需求的理解、业务建模能力、技术理解等。 5. **改变的起点**:改变的起点是相信“相信的力量”,即相信通过理解和实践领域驱动设计的价值观,可以提高团队的效率和产品质量。 文章最后指出,如果团队中的非决策者希望实践DDD,他们可以选择与领导沟通、努力成为决策者,或者在必要时考虑更换更开放的组织文化。

正文

欢迎关注公众号“老肖想当外语大佬”: https://mp.weixin.qq.com/s/HHJ5vt2_iT0-CFcw0HcPnA

先有鸡还是先有蛋的困局

前文我们提出了“领域驱动设计是一种价值观”这个观点,那么落地领域驱动设计就是践行价值观的过程,实践过程中势必需要一些方法来指导,那么问题来了,一个团队要落地领域驱动设计,是先有认知还是先有方法呢?
 

 

如果团队没有“识别范围和边界是最重要的事”这样的认知,那么大概率也不会关注它,“方法”就无从谈起,如果没有“方法”,你大概率也体会不到“识别范围和边界是最重要的事”这样价值观带来的好处,那么就很难构建起这样的价值观,因此就陷入了一个“先有鸡还是先有蛋”的困局,这也是现实中大多数研发团队面临的困局,即使团队中有人意识到这个问题,普遍地也是无能为力。

 

核心问题是什么?

你可以审视一下自己的团队,在需求分析的时候,是否真的建立了需求边界的共识?产品经理在定义产品功能的时候,又是否真的把功能的边界、目的、以及对应的需求给团队讲明白了?再看看你的代码,是否每个类的职责和目的都是清晰的?
如果以上问题的答案都是肯定的,那么,你也不会觉得需求难分析、功能难设计、代码难修改了。我相信,大部分团队的答案,都是“否”,而且这些问题,最后都会以程序员背负着“迭代交付效率低下”这口大锅,然后拼命用加班来补偿而告终,然而这个锅的罪魁祸首却在立项的那一刻已经埋下了,很多的隐性代价在项目初期被忽视,无边界的问题、模糊的需求、凑合的建模、背离现实的扩展性设计、匮乏的测试用例等等一系列的不确定性,在团队的工作流程里一步步被放大,而这个锅该不该由流程下游才介入的程序员们来背,是值得商榷的。但组织的管理者并没有这个认知,没有这个判断力,他们只会看到工期紧任务重,程序员们出活慢。
那么问题来了,一个事情做不好,是决策者的锅大,还是执行者的锅大呢?
 

决策者是最大的绊脚石

在我看来,最大的锅应该是团队决策者的,首先,这一系列的问题本质就是没有意识到“把问题的边界和范围搞清楚”是最重要的事,下达的很多决策都是脱离实际的。
团队成员无法推动团队价值观的变化”,这是因为价值观的现实体现,就是决策结果,而团队的决策其实是由管理者最终拍板的,因此管理者的价值观就是团队价值观

 

设想一下,假如老板不期望员工加班,员工大概率不用加班,反之结果,就是普遍意义上的各种996、福报、奋斗逼。老板的价值观,就是企业的价值观,因为各种决策是老板做的,决策本身就是价值观的体现。放到研发团队里,团队主管就是那个下决策的人,诚然很多经验丰富的开发者、架构师对于软件设计有丰富的经验和独到的见解,仍然架不住领导一句“明天这个功能就得上线”、“客户要得急”、“先上线再说”。
所以我的观点是:
  • 决策者在做决策时,核心价值判断出现了偏差;
  • 决策者对自己的决策后果,缺乏充分的判断力;
所以,决策者是领域驱动设计落地最大的绊脚石
 

落地领域驱动设计的必要条件

要成功在团队中实践“领域驱动设计价值观”,就必须把识别和明确边界作为首要决策依据,那么需要做到下面几点:
  • 所有的需求都有明确的边界定义
  • 所有的功能设计都有明确的边界定义
  • 所有的业务模型都有明确的边界定义
  • 所有的代码都有明确的边界定义
而要做到这些,就必须由决策者直接或者授权团队在这些问题上做充分的沟通和讨论,所做的决定必须是明确的,哪怕是有限信息下的决策,也得明确有多少是确定的,有多少是团队建立了一个猜的共识,这些决策都明确的情况下,团队的最终执行,就一定是符合领域驱动设计价值观的。
 
此外,如果有下面两条,那么团队落地领域驱动设计的顺畅程度会大大提高:
  • 一套匹配的DDD战术框架
  • 一组执行力强的开发团队
这两条,我们在后续更具体实战操作中更详细地展开和说明。

关键角色的能力模型

既然,决策者是最关键的角色,那么这个角色需要具备哪些能力呢?
首先,决策者的核心职责如下:
  • 理解业务与需求
  • 业务建模
  • 确保研发按照模型交付
具象化出来就是“业务专家的话你听得懂”、“产品经理懂的你得懂”、“研发的方案你看得懂”,这个角色需要能够与各个角色充分地交流和协作,并且对技术有充分的了解,那么就必须有足够的“判断力”、“表达力”、“协作力”以及“技术功底”。

 

有这些能力做支撑,才能够在沟通互动中捕捉关键信息,识别问题的边界,给出匹配的方案,才能判断一个决策的范围和边界是否足够明确,是否在团队中建立了共识,是否明确了不可共识的部分。
 

改变的起点是相信“相信的力量”

在回到文章开头,要打破“先有鸡还是先有蛋”这个困局,需要团队管理者身上突破,管理者得先意识到,问题的边界、解决方案的边界的重要性,先理解系统迭代慢这件事背后的核心因素就是在决策时把很多需要明确的问题推迟了,这个推迟,导致了团队付出大量额外的代价来补偿,以应对决策时的不确定性,伪需求、没人用的功能、无意义的扩展性等等问题都是在一个个决策中产生的,而大家看到最终的结果,就是研发团队的效率低下,一个小小的功能都迭代不上去,这个锅扣在程序员身上是不符合事实的。
因此,要做出改变,先要相信“相信的力量”,你看到了这篇文章,尝试理解了“范围和边界是最重要的事”这样的价值观,那么接下来就是不断地在每次决策和讨论中实践它,不断自我审视自己的决策,是否把范围和边界弄清楚了,尽可能地向这个方向靠拢,我也相信,因为你的相信,一定能够收获到“相信”的价值。

 

 

不是决策者,我该怎么办

如果你不是决策者,而你又认同“领域驱动设计是一种价值观”,那么你有三个选择:
  1. 将这个观点与你的领导沟通,尝试推动领导与你建立共识,获取信任并帮助团队做决策;
  2. 努力自己成为决策者;
  3. 以上都行不通,也许你该换个更加开放组织了;

后续

到此,领域驱动设计的概念和核心落地的核心角色已经描述完毕,期待与大家对这些观点来讨论沟通。
接下来,将展开探讨作为领域驱动设计的核心角色,具体应该如何操作,帮助团队将这个价值观内化到日常工作行为中来。

与先有鸡还是先有蛋?这是领域驱动设计落地最大的困局相似的内容:

先有鸡还是先有蛋?这是领域驱动设计落地最大的困局

本文书接上回 《关于领域驱动设计,大家都理解错了》 欢迎关注公众号“老肖想当外语大佬”: https://mp.weixin.qq.com/s/HHJ5vt2_iT0-CFcw0HcPnA 先有鸡还是先有蛋的困局 前文我们提出了“领域驱动设计是一种价值观”这个观点,那么落地领域驱动设计就是践行价值观

卷积导向快速傅里叶变换(FFT/NTT)教程

1 Forewords 卷积,但不止卷积 - FFT 漫谈 先有 FT,再有 DFT,才有 FFT 时频转换是最初的用途 发现单位根优秀性质,James Cooley, John Tukey 发明现代 FFT 加速 DFT,但此前相似的发现早已有之 后来将 DFT 与卷积定理联系,FFT 才被用于计

Jemter代理服务器录制脚本,优化后形成性能测试场景

在进行性能测试(压力、负载)等,先要有对应的测试场景,比如添加功能:要先登录成功,然后调用添加接口,输入添加的内容,才可以添加成功。那么可以通过Jemter代理服务器,设置代理,打开测试的网站,录制脚本,当然,也可以根据接口文档,使用接口文档添加对应的接口形成业务测试脚本。 HTPP代理服务器设置:

归并排序-Python

归并排序的时间复杂度O(nlogn),空间复杂度为O(n) 首先我们先假设有两个有序数组,我们去进行一次归并 用代码实现 def merge(li: list, start: int, mid: int, end: int) : res=[] j = mid +1 while start <= mi

[转帖]JVM 运行数据区深度解析

https://my.oschina.net/jiagoushi/blog/5597878 运行数据区 字节码只是一个二进制文件存放在那里。要想在 jvm 里跑起来,先得有个运行的内存环境。 也就是我们所说的 jvm 运行时数据区。 1)运行时数据区的位置 运行时数据区是 jvm 中最为重要的部分,

基尼系数的直观解释

我们在使用分类算法训练数据后,评价分类模型的优劣时,经常会遇到一个词,“基尼系数”。那么,什么是基尼系数呢? 本文将尝试用最简单的方式介绍什么是“基尼系数”以及它的计算方法和意义。希望能让大家对基尼系数有个直观的印象,而不仅仅是记住它枯燥的计算公式。 1. 从分类模型开始 首先,先假设有一个分类案例

[转帖]Oracle 创建和查看DBLink 的方法

https://www.cnblogs.com/zhouzangood/articles/4612441.html 1、如果需要创建全局 DBLink,则需要先确定用户有创建 dblink 的权限: select * from user_sys_privs where privilege like

Unity 利用Cache实现边下边玩

现在手机游戏的常规更新方案都是在启动时下载所有资源更新,游戏质量高的、用户粘性大的有底气,先安装2个G,启动再更新2个G,文件小了玩家还觉得品质不行不想玩。 最近在做微信、抖音小游戏,使用他们提供的资源缓存方案,现在要转成Android APP, 也想用这种边下边玩的机制把首包做小。 其实很简单,直

[BUUCTF][WEB][极客大挑战 2019]BabySQL 1

靶机打开url 界面上显示,它做了更严格的过滤。看来后台是加了什么过滤逻辑 老规矩先尝试时候有sql注入的可能,密码框输入 123' 爆出sql错误信息,说明有注入点 构造万能密码注入 123' or 1=1 # 居然爆出sql错误, ...version for the right syntax

基础知识小结

为什么会存在这个 大概在2021年中左右,我决定未来5-8年还是在搞技术,所以我就在想我该如何完善自己的知识体系,要怎么样才能成为一个合格的、专业的前端工程师,如果后面不止于前端,我要怎么样才能在这个行业走的更远。所以就有了先提升基础的知识点的想法,虽然专业是软件工程,但是这些基础真的基本都还给书本