如何运用DDD解决团队协作与沟通问题?

领域驱动设计的核心是“领域”,因此要运用领域驱动设计,从一开始就要让团队走到正确的点上。当我们组建好了团队之后,应该从哪里开始?不是UI原型设计,不是架构设计,不是设计数据库,这些事情重要却非最高优先级。试想,项目已经启动,团队却并不了解整个系统的目标和范围,未对系统的领域需求达成共识,那么项目开发的航向会否随着时间推移而逐渐偏离?用正确的方法做正确的事情,运用领域驱动设计,就是要先识别问题域,进而为团队提炼达成共识的领域知识。

要做到这一点,就离不开团队各个角色的沟通与协作。客户的需求不是从一开始就生长在那里,如同在茫茫森林中的一棵树木,等待我们的眼睛去“发现”它。相反,需求可能只是一粒种子,需要土壤、阳光与水分,在人们的精心呵护与培植下才能长成。因此,我们无法“发现”需求,而是要和客户一起“培育”需求,并在这个培育过程中逐渐成熟。


达成共识


“培育”需求的过程需要双向的沟通、反馈,更要达成对领域知识理解的共识。原始的需求是“哈姆雷特”,每个人心中都有一个“哈姆雷特”,如果没有正确的沟通与交流方式,团队达成的所谓“需求一致”不过是一种假象罢了。

由于每个人获得的信息不同,知识背景不同,又因为角色不同导致设想的上下文也不相同,诸多的不同使得我们在对话交流中好似被蒙了双眼的盲人,我们共同捕捉的需求就好似一头大象,各自只获得局部的知识,却自以为掌控了全局:


640?wx_fmt=jpeg


或许有人会认为客户提出的需求就应该是全部,我们只需理解客户的需求,然后积极响应这些需求即可。传统的开发合作模式更妄图以合同的形式约定需求知识,要求甲乙双方在一份沉甸甸的需求规格说明书上签字画押,如此即可约定需求内容和边界。一旦发生超出该文档边界的变更,就需要将变更申请提交到需求变更委员会进行评审。这种方式从一开始就站不住脚,因为我们对客户需求的理解,存在三个方向的偏差:


  • 我们从客户处了解到的需求,并非最终用户的需求

  • 若无有效的沟通方式,需求的理解偏差会导致结果大相径庭

  • 理解到的需求并没有揭示完整的领域知识,导致领域建模与设计出现认知障碍

    Jeff Patton 在《用户故事地图》中给出了一副漫画来描述共识达成的问题。我在 ThoughtWorks 给客户开展 Inception 活动时,也使用了这幅漫画:


640?wx_fmt=jpeg


这幅漫画形象地表现了如何通过可视化的交流形式逐渐在多个角色之间达成共识的过程。正如前面所述,在团队交流中,每个人都可能成为“盲人摸象的演员”。怎么避免认知偏差?很简单,就是要用可视化的方式表现出来,例如绘图、使用便签、编写用户故事或测试用例,都是重要的辅助手段。后面我会结合着领域场景分析来讲解这些提炼领域知识的手段。

可视化形式的交流可以让不同角色看到需求之间的差异。一旦明确了这些差异,就可以利用各自掌握的知识互补不足去掉有余,最终得到大家都一致认可的需求,形成统一的认知模型。


团队协作


在软件开发的不同阶段,团队协作的方式与目标并不相同。在项目的先启(Inception)阶段,团队成员对整个项目的需求完全一无所知,此时与客户或领域专家的沟通,应主要专注于宏观层面的领域知识,例如系统愿景和目标、系统边界与范围、还有主要的需求功能与核心业务流程。在管理层面,还需要在先启阶段确定团队与利益相关人(包括客户与领域专家)的沟通方式。


先启阶段


在敏捷开发过程中,我们非常重视在项目之初开展的先启阶段,尤其是有客户参与的先启阶段,是最好的了解领域知识的方法。如果团队采用领域驱动设计,就可以在先启阶段运用战略设计,建立初步的统一语言,在识别出主要的史诗级故事与主要用户故事之后,进而识别出限界上下文,并建立系统的逻辑架构与物理架构。

