当前位置:首页 > 软件项目的规模、工作量和成本是如何进行估算的
软件项目的规模、工作量和成本是如何进行估算的 2010-08-23 来源:网络 1. 基于代码行和功能点的估算 软件项目的规模是影响软件项目成本和工作量的主要因素。在基于代码行(loc,line of code)和功能点(function point)的估算方法中,利用代码行和功能点来表示软件系统的规模,并通过对软件项目规模的估算进而来估算软件项目的成本和工作量。 显然,一个软件项目的代码行数目越多,它的规模也就越大。软件代码行的数目易于度量,许多软件开发组织和项目组都保留有以往软件项目代码行数目的记录,这有助于在以往类似软件项目代码行记录的基础上对当前软件项目的规模进行估算。 用代码行的数目来表示软件项目的规模简单易行,自然、直观且易于度量。但是其缺点也非常明显。在软件开发初期很难估算出最终软件系统的代码行数;软件项目代码行的数目通常依赖于程序设计语言的功能和表达能力;采用代码行的估算方法会对那些设计精巧的软件项目产生不利的影响;该方法只适合于过程式程序设计语言,不适合于非过程式程序设计语言(如函数式或者逻辑语言)。 针对上述问题,人们提出用软件系统的功能数目来表示软件系统的规模。1979年ibm的albrecht提出了计算功能点的方法。该方法需要对软件系统的二个方面进行评估,即评估软件系统所需的内部基本功能和外部基本功能,然后根据技术复杂度因子对这二个方面的评估结果进行加权量化,产生软件系统功能点数目的具体计算值。具体的,以下是软件系统功能点的计算公式。 fp = ct× (0.65 + 0.01×sfi) (i=1..14) 其中,ct是5个信息量的“加权和”,fi是14个因素的“复杂性调节值”(i =1..14),0.65和0.01是经验常数。 ct的计算方法如表 3所示,ct =(简单用户输入数×3 +一般用户输入数×4+复杂用户输入数×6)+(简单用户输出数×4+一般用户输出数×5+复杂用户输出数×7)+(简单用户查询数×3+一般用户查询数×4+复杂用户查询数×6)+(简单文件数×7+一般文件数×10+复杂文件数×15)+(简单外部界面数×5+一般外部界面数×7+复杂外部界面数×10)。其中,用户输入数是指由用户提供的、用来输入的应用数据项的数目;用户输出数是指软件系统为用户提供的、向用户输出的应用数据项的数目;用户查询数是指要求回答的交互式输入的项;文件数是指系统中主文件的数目;外部界面数是指机器可读的文件数目(如磁盘或者磁带中的数据文件)。 表 3. ct值的加权计算 参数\\取值\\加权 简单 一般 ′4 ′5 加权因子 复杂 ′6 ′7 最终值 用户输入数 ′3 用户输出数 ′4 用户查询数 ′3 文件数 ′7 ′4 ′10 ′7 ′6 ′15 ′10 外部界面数 ′5 ct= fi(i=1..14)14个因素的“复杂性调节值”取值见表 4。 表 4. fi的取值表 序号i f1 f2 f3 f4 f5 f6 f7 f8 f9 系统需要可靠的备份和复原码 系统需要数据通信吗 系统有分布处理功能吗 性能是临界状态吗 问题 fi的取值(0,1,2,3,4,5) 0-没有影响 1-偶有影响 2-轻微影响 平均影响 系统是否在一个实用的操作系统下运行 系统需要联机数据项吗 联机数据项是否在多屏幕或多操作之间进行切换 需要联机更新主文件吗 输入、输出、查询和文件很复杂吗 4-较大影响 5-严重影响 f10 内部处理复杂吗 f11 代码需要被设计成可重用吗 f12 设计中需要包括转换和安装吗 f13 系统的设计支持不同组织的多次安装吗 f14 应用的设计方便用户修改和使用吗 例如,假设项目组要开发一个软件项目a。根据用户的需求描述,该软件项目的ct取值如表 5所示。进一步的,假设该软件项目的14个复杂性调节值全部取平均程度。那么根据表 5可知,该软件项目的ct=341,14个复杂性调节因素的累加值sfi=42,因而根据公式fp = ct× (0.65 + 0.01×sfi) (i=1..14)可知,该软件项目的功能点fp=341× (0.65 + 0.01×42) = 364.87,即该项目的功能点数目大致为364。 表 5. 软件项目a的ct值 参数\\取值\\加权因子 加权 用户输入数 用户输出数 用户查询数 文件数 外部界面数 ct= 简单 6′3 7′4 2′3 0′7 2′5 一般 2′4 6′5 0′4 3′10 3′7 复杂 5′6 5′7 5′6 3′15 4′10 最终值 56 103 36 75 71 341 用功能点来表示软件项目规模的好处是:软件系统的功能与实现该软件系统的语言和技术无关,而且在软件开发的早期阶段(如需求分析)就可通过对用户需求的理解获得软件系统的功能点数目,因而该方法可以较好地克服基于代码行软件项目规模表示方法的不足。其不足主要体现在:该方法没有直接涉及算法的复杂度,不适合算法比较复杂的软件系统;功能点计算主要靠经验公式,主观因素比较多;此外计算功能点所需的数据不好采集。 大量的实践表明:针对特定的程序设计语言,软件系统的功能点和代码行二者之间存在某种对应关系(如表 6所示)。根据该表的数据,一个功能点如果用汇编语言来实现大约需要320行代码,如果用c语言来实现大约需要150行代码,如果用smalltalk语言来实现大约需要21行代码。从另一个角度上看,该表反映了不同程序设计语言的描述能力是不一样的。 表 6. 功能点和代码行之间的转换表 序号 1 2 3 4 5 6 7 8 9 10 程序设计语言 汇编语言 c cobol fottran pascal ada pl/1 prolog/lisp smalltalk 代码生成器 代码行/功能点 320 150 105 105 91 71 65 64 21 15 假设用l表示软件系统的规模(或者用loc表示,或者用fp来表示)。针对一个具体的软件项目,可以采用自顶向下或者自底向上等多种方式来估算出软件项目规模的乐观值a、悲观值b和一般值m,然后根据以下公式估算出软件项目规模的期望值e: e = (a + 4′m + b)/6 根据软件项目规模的期望值e以及下列公式,就可以估算出软件项目的成本和工作量。 生产率 pm = l / e
其中,l表示软件项目的规模(单位:loc或者fp),e表示软件工作量(单位:人月),pm表示单个人月能够生产的功能点或者代码行数。 平均成本 ckl = s / l
其中,s为软件项目总开销,l表示软件项目的规模(单位:loc或者fp), ckl表示每行代码或者每个功能点的平均成本。
对于一个特定的软件开发组织或者项目组而言,其软件生产率和平均成本在不同的软件项目实施中可能是比较稳定的。如果有以往软件项目的历史信息,可以很容易地获得关于软件开发组织或者项目组的pm和ckl值。因此,一旦估算出了软件项目的规模,获得了软件开发组织或者项目组的pm和ckl的值,就可根据公式ckl = s / l计算出软件项目的成本s = ckl′ l,也可根据公式pm = l / e计算出软件项目的工作量e= l / pm。
例如,假设项目组要开发一个软件项目a,经过估算该项目的规模是364个功能点。进一步的,根据以往的历史数据,该项目组软件开发的生产率是8fp/人月,每个功能点的平均成本为12000元人民币,那么该软件项目的开发成本s = 6800元人民币′ 364 = 247,5200元人民币,工作量为e= 364/ 8 = 45.5人月。 基于经验模型的估算
基于经验模型的估算根据以往软件项目实施的经验数据(如成本、工作量和进度等)建立相应的估算模型,并以此为基础对软件项目开发的有关属性进行估算。构造性成本模型cocomo(constructive cost model)是目前应用最为广泛的经验模型之一。
在二十世纪七十年代后期,boehm对多达63个软件项目的经验数据进行了分析和研究,在此基础上于1981年提出了cocomo模型用于对软件项目的规模、成本、进度等方面进行估算。boehm把cocomo模型分为基本、中间和详细三个层次,分别支持软件开发的三个不同阶段。基本cocomo模型用于估算整个软件系统开发所需的工作量和开发时间,适合于软件系统开发的初期。中间层次的cocomo模型用于估算各个子系统的工作量和开发时间,适合在获得各个子系统信息之后对软件项目的估算。详细层次的cocomo模型用于估算独立的软构件,适合在获得各个软构件信息之后对软件项目的估算。由于篇幅限制,本书仅介绍基本cocomo模型,其模型形式描述如下。
e = a * (kloc)b 。其中e是软件系统的工作量(单位:人月) ,a和b是经验常数,其取值见表 7,kloc是软件系统的规模(单位:千行代码)。该公式描述了软件系统的规模与工作量之间的关系。 d = c * ed。其中d是开发时间(单位:月),c和d是经验常数,其取值见表 7。该公式描述了
共分享92篇相关文档