原文来自 "现代软件工程" 周之英编著 (上)



概述

  为什么需要软件度量呢?

在软件开发中,软件度量的根本目的是为了管理的需要。利用度量来改进软件过程。人们是无法管理不能度量的事物。在软件开发的历史中,我们可以意识到,在60年代末期的大型软件所面临的软件危机反映了软件开发中管理的重要性。而对于管理层人员来说:没有对软件过程的可见度就无法管理;而没有对见到的事物有适当的度量或适当的准则去判断、评估和决策,也无法进行优秀的管理。我们说软件工程的方法论主要在提供可见度方面下工夫。但仅仅是方法论的提高并不能使其成为工程学科。这就需要使用度量。度量是一种可用于决策的可比较的对象。度量已知的事物是为了进行跟踪和评估。对于未知的事物,度量则用于预测。本专题将讨论软件度量的一些基本问题。但应认识到软件度量的成果是非常初步的,还需要大量工作才可能真正地做到实用化,但它的实用化成就将对软件的高质量和高速发展有不可估量的影响。那么,



一、 什么是度量呢?

1、度量概念:

度量存在于左右我们生活的很多系统的核心之中。在经济领域,度量决定着价格和付款的增加;在雷达系统中,度量使我们能透过云层探测到飞机;在医疗系统中,度量使得能够诊断某些特殊疾病;在天气预测系统中,度量是天气预报的基础;没有度量,技术的发展根本无法进行。

度量的正式定义是:

度量是指在现实的世界中,把数字或符号指定给实体的某一属性,以便以这种方式来根据已明确的规则来描述它们。

因此,度量关注的是获取关于实体属性的信息。一个实体可以是一个实物,如人或房间;或者是一个事件,如旅行;或软件项目的测试阶段。属性是我们所关注的实体的特征或特性,如血压的高度(人)、时间(测试阶段)、范围或颜色(房间)、花销(旅行) 等。因此,说"度量事物"或"度量属性"的说法是不完全正确的;应该说"度量事物的属性"。

"度量房间"的说法是模糊的;我们可以说度量它的长度、范围和温度等。同样说"度量温度"的说法也是模糊的,应该说:我们度量的是某一特定地理位置和特定情况下的温度。



2、工程学科需要度量

软件工程要的是有模型和理论支持的方法。如在设计电路的时候我们应用欧姆定律。这个定律描述了电路中电阻、电流和电压三者之间的关系。但是这些理论已超出了一般意义上的科学方法的范畴,在这种范畴里最基本的东西是度量。度量除了在发展一个理论的过程中起作用外,我们使用度量并应用它们。因此设计一个特定电流和电阻的电路时我们就知道需要多大的电压。

如果没有度量,我们很难想象关于电子、机械、及普通工程的定律能得到发展。但事实上现在在软件工程的主流里度量却被忽略了。现在的情况是:

■ 当我们在设计和开发软件产品的时候,我们并未能制定出度量的目标。

例如:我们保证说我们将使用户界面友好、可靠、易于维护;而并未使用度量的术语来详细说明它们的具体含义。Gilb曾经说过:所谓模糊目标定理,就是没有明确目标的项目将不能明确地达到它的目标。

■ 我们未能对构成软件项目实际费用的各个不同的部分进行有效的度量。

譬如:通常我们并不知道,和测试阶段相比,设计阶段花费时间多大。

■ 我们并未试图使我们开发的产品的各种质量合格。因此我们未能使用术语(如:在一段时间里使用故障的可能性、把产品安装到新环境中需花费的工作量等)向潜在的用户说明产品的可靠性很高。

■   我们总是试图说服自己使用另一种新的革新的开发技术和方法进行软件开发。



事实上,我们在软件度量方面做的工作很少很少,而且所作的度量方面的工作也与一般科学意义上的度量相分离。我们经常会看到诸如此类的话:"软件的费用有80%花费在维护上。"或"软件每一千行程序中平均有55个Bugs。"。但是这些话并没有告诉我们这样的结果是怎样产生的、试验是怎样设计、执行的、度量的是那个实体、及错误的框架是什么等等。 没有这些东西,我们就不能在我们自己的环境中客观地进行反复度量,重现度量的结果以获得与工业标准的真实比较。因此,归因于度量不充分的问题的产生是由于缺乏严格的度量方法造成的。