在先启阶段,与提炼领域知识相关的活动如下图所示:


640?wx_fmt=jpeg


上图列出的七项活动存在明显的先后顺序。首先我们需要确定项目的利益相关人,并通过和这些利益相关人的沟通,确定系统的业务期望与愿景。在期望与愿景的核心目标指导下,团队与客户才可能就问题域达成共同理解。这时,我们需要确定项目的当前状态与未来状态,从而确定项目的业务范围。之后,我们就可以对需求进行分解。在先启阶段,对需求的分析不宜过细,因此需求分解可以从史诗级(Epic)到主故事级(Master)进行逐层划分,并最终在业务范围内确定迭代开发需要的主故事列表。


迭代开发阶段


在迭代开发阶段,针对迭代生命周期和用户故事生命周期可以开展不同形式的沟通与协作。在这个过程中,所有沟通协作的关键点如下图所示:


640?wx_fmt=jpeg


迭代生命周期是针对迭代目标与范围进行需求分析与沟通的过程。团队首先要了解本次迭代的目标,对迭代中的每个任务要建立基本的领域知识理解。在迭代开发过程中,我们可以借鉴 Scrum 敏捷管理过程。

Scrum 要求团队在迭代开始之前召开计划会议,由产品负责人(Product Owner)在会议中向团队成员介绍和解释该迭代需要完成的用户故事,包括用户故事的业务逻辑与验收标准。团队成员对用户故事有任何不解或困惑,都可以通过这个会议进行沟通,初步达成领域知识的共识。每天的站立会议要求产品负责人参与,这就使得开发过程中可能出现的需求理解问题能够及时得到解答。Scrum Master 则通过每天的站立会议了解当前的迭代进度,并与产品负责人一起基于当前进度和迭代目标确定是否需要调整需求的优先级。


迭代结束后,团队需要召开迭代演示会议。除了开发团队之外,该会议还可以邀请客户、最终用户以及领域专家参与,由团队的测试人员演示当前迭代已经完成的功能。这种产品演示的方法更容易消除用户、客户、领域专家、产品负责人与团队在需求沟通与理解上的偏差。由于迭代周期往往较短,即使发现了因为需求理解不一致导致的功能实现偏差,也能够做到及时纠偏,从而能够将需求问题扼杀于摇篮之中。

每一个功能的实现,每一行代码的编写都是围绕着用户故事开展的,它是构成领域知识的最基本单元。用户故事指导着开发人员的开发、测试人员的测试,其质量会直接影响领域驱动设计的质量。

敏捷方法非常重视发生在用户故事生命周期中的各个关键节点。对于用户故事的编写,敏捷开发实践强调业务分析人员与测试人员共同编写验收测试的自动化测试脚本,这在《实例化需求》一书中被称之为“活文档(Living Document)”。测试人员与需求分析人员的合作,可以为需求分析提供更多观察视角,尤其是异常场景的识别与验收标准的确认。

当用户故事从需求分析人员传递给开发人员时,不管这个用户故事的描述是多么的准确和详细,都有可能导致知识流失。因此,在开发人员领取了用户故事,并充分理解了用户故事描述的需求后,不要急匆匆地就开始编码实现,而是建议将需求分析人员与测试人员叫过来,大家一起做一个极短时间的沟通与确认。我们称这一活动为“kick off”。这种方式实际就是对“盲人摸象”问题的一种应对。在这个沟通过程中,开发人员应尽可能多问需求分析人员“为什么”,以探索用户故事带来的价值。只有如此,开发人员才能更好地理解业务逻辑与业务规则。同时,开发人员还要与测试人员再三确认验收标准,形成一种事实上的需求规约。

