软件测试和软件质量的概念是分不开的。测试是手段,质量是目的。关于软件质量,学软件工程的时候曾考虑过这个问题,但想得不深。现在正好可以借把想法变成文字的过程理一理自己的思路,谈谈我的看法。
在学校读书的时候,我有很多与我不同专业的朋友,建筑的,桥梁的,机械的,等等。他们有一个与我不同的共同之处,都常背一块大木板,机械制图是他们很重要的课程。我和我的同学们则学习程序设计,学习计算机的结构和原理。我们往往抱怨操作系统编译原理太复杂,可是看看那老大一张纸上铅笔细细勾出的房屋结构机械零件,精确到0.1毫米的内径外径,钢筋水泥混凝土的组成结构及抗这抗那的能力,我觉得简单考量一下的话,二者本并不具直接可比性的复杂程度至少是在一个量级上的。
我也知道一些各行业的工程师,包括我的姑姑是桥梁设计师,我的父亲是机械模具设计师。从小我就对父亲那一卷卷的图纸印象很深。父亲从无到有在一张张白纸上勾出一幅平面的在我看来乱七八糟什么也不是的东西,可是按照它对原料裁剪、加工就变成了一个实实在在的产品。当时觉得神奇,现在想来,这是需要很扎实的知识的。在设计图纸的整个过程中,并没有什么工具和方法可以检查一下是否有错误或疏漏,而最终送到工人手里的图纸必须是正确无误的,否则原料就成了废品。
作为一个工程师,确保所从事的工作是正确的,对于工程师们是很重要的。假如建筑师因为偷懒疏忽而不能使我们的房子十分结实,将会发生什么情况?房子会倒塌而且我们要受到伤害。假设GM的工程师们对于汽车刹车不做最终的测试,当我们需要刹车时,它就可能不能正常工作,就可能出事故。所以当工程师回答一个有关如何工作的问题时,必须确信自己是正确的,必须确信没有忘掉什么。
要做到这些,是需要大量工作的。
而软件行业好象有着很大的不同。也是还在读书的时候,我就曾问自己,同样是工程师,为什么软件行业的工程师不能像传统行业的工程师一样对自己的工作的品质有着如此的确信?
在很多方面,程序设计师还是有着相当的便利的。譬如,在从开始编写代码直到完成最终的软件成品的过程中,每当完成一个功能、一个模块、一个代码段,或者干脆程序员对自己不自信的时候,都可以运用各种工具编译、跟踪、调试程序去发现隐藏的错误或疏漏。而即便是由于偷懒疏忽没有发现错误导致最终的产品中有很多的bug,似乎也不会发生什么,市场仍然接受,用户仍然使用。
有两个数据可以说明程序设计师的工作品质:
人们发现,即使具有较多经验的编程人员,其编程正确率的得分平均只有7.8/14。
在有经验的编程人员写的代码中,平均每150行就会有一个bug。
是什么导致了这样的情况?
是程序员心浮气躁,责任心不强?是软件行业的复杂程度远远超过传统行业?是行业的特殊性造成市场和用户对如此高的错误率持接受态度?还是其他的什么原因?
给自己提了这么些问题,却不知道该怎么回答了。
对于第一个问题,这确实是大量程序员的写照。从这里产生的大量问题也确实严重影响了软件产品的质量。
对于第二个问题,我想起了一个经典的对话:
程序设计行家说:“任何程序,无论多么小,都有错误。”
新手不相信行家的话。“如果一个程序小到只能执行一个单一的功能,也是这样吗?”他问道。
“这样的程序不会有任何意义。”行家说。“假如这样的程序存在,操作系统最终也会由于一个错误而失效。”
新手并不满意。“如果操作系统不失效呢?”他问道。
“没有不失效的操作系统。”行家说。“假如这样的操作系统存在,硬件最终也会由于错误而失效。”
新手仍然感到不满意。“如果硬件不失效呢?”他问道。