除了传统的对计算机硬件的性能进行度量外,对算法的复杂性的度量一直是计算机科学的重要组成部分。但是,这种度量方法只适用于小程序,而对大型、复杂的软件来说它却无能为力了。这就属于软件工程的范畴了。

如果我们不承认度量将会一个更重要的作用的话,软件危机将在随后的几年里依然存在。



二、软件度量的目标

软件开发正在经受一场危机。费用超支(特别是在维护阶段的花费太大)、生产率低下、 以及质量不高等问题正困扰着它。简言之,软件开发经常处于失控状态。软件之所以失控是因为没有度量。Tom Demarco 曾经说过:"没有度量就不能控制。"这种说法是好的,但不完全。并不能说为了获得控制必须进行度量。度量活动必须有明确的目标或目的,而正是这决定着我们选择哪种属性和实体进行度量。这个目标与软件开发、使用时所涉及的人的层次有关。

以下主要从管理者和软件工程师两种角度来考虑,为了达到各种目标所要进行的度量工作。  

● 对管理者而言:

1. 需要度量软件开发过程中的不同阶段的费用。

例如:度量开发整个软件系统的费用(包括从需求分析阶段到发布之后的维护阶段)。必须清楚这个费用以决定在保证一定的利润的情况下的价格。

2. 为了决定付给不同的开发小组的费用,需要度量不同小组职员的生产率。

3. 为了对不同的项目进行比较、对将来的项目进行预测、建立基线以及设定合理的改进目标等,需要度量开发的产品的质量。

4. 需要决定项目的度量目标。例如:应达到多大的测试覆盖率、系统最后的可靠性应有多大等。

5. 为了找出是什么因素影响着费用和生产率,需要反复测试某一特定过程和资源的属性。

6. 需要度量和估计不同软件工程方法和工具的效用,以便决定是否有必要把它们引入到公司中。

● 对软件工程师而言:

1. 需要制定过程度量以监视不断演进的系统。这包括设计过程中的改动、在不同的回顾或测试阶段发现的错误等等。

2. 需使用严格的度量的术语来指定对软件质量和性能的要求,以便使这些要求是可测试的。例如:系统必须"可靠",可用如下的更具体的文字加以描述:"平均错误时间必须大于15个CPU时间片。"

3. 为了合格需要度量产品和过程的属性。例如:看一个产品是否合格要看产品的一些可度量的特性如"β测试阶段少于20个错误。","每个模块的代码行不超过100行。",和开发过程的一些属性如"单元测试必须覆盖90%以上的用例。"等。

4. 需要度量当前已存在的产品和过程的属性以便预测将来的产品。例如:

(1). 通过度量软件规格说明书的大小来预测目标系统的大小。

(2). 通过度量设计文档的结构特性来预测将来维护的"盲点"。

(3). 通过度量测试阶段的软件的可靠性来预测软件今后操作、运行的可靠性。

研究上面我们列出的度量的目标和活动我们可以发现:软件度量的目标可大致概括为两类。

其一,我们使用度量来进行估计。这使得我们可以同步地跟踪一个特定的软件项目。

其二,我们应用度量来预测项目的一些重要的特性。但是,值得指出的是我们不能过分夸大

这些预测。因为它们并不是完全正确的。软件度量得到也仅仅是预测而已。有些人甚至认为只要使用合适的模型和工具,所获得的预测可以精确到只需使用极少的其他度量(甚至根本就不用使用度量)。事实上,这种期望是不现实的。



三、软件度量研究的范畴

现在我们已经知道软件工程需要度量。如何进行度量是的重要性是显而易见的。首先我们必须弄清楚"软件度量"是一个包含很多完全不同的活动的术语。它主要包括:

费用和工作量估计模型和度量

生产率度量模型和标准

质量控制和保证

数据收集

质量模型和度量

可靠性模型

性能评价和模型

算法/计算复杂性度量

结构和复杂性度量

GQM法(Goal/Question/Metric)

其他等

在本专题中,我们将对上面这几个方面进行简要介绍以便使读者对当前正在使用的方法和技术有一个大致了解。这些方面排列的顺序不是任意的。它反映了进行软件度量时从高层次、高目标到它们所依赖的最基本的东西的顺序。