某一程序员试图让另一名程序员确信某段代码是正确无误时,所使用的主要工具通
常都是测试用例:手工输入然后执行该程序。那是一个功能强大的工具:它适用于检测
bug,使用简单,也好理解。然而,这样做很显然需要程序员对程序有很深的理解。如果
对程序没有很好的理解,那他们决不能先行编写出程序来。程序验证的好处之一就是它
为程序员提供了一门语言,程序员可以用它来表达对程序的理解。
在本书的后面,尤其是第9、11 和14章,在开发各种精细的程序时,我们将应用到
验证技术。编写代码时,我们将使用验证语言来解释每一行代码:在勾画每一个循环的
不变式时验证技术尤其有帮助。程序文本结尾的重要解释将作为断言;确定现实世界中
的软件应该包含什么样的断言是一门艺术,这门艺术只能从实践中学来。
验证语言经常用在代码第一次编写之后, 并且在代码走查期间开始执行。测试期间,
如果违反了断言语句的话,那将指明出现bug了:对违规形式进行分析你就知道该如何
排除某一bug 而不会再引入另一个bug。请注意,当你在调试、修改代码或错误的断言
语句时,要完全地理解代码,抵御那种“改变代码,只要能让它运行起来就行”的冲动。
下一章讲述了断言在程序测试和调试中扮演的几种角色。断言在程序维护期间很关键:
当你捡起以前从没有看过,而且几年来也没有其他人看过的代码时,程序状态断言对我
们理解程序很有帮助。
这些技术仅仅是编写正确程序的一小部分;保持代码的简单性通常是正确性的关键。
另一方面, 有些熟悉这些技术的专业程序员给我的感觉是:当他们构建一个程序时,难
的部分通常先通过,而错误往往就在容易的部分。这在我自己的编程经历中太常见了。
当他们碰到难的部分时他们就会耐下心来,成功地运用那些功能强大的正规技术。而在
那些容易的部分,他们往往会回退到古老的编程方式中,因而得到的结果也是老的。以
前我还没有碰到过这种现象,自己碰到过之后才相信这种现象。这种难堪的现象也是对
经常使用这些正规技术的一个良好触动。
David Gries所著的(The Science of Programming》是一-本在编程验证方面相当出色
的入门书。这本书在1987 年由Springer-Verlag出版社以平装本出版。它先从逻辑开始
说起,继而对程序验证和开发进行了正规介绍,最后讨论了常见语言的编程问题。在本
章中我已设法勾画了程序验证的好处;大多数程序员可以有效使用验证技术的惟-方法
就是学习诸如Gries所著的那样的书籍。
个人感受:程序检验是软件开发中的重要一环,不能合适通过检验的程序不是好程序,
我以前不太注意程序的稳定性,总是想敲完就行,太注重速度而没有注重稳定性。以后我要
多注意程序的稳定性,不怕改bug。
解决方案:以后要多对程序进行检验,不能怕改bug