8.2 软件项目度量
软件项目度量
软件项目度量的目的
-
在物理学界,有一个说法是,当你能够度量你所说的事物,并能用数字表达它时,你就对它有了一定了解;
反之,如果不能测量他,也不能用数字表达,就说明你对它的了解还不深入,不能令人满意。
-
软件工程界也接受了这样的观点。
-
软件项目管理的成熟化也需要度量与数字化,目的是持续改进软件过程,并用于项目估算、质量控制、生产率评估等,并在项目过程中起到辅助决策的作用。
软件项目度量的内容
1、生产率度量
-
项目工作量
-
项目周期
-
项目成本
2、质量度量
-
产品发布之前发现的缺陷数
-
产品发布后用户报告的缺陷数
-
产品的运行速度
软件项目度量的方法
- 面向规模的度量(常用)
- 面向功能点的度量(常用)
- 面向对象的度量
- 面向用例的度量
面向规模的度量
通过对质量和(或)生产率的测量进行规范化而得到的,这些测量是根据开发过的软件的规模得到的。
-
L表示代码总量(单位:KLOC),E表示软件工作量(单位:人月)
- 人月的意思是指一个人做一个月,是项目参与人数与工作月数的成绩,2个人做一个月是2个人月,1个人做两个月也是2个人月
-
S为软件项目总开销,Ne表示代码出错的行数,Pd表示文档页数
-
千行代码( KLOC ): 这些代码指的是源代码,通过源代码的行数来直观度量一个软件程序有多大规模。千行代码就是指一千行程序语句。
-
生产率(PM):PM = L / E
-
每千行代码的平均成本( CKL ):CKL = S / L 单位可以是任何货币单位,如元、万元等
-
代码出错率(EQRl):EQRl = Ne / L
-
文档与代码比(Dl):Dl = Pd / L
示例
以项目A为例:
- 生产率(PM)= 12.1/24 = 0.51人月;
- 每千行代码的平均成本( CKL )= 168/12.1=13.9;
- 代码出错率(EQRl)=134/12.1= 11.1
- 文档与代码比(Dl)=29/12.1=2.4
面向规模的度量优缺点
优点
- 简单易行,自然直观。
- 是因为LOC是软件开发的输出,并且容易计算,且现有很多软件估算模型都是使用LOC或KLOC作为关键输入。
缺点
- 依赖于程序设计语言的表达能力和功能
- 同一个软件功能,采用不同程序语言开发会有不同的代码行数;
- 软件开发初期很难估算出最终软件的代码行数
- 对精巧的软件项目不合适
- 比如有些需要高级数学能力的算法虽然代码行不多,但其难度很大,工作量、时间和成本都不是能简单用代码行数可以判断的。
面向功能的度量
面向功能的度量概念
- 基本思想:用软件的功能表示软件的规模——软件包含的功能越多,软件的规模越大。
- 面向规模的度量是以代码行作为度量软件规模的基本单元,而功能点法以功能点作为度量软件规模的基本单元。
- 应用最广泛的是功能点(Function Point, FP)法
- 由于是以功能点作为度量依据,这种方法容易在项目开发初期就可估算出
- 功能点计算目前主要基于经验公式
功能点计算方法
- FP = UFC×TCF = UFC × (0.65 + 0.01× ΣFi)
- UFC (Unadjusted Function Component) : 未调整功能点计数, 是5个信息量的“加权和”
- TCF (Technical Complexity Factor): 技术复杂度因子
- Fi: 14个因素的“复杂性调节值” (i =1..14)
- 0.65, 0.01都是历史数据总结的经验常数,现在由国际组织根据大量项目跟踪分析获得。
- TCF=0.65 + 0.01×ΣFi,其中Fi: 14个因素的“复杂性调节值” (i =1..14)。0.65, 0.01是根据经验常数。需要注意的是,这里的功能点不是指的软件需求分析文档里面定义的软件功能,比如一个登录功能或者一个订单管理功能,而是一个软件规模的计量单位,一个登录功能可能有4个功能点计数,一个订单管理功能可能有40个功能点计数。
UFC相关的五类组件
内部逻辑文件(ILF, Internal Logical Files )
-
一个用户可识别的逻辑相关的数据组,它在应用程序边界内,由用户输入来维护
-
它可能是某个大型数据库的一部分或是一个独立的文件
- 之所以叫内部逻辑文件,一方面表示它是文件形式,比如数据库表
- 另一方面表示它是所开发系统中的文件,比如是一个学生管理系统中的Student表,而不是后勤管理系统中的某个数据库表。
外部接口文件(EIF, External Interface Files)
-
一个用户可识别的逻辑相关的数据组,但只能被引用,且数据完全存于软件外部,由另一个应用程序进行维护
-
是机器可读的全部接口(如磁盘或磁带上的数据文件)
-
是另一个应用程序的内部逻辑文件
- 正好和内部逻辑文件ILF相反,这类文件存在于所开发的软件系统外部,通过接口访问,比如学生管理系统通过接口访问了后勤管理系统中的校车时刻表。
外部输入(EI, External Input)
-
来自于软件外部的数据输入
-
控制信息(不更新ILF) / 业务逻辑信息(更新ILF)
-
可来自于一个数据输入屏幕或其他应用程序。
-
典型的操作是通过系统向数据库表新增一条记录,但这个新增记录可能来自于人通过界面手动录入的,也可能是通过程序导入到系统中的。
外部输出(EO, External Output)
-
经过处理的数据,由程序内部输出到外部
-
从ILF、EIF中取出数据经过一定的组合、计算后得出的输出数据, 如生成报表, 派生数据, 可能更新ILF
用户查询(EQ, External Query)
-
一个输入输出的组合过程,从一个或多个ILF、EIF中取出数据输出到程序外部
-
输入过程不更新ILF,输出过程不进行任何数据处理
UFC相关的五类组件
-
EI:External Input(外部输入)
-
EO:External Output (外部输出)
-
EQ:External Query (外部查询)
-
ILF:Internal Logical File (内部逻辑文件)
-
EIF:External Interface File (外部逻辑文件)
-
此外,ILF和EIF也称为逻辑信息存储组件,EI、EO、EQ统称为事务组件。
功能组件复杂度加权因子表
UFC的计算方法
▪外部输入EI数×加权因子(简单=3,平均=4,复杂=6)
▪外部输出EO数×加权因子(简单=4,平均=5,复杂=7)
▪外部查询EQ数×加权因子(简单=3,平均=4,复杂=6)
▪内部逻辑文件ILF数×加权因子(简单=7,平均=10,复杂=15)
▪外部接口EIF数×加权因子(简单=5,平均=7,复杂=10)
UFC = 上述计算值的总和(加权和)
例子
- 假设每个功能要素的复杂度都是中等的。
- 若有一个由25个数据登记表、15个报告、10个外部查询、 20个逻辑内部表单和5个接口文件组成的学生管理系统,其未调整功能点计数为:
- UFC =(25x4) +(15x5)+(10x4)+(20x10)+ (5x7) = 450(个功能点)
14个复杂性调节因素Fi
面向功能的度量优缺点
优点
- 与程序设计语言无关, 在开发前就可以估算出软件项目的规模
不足
-
没有直接涉及算法的复杂度,不适合算法比较复杂的软件系统;
-
功能点计算主要靠经验公式,主观因素比较多
面向功能的度量:和代码行的转换
一个功能点所需的代码行粗略估算
针对面向规模的度量和面向功能的度量,根据不同编程语言,人们总结了一个映射表,粗略估算了在不同编程语言环境下一个功能点所需的代码行,并定义了低值、高值、中值和平均值。从这个表也能看出来不同程序语言间代码数量比例关系。也能利用这个表进行面向规模的度量和面向功能的度量这两个度量方法之间的转换。