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



度量的基本理论

度量就是实际指定数据的进程。这种指定也可被称之为度量的(对实体的一种)映射。因此,度量其自身不是数字而是我们所考虑的实体或属性的映射。事实上,度量的理论研究者往往有意放松了这个界限。



假设我们想度量源代码程序的长度这个属性。一个可选的度量是把源代码的长度属性定义(或映射)为可执行代码的语句数。另外一个可选的度量是把源代码的长度属性定义为其在计算机中的存储字节数。对一个指定的程序在度量其长度的时候我们可以说它有100行可执行语句。但是这只是一种在我们要定义的问题非常清楚明了的情况下的不严格的术语学的说法。如果只有两种可选定义方法的话,是可行的。但是事实上有很多定义可执行源语句的方法,在这种情况下,我们是不能简单的说源程序有100行可执行语句而不提及是如何定义的。

为了进行度量我们必须知道我们度量的实体是什么以及实体具有那些属性(或特性)。尽管这一点很明显,但是在数据收集的过程中我们往往却忽略了这一点。

为了对度量加深认识,我们可以对度量进行分类:

客观度量:一般为定量的度量。

主观度量:一般反映为专家意见。

在这些基本度量(直接度量)的基础上,经过计算得到进一步的附加的度量(或称推导度量,间接度量等)。

一旦我们确定了要度量的属性和度量的方法之后,我们就可以开始积累数据了。对积累的数据分析的结果往往可以澄清该属性或得到一个新的认识。这继而使我们改进和软提高度量的准确性。



一、直接和间接度量

我们可以直接度量对象的规模大小、长度等属性而不需要参考其它的属性。但是在度量象密度等这样的属性的时候也要度量其它的属性(象长度和大小等)。为了区分不同的度量我们定义如下:

直接度量:是指属性的度量不依赖于其它属性的度量。

间接度量:是指该属性的度量与一个或多个其它属性的度量标准有关。

直接和间接度量是指的属性的度量定义(映射)而不是指的属性本身。在此我们讨论的主要是直接度量。这是理解实体及其属性的最自然的过程,而并不需要先度量一些其它的属性。但这并不排除使用间接度量将获得更精确的度量。

二.度量理论——表示法

度量理论的框架是数学化的,由集合、关系、定理和函数组成。其各主要组成部件分述如下:

.关系系统:即用获得的对实体深层理解和观察经验来给出关于实体的属性的一些定律。这主要表现为实体之间的关系。例如:液体的属性"热"是指液体比其它的液体热一些,从而可得出一个二元关系:A比B热。 而且这个关系是满足传递律的。

即若 A比B热,B比C热;则A比C热。

表示法则:即使用一种数学的数字符号系统来表示实体之间的关系。例如:我们可以用符号">" 表示 "….比…热"这个关系。那么"A比B热"可表示为"A>B"。

单一法则:表示任何两个关于实体或表示实体属性的数字的函数是相关的。例如:我们知道"热"的液体是指比其它的液体更热一些而且这个关系是传递的,那么,一个单一法则的断言是:任何两个表示热的函数是以一种递增的关系相关的。    

我们在这里讨论了数字系统的表示法,但这并不是说我们必须局限于这种特定的实际的数据之中。我们在使用大量复杂的数据的同时要排除这样一种错误的认识,那就是在度量中只有具体的数据是最重要的。在后面度量算法的效率的时候我们可以看到只有在我们扔掉了实际数字的限制之后我们才能真正实现对算法的度量。

而且,把一组实体分类是一种特殊形式的度量,我们是希望使用各种各样的符号而不仅仅是数字来达到这个目的的。

一般地说,软件度量的尺度可以不同:

-分类(列名):无次序概念。例如:错误位于"用户界面,通信,数据库,…"。

-次序:无距离概念。例如:用户满意程度为"非常满意,满意,一般,不满意,很不满意"。

-区间:有距离。例如:项目A超支二万元;项目B节余十万元。

-比例:例如:A的重量是B的两倍。



三、度量和软件度量

在软件度量中,度量主要用于以下几个方面:

