写点什么

如何坚持 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:116707
用户头像

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

关注

评论

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

经济下行趋势明显,Android开发者出路在哪?7成Android开发者月薪不足6千

android 程序员 移动开发

网易被裁后,68天吃透这份阿里学长甩我的Android面试笔记,竟让我收到字节跳动和小米offer

android 程序员 移动开发

耗时118天爆肝【1296页】的“Android高级开发面试题

android 程序员 移动开发

腾讯校招被问Android网络相关面试题,精编参考解析全整理,你不看看吗?

android 程序员 移动开发

脑瓜子嗡嗡的。。Android-UI-线程更新UI也会崩溃?

android 程序员 移动开发

腾讯一面被拒含泪离开,面试官:Android开发连这些都不懂,哭也没用

android 程序员 移动开发

【架构实战营作业】模块七——王者荣耀商城异地多活架构

聆息

继承的基本使用

android 程序员 移动开发

老板答应给我升职得前夕,34岁的我被优化了?3个月沉淀后迎来转折入职字节跳动!

android 程序员 移动开发

耗时118天爆肝【1296页】的“Android高级开发面试题(1)

android 程序员 移动开发

自定义View

android 程序员 移动开发

光的进化曲:电力承载网的升级之路

脑极体

给你一个全自动的屏幕适配方案(基于SW方案)!

android 程序员 移动开发

绝了,华为大神耗费5个月21天,打造这份714页PDF的鸿蒙学习笔记,2020终于火爆全网

android 程序员 移动开发

自定义View(一) Android 可计数EditText实现

android 程序员 移动开发

聊一聊 Android 中巧妙的位操作

android 程序员 移动开发

腾讯Android中高级面试题大全(含解析)

android 程序员 移动开发

你真的会打印日志?

中间件兴趣圈

Java 11月日更

自学Android,面试被怼,看我如何拿下阿里offer

android 程序员 移动开发

腾讯大牛,一篇文章教你什么是Android-Fragment-,Android高级架构师筑基必备!

android 程序员 移动开发

自定义Gradle插件的开发

android 程序员 移动开发

线程池系列 - (4)工作流程

android 程序员 移动开发

编写-Android-Library-的最佳实践-1

android 程序员 移动开发

腾讯35岁架构师提前退休,比别人早2年确定职业目标有多重要?还不学起来等着被裁吗?

android 程序员 移动开发

腾讯T3-Android高级架构师学习笔记

android 程序员 移动开发

云计算市场,是时候来一场鱿鱼游戏了

白洞计划

自定义ViewGroup实现微信朋友圈九宫格图片控件

android 程序员 移动开发

经验分享:上传视频到优酷客户端

android 程序员 移动开发

模块三作业及总结

Thomas

架构训练营

美团外卖Flutter动态化实践

android 程序员 移动开发

C++学习路线图

泰伦卢

c++

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