红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

如何坚持 TDD:使用者出现的问题以及解决方案

  • 2009-02-03
  • 本文字数:3266 字

    阅读完需:约 11 分钟

我们组织里曾有许多团队努力采用测试驱动开发(TDD)[1]。偶尔会有一两个开发者成功,但是大多数都失败了。为了更好地找出原因,我调查了团队 的一些成员,发现即使经过了课堂培训,还有更多的事情需要做。虽然这里介绍的问题和想法只适用于中大型的公司,但理解这一点能够帮我们在组织中更好地引入 TDD。

我对组员(他们全都接受过培训)的调查显示,以下问题影响了他们:

  • 由于经验不足,大家发现自己直接 TDD 比较困难。
  • TDD 培训的例子比实际应用简单得多。
  • 需要更多的时间来实验和尝试,不要有赶紧发布软件的压力。
  • 实际中应用的语言,比如 Visual Basic 和 JavaScript,在单元测试文档或者课堂练习中从来不会用到。
  • 常常会碰到很多遗留代码,而培训时不会介绍如何改进这些代码。
  • 永远没有足够的时间用来学习──随时都有尽早交付产品的(人为的)压力,于是没有时间学习提高自己。

隐藏的问题

我们已经列举了这么多症状,那么冰山下面隐藏的问题是什么呢?

测试驱动开发并不是很难学。学习阶段(指形成根深蒂固的习惯的这段时间)一般会持续 2 到 4 个月,期间生产效率有所降低 [2]。最终的好处显而易见,开发者也能自己保持该项技术,但问题是:怎么才能做到这样?很多开发者仅仅几天之后就放弃了。

就我见过的方法而言,大多数依赖于课堂培训(或者e-learning)和一对一的辅导。如果做得好的话,这些方法当然不错,可以作为整个解决方案的一部分,但是我认为还需要更多的方法。

课程培训有两个主要的问题:例子太简单,与实际问题关系不大;给大家练习的机会不多。

在线培训( Object Mentor Industrial Logic ,以及其它机构提供的培训),其优点是更有深度。然而练习的机会仍然不多。而且在这些课程里,你与其他学生通常没有交互。听一听你同学和同事的问题,能够加深你的理解。

一对一的辅导只能用于团队中的几个人,很难推而广之。在大型企业里面,专家只有几个,而需要帮助的人有成千上万,所以一对一的辅导更是困难。

看书是个很好的方法,但是很少有开发者喜欢通过读书学习 TDD 技术,即使有些人发现看书可以缓慢提高其 TDD 水平。与其它在线教程类似,看书仍然是只能一个人学习。

最后:遗留代码使得 TDD 难上加难。开发者当然会问这样的问题:“这些对象紧密耦合,怎样才能测试它们?这些代码太复杂了,怎样才能测试这个算法?”

一个解决方法

