Bug也是累积的。你的bug越多,消除每一个bug也就越不容易。一定程度上是因为bug互相影响,表现出来的失败可能是很多错误共同的结果—这就导致很难找到每一个错误。这也是心理上的,当有很多bug的时候,人们自然就缺少激情去找到并解决这些bug—这是一种在《Pragmatic Programmer》一书中被称为“破窗效应”的现象。破窗效应(英语:Broken windows theory)是犯罪学的一个理论,该理论由詹姆士·威尔逊(James Q. Wilson)及乔治·凯林(George L. Kelling)提出。此理论认为环境中的不良现象如果被放任存在,会诱使人们仿效,甚至变本加厉。一幢有少许破窗的建筑为例,如果那些窗不被修理好,可能将会有破坏者破坏更多的窗户。破窗理论能够很好地解释人们违反代码整洁之道,对质量问题视若罔闻的背后原因:是因为原来就是垃圾,别人做了错误的行为没有受到惩罚或者约束,那么我做同样的事情和行为也是正常的,大家都一样。但是所谓的没有关系的错误或者瑕疵被放过去,累积起来,等雪崩的时候,没有一片雪花是无辜的。最后整个团队为质量买单。怎么避免破窗效应?让我们的质量能够保持在一个健康的状态呢?应对方式就是童子军军规:“当你离开一个露宿营地的时候,一定要让它比你来的时候更整洁干净一点。”我们的每次提交都应该让代码比前一个版本更干净一点,哪怕是减少一部分重复代码,修正一个格式问题。这样也能让我们远离代码的坏味道,保持我们代码和架构的整洁。
这些优点将会是质量的有力保障。验收测试驱动开发(ATDD):在代码层次,在编码之前写测试脚本就是上面所说的TDD,而在业务层次,在需求分析时就确定需求(如用户故事)的验收标准,就是这里所说的验收测试驱动开发(Acceptance Test Driven Development,ATDD)。TDD和ATDD的关系如下图所示。ATDD解决了TDD在实践中遭遇的一部分实际障碍:比如工期紧张然而单元测试需要的时间又比较多等。从需求的角度去准备验收标准和测试用例。同样可以保障从开发的开始就有较高的质量。行为驱动开发(BDD):BDD可以看成ATDD的延伸,只是BDD更强调用户的视角、用户的行为,为ATDD注入了“Given,When,Then”这样特定的需求描述语言。和敏捷的user story极为吻合。TDD在写测试用例时,常常会提出“我们应该先测什么”,然后针对测试的条件来填充代码,而BDD则试图换一种方式去思考问题,即问自己“预期的行为是什么?”,可能会写出结构更好的代码。说到底,BDD更关注客户的需求,通过了解客户的不同行为,对客户的需求有更深刻的理解,从而借助对需求逐渐深入的理解来驱动软件开发。下图就是一个BDD的典型case:而BDD和TDD的关系则可以通过下图清晰的看出来区别所在: