1
 软件工程
1.10.2.1 8.2.1 软件度量

8.2.1 软件度量

合理的计划是建立在对要完成的工作做出一个比较符合实际的估计,以及为完成该工作建立一些必要的、约定的基础上,而估算的基础是软件的度量。软件度量是一个对软件性质及其规格的量化测度,量化是管理的一个重要手段和基础,只有通过量化,才能深刻地了解所研究的对象。

1.软件度量的困难

估计实现软件所要求的工作量是一件很困难的事情,这是由软件本身所固有的复杂性和不可见性所决定的。对于传统的工程项目而言,要创建的系统可能与先前构造的系统类似,这类项目的估计可以借鉴先前的经验。而在多数情况下,软件产品是该领域中创新的、唯一的,则往往缺乏同类项目的经验,使项目的估计充满了不确定性。另外,估计人员的主观特性和开发组中的角色因素也会对估计产生直接影响。

2.软件的范围

软件项目计划的第一项活动就是确定软件的范围。应当从管理角度和技术角度出发,确定明确的和可理解的项目范围,明确地给出定量的数据(如同时使用该软件的用户数目、发送表格的长短、最大允许响应时间等),指明约束条件和限制(如存储容量)。此外,还要叙述某些质量因素(如给出的算法是否容易理解、是否使用高级语言等)。

软件范围包括功能、性能、限制、接口和可靠性。在估算开始之前,应对软件的功能进行评价,并对其进行适当的细化以便提供更详细的细节。由于成本和进度的估算都与功能有关,因此常常采用某种程度的功能分解。性能方面应考虑处理时间和响应时间的需求。约束条件则标识外部硬件、可用存储容量或其他现有系统对软件的限制。

功能、性能和约束必须在一起进行评价。当性能限制不同时,为实现同样的功能,开发工作量可能相差一个数量级。功能、性能和约束是密切联系在一起的。

3.度量的方法

有效的度量应该满足以下的属性:

(1)简单且可以计算;

(2)结果是客观的非二义性;

(3)经验和直觉上有说服力;

(4)单位和维度的使用是一致的;

(5)独立于编程语言;

(6)能提供影响高质量产品的信息。

按照度量所使用的方法和侧重点,可以分为如下几类。

1)直接度量

软件工程过程的直接度量包括所投入的成本和工作量,侧重于理解和控制当前项目的情况和状态,如针对软件生产率的度量主要关注的是软件工程过程的结果,直接度量的参数一般包括代码行数、执行速度、在某段时间内所报告的错误数、花费的成本、文档的页数等。

2)间接度量

产品的间接度量包括功能性、复杂性、效率、可靠性、可维护性和许多其他的质量特性,它们很难用直接度量判明,只有通过间接度量才能推断。间接度量包括功能点、复杂度、生产率、正确性、可维护性、完整性、可使用性、错误排除率等。

3)面向规模的度量

面向规模的度量是对软件和软件开发过程的直接度量。只要事先建立特定的度量规程,才能很容易做到直接度量开发软件所需的成本和工作量、产生的代码行数等。如可以建立一个如表8-1所示的面向规模的度量,记录过去几年完成的每一个软件项目和关于这些项目的相应面向规模的数据。

表8-1中,PM表示工作量,KLOC表示代码行数(千行计数)。对于每一个项目,可以根据表格中列出的基本数据进行一些简单的面向规模的生产率和质量的度量。例如,可以根据表8-1对所有的项目计算出平均值,即

表8-1 面向规模的度量

img138

生产率=规模/工作量 平均成本=总成本/规模

质量=错误数/规模 平均文档=文档页数/规模

如果项目负责人已经正确地估计了新项目的KLOC,然后使用该项目开发组的原来平均生产率就可以估算出完成该项目所需的工作量等数据,但由于项目复杂度的不同,这种估计方法往往与实际工作量有一定的差距。

4)面向功能的度量

面向功能的软件度量是对软件和软件开发过程的间接度量。面向功能度量的关注点在于程序的“功能性”和“实用性”,而不是对KLOC计数,该方法利用软件信息域中的一些计数度量和软件复杂性估计的经验关系式而导出功能点FPs(Function Points)。

度量功能点的常用的项目包括以下几项。

(1)用户输入数:各个用户输入是面向不同应用的输入数据,对它们都要进行计数。输入数据应有别于查询数据,它们应分别计数。

