最近在拜读郑晔的10x程序员工作法,收益良多,文中提出一个概念叫DoD(Definition of Done)给我的感触颇深。这让我联想到实际工作过程中,经常遇到的扯皮、争吵等各种场景,其实就和这个DoD分不开。

一、场景描述

  郑晔在文中描述了这样一种现象,相信有开发经历的人多少有同感:

老张:这有一个任务需要完成,你看一下。
小李:这个不难,两天就能做完,两天以后就能上线。

  两天以后,老张又来到小李的身边验收工作:

老张:怎么样,做完了吗?今天能上线吗?
小李:我的代码写完了。
老张:测试人员测过了吗?
小李:还没有。
老张:那今天能测完吗?
小李:那我就不知道了。
老张:什么?我可是答应了业务的人,今天一定要上线的!

  两天以后,老张又来检查工作。

老张:这个功能开发完了吗?
小李:写完了,你看我给你演示一下。

  小李熟练地演示了这个新写好的功能,这次老张很满意:

老张:做得不错。单元测试都写了吧?
小李:啊?还要写单元测试吗?
老张:要不为啥给你两天的时间?

  很明显,老张有些愤怒,貌似总在挑刺,而小李也没有偷懒、有些委屈。于是,老张、小李和测试人员一起度过了一个不眠之夜。

二、理解的代沟

  根据上面的场景,我画了两幅小李和老张的思考图,看下两者的代沟在哪儿,如下图所示。

  很显然两者对完成的定义各不相同。对开发人员小李来说,完成容易理解为编码完成;而不去考虑代码测试和线上测试;对技术主管老张来说,完成的理解可能会更多一些,包括编码,测试,代码规范,审查,上线等等,有些老张脑子里的东西更多,比如下图所示:

  为什么会有上面的差异?从立场来看,小李汇报的对象只有老张,而老张要协作的对象可能有产品经理、老板、总监、小李们。小李是从个人层面,关注的是一个点,老张是从团队层面,关注的是一个面。

  各自定义差可能反应了一个信号,就是团队成员整体上缺乏职业素养,那么这个团队就危险了。从小李的角度无论怎么努力,都不可能满足老张的需求,从老张的角度总觉得小李偷懒,导致团队之间老是摩擦、挑刺,最后小李干的不爽了,老张也觉得小李孺子不可教,最后事没有做好,人跑了。

  接下来就要回到作者提出的DoD概念(完成的定义),从这个概念的名字便不难看出,它就是为了解决软件开发中常见的“完成”问题而生的。

三、完成的定义

  这里的DoD在郑晔看来包含三个层次的含义:

  • DoD 是一个清单,清单是由一个个的检查项组成的。
  • DoD 的检查项应该是实际可检查的。
  • DoD 是团队成员间彼此汇报的一种机制。

  借助这三个含义,我模拟登录功能列了表格:

  以上是站在测试用例的角度来写,一个简单的登录就可以包含18个开发功能点,做好登录并没有那么简单,这也就难怪小李和老张总是意见不一致。如果摊开这份清单用来验收登录功能的完整性,我相信小李和老张彼此都不会有什么意见。

  但是这里有一个问题,就是老张根本不会去做这份清单!小李也没有这种意识,那谁来拟定?也许你会说引入中间层,就是测试人员来拟定,假设你们团队没有测试人员呢?

  事情总是没有表面看起来的那么简单。这里再设计一份简化的验收清单

  如此简化的功能也能多少避免小李和老张的鸿沟了吧?那么又回到前面的问题,谁来制作这份清单?

  我个人的意见是小李来做,因为小李的势能没有老张高,那就多增加自己的动能了,显示自己做事的能力,同时也做一个同事眼中的好伙伴,领导眼中的好同事。等小李变成老李了,遇到小张也是小张来做这事。

四、DoD是一种思维方式

  郑晔在最后又补充道:

至此,我们只是从软件开发团队内部协作的角度来谈 DoD。但实际上,它不仅局限在团队内部协作上,如果你可以放开思路,会发现 DoD 的思维在工作中用途非常广泛。比如,当我们需要和其他团队合作开发一个接口时,我们都知道第一步就是要把接口定义下来。

  这里的DoD看起来很完美,定义了验收清单,罗列了一系列验收项目,并固化成文档。但是,过程中有几个焦油坑需要去思考:

  • 如何才能符合“可验收”?
  • 彼此都无法想到的风险如何管理?

  也许这需要团队的磨合了,从老张角度如果这事不会死人,其实没有必要去咄咄逼人,大不了后续进行迭代改进,否则逼得紧其实只会引起反弹,养成小李习惯性的逃避责任,形成团队推卸责任的文化就得不偿失了。

  当我们有了DoD的思维方式,后面的事情也许会变得简单很多,郑晔举了个小例子让人折服:

