测试必定是不完备的

哥德尔不完全性定理表明任何一个形式体系,只要包括了简单的初等数论描述,而且是一致的,它必定包含某些体系内所允许的方法既不能证明也不能正伪的命题。这就是一种很常见的现象:可证的一定是真的,但真的不一定是可证的。

哥德尔不完全性定理也指出,如果需要证明一个系统是一致完备的,需要一个至少与该系统一样强度的系统。任何试图选择受限系统来证明一个系统的一致性都是徒劳的。

软件开发实际上是码侬们在构造一个系统,能够证明系统是正确完备的一真是所有码侬的梦想。码侬们构造的系统满足用户的需求,不考虑需求的变动,需求就是系统能够支持的所有真命题。测试就是证明每一条命题是否为真的证明过程。如果能够证明所有命题都为真,开发出来的软件系统就是一个正确的系统么?

不是!因为需求看作一种基本的需求,它总存在一些规则,这些规则可以演绎。类似于,我们不能穷举所有的素数一样。这些未被发现的规则,让需求的集合处在一个不稳定的状态。你永远无法列举并证明所有的。另一方面,总是存在一些需求是不可通过测试证明的。

前面说的两种情况可以通过一个简单例子来加深理解。对于需求的无限演绎,可以考虑新设计功能与系统中其他系统的交互、影响,这些往往是出乎码侬们意料之外的。对于需求的可验证性,可以考虑Hadoop在上万台机器上性能表现,这样的常见在前几年是不可想的。

总之,如果想要证明软件是正确完备一致的,我们花费的代价将是开发代价的数倍,甚至是不可估计。现今广泛的开发策略,是尽力而为之,不停地反馈改进。

如果谁能保证它开发系统的100%可靠性,除非是Hello World。其实也不一定,有多少人说自己第一次写Java的Hello World就一次性编译运行成功了。

public class test{
    public static void main(String[] args){
        System.out.println("Hello World!");
    }
}

自己敲敲试试。

你可能感兴趣的:(测试必定是不完备的)