(1).从产品、过程、和资源中得来的数字。如:功能点数或代码行(LOC〕/每人每月等。

(2).度量的分类。

(3).可识别的属性。

(4).一个理论或数据驱动的模型,其描述的是一个依赖于独立变量(如大小)函数的可变变量;这种模型通常是用于预测的目的的。

四、软件度量的框架

1、度量对象:

从前面的论述我们知道任何软件度量活动最想做的是识别我们想度量的实体和实体   的属性。在软件中我们想度量其属性的实体可以分为三类,他们是:

1.过程。是与软件相关的一些活动。这些活动都有一个时间因素。

2.产品。是指在软件开发过程中产生的各种中间产品、发布的资料和文档         等 。

3.资源。是指在开发过程中输入给过程的东西。

在软件中想度量或预测的属性都是上述三种实体之一的属性。同时我们有必要区分一下外部属性和内部属性:

内部属性:是能够纯粹用过程或产品或资源其自身来度量的属性;

外部属性:是指由过程或产品或资源及与其相关的环境一起共同才能度量         的属性。

下表B-1代表不完全的一些度量属性:

实体   属性



    内部属性     外部属性

产品   规格说明书     规模、可复用性、模块化、冗余、功能、语法正确… 可理解性 、可维护性…

设计   规模、可复用性、模块化、耦合、聚合、功能…     质量、复杂性、可维护性



编码   规模、可复用性、模块化、耦合、功能、算法复杂性、控制流、结构性… 可靠性、可用性、可维护性…

    测试数据     规模、覆盖度… 质量…

过程   构造规格说明书 时间、工作量、需求变动数、事件(故障与变化)… 质量、费用、稳定性…

详细设计 时间、工作量、在规格说明书中找到的缺陷数…     费用、性能/价格比…

测试   时间、工作量、找到的缺陷数     费用、性能/价格比、稳定性…

资源   人员   年龄、工资待遇…     生产率、经验、智力…

      团队   规模、交流活动水平、结构…     生产率、质量…

      硬件   价格、速度、内存容量… 可靠性…

      软件   价格、规模…   可用性、可靠性…

      办公地点     面积、温度、照明…     舒适程度、质量…

表B-1分类的软件度量例子



外部属性是管理者和软件用户通常喜欢加以度量和预测的。例如:软件管理者希望知   道某些过程的费用、效率或者是他开发组的生产率;而用户可能想知道软件系统的可靠性、可用性或他们想购买的系统的可安装性。但是,外部属性从其自身的天性来说是最难以加以度量的。而且,对外部属性通常没有达成一致的看法;象质量等这种属性太一般性以至于他们看起来几乎毫无意义可言。于是我们不得不使用其它可度量的属性来描述这些属性的定义。例如:有人用在正式测试(过程的一种内部属性)中发现的Bugs的数量来定义软件系统(产品的一种外部属性)的质量;这样看来,我们度量外部属性需要使用内部属性。

外部属性和内部属性是相关的;同样直接和间接属性也是相关的。从我们的定义中   我们可以看出内部属性是可以直接度量出来的。正如我们在前面曾经指出过这并不排除使用间接度量方法可以获得更精确的度量。需要指出的是,外部属性不能直接加以度量。

2、度量、预测和模型的概念:

在此,有必要区别一下度量、预测和模型这几个概念。 当我们谈到想进行度量的时候,我们是说想评价某个实体已存在的属性。但是,在很多情况下,我们可能也想对实体的某一个尚未存在的属性进行预测。例如:尽管我们只能在软件可以操作、运行之后才能真正对软件的可靠性进行估计;但事实上,在我们开发的过程中我们总是试图根据我们对系统的已有的理解来估计其可能的可靠性。

为了更好地区别与度量有关的这几个概念,需要给出下面这个定义:模型是一个实体的抽象表示。这个定义很抽象,存在很多种模型。软件度量感兴趣的模型有以下两种不同类型:

1。是不同产品或过程或资源的抽象表示的模型。为了明确的定义度量我们需要使用这些模型。这些模型必须针对我们要度量的属性构造。例如:源代码的流程图模型包含有与程序的控制结构有关的属性。值得注意的是即使是定义一个象程序源代码的长度这样看起来非常简单明了的属性,我们仍需要一个正式的程序源代码模型。

2。是不同的实体之间的关系的抽象表示的模型。这种模型通常用一个数学公式表示两个或两个以上的属性之间的关系。事实上间接度量使用的就是这种模型。

这里举一个很简单的例子:m = x / a

其中,X是一个变量,表示的是对源程序代码长度的度量(LOC);而M是源程序代码页数的度量,a是一个常量。

这样的一个模型进行估计的程度,与解决一个预测问题相反,主要依赖于我们对这个模型的参数的了解程度。在上面这个例子中,假设在某一特定的环境中a为55。如果某一已知程序的X也知道;用这个公式去计算代码页数时我们并不能说用这个间接度量的公式真正解决了一个预测问题。但是,如果我们只知道程序的规格说明书,而又想知道最后完成时整个程序大概有多少页,这时,我们就可以使用这个公式来解决这个预测问题。在真正情况下,我们将需要一个预测程序,然后根据我们对程序的规格的理解来决定未知的X的值,最后得出M的值。

这个简单的例子表明对软件度量中有关的模型很重要的一点:模型自己本身是不足以   完成所需的预测的。我们也需要一些方法来给定模型的参数;另外还需要一个步骤来解释所得到的结果。LittleWood为此曾给出如下定义:

预测系统是由数学模型,和一组对未知参数进行预测的步骤,和一个解释得到的结果   的步骤组成的。

使用相同的模型,如果使用的预测步骤不同,得到的结果也将是不同的。