当开发完成后,是否就意味着我们可以将实现的故事卡移交给测试呢?虽然通过迭代开发以及建立特性团队已经大大地拉近了开发人员与测试人员的距离,缩短了需求从开发到测试的周期。但我们认为,有价值的沟通与交流怎么强调都不过分!磨刀不误砍柴工。我们认为从开发完成到测试开始也是一个关键节点,建议在这个关键节点再进行一次交流活动,即在开发环境下,由开发人员向需求分析人员与测试人员“实地”演示刚刚完成的功能,并对照着验收标准进行验收。我们称这个过程为“desk check”,是一个快速迷你的功能演示,目的是快速反馈,也减少了任务卡在开发与测试之间频繁切换的沟通成本。

通过 desk check 的用户故事卡才会被移动到“待测试”。不必等到迭代结束,更不必等到版本发布,只要开发人员完成了用户故事,测试人员就应该在迭代周期内进行测试。未经过测试的用户故事其交付价值为0,可以认为这张用户故事卡没有完成。这也是大多数敏捷实践对所谓“完成(Done)”的定义。无数研究与实践也证明了,修改 Bug 的成本会随着时间的推移而增加,如果在开发完成后即刻对其进行测试,一旦发现了 Bug,开发人员就能够快速响应,降低修改 Bug 的成本。当然,测试的过程同样是沟通与交流的过程,是最有效的需求验证和质量保障手段。

敏捷思想强调个体和团队的协作与沟通,强调快速反馈与及时响应。前面探讨的这些敏捷实践都是行之有效的沟通机制和交流手段,可以帮助团队对需求的理解更加全面更加准确。只有频繁的沟通,才能就业务需求达成整个团队的共识;只有良好的协作,才能有助于大家一起提炼领域知识,建立统一语言;只有快速反馈,才能尽可能保证领域模型与程序实现的一致。这些都是实践领域驱动设计的基本前提。


以上文章节选自我在 GitChat 平台独家发布的 DDD 系列精品课上篇:《领域驱动战略设计实践》,本课程限时特价39元,共计34篇,形式为“图文+音频”;特价时间为即日起到 7月30日 。订购本课程还可在 GitChat 读者圈与我交流互动,欢迎所有热爱 DDD 的朋友一起交流学习!


张逸的达人课:https://link.zhihu.com/?target=https%3A//gitbook.cn/gitchat/column/5b3235082ab5224deb750e02

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务等于Spring Cloud?一文告诉你微服务到底是什么

作者:TIM XU 原文:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/1微服务初探什么是微服务?首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应…

我们爬了上千个数据分析师信息, 你真的懂数据分析师嘛?

01 项目简介有人说,这个时代,只要站在了风口,猪都能飞起来,尤其互联网行业,千变万化,日异月殊,一不小心就错过了风口,如果没记错的话,前几年火的是App开发,后…

高可用Redis服务架构分析与搭建

作者:HorstXu 原文:https://www.cnblogs.com/xuning/p/8464625.html基于内存的Redis应该是目前各种Web开发业务中最为常用的Key-Value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热…

java怎么弄redis,java怎么使用redis

开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装 Java redis 驱动:首先你需要下载驱动包 下载 jedis.ja…

我花了14个小时找了一下长春长生们究竟卖到了哪里去

前言本文首发于个人的公众号和v2ex,事先也没想到会有这么多人关注。在这边重新编辑一下,去掉了原先前言中对此次疫苗事件背景的描述及部分不严谨的措辞。全文的观点从技术讨论出发,尽量客观中立,观点及行为为员工自发,…

我们分析了50万条拼多多商品数据,告诉你到底是消费升级还是降级?

作者:放开那个猕猴桃来源:人工智能与大数据生活转自:知乎,恋习Python一、缘起我在杭州有位朋友,提到有家做社交的电商很火,叫拼多多,我没有在意,直到有一天,我居然在电视…

java并发集合面试题,那些经常被问的JAVA面试题(1)—— 集合部分

【本文转自极客原创 作者:张锋 原文链接:】Java集合框架是什么?说出一些集合框架的优点?每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用&…

拯救阿波罗14号!那些伟大太空计划背后的计算机工程师们