那怎样才是好的解决办法呢?前面的方法主要有两个问题:没有深度、缺乏协作。一个完整的解决方案需要结合使用多种学习模式,并需要包含以下多种因素。

  • 课堂培训——开发者需要对 TDD 有个基本的理解,对多数人来说,课堂培训仍然是最好的方法。但是需要知道的是,培训本身并不能让人学会并使用 TDD。

  • 在线培训——这有助于加深基本概念的了解。但在所有这些方法中,这一种是可选的。

  • 耐心——学习并使用 TDD 需要花费一定的时间,这个时间可能比你计划的更多一些。

  • 衡量测试覆盖率——使用代码覆盖工具(比如 Emma Cobetura NCover …)并向组员说明,衡量覆盖率可以让我们知道是否变得好些了,还是变得更糟了。很明显,这没法衡量测试的质量,因此只能用作参考。

  • 内心感到自豪——开发人员需要知道什么样的代码和测试才是简单的、干净的,并需要感到花时间那么做是值得的。Bob Martin 刚刚写了一本新书《 Clean Code 》,很好地回答了这个问题。

  • 管理层的支持—— 开发人员需要管理层明确表态,说他们知道转向 TDD 会花费一定时间,并会“降低”团队效率 [3]。他们需要澄清相对于产出速度和不断累积的技术债,他们更 看中的是质量。当不断地生产、生产、生产时,多数开发人员会有压力,所以管理层需要不止一次地重复这句话。说这句话的人等级越高(最好是来自最高层的执行 官),就会有越多的人去听。

  • 结对编程——如果你发现自己停滞不前、不知道下一步该做什么,与别人一块编程通常会有所帮助,即使他是个新手,也会使你受益颇多。

  • 社区——在你的组织里(或者城市里)组建社区,大家互相分享经验。社区可以让你与其他正在学习使用 TDD 的人通过网络保持联系,可以让大家互相学习成功的经验和失败的教训,社区还能够培养 TDD 需要的文化。此外,社区提供了一个机会,让大家能够分享新的想法。

  • 编程道场——是大家在一块练习解决小问题的地方。编程道场提供了一个安全、协作的环境,让大家作为团队一块研究问题,而没必要真正解决这些问题。

  • 阅读工坊—— 一组人(不超过 8 个人)定期聚在一起,讨论书中的某一章节。

  • 教练定期走访——当团队偏离轨道、终止实践 TDD 时,教练的定期走访能够帮助团队重回正轨。这时与一两个人配对编程,就能够重新感染整个团队。

这一计划的核心是:针对 TDD 创造交流机会、促进互相协作。以上方法中有 3 个是关注这一方面的:结对编程、编程道场和阅读工坊。

编程道场

编码道场(使用自由方式)指的是这样一种活动,一小组人(最多15 个人)采用TDD 一块解决问题(下述内容来自 Danilo Sato ):

  • 在一个电脑上工作,通过投影让所有人看到输出结果。
  • 采用配对编程的方式。
  • 配对中的一个人每 5 到 10 分钟交换(我们用的是 7 分钟,效果不错)。
  • 编码的人要解释他们正在干的事情,这样观众才能明白他们在干什么。
  • 只有当测试通过时观众才能够对设计给出评论,而测试失败时观众不能提问题。
  • 如果观众被搞糊涂了,编码的人应该停下来解释他们在干什么。

根据经验,我建议初次尝试要选择一个很小的问题。

阅读工坊

对阅读工坊来说,有很多好书可以选择:

典型情况下,团队在一次会议上可以讨论一章或者两章的内容。节奏一定要慢,让大家能够在业余时间读完相关内容,而不是变成了负担。除此之外,要留够充足的时间,让大家对文中的一些条目做深入地探讨。

一块学习的好处

这两个工坊都需要提供皮萨(或者一顿健康午餐)──因为你要求大家在私人时间做工作相关的事情,所以要给他们适当的鼓励。这两个工坊可以每数周进行轮换,以防大家觉得陷入太深。最后,不要指望每个会议上人员都是相同的。

与以自己为导向的学习相比,工作坊和社区是个很大的提高,因为组员致力于交流和协作。其结果是我们能够学到一些根本想不到的事情。

坚持 TDD

总结说来,要想成功采用 TDD,下面几点是关键:

  • 耐心、实践、深度
  • 管理层的支持
  • 采用多种方法
  • 开发者帮助开发者

某大型公司已经使用这种方法,着力提高 TDD 在其公司内的使用情况。

非常感谢 Lasse Koskela、Nat Pryce、Dave Nicolette 和 Dave Rooney 花费时间审阅本稿。

注意

[1] 本文中,TDD 是指编码前首先编写测试用例,并采用增量的方法逐渐完成功能。而不是先写完代码,然后再生成大量的单元测试用例。

[2] http://tech.groups.yahoo.com/group/testdrivendevelopment/message/29461

[3] 能够感觉到生产效率会有所降低──比如,一个迭代中交付的故事数量会减少。然而由于一开始就能提高质量,所以这里说的降低并不像看上去那样会真正地降低效率。

作者简介

