作者 Mark Levison译者 张晓庆 发布于 2009年2月3日 上午2时11分
我们组织里曾有许多团队努力采用测试驱动开发(TDD)[1]。偶尔会有一两个开发者成功,但是大多数都失败了。为了更好地找出原因,我调查了团队 的一些成员,发现即使经过了课堂培训,还有更多的事情需要做。虽然这里介绍的问题和想法只适用于中大型的公司,但理解这一点能够帮我们在组织中更好地引入 TDD。
我对组员(他们全都接受过培训)的调查显示,以下问题影响了他们:
我们已经列举了这么多症状,那么冰山下面隐藏的问题是什么呢?
测试驱动开发并不是很难学。学习阶段(指形成根深蒂固的习惯的这段时间)一般会持续2到4个月,期间生产效率有所降低[2]。最终的好处显而易见,开发者也能自己保持该项技术,但问题是:怎么才能做到这样?很多开发者仅仅几天之后就放弃了。
就我见过的方法而言,大多数依赖于课堂培训(或者e-learning)和一对一的辅导。如果做得好的话,这些方法当然不错,可以作为整个解决方案的一部分,但是我认为还需要更多的方法。
课程培训有两个主要的问题:例子太简单,与实际问题关系不大;给大家练习的机会不多。
在线培训(Object Mentor和Industrial Logic,以及其它机构提供的培训),其优点是更有深度。然而练习的机会仍然不多。而且在这些课程里,你与其他学生通常没有交互。听一听你同学和同事的问题,能够加深你的理解。
一对一的辅导只能用于团队中的几个人,很难推而广之。在大型企业里面,专家只有几个,而需要帮助的人有成千上万,所以一对一的辅导更是困难。
看书是个很好的方法,但是很少有开发者喜欢通过读书学习TDD技术,即使有些人发现看书可以缓慢提高其TDD水平。与其它在线教程类似,看书仍然是只能一个人学习。
最后:遗留代码使得TDD难上加难。开发者当然会问这样的问题:“这些对象紧密耦合,怎样才能测试它们?这些代码太复杂了,怎样才能测试这个算法?”
那怎样才是好的解决办法呢?前面的方法主要有两个问题:没有深度、缺乏协作。一个完整的解决方案需要结合使用多种学习模式,并需要包含以下多种因素。
这一计划的核心是:针对TDD创造交流机会、促进互相协作。以上方法中有3个是关注这一方面的:结对编程、编程道场和阅读工坊。
编码道场(使用自由方式)指的是这样一种活动,一小组人(最多15个人)采用TDD一块解决问题(下述内容来自Danilo Sato):
根据经验,我建议初次尝试要选择一个很小的问题。
对阅读工坊来说,有很多好书可以选择:
典型情况下,团队在一次会议上可以讨论一章或者两章的内容。节奏一定要慢,让大家能够在业余时间读完相关内容,而不是变成了负担。除此之外,要留够充足的时间,让大家对文中的一些条目做深入地探讨。
这两个工坊都需要提供皮萨(或者一顿健康午餐)──因为你要求大家在私人时间做工作相关的事情,所以要给他们适当的鼓励。这两个工坊可以每数周进行轮换,以防大家觉得陷入太深。最后,不要指望每个会议上人员都是相同的。
与以自己为导向的学习相比,工作坊和社区是个很大的提高,因为组员致力于交流和协作。其结果是我们能够学到一些根本想不到的事情。
总结说来,要想成功采用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是Pure Agile Consulting公司的首席咨询师,该公司关注于敏捷和精益,致力于帮助客户每两个星期交付软件。从2001年起Mark就是一个敏捷实践者,曾在一个小团队内引入敏捷实践。过去三年中,作为一个大型独立软件开发商的雇员,他负责在组织里引入Scrum,并指导了多个团队-其内容包括设计TDD的策略,并引入了很多实践支持它。Mark是InfoQ敏捷社区的编辑,并且撰写了数十篇敏捷方面的文章。他还有一个blog:Notes from a Tool User。业余时间,Mark与他的妻子和两个女儿一起享受天伦之乐。
阅读英文原文:Making TDD Stick: Problems and Solutions for Adopters。