Take Advantage of Code Analysis Tools
测试的价值时从软件开发者职业生涯的早期就被灌注的。近些年,单元测试、测试驱动开发(TDD)、以及敏捷方法的兴起证明,在开发周期的所有阶段充分利用测试的兴趣正在激增。然而,测试仅仅是你改善代码质量所采用的众多工具之一。
时光倒流,当C还是个新玩意的时候,CPU时钟以及存储器类型都非常宝贵。最初的C编译器意识到了这点,因此通过删除一部分语义分析功能来降低代码的遍历次数。这就意味着在编译阶段只有一小部分bug能被编译器探知到。作为弥补,Stephen Johnson 编写了一款叫做lint的工具(能够删掉你代码中的毛刺),也就是实现了它的好姐妹C编译器中被删除的静态分析部分。无论如何,静态分析工具因在那些无需严格遵守的编码风格上提供了大量的警告,而被广受赞誉。
现在的编程语言,编译器,以及静态分析工具都发生了巨变。内存和CPU资源相对便宜,因此编译器可以负载更多的错误检查。几乎每款语言都拥有至少一种工具来检查编码风格、常见陷阱、以及难以捕获的隐晦错误,比如对空指针的引用。
更牛逼一点的工具,比如C用的Splint或者Python用的Pylint都是可配置的,这就意味着你可以通过配置文件、命令行、或IDE来选择排除那些错误和警告。Splint甚至可以强制你做好代码注释,让它提供你程序是如何运行的提示。
如果这些都失败了,你通过编译器、IDE或lint工具都没有捕获到简单的bug或违规情况,那你完全可以动手做个属于你自己的静态检查器。这听起来并不困难。大部分编程语言,特别是动态类型语言,会将抽象语法树和编译工具作为它们标准库的一部分给公开。这有利于理解语言开发团队所采用的标准库的每个犄角旮旯,对于静态分析和动态测试,这其中都暗含宝藏。例如,Python标准库里包含了一个反汇编器,它会告诉你被用于生成编译代码或代码对象的字节码是哪些。这听起来像是python-dev这样的编译器作者才会去用的晦涩工具,但其实它在日常情况中也非常有用。这个库所做的一件事就是你最后的堆栈跟踪,反馈给你最后一次未捕获到异常的确切指令字节码。
因此,不要把测试作为你质量保证的最后一站——利用分析工具,不要害怕自己动手。