本文书接上回《这就是为什么你学不会DDD》,关注公众号(老肖想当外语大佬)获取信息:
  1. 最新文章更新;
  2. DDD框架源码(.NET、Java双平台);
  3. 加群畅聊,建模分析、技术实现交流;
  4. 视频和直播在B站。

https://mp.weixin.qq.com/s/TJEtclwcJydiE58pjWpXXw
 

背景

前文说到,我们在建模的时候要放下技术层面的心智负担,这是我们自己内在的问题,相对来讲容易克服。但另外一面,我们分析需求、设计模型时候,就会与业务人员、产品经理等角色进行深入沟通互动,这个时候,很难找到一个比较一致的表述方式,以在大家的大脑中展现出比较一致的形象,往往会出现认知偏差,甚至相互得出相反的理解却无法察觉的情况,沟通效率和准确性非常糟糕。
为了解决这个问题,我们发现了一个很容易被接受的“类比”,就是“拟人化模型沟通法”。
PS: 你依然要先忘掉所有的技术知识。
 

为什么可以拟人化

我们先来看下面的图,展示了一家公司的组织架构:

 
如果我们把图中的结构不变,仅仅是把元素的名称进行替换,就能得到一个系统的结构图:

 
在这里我们得到如下的对应关系

 
其中公司对应系统,部门对应模块,可以理解为层级或者分组,是比较自然的,接下来我们重点看看员工和模型为什么可以对应。
 

“人”与“模型”的共性

 
首先我们思考一下,企业中员工之间是怎么协作的,我觉得无外乎下面两种情形:
 
  1. 真“手把手”教你做事;
  2. 我做好我的事,然后通知你,你做好你的事;
 
类似下图:

 
如果一个任务需要员工A手把手教员工B做,那是不是意味着下面几个情况:
  1. 员工B无法独立完成该任务;
  2. 员工A对该任务最终负责,或者至少是AB共同负责;
 
如果两个员工的协作模式模式2,即“我做好我的事,然后通知你,你做好你的事”,是不是意味着:
  1. 员工A和员工B各自有自己的职责;
  2. 员工A和员工B通过“通知(事件)”来协作;
 
基于上述的逻辑,我们是不是可以得出下面的类比:
 

 
基于这样的类比,我们可以得出如下结论:
 
  1. 如果一个任务需要模型A直接依赖(调用)模型B,说明它们无法独自完成任务;
  2. 如果模型A和模型B仅通过事件协作,说明它们相互独立,职责边界清晰;
 
这个结论情形2是非常合理的,但如果我们遇到的是情形1,一个任务需要模型A和模型B共同的信息协作才能完成,我们一般认为有两个可选方案:
  1. 合并模型A和模型B,把他们看作一个整体,在模型图上的表现,就是他们之间有实线相连,他们是一个聚合整体;
  2. 创建模型C,来负责这个任务的解决,由模型A和模型B通过事件通知的方式把信息告诉模型C;
 
最终我们的模型都会是通过事件的方式协作,“人”与“模型”的共性大体如下:
 
  1. “人”与“模型”都有自己的职责,负责解决特定的业务问题;
  2. “人”与“模型”都拥有要履行自己职责所需要的信息;
  3. “人”与“模型”都通过事件驱动来协作;
 
 

拟人化建模沟通法

 
基于上面的推导,我们可以把一个个“模型”看作是一个个人的名字,那么在我们沟通时,就会可以用拟人化的方式来表达业务流程,表达模型的职责,表达模型身上需要携带哪些信息,表达命令与事件:
 
  1. 当“支付单”支付成功的时候,“订单”得把自己的支付状态设置成已支付;
  2. 当“用户”注册成功的时候,得向“用户积分账户”里发5个积分;
  3. “商品列表”要展示“商品信息”和“销售统计”的综合信息,还得支持各种纬度的搜索,性能还得跟得上;
 
通过拟人化的方式,我们可以在业务人员、产品经理、技术人员的大脑中构建比较一致的形象,这些形象对应着“职责”、“能力”和“边界”,从而我们可以在一个频道上推演这些“模型”的定义和分工协作,是否真的可以满足需求,至此,我们的团队获得了一个能力,就是“有效的建模沟通”,借助这个能力,我们就可以实现“需求-模型-代码”三者一致性的前半部分,即“需求-模型”的一致性:
 

 
 

后续

后续,我们会就“模型-代码”如何保持一致性展开剖析,敬请期待。
 
请关注公众号(老肖想当外语大佬)获取最新更新。
 

