这些天关于TDD的讨论很是激烈,从CoolShell上的TDD并不是看上去那么美,到InfoQ的TDD有多美,再到博客园的TDD到底美还是不美,基本上分成两派,一派说她美,一派说她不那么美。不过今天我想说的不是她美不美,而是这几天我自己反思后的一些想法。
这篇CoolShell上的原文我本是没看过的,InfoQ上的这篇也没留意,完全是无意中看到Todd Wei的这篇以后才有回复的想法的,因此基本上我的回复都是基于Todd Wei的这篇文进行的讨论。
首先我回复的是一个关于测试需要修改的问题:
我们的工作到底是什么?
我们的工作不是写代码。
我们的工作是解决问题,是通过编写软件来解决问题。就好像你准备买一跟网线来连接你的电脑和网络,接上后却发现连不通,那么这跟网线解决了你的问题么?显然没有。软件也是一样,如果软件的质量不好,解决不了问题,那么不管是用了几个人月,多少行代码,也都是没用。
测试是目前为止最有效和可靠的保证软件质量的方法,如果你把测试与功能代码放在一个同等的位置,都作为软件不可分割的一部分的话,根本就不会说出“还要改测试”这样的话。不管你是先写测试还是后写测试,测试都是用来验证需求是否实现的,当需求改变时,测试用例自然会随之变化,跟test first还是test after没有关系。
道理上还行的通,似乎后来也没人反驳,不过现在看起来当时有些激动。
再看下一个回复:
@Ivony...
TDD不是没有设计,而是你用TDD的时候没有做设计。拿着一把锤子钉钉子,结果定歪了,你能说是锤子的问题么?
这个基本上就是人身攻击了,和“你真笨,为啥TDD的时候就不会做设计呢?”没啥差别(在这里向Ivony同学致歉),情绪更加激动。
再后面隐隐约约感觉自己说的话不太合适,于是又补上一条:
现实一点看,你要是觉得TDD好,不管是很好还是有一点好,只要你觉得好,那你就用。你觉得不好,那就不用。
你觉得Test First接受不了那就Test After。没必要非争来争去,一定要下个结论说TDD不是那么的好。
给你一辆F1,还真不一定能比QQ开着舒服。
这几天反思了一下,为什么那么长时间没在博客园写东西或者回复什么,一看到这个帖子就浮出水面狂激动呢?Todd同学只是表达了自己对某一技术实践(TDD)的一点想法,既没强迫我接受他的观点,也基本上跟我没啥关系,我为什么要大半夜的觉也不睡在这码字回帖呢?
一开始我想到的理由是:我已经实践TDD有一段时间了,看到了一些好处,有一些心得。看到有人因为经验不够,没有认清TDD的好处和本质,妄下结论,这不仅会使他无法进一步享受TDD带来的好处,还会让其他人放弃使用TDD。所以我作为一个“过来人”,要帮助他去除偏见,朝着正确的方向走向TDD的光明大道。多么的高尚啊,多么的冠冕堂皇啊。
可是今天,我才发现,根本就不是这么回事。以我懒惰的性格,根本无需如此激动,毕竟Todd和我也没什么深交,我没有任何义务“帮助”他,这背后还有更深层次的原因。
记得上中学的时候,很多同学都喜欢听歌,有人喜欢张学友,有人喜欢刘德华,还有人不喜欢流行而是摇滚,比如当时的魔岩三杰,黑豹乐队等等。本来大家各自喜欢各自的,你追你的流行星,我听我的摇滚歌,也算相安无事。突然有一天,一个喜欢摇滚的哥们说:流行音乐都是垃圾。也许他只是copy某人的言论,也许他是有感而发。但不管怎么样,此言一出必然挑起“流行派”和“摇滚派”两大帮派的争斗,于是江湖又掀起一片血雨腥风……
Sorry,武侠看多了。不过说起武侠,我不禁想起金庸武侠中各种黑道与白道,正派与邪派的各种势不两立,各种你死我活。我当时不管是看小说还是看电视,都觉得他们傻的可怜。所谓名门正派只因为有些人行事方式有别,就称之为歪门邪道,而这些所谓的歪门邪道本来在自己的小圈子里过着正常的生活,却因为他人的歧视而被迫走上对抗的道路。
好的,回到现实之中。 为什么Todd的这篇文章对我的刺激如此之大呢?原因是,我一直是TDD的拥护者,我也写了一些东西来宣扬TDD,说TDD好。突然有人说TDD不那么美,TDD和敏捷是矛盾的,这不是在打我的脸么?我的面子何存?于是我便自我标榜为“正道”,而将一切和我意见相佐者标为“邪道”。昔日被我称之为“傻”的行为正发生在我自己的身上。看,道理就是这么简单。
如果你将上面的“TDD”用find/replace替换成“敏捷”、“结对编程”或者是“C#”之类的东西,你会发现其结果也是一样的。这在X语言是不是比Y语言好,或者是A平台是不是胜过B平台的各种争论中已经屡见不鲜了。
孟子曰:人之患在于好为人师。多么大的智慧啊。