Mark Levison Mark Levison是 Pure Agile Consulting 公司的首席咨询师,该公司关注于敏捷和精益,致力于帮助客户每两个星期交付软件。从 2001 年起 Mark 就是一个敏捷实践者,曾在一个小团队内引入敏捷实践。过去三年中,作为一个大型独立软件开发商的雇员,他负责在组织里引入 Scrum,并指导了多个团队 - 其内容包括设计 TDD 的策略,并引入了很多实践支持它。Mark 是 InfoQ 敏捷社区的编辑,并且撰写了数十篇敏捷方面的文章。他还有一个 blog: Notes from a Tool User 。业余时间,Mark 与他的妻子和两个女儿一起享受天伦之乐。

阅读英文原文 Making TDD Stick: Problems and Solutions for Adopters


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2009-02-03 02:116492
用户头像

发布了 37 篇内容, 共 10.9 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

内含(基础+进阶+高级+调优)的神仙级的阿里巴巴“MySQL”教程限时开源!

Java 架构 面试 程序人生 编程语言

GraphQL 快速入门【4】GraphQL 组件

码语者

Rest graphql

DCEP:真正的“无现金新时代”!现已完成技术对接!

CECBC

顺丰对供应链+区块链应用的思考与规划

CECBC

太有用,Alibaba架构师十年心血熬成的435网络协议文档

程序员 编程语言 网络协议 TCP/IP

《数据安全法》实施后,企业如何依法进行数据安全加固及创新

星环科技

数据安全 数据安全法

夸克APP端智能:文档关键点检测实践与应用

阿里巴巴终端技术

算法 移动开发 客户端 端智能

百度智能云全面升级金融AI中台解决方案, 打造软硬一体AI开发全栈能力

百度大脑

人工智能 金融

小程序下一破局点?钉钉小程序卡片,应用与平台的深度集成

阿里巴巴终端技术

小程序 ios android App 移动开发

物超所值!5.7w字在GitHub标星120K的Java面试知识点总结

Java 架构 面试 程序人生 编程语言

企业如何通过图数据库及知识图谱形成业务壁垒

星环科技

开发上云,化繁为简 | CIF 论坛精彩看点

CODING DevOps

腾讯云 DevOps 云原生 云开发 CIF

云拨测助力节卡机器人 全面优化海外网站性能

阿里巴巴云原生

阿里云 云原生 拨测 成功案例

如何处理各种「陨石开发」的紧急要求?

LigaAI

敏捷开发

想要入职阿里P8?至少是要啃完这本500页Java并发多线程源码笔记!

Java 架构 面试 程序人生 编程语言

2022前端react高频面试题

buchila11

React

常用的 分布式事务 都有哪些?我该用哪个?

Java 程序员 面试 后端 计算机

财经大课:从效率公平看“共同富裕”

石云升

学习笔记 9月日更 共同富裕

后端选择 java, 还是 python?

cdhqyj

不愧是阿里高工出产的《Java面试手册》,实战命中率竟高达“80%”

Java 架构 面试 后端

低代码的自动化工作流靠谱吗?对企业有何帮助?

优秀

自动化 低代码

十大算法

wudaxue

第6章-《Linux一学就会》- Centos8 用户管理

学神来啦

Linux 运维 linux学习 linux云计算

AI技术在漫画阅读体验上的应用

快看工程技术中心

深度学习 AI 漫画

当支付宝 App 遇见 AndroidX......

阿里巴巴终端技术

android App 移动端 AndroidX

大模型时代的AI之变与开发之根

脑极体

列举出常见的Java面试题100+,我靠这个在十月拿到了阿里的offer

Java 程序员 编程语言

未来5年,虚拟化5个非常有前景的就业方向

hanaper

这份阿里P8手写的JDK发展史源码剖析手册,竟获GitHub热门榜第一

Java 架构 面试 程序人生 编程语言

技术干货 | Native 页面下如何实现导航栏的定制化开发?

蚂蚁集团移动开发平台 mPaaS

大前端 H5 移动开发 mPaaS

大数据presto作业

Clarke

如何坚持TDD:使用者出现的问题以及解决方案_研发效能_Mark Levison_InfoQ精选文章