一种很变态但有效的DDD建模沟通方式的更多相关文章

  1. 介绍一种很棒的wince 如何替换系统声音的方法

    Topic:介绍一种很棒的wince 如何替换系统声音的方法(作者:Baiduluckyboy) //------------------------------------------------- ...

  2. 一种很有意思的数据结构:Bitmap

    昨晚遇到了一种很有意思的数据结构,Bitmap. Bitmap,准确来说是基于位的映射.其中每个元素均为布尔型(0 or 1),初始均为 false(0).位图可以动态地表示由一组无符号整数构成的集合 ...

  3. 用 Java 技术创建 RESTful Web (服务 JAX-RS:一种更为简单、可移植性更好的替代方式)

    作者: Dustin Amrhein, 软件工程师, IBM Nick Gallardo, 软件工程师, IBM 出处: http://www.ibm.com/developerworks/cn/we ...

  4. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

  5. Ckeditor一种很方便的文本编辑器

    ckeditor官网:http://ckeditor.com/ 这里介绍ckeditor的其中一个的用法,自己做小项目练手非常的适合,上手非常的快. 首先去官网下载这个东西,链接:http://pan ...

  6. mac下两种很常见的button的xib设置

    第一种,双变button.就是有两种状态的button:普通态和点击选中态. 第二种,点变button.有两种状态:普通态和mouseDown的态,mouseUp时同普通态.

  7. 【很变态】PHP类实例化对象竟然可以访问类的“静态(static)方法”!!!

    之前发现一个PHP的变态问题:PHP中静态(static)调用非静态方法详解 这次看了下 ThinkPHP 的源码 function.inc.php ,里面有个函数: /** * 取得对象实例 支持调 ...

  8. 在不开启事件循环的线程中使用QTimer(QThread::run函数自带事件循环,在构造函数里创建线程,是一种很有意思的线程用法) good

    引入 QTimer是Qt自带的定时器类,QTimer运行时是依赖于事件循环的,简单来说,在一个不开启事件循环(未调用exec() )的线程中,QTimer是无法使用的.通过分析Qt源码可发现,调用QT ...

  9. iOS 一种很方便的构造TarBar

    直接在TarBarController中操作,代码如下: #import "DLTabBarController.h" #import "ViewController.h ...

  10. 一个很变态的SQL

    select max(s.operat_time) as pzTime from ws_state_record s where s.status = (select p1.node_id from ...

随机推荐

  1. 基于Vue+OpenSeaDragon的数字细胞阅片开发

    前端框架: vue+elementui+openseadragon 后端 .net core 5.0 数据库 mysql 目前项目效果如图 在原有的基础上新增了阅片轨迹 图像调节,绘图,截图等功能. ...

  2. Kubernetes 审计(Auditing)

    目录 一.系统环境 二.前言 三.Kubernetes 审计简介 四.审计策略简介 五.启用审计 5.1 引入审计 5.2 启用审计 六.审计策略 6.1 记录审计阶段为:ResponseStarte ...

  3. 3568F-PCIe 5G通信测试手册

  4. ARM平台实现Docker容器技术

    什么是Docker? (1)Docker的架构   Docker是一个开源的应用容器引擎,让开发者可打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上, ...

  5. 复习 - es6语法

    这几天电脑有点问题,一直在弄,而且论文也逼近了也在时间弄那个 ,前面node有一个大项目,已经做完了,我现在是准备把上次复习断下的继续复习一直到这个项目,然后就开始vue了. 1. 首先是函数的一个进 ...

  6. nicegui 第一次

    from nicegui import ui from ex4nicegui.reactive import rxui from ex4nicegui import to_ref,ref_comput ...

  7. JVM(Java虚拟机)整理(二):排错调优

    前言 上一篇内容:JVM(Java虚拟机)整理(一) Java 内存模型(JMM)详解 声明:本章节转载自 Info 上 深入理解Java内存模型.PDF文档下载 深入理解Java内存模型[程晓明] ...

  8. Solo 开发者周刊 (第9期):Dawwin首位人工智能编程师或将改变未来?

    这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 好文推荐 Daw ...

  9. git将某个开发分支最近的提交合并成一个提交

    你可以使用 `git merge --squash` 命令将某个开发分支最近的提交合并成一个提交. 具体步骤如下: 1. 切换到你想要合并的分支上,比如 `develop` 分支: `git chec ...

  10. git fetch origin

    可以运行 git fetch origin 来同步远程服务器上的数据到本地.该命令首先找到 origin 是哪个服务器(本例为 git.ourcompany.com),从上面获取你尚未拥有的数据,更新 ...