昨晚我发了条微博,内容如下:

编程本质上是用脑的,当程序复杂的时候人脑会不够用,于是bug百出,程序员心力憔悴。好在出现了各种工具和方法论来帮助降低人脑的负荷,让人能够专注于有限的地方。但是,很多人迷信工具和方法论以致几乎忽略了人脑的能力,就好像只要用对了方法和工具,放只猴子也能把软件写出来,这也应该反思。

这是我最近看到一些关于敏捷方法的争论有感而发,就以测试驱动开发(TDD)为例,有那么两派人,一派是死忠,认为不用TDD写不出好的代码,不写测试就不能写主代码;另一派则相反,觉得TDD是很扯淡的东西,是咨询公司忽悠人的工具。我则认为两派都走了极端,在我看来,包括TDD在内的敏捷方法论都旨在帮助降低程序员的脑负荷,因此恰当的使用能帮助我们专注于重要的事情,但认为TDD是万能的,而忽视了,那也大错特错了,不管多么神奇的方法,多么完善的过程,我们都不能否认人脑思考是编程活动中最重要的一环。

所以TDD不是能让你秒杀狼人的银弹,但它的确是能帮助打猎的子弹。

回到《测试驱动开发的艺术》一书上来,首先我想批评的是这个看似很雅实则恶俗的题目,原书名为 Test Driven - Practical TDD and Acceptance TDD for Java Developers ,一经翻译,意思完全走样。这书比较重在介绍TDD(包括ATDD)以及相关的实践,离”艺术”二字真差十万八千里。不过除了题目,其他一切都不错,包括那个照搬的Manning系列封面。下面介绍下内容:

  • 第1-3章 是对TDD入门的介绍,TDD是什么,为什么要用TDD,相关工具,然后是实际操作等等。由于TDD无法脱离重构而存在,因此这里也有不少涉及。这一部分很棒,不是说内容多精彩,重要的是浅显易懂。
  • 第4章 是对TDD概念和模式的一些挖掘,也是期望比较大的一章,我也看到了一些精彩的论述,包括如何提高代码可测试性的手段,将测试分为基于状态和基于交互两类,等等。可惜不够过瘾,作者引申的书倒不少,自己的料不够足啊。
  • 第5-8章 就是一些实际的实践了,可能也算本书的重头,包括测试web组件,数据访问组件,Swing组件,时间相关功能,以及多线程代码等等。根据自己背景需要,跳着看看就可以了。
  • 第9-11章 是对验收测试驱动开发(ATDD)的介绍,是我个人,除第4章之外最喜欢的部分,因为我之前对TDD了解得不算少了,但对验收测试的了解寥寥,这部分帮助我扫盲了,也学习了一下相关工具Fit(由Wiki之父Ward Cunningham开发)。
  • 第12章 也是最后一章,是教你如何推行TDD,基本上是一些咨询培训的技巧,也挺有趣,不过故事少了点(作者自己还在文中强调故事的重要性,有点搞笑啊)。

总得来说这是本介绍TDD和ATDD的不错的书,优点在于浅显易懂,而且有不少实践,缺点就是深度不够。

和TDD相关的书还有不少,顺带介绍几本不错的:

关于TDD,我最喜欢的是它的两点。第一是它能帮助我建立对自己代码的信心,让我能够保持前进而不用在潜意识里担心破坏什么东西;第二是它教会我在代码用户的角度设计API,而不是在代码中越钻越深最后竟忘了最初的需要。

TDD是枚不错的子弹,当然前提是你眼睛得好使。