一、什么是功能点估算
功能点估算最早在1979年由IBM提出,人为设计的度量方式,主要是对项目工作量进行估计。功能点估算法方法是一种估算软件项目大小的方法,它是从用户视角出发,通过量化系统功能来度量软件的规模,这种度量主要基于系统的逻辑设计,并且基于客观外部应用接口和主观的内部应用复杂度以及总体的系统性能特征,对软件功能规模进行间接定量估算。估算内容包括外部输出数、外部输入数、文件数、外部接口和用户查询数等方面。这里说它是一种间接度量,是相较于另一种估算方法,即代码行估算法(LOC)。前者是从用户需求角度出发,关注软件程序的“功能性”和“实用性”,而不是LOC的技术上,这种用户功能需求便于理解,不是从技术角度的代码行出发去直接评估。
下表为二者的主要区别和联系:
功能点估算法(FP) | 代码行估算法(LOC) |
|
|
图 1 FP与LOC区别
功能点估算适用于三种项目类型,分别是新开发项目、二次开发项目、功能增强项目。对于不同的项目类型,在最后计算功能点数时采用的计算公式会有差异和调整,主要是考虑到项目开发时不仅有功能的开发还有部分现有系统数据整合等工作量。
二、功能点估算方法的思路
用户需求分为功能性需求和非功能性需求,功能点的估算方法有IFPUG、NESMA、SNAP等,IFPUG 和NESMA用来估算功能性用户需求的规模;而SNAP用来估算非功能性用户需求的规模.。NESMA估算法更多的在项目前期,可以快速的利用逻辑文件,给出预估的功能点数量,起到较好的指导作用。NESMA估算法有三种类型的功能点估算,包括:指示功能点计数、估算功能点计数、详细功能点计数;分别对应项目的前期,中后期的功能点估算需求,同时估算出来的功能点也是越来越细化和精准。当然操作难度和复杂度也是越来越高。
对于一般性的产品而言,主要是使用前两种(指示功能点计数、估算功能点计数)估算方法即可,两种方法的主要区别就在于计算公式的不同,一个粗放,一个则较精细,两种都可以使用,可以根据自身项目的具体要求和所处阶段来进行选择。指示功能点计数:ILF*35+EIF *15;估算功能点计数:UFP=(7* ILF+5* EIL+4* EI+5* EO+4* EQ)。
估算软件开发成本的总体思路是:
选用合适的估算法估算软件规模。估算法的选择,可以考虑是在项目的阶段以及需求文档的明细程度。主要有4种:
A、NESMA快速估算,项目早期,需求不明确,文档不全。
B、NESMA估算,项目中期,需求清晰,文档较全。
C、NESMA详细估算,项目完全,需求完成,文档完备。
D、IFPUG估算。
- 计算工作量。工作量=规模/生产率。
- 计算开发成本。基于工作量和成本单价计算开发总成本。
三、功能点估算步骤(IFPUG标准)
功能点估算大致可以分为7个步骤或阶段,分别是:
图 2 估算步骤
其中,最核心的是分解功能需求和确定加权因子,功能分解需要识别不同的功能单元类型。确定加权因子,需要给不同单元类型赋权重值。确定该功能的复杂度和难度。
1、确定功能需求
用户功能需求是用户需求子集,表示软件应实现的用户业务活动和过程。用户功能需求不包括质量需求和用户软件开发、维护、支持和执行的技术以及环境相关要求。一般,会根据拟签订的合同或技术协议等要求来确定用户的功能需求。这里值得一提的是,我们的估算对象是软件的功能性需求,即用户要这个系统做什么,实现什么功能或解决什么业务问题。
2、分解功能需求
分解功能需求,需要首先了解两类功能类型,数据功能和事务功能。数据功能就是我们可见的数据或信息,比如表、字典等等;事务功能,就是逻辑上的一组操作(SQL语句等),是一组执行过程。具体的功能类型类别有:
图 3 功能类型
以下我们分别介绍5种功能单元类型。
- 内部逻辑文件(ILF):用户可确认的一组在软件内部维护的逻辑相关的数据或控制信息。内部逻辑文件的主要用途是通过本软件的一个或更多的基本过程来控制数据。
- 外部接口文件(EIF): 用户可确认的一组由本软件引用但由其他软件维护的逻辑相关的数据或控制信息。外部接口文件的主要用途是通过本软件的一个或更多的基本过程来控制数据引用,即一个软件的外部接口文件应是另一个软件的内部逻辑文件。
- 外部输入(EI) :一个对来自本软件边界以外的数据或控制信息进行处理的基本过程。外部输入的主要用途是维护一个或更多的内部逻辑文件和(或)改变系统的行为。
- 外部输出(EO) :一个向本软件边界外发送数据或控制信息的基本过程。外部输出的主要用途是通过处理逻辑或者通过数据或控制信息的检索给用户提供信息。该处理过程应至少包含一个数学公式或计算,产生导出数据,维护一个或多个内部逻辑文件,或改变系统的行为。
- 外部查询(EQ) :一个向本软件边界外发送数据或控制信息的基本过程。外部查询的主要用途是通过外部接口文件中的内部逻辑文件进行数据或控制信息的检索,给用户提供信息。这一处理逻辑不包含数学公式或计算,不产生导出数据,该处理过程既不维护内部逻辑文件也不改变系统行为。
上述5类功能单元类型,可以简单理解如下:
1)ILF内部维护的逻辑数据(平面文件或关系型数据库中的表),EIF是外部维护,内部调用数据。
2)EI主要目的是维护内部数据或改变应用程序属性行为(比如增删改操作)
3)EO EQ主要目的是向用户呈现数据和信息,EO是通过逻辑处理方式(至少含一个计算公式),EQ是通过直接输入输出简单查询方式(简单的输入引出即时的输出反馈)。
下面通过一个例子进行更具体说明,比如一个公司的员工管理系统,包含有员工基本信息、部门组织信息。每个文件中都有一些字段属性值,这些内部逻辑文件就是ILF,是员工系统中需要维护的数据。另外,员工的工资信息是在财务系统中,员工管理系统会调用工资信息,这个就是EIF外部接口文件。表示的是外部系统维护但是我内部的系统需要调用的数据。最下面,是系统的部分用例,分为外部输入过程、外部输出过程和外部查询过程。外部输入比如员工信息和部门信息的增删改,维护内部数据更新的过程。外部输出比如统计员工人数、员工的部门信息导出等,涉及到的是改变系统行为或是通过逻辑处理(计算)方式对外提供数据的过程。外部查询就比较简单,比如用户查询用户id即时反馈输出的过程。
图 4功能需求分解
3、确定加权因子
根据功能单元的功能复杂程度确定其功能复杂度。功能复杂度按照高(H) 、平均(A) 或低(L)进行划分。功能复杂度高、中、低分别对应不同的功能单元加权因子取值,也就是功能点个数值。
功能单元类型 | 功能复杂度 | ||
低(L) | 平均(A) | 高(H) | |
内部逻辑文件(ILF) | 7 | 10 | 15 |
外部接口文件(EIF) | 5 | 7 | 10 |
外部输入(EI) | 3 | 4 | 6 |
外部输出(EO) | 4 | 5 | 7 |
外部查询(EQ) | 3 | 4 | 6 |
图 5 功能复杂度对照表
功能单元的加权因子,是由某一功能单元涉及的数据元素类型数(DETs) 和记录元素类型数(RETs) 或引用文件类型数(FTRs) 共同决定。其中:
a) 数据元素类型(DET) :唯一的、用户可识别的、非重复的字段:
b) 记录元素类型(RET) :用户可识别的内部逻辑文件或者外部接口文件中的一个数据元素子集:
c) 引用文件类型(FTR) :被处理事务所读写或读取的文件,应是内部逻辑文件或外部接口文件。
这三种类型的取值可以大致理解为:
1)逻辑文件中DET取值大致对应逻辑文件的用户可见数据项个数;RET可理解为数据元素子集,取值大致对应逻辑文件实体个数。
2)在基本过程中,FTR取值大致对应基本过程访问的逻辑文件数;DET取值大致对应基本过程访问的用户可见字段数。
下面,我们仍以员工管理系统为例,可以估算该系统的5中功能单元的复杂度以及对应的加权因子(功能点个数)。
图 6 加权因子确定
4、计算未调整功能点数(UFP)
这一步就是求加权和。分别将外部输入EI、外部输出EO、外部查询EQ、内部逻辑文件ILF、外部接口文件EIF的个数和分别与之对应的加权因子相乘,然后求和,结果即为未调整功能点数(UFP),计算公式为:
图 7 UFP计算公式
5、确定调整因子
功能点的调整系数是通过通用系统特性及其影响程度来评定。常用的通用系统特征主要是以下14类,但是并不仅限于这些。
a) 数据通信:描述软件直接同处理器进行通信的程度:
b) 分布式数据处理:描述软件的各部件间数据传输的程度:
c) 性能:描述响应时间和数据吞吐量对软件研制的影响程度:
d) 系统配置要求:描述计算机资源约束对软件研制的影响程度:
e) 事务率:描述事务处理率对软件研制的影响程度:
f) 在线数据输入:描述通过交互处理输入数据的程度:
g) 最终用户效率:描述对各种人为因素和最终用户易用性的考虑程度:
h) 在线更新: 描述内部逻辑文件被在线更新的程度:
j) 复杂处理:描述,处理逻辑对软件研制的影响程度:
j) 可重用性:描述经过专门设计、开发和支持的软件,可在其他软件中重用的程度:
k) 易安装性:描述软件在不同环境下转换和安装操作的简便程度:
J) 易操作性:描述软件在操作方面的满足程度,如:启动、备份和恢复过程:
m) 多工作场所:描述软件用于多个用户组织、多种场所的程度:
n) 易变更性:描述软件的数据结构和处理逻辑易于修改的程度。
对每个常规系统特性的评估由其影响程度(DI)而定,分为0-5级:通过给不同系统特征打分进行影响程度和重要性的评估。
0 毫无影响
1 偶然影响
2 适度影响
3 一般影响
4 重要影响
5 强烈影响
将所有系统特征影响度相加获得总影响程度,调整因子(VAF)的计算公式如下:
图 8 VAF计算公式
不同行业的不同规范文件中,对公式中的常数要求有所不同,有的是1.3 ,有的为1.0。这个根据要求进行调整即可。
6、计算功能点数
将未调整功能点数(UFP)和调整因子(VAF)相乘得到功能点数。
计算公式:PF=UFP*VAF。
说明:国际的IFPUG组织将软件项目分为新开发项目、二次开发项目、功能增强项目这三类,功能点估算法适用于任何一类项目,上述为功能点原始计算公式。根据不同类型项目、不用用户规范或不同使用场景,会有不同的公式变形。