免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

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

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

关注

评论

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

用tidb来帮助企业节省成本。我们做一次aws上的数据库成本分析

TiDB 社区干货传送门

7.x 实践

TiDB多集群监控部署方案实战

TiDB 社区干货传送门

实践案例

澜起科技推出支持7200 MT/s速率的DDR5第四子代RCD芯片

财见

SMART Utility for mac (硬盘检测工具) 3.2.7完美激活版

mac

苹果mac Windows软件 SMART Utility 磁盘诊断工具

Shell脚本实现Mysql持续kill功能

百度搜索:蓝易云

MySQL Linux Shell 云服务器 kill

Ubuntu的USB相关操作教程。

百度搜索:蓝易云

云计算 Linux ubuntu 云服务器 usb

iOS文件管理工具:Aiseesoft Mac FoneTrans 激活中文版

mac大玩家j

Mac软件 iOS文件管理 iOS文件传输

Kafka Streams概述

FunTester

HTTP 和 HTTPS 的比较

Liam

程序员 前端 https 后端 HTTP

如何为 TiDB 文档提交第一个 PR

TiDB 社区干货传送门

实践案例

论文《TiDB:A Raft-based HTAP Database》阅读感悟

TiDB 社区干货传送门

TiKV 底层架构

软件测试开发/全日制丨Python 常用第三方库 yaml 学习笔记

测试人

Python 软件测试 yaml 测试开发

云上成本贵,用tidb

TiDB 社区干货传送门

7.x 实践

PDF优化压缩软件 Recompress中文激活版

胖墩儿不胖y

Mac软件推荐 PDF压缩软件 好用的PDF处理工具

解读 $mash 通证 “Fair Launch” 规则(Staking 玩法解读篇)

大瞿科技

Python语言中while循环的应用举例

百度搜索:蓝易云

Python Linux 运维 云服务器 while

每日一题:LeetCode-227. 基本计算器 II

Geek_4z9ami

Go 面试 算法 LeetCode

Curve Code Camp·金秋篇顺利结营

OpenCurve

开源 网易 分布式文件存储 开源社区 开发者福利

【第七在线】智能商品计划可以帮助鞋服企业做什么?

第七在线

XSKY SDS 产品率先获得 OceanBase V4 新版本认证

XSKY星辰天合

合理利用tidb能帮你省去90%的费用

TiDB 社区干货传送门

7.x 实践

一文读懂 $mash 通证 “Fair Launch” 规则(幸运池玩法解读篇)

大瞿科技

揭秘程序员如何轻松接私活,赚取高额外包收入!

EquatorCoco

程序员 开发 接私活

企业数字化转型:1个核心、2种力量、3个关键点、4大转型、5大平台

天津汇柏科技有限公司

数字化转型

如何处理预防XSS漏洞攻击问题

德迅云安全杨德俊

CDN xss攻击 网站安全

工作会议:更适合中国宝宝体制的party

伤感汤姆布利柏

DR-AUTO-SYNC架构集群搭建及主备切换手册

TiDB 社区干货传送门

实践案例

TiDB忘记了root密码?教你一招搞定

TiDB 社区干货传送门

7.x 实践

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