1.经常会有人过来,让我帮忙做些事。运用 DoD 的思维,我首先会问他我具体要做哪些事,确认好细节(相当于定义好“检查项”),然后我就知道,这个忙我能帮到什么程度。
2.我请别人帮忙的时候,也会很清楚告诉他,哪些事是需要他做的,尽量减少不必要的误解。

五、总结

  人与人的协作,总会存在理解上的偏差,如何去解决信息不同步的问题呢?DoD是一种最佳实践,它是包含了检查项的验收清单,而如何做到“可检查”需要双方重点沟通。DoD从大了看是一种思维模式,是一种尽可能消除不确定性,达成共识的方式。

借用郑晔的一句话:“如果今天的内容你只能记住一件事,那请记住:在做任何事之前,先定义完成的标准。”

 

如何定义开发完成?(Definition of Done)的更多相关文章

  1. CREATE TABLE——数据定义语言 (Data Definition Language, DDL)

    Sql语句分为三大类: 数据定义语言,负责创建,修改,删除表,索引和视图等对象: 数据操作语言,负责数据库中数据的插入,查询,删除等操作: 数据控制语言,用来授予和撤销用户权限. 数据定义语言 (Da ...

  2. 研发流程 接口定义&开发&前后端联调 线上日志观察 模型变动

    阿里等大厂的研发流程,进去前先了解一下_我们一起进大厂 - SegmentFault 思否 https://segmentfault.com/a/1190000021831640 接口定义 测试用例评 ...

  3. PythonStudy——函数嵌套定义 Function nesting definition

    # 在一个函数内部定义另一个函数 # 函数对象(变量)与普通对象(变量)一样,在函数内部定义,随函数调用而产生, # 调用结束而销毁,所以只能在函数内部调用 def outer(): print('o ...

  4. 信贷风控模型开发----模型流程&好坏样本定义

    第二章 模型开发流程&好坏样本定义 2.1模型开发流程 2.1.1 评分模型流程图 2.1.2流程图阐述 该小结提出了一些数据指标,如果不明白没有关系,往后的文章笔者会一个个地解释这些指标的含 ...

  5. Java开发学习(十)----基于注解开发定义bean 已完成

    一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies>    <dependency>        < ...

  6. [SAP ABAP开发技术总结]面向对象OO

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. C++-函数模板特化如何避免重复定义

     我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...

  8. C#定义类成员

    1.成员定义 public--成员可以由任何代码访问. private--成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字). internal--成员只能由定义它的程序集(项目 ...

  9. Google开发规范

    v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件   ...

随机推荐

  1. leetCode刷题(使用链表做加法)

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = ...

  2. 使用input file上传文件中onChange事件只触发一次问题

    每次上传文件的时候,都会将当前的文件路径保存至$event.target.value中,当第二次选择文件时,由于两次$event.target.value相同,所以不会触发change事件. 解决方案 ...

  3. SSM-SpringMVC-16:SpringMVC中小论注解式开发之访问方式篇

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 访问方式可以指定,打个比方,你通过get方式进入登陆页面,通过post发送ajax数据库校验或者post提交 ...

  4. python3中使用builtwith的方法(很详细)

    1. 首先通过pip install builtwith安装builtwith C:\Users\Administrator>pip install builtwith Collecting b ...

  5. centos6.9 升级内核版本

    想在centos6.9上安装docket,不过因为内核版本是2.6的故而想升级到最新的内核版本 晚上有编译升级的比较麻烦,不过有助于理解内核升级,我使用的直接升级到最新版方法 1. 导入public ...

  6. XSS(笔记1)

    概念 跨站脚本(Cross-Site Scripting,XSS) 发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生.为 ...

  7. 最短寻道优先算法----SSTF算法

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短 java代码实现如下: import java.ut ...

  8. 手机端实现fullPage——全屏滚动效果

    封装了一个小插件模拟fullPage的全屏滚动效果,比较简单. 特点: 1.  纯js实现,小巧轻便. 2.  兼容性好.苹果.安卓都没问题,暂时没遇到问题机型. 缺点: 1.  仅封装了基础功能,H ...

  9. 【转载】JavaScript基础知识体系

    前言 最近总是有一种感觉,对于知识没有积淀,很多时候都是忘记了哪里就去查一下,比如JS这种语言,很是浪费时间,如果能够把这些知识形成知识体系塞进大脑,做到即用即取就好了,那么就可以借助思维导图来帮助我 ...

  10. infolite(中文检索系统)~爬虫利器

    infolite 今天为大家分享一个爬虫利器-infolite.这是一个chrome浏览器的插件,如果你在写爬虫的时候对复杂繁琐的控件路径分析是深恶痛绝.那么infolite绝对是你最好的选择. 安装 ...