1971年1月31日,阿波罗14号发射。外太空旅行近一周后的凌晨,回程中的阿波罗14号突然面临一个严峻的问题:它可能没办法正常降落了。问题出在其计算机工程师Don Eyles编写的一个应急程序上,他必须在很短的时…

golang web php,golang 适合做web开发吗

使用go语言来做web开发,是非常方便的。如果不使用框架,仅仅使用net/http包,也能快速开发一个web应用。但是,官方包不支持RESTful风格的API,所以我们依然还是需要选择一个框架来帮助我们进行开发。 (推荐学习&#xff1…

我又花了28个小时分析了一下各省二类疫苗采购公示数据

1前 言距离《我花了14个小时找了一下长春长生们究竟卖到了哪里去》发出来已经过去了4天,过去的几天里,每天晚上我都在搜集和整理数据,终于把之前没做完的工作做的差不多了。现在做一个大致的总结,分析相对粗略,大家见…

[重磅] 如何更好地实现服务调用和消息推送

第四届阿里中间件性能挑战赛是由阿里巴巴集团发起,阿里巴巴中间(Aliware)、阿里云天池联合举办,是集团少有的工程性品牌赛事。大赛的初衷是为热爱技术的年轻人提供一个挑战世界级技术问题的舞台,希望选手在追求性能极致的同时,能深…

开发怼产品,天经地义?大惊小怪?

最近,又有一件轰动程序员界的事情发生了,想必大家伙都已经奔走相告了。来回顾下事情的经过,1张图就能说明白了骚不?反正有句话叫「从技术层面出发,总归有办法实现的」,还有这么一句话叫「从技术角度出发&am…

php实现数据排序算法,PHP实现排序堆排序算法

这篇文章主要为大家详细介绍了PHP实现排序堆排序(Heap Sort)算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下算法引进:在这里我直接引用《大话数据结构》里面的开头:在前面讲到 简单选择排序 ,它在待排序的 n 个…

谷歌Edge TPU:将机器学习引入边缘,撬动边缘计算/IOT大“地球”

近期,谷歌在Cloud Next会议上推出其最新产品,Edge TPU芯片和Cloud IOT Edge软件,并将于10月推出Edge TPU开发套件。作为Cloud TPU的补充,目前Edge TPU仅用于推理,专为在边缘运行TensorFlow Lite ML模型而设计。Edge TP…

详解云计算、大数据和人工智能的区别与联系

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系:一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

关于腾讯云丢数据事件的一些看法

事件回顾:创业公司“前沿数控”8月5日发文称,公司存放在腾讯云上的精准注册用户以及内容数据全部丢失,并且不能恢复,造成公司平台全部停运的状态。前沿数控表示,公司丢失的数据近千万元级,对此索赔1000余万…

Navicat for mysql备份与恢复

文章目录 一、Navicat for mysql备份1.打开navicat,找到备份2.点击新建备份,直接点备份3.备份完成 二、恢复数据1.删除表2.点击备份,选中备份文件,点击还原备份3.还原完成 三、其他命令四、视频演示总结 一、Navicat for mysql备份…

一文详解微服务架构的数据设计

微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务这些方面。本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方,旨在帮助大家在构建微服务架构时,提供一个数据方面的视角:什…

干货 | 数据分析的 7 个关键步骤是什么?

“数据科学家” 这个名号总让人联想到一个孤独的天才独自工作,将深奥的公式应用于大量的数据,从而探索出有用的见解。但这仅仅是数据分析过程中的一步。数据分析本身不是目标,目标是使企业能够做出更好的决策。数据科学家构建出的产品&#x…

Python 爬取了马蜂窝的出行数据,告诉你这个夏天哪里最值得去!

文章由数据森麟出品作者徐麟正值火辣的暑假,朋友圈已经被大家的旅行足迹刷屏了,真的十分惊叹于那些把全国所有省基本走遍的朋友们。与此同时,也就萌生了写篇旅行相关的内容,本次数据来源于一个对于爬虫十分友好的旅行攻略类网站&a…