王 颖,柳小军,郭继光
(中国电子科学研究院,北京 100041)
在软件项目管理中,软件评估的准确与否是关系着所制定的项目计划好坏的一个重要前提。而软件规模评估是软件评估中首要的也是最重要的尺度,软件规模评估是估算软件产品大小的过程,一旦确定了项目的规模,即可产生相应的开发进度表。但不准确的规模评估将导致项目预算和工作进度的较大偏差。因此,对软件项目如何进行准确的规模评估研究是一个重要而切实的问题。
软件度量(Software Measurement)是通过各种不同的量度(metric)对软件生命周期中的各个元素进行度量(Measure),它能够为项目管理者提供有关项目的各种重要信息,同时也是进行大多评估活动的基础。建立完整可行的软件度量体系,基于定量的度量和客观基准进行项目的管理和监控,已经被公认为是软件项目规范运作、成功执行的基本要求之一。正确地运用度量可以帮助项目经理更好地确定软件规模,规划资源投入,安排项目进度,核算工作量、评估产出质量及评价组织绩效。
软件产业最初的度量实践来自对软件规模的估算,自20 世纪80 年代,对软件规模测算的各种各样的方法就开始被提出来,例如:功能点分析(FPA,function points analysis)、代 码 行(LOC,lines of code)、德尔菲法(Delphi technique)、COCOMO 模型、特征点(feature point)、对象点(object point)、3-D功能点(3-D function points)、Bang 度量(DeMarco's bang metric)、模糊逻辑(fuzzy logic)和标准构件法(standard component)等,这些估算方法又会不断细化为更多具体的方法。
所提出的这些方法各有优缺点,专家法最简单易行,但误差最大,不适合开发商使用;代码行由于与开发语言有关,且误差也较大,对有经验的开发商有利,但对用户来说没法掌握;COCOMOII 模型测算的比较准,但是参数的取值比较困难,所以也不太适合用户评价;功能点分析法是在20 世纪70 年代中期,IBM 委托Allan Albrecht 工程师和他的一些同事为解决LOC 度量所产生的问题和局限性而研究发布的[1],随后被国际功能点用户协会(IFPUG,the international function point users' group)提出的IFPUG 方法继承,在国际软件行业范围得到一致接受和广泛应用。下面将探讨如何建立一种基于FPA的软件度量体系,并应用于软件项目管理。
IFPUG 功能点的分析计算基本过程为:(1)明确用户需求;(2)确定计算范围和应用程序边界;(3)确定基本功能要素及其复杂性,并转化为功能点;(4)确定调整因子值;(5)计算已调整功能点[2]。
功能点测量中的基本功能要素被分为两大类共五个功能要素。(1)数据类:内部逻辑文件ILF(Internal Logical Files)、外部接口文件EIF(External Interface Files);(2)事务类:外部输入EI(External Inputs)、外部输出EO(External Outputs)、外部查询EQ(External Queries)。数据类功能要素即每个ILF 和EIF 的复杂度由数据元素类型DET(Data Element Type)和记录元素类型RET(Record Element Type)决定。事务类功能要素即每个EI、EO、EQ 的复杂度由数据元素类型DET(Data Element Type)和引用文件类型FIR(File Types Referenced)决定。
功能点方法由5 个仅取决于需求规格说明的要素组成,并有自己特定的规则,所以它是能取得可重复和可跟踪结果的构造性方法。根据计算规则首先确定每个功能的分类及其功能复杂度,从而可以得到每个功能的权值,全部功能的权值相加就得到“未调整的功能点数”。“未调整的功能点数”还不能完整表现出系统的全部基本特征,功能点方法通过14 项系统基本特征进行调整,得到“已调整的功能点数”。
功能点分析法(FPA)认为整个项目的规模由信息处理规模、技术复杂度、功能点数FP 三部分构成。
(1)信息处理规模
依据标准可以计算出系统(或模块)中所含每一种元素的数目,乘以加权值(weight)的合计数即为信息处理规模,称为UAF(unadjusted function points)[3]。
每种描述权值对应的数据见表1。
表1 功能点权值表
计算关系式为
式中每项的计算分别是统计值和加权系数的累加,因此有
(2)技术复杂度
调整系数的值取决于14 个通用系统的特性,每个特性有相关的描述,以帮助确定系统特性的影响程度。影响程度的取值范围为0 ~5,即从没有影响到有强烈影响。对这些特性进行评估,可以得到对系统的调整系数VAF(value adjustment factor),调整系统的经验公式为
(3)计算功能点数
将功能点数乘以修订系数,则得到修订以后的功能点数为
一个应用系统的功能性是由一组事务类型和数据组类型来共同描述的。数据的概念是把数据元素看作是基本项。一个数据组的类型是应用系统存储的数据元素的集合,可以基于数据组类型中的数据元素定义子群,这个特征描述可以直接应用到IFPUG FPA 中。
参考COSMIC-FFP 子过程(Sub-process)的概念,可以使用7 类逻辑活动来描述事务类型,当然,这些逻辑活动是用于处理数据元素的。这7 类逻辑活动分别是:
输入(Entry)活动 用户向应用程序输入数据元素的过程。
输出(Exit)活动 将数据元素输出给用户的过程。
控制(Control)活动 用户输入控制信息数据元素的过程。
确认(Confirm)活动 确认数据元素输出给用户的过程。
读取(Read)活动 从一个存储数据集类型中读取数据元素的过程。
写入(Write)活动 将数据元素写入一个存储的数据集类型的过程。
计算(Calculate)活动 从一些现有的数据元素中计算新的数据元素的过程。
这7 类逻辑活动都可以通过FSM 方法的识别规则识别出来,然后使用这些逻辑活动可以描述识别出的数据元素。有了这些逻辑活动,可以定义:一个事务类型就是逻辑活动的一个集合。
一个应用程序理论上应包含一个事务类型的集合和一个数据组类型的集合。任何一种功能类型在其逻辑功能方面都是不同的,这种区别首先体现在第一步的抽象中,也就是说第一步的抽象是由其具体规则通过定义各自的功能点分析变量给出的。在表示FPA 变量及其属性时,以向量的形式来表示这种逻辑区别。因此,一个应用程序是一个功能类型的向量。
用一个由τ 个事务类型Ti和σ 个数据组类型Fj的向量来定义一个应用[4],有关FSM 方法的组件的具体定义如下。
定义1 一个应用程序H 的定义为:H =(T1,…,Tτ,F1,…,Fσ)。其中,事务类型Ti是由大量的逻辑活动组成,而与一个活动相关的解释是由下标加以区分的。
定义2 一个事务类型Ti定义为由一个由活动组成的向量,即Ti=(Pi1,…,Pin)。
一个活动是由以下4 个特性来刻画的。
(1)该活动所属的类别θik,即θik∈{Entry,Exit,Confirm,Read,Write,Calculate};
(2)对于活动Read 和Write,要注明所引用的数据组类型rik;
(3)该活动所处理的数据元素的集合Dik;
(4)对于Calculate 活动,要注明所计算出来的数据元素的集合Cik。
而一个活动的具体定义见定义3。
定义3 一个活动Pik就是一个由以上4 个特性组成的四元组,即Pik=(θik,rik,Dik,Cik)。
数据组类型实际上就是一个数据元素的集合。每个数据元素都属于一个确定的子群。一个数据组类型是由一个二元序偶的集合来描述的,而每个序偶是由一个数据元素及其所属的子群来描述的。具体的定义如定义4。
定义4 一个数据组类型Fj是一个由序偶组成的集合,即Fj={(dj1,gj1),…,(djr,gjr)}。其中:djk表示数据元素,而gik指定了djk所属的子群。
根据以上定义,可以用度量函数FPM 来表示有关功能规模的假设,即FPM(a)就是应用a 的功能规模,当然还可以测试有关FSM 度量的假设。例如,如果现在有2 个应用:a 和a′,假定应用a 的规模大于a′,即FPM(a)>FPM(a′)。基于这种假设,对于一个给定的应用,任何一种FSM 方法都可以根据事务和数据集进行抽象。
根据FPA 的数据模型可以看出,一个FPA 活动对应于通用模型中的一个以上的活动。具体的映射关系见表2,表中每种事务功能允许的活动用“√”标出。
表2 FPA 的事务功能和通用FSM 模型之间的映射关系
根据2.2 节中有关FSM 方法组件的描述,功能点分析(FPA,function point analysis)中的数据功能对应于数据组类型Fj,而数据元素类型(DET,data element type)对应于数据元素djk,参考文件类型(FTR,file type referenced)对应于该数据元素所属的子群。FPA 方法能够区分内部数据需求和外部数据需求,而通用FSM 抽象模型定义了7 类逻辑活动来区分这些需求。因此,认为外部接口文件(EIF,external interface file)就是不能在Write 活动中使用的一个数据类型。给出FPA 的抽象数据模型描述,具体描述如下。
根据以上描述可以定义一个度量函数FPC,即FPC(a)就是应用系统a 的功能规模,具体的描述如下。
WEIF、WILF、WEI、WEO和WEQ表示度量过程中根据相应功能要素的复杂度等级所得到的功能点数量,而其值的决定要素是DET 和FTR 或者DET 和RET 的数量。具体的取值范围为:WEIF={7,10,15},WILF={5,7,10},WEI=WEQ={3,4,6},WEO={4,5,7}[5]。
从计算方法来看,FPA 似乎只是在项目前期进行规模估算的一种工具,但以功能点为基本度量出发点,结合相关的度量体系,进行指标的设定、过程数据的收集和分析,则可以很好地辅助项目管理者作出决策,改善软件过程。这里将以某国家重点项目的规模估算和进度控制过程为例,讨论功能点分析法在项目管理中的应用。
步骤一:将系统的软件功能清单中列举的功能划入EI、EQ、EO、ILF、EIF 中,并计算相应的个数,划分结果见表3。
表3 功能点划分
步骤二:根据功能描述,大致确定各要素的复杂程度;确定处理和文件的功能点权值。
步骤三:未调整的功能点的计算。
步骤二、步骤三操作的结果见表4。
表4 功能点赋值表
步骤四:计算调整后的功能点。
为14 项系统基本特征赋值,这里为简单起见均赋值为4,即认为有很重要的影响,则
已调整功能点数= VAF* 未调整功能点数=1.21* 249 =301.29。
步骤五:根据功能点计算成本。
根据某科研单位软件开发人员的工资情况及项目的实际环境,取单位功能点成本为10000元,则该系统的软件成本为301.29* 10000=3012900 元。
通过以上应用实例证明,功能点估算方法简单、实用、可行性强,对于客户来说,可以不必理解功能的具体开发和实现过程,而根据功能的复杂度粗略估算出系统的规模,进而了解开发成本,能够建立开发者与顾客之间的信任关系,即开发者将用户的需求转化成要实现的功能,通过功能点的多少来衡量软件规模的大小。
功能点分析方法已将软件质量、生产率和经济分析构筑在坚实的经济学基础上,成为软件度量的基础。功能点方法是用户能够理解的度量方法,它可以在项目的早期准确度量软件的规模。通过借助一种通用的FSM 抽象数据模型,把该模型与功能点分析方法相结合,能够通过它,用户可以与软件开发企业达成确保项目成功的共识和期望,软件项目管理人员可以在软件的整个生命周期对它进行跟踪和管理,采取主动和量化的方式来处理软件项目中固有的问题,获得更精确的估量和更客观的评价。
[1]DAVID GARMUS,DAVID HERRON. 功能点分析-成功项目的测量实践[M].北京:清华大学出版社,2003.
[2]余方,李娟,王晓程,等. 功能点分析方法研究[J]. 计算机科学,2007,34(11):245-247.
[3]IFPUG(International Function Point Users Group).Function Point Counting Practices Manual-Release 4. 2[R].Westerville,2004.
[4]BRIAND L C,LABICHE Y,HE S.Automating Regression test Selection Based on UML Designs[J].Information and Software Technology,2009,51(1):16-30.
[5]CUADRADO-GALLEGO J J,MACHADO-PIRIZ F,AROBA-PAEZJ.On the Conversion Between IFPUG and COSMIC Software Functional Size Units:A Theoretical and Empirical study[J]. The Journal of Systems and Software,2008,81(5):661-672.