(2)用户输出数:各个用户输出是为用户提供的面向应用的输出信息,它们均应计数。这里的输出是指报告、屏幕信息、错误信息等,在报告中的各数据项不应再分别计数。

(3)用户查询数:查询是一种联机输入,它导致软件以联机输出的方式生成某种即时的响应。每一个不同的查询都要计数。

(4)文件数:每一个逻辑主文件都应计数。这里的逻辑主文件,是指逻辑上的一组数据,它们可以是一个大的数据库的一部分,也可以是一个单独的文件。

(5)外部接口数:对所有被用于将信息传送到另一个系统中的计算机可读/写的接口(磁带或磁盘上的数据文件)均应计数。

一旦收集到上述数据,就可以统计出软件的总计数:对每一个计数乘以表示该计数复杂程度的加权因子再求和来得到。评定每个加权的尺度为0~5:

0—没有影响;1—极轻影响;2—轻影响;3—普通影响;4—重要影响;5—极重要影响。

软件的功能点使用的关系式为

FPs=总计数×[a+b×SUM(Fi)]

其中,总计数是软件的总计数;Fi(i∈[1,14])是复杂性校正值,它们应通过逐一回答表8-2中所提的问题来确定;SUM(Fi)是求和函数;常数a和应用于信息域计数的加权因数b可以依据经验进行选择(如a=0.65,b=0.01)。

表8-2 计算功能点的校正值

img139

功能点度量是为了商用信息系统应用而设计的。事实上,以上内容并非固定不变。例如,对某些算法复杂的应用问题,就应该对新的软件特征“算法”进行计数。因而,必须根据实际应用情况来决定功能点的度量方式,并进行计算。

针对这种情况,Jones将其扩充,提出在功能点度量的基础上,增加对软件“算法”特征的计数,其中算法可以定义为“在一个特定计算机程序内所包含的一个有界的计算问题”。如矩阵求逆、二进制位串转换为十进制数、处理一个中断等都是算法,并称为特征点,它适合于实时处理、过程控制、嵌入式软件应用等算法复杂性高的应用。必须注意,特征点与功能点表示的是同一件事:由软件提供的“功能性”或“实用性”。事实上,对于传统的工程计算或信息系统应用,两种度量会得出相同的FP值。在较复杂的实时系统中,特征点计数常常比只用功能点确定的计数高出20%~35%。

5)软件质量的度量

质量度量贯穿于软件工程的全过程及软件交付用户使用之后。在软件交付之前得到的度量提供了一个定量的根据,以做出设计和测试质量好坏的判断。这一类度量包括程序复杂性、有效的模块性和总的程序规模。在软件交付之后的度量则把注意力集中于还未发现的差错数和系统的可维护性方面。特别要强调的是,软件质量的售后度量可向管理者和技术人员表明软件工程过程的有效性达到什么程度。它包括以下几个特点。

(1)正确性:正确性的度量是时间周期,通常的度量是1年的每千代码行(KLOC)的差错数,其中将差错定义为已被证实是不符合需求的缺陷。

(2)可维护性:当发现程序中的错误时,要能够很容易地修正它;当程序的环境发生变化时,要能够很容易地适应它;当用户希望变更需求时,要能够很容易地增强它。可维护性的度量称为平均变更等待时间(Mean Time To Change,MTTC)。这个时间从开始分析变更要求到发送给所有的用户所需的时间。

(3)完整性:完整性度量是一个系统抗拒对它的安全性攻击(事故的和人为的)的能力。为了度量完整性,需要定义两个附加的属性:危险性和安全性。危险性是特定类型攻击在一给定时间内发生的概率,安全性是排除特定类型攻击的概率,可以估计或从经验数据中导出。一个系统的完整性可定义为

完整性=∑[1-危险性×(1-安全性)]

其中,对每一个攻击的危险性和安全性都进行累加。

(4)可使用性:包括学习系统所需的体力和智力的要求,熟练使用系统所需的学习时间,用户对系统友好性的评价。

(5)错误排除率:错误排除率是对质量的过滤能力的一个测量。系统的错误排除率可定义为

E/(E+D)

其中,E表示某软件活动(或工程活动)中所发现的错误数,D表示该软件活动(或工程活动)中未能发现的错误却在接下来的软件活动(或工程活动)中被发现的错误数。