测试驱动开发和公理化
最近在地铁上看Junit时注意到书中提到,单元测试或者测试驱动开发可以以让开发人员对自己的代码充满自信。那么这种自信是哪里来的呢?今早在地铁上想到了近代数学中的公理化。
我们知道很多概念通常有很多内涵和外延的解释,而解读的差异往往会造成现实交流中的分歧。比如说一个系统的结构是好的,一段代码是好的等等。我们对这里好的建议常常是因人而异。甚至即使是一个人,如果他是个完美主义者,也会不断的质疑自己的设计是否是“好”的。“好”的定义的模糊,直接影响了设计和开发人员的工作效率。很多精力浪费在了对代码质量评估和质疑上。
面对概念的不清晰,我们需要对软件的“好”的定义进行公理化。通常数学上的对概念的定义是这样进行的:
对于一个XX,如果他满足下列调节,则称XX为YY: 1)条件一;2)条件二;3)条件三。这样的定义的好处是他有非常清晰的边界,如果你承认这套定义,那么就不会对他的解读产生分歧。我们把这种方法借鉴到软件开发中时,就得到了测试驱动开发所遵循的基本公理:
一个系统是“好”,当它满足下列条件时:
1)它易于并且可以通过单元测试;
2)它可以通过集成测试;
3)它……
有了公理化的方式评估软件,我们就可以在这方面花更少的时间。而且可以毫无顾虑的执行软件的开发进度。
to be tried early, ideally within days
(iii) Design and build software, even operating systems, to be tried early, ideally within weeks. Don’t hesitate to throw away the clumsy parts and rebuild them. -- Doug McIlroy
这也是自己一段时间写程序的感受。不管多么复杂的程序,一定要从基本的功能开始。当你完成了程序的原型之后,再进行不断的测试和扩充。对于复杂项目,也许要几周内实现出来。而对于简单的项目,迅速选择一个简单的框架更短的时间内实现是可行而且必要的。
另一个有优势是早实现意味着早测试,留给测试的时间越多,能够发现的问题就越多。