1
 软件工程
1.10.2.2 8.2.2 项目资源估算与成本分析

8.2.2 项目资源估算与成本分析

软件项目计划的第二个任务是对完成该软件项目所需的资源及开发成本进行估算。估算资源、成本和进度时需要经验、有用的历史信息、足够的定量数据和作定量度量的勇气。另外,估算本身也带有风险。

1.项目开发中的资源

开发一个软件项目所需的资源可以分为三类:人力资源、硬件资源、软件资源。资源的估算需要对每一种资源说明4个特性:资源的描述、资源的有效性说明、资源在何时开始需要、使用资源的持续时间。最后两个特性统称为时间窗口。对每一个特定的时间窗口,在开始使用它之前就应说明它的有效性。

1)人力资源

在考虑各种软件开发资源时,人是最重要的资源。在安排开发活动时必须考虑人员的技术水平、专业、人数,以及在开发过程各阶段中对各种人员的需要。

计划人员要根据范围估算,选择为完成开发工作所需的技能,并在组织状况(如管理人员、高级软件工程师等)和专业(如通信、数据库、微型计算机等)两方面做出安排。

对于一些规模较小的项目(1人/年或更少),只要向专家做些咨询,也许一个人就可以完成所有的软件工程步骤。对于一些规模较大的项目,在整个软件生存周期,各种人员的参与情况是不一样的。图8-1画出了各类不同的人员随开发工作的进展在软件工程各个阶段的参与情况的典型曲线。

img140

图8-1 管理人员与技术人员的参与情况

2)硬件资源

硬件是作为软件开发项目的一种工具而投入的,可考虑三种硬件资源:

(1)宿主机(Host Machine),软件开发时使用的计算机及外部设备;

(2)目标机(Target Machine),运行已开发成功软件的计算机及外部设备;

(3)其他硬件设备,专用软件开发时需要的特殊硬件资源。

宿主机连同必要的软件工具构成一个软件开发系统。通常这样的开发系统能够支持多种用户的需要,且能保持大量的由软件开发小组成员共享的信息。但在许多情况下,除了那些很大的系统之外,不一定非要配备专门的开发系统。因此,所谓硬件资源,可以认为是对现存计算机系统的使用,宿主机与目标机可以是同一种机型。

可以定义系统中其他的硬件元素为软件开发的资源。例如,在开发自动排版软件的过程中,可能需要一台照相排版机。所有硬件元素都应当由计划人员指定。

3)软件资源

软件在开发期间使用了许多软件工具来帮助软件的开发。软件工程人员在许多方面都使用类似于硬件工程人员所使用的CAD/CAE工具的软件工具集。这种软件工具集称为计算机辅助软件工程(CASE)。主要的软件工具可做如下分类。

(1)业务系统计划工具。

业务系统计划工具借助特定的“元语言”建立一个组织的战略信息需求的模型,导出特定的信息系统。这些工具要解答一些简单但重要的问题,例如,业务关键数据从何处来?这些信息又向何处去?如何使用它们?当它们在业务系统中传递时又如何变换?要增加什么样的新信息?

(2)项目管理工具。

项目管理人员使用这些工具可生成关于工作量、成本及软件项目持续时间的估算。定义开发策略及达到这一目标的必要的步骤,计划可行的项目进程安排,以及持续地跟踪项目的实施。此外,管理人员还可使用工具收集建立软件开发生产率和产品质量的那些度量数据。

(3)支持工具。

支持工具可以分为文档生成工具、网络系统软件、数据库、Email、通报板,以及在开发软件时控制和管理所生成信息的配置管理工具。

(4)分析和设计工具。

分析和设计工具可帮助软件技术人员建立目标系统的分析模型和设计模型,这些工具还帮助人们进行模型质量的评价。它们靠对每一个模型进行执行一致性和有效性的检验,帮助软件技术人员在错误扩散到程序中之前排除它。

(5)编程工具。

系统软件实用程序、编辑器、编译器及调试程序都是CASE中必不可少的部分。而除这些工具之外,还有一些新的编程工具:面向对象的程序设计工具、第四代程序生成语言、高级数据库查询系统及一大批PC工具(如表格软件)。

(6)组装和测试工具。

测试工具为软件测试提供了各种不同类型和级别的支持。有些工具,如路径覆盖分析器为测试用例设计提供了直接支持,并在测试的早期使用。其他工具,如自动回归测试和测试数据生成工具,在组装和确认测试时使用,它们能帮助减少在测试过程中所需的工作量。

(7)原型化和模拟工具。

原型化和模拟工具是一个很大的工具集,它包括的范围从简单的窗口画图到实时嵌入系统时序分析与规模分析的模拟产品。原型化工具把注意力集中在建立窗口和使用户能够了解一个信息系统或工程应用的输入/输出域而提出的报告。使用模拟工具可建立嵌入式的实时应用,如为一架飞机建立航空控制系统的模型。在建立系统之前,可以对用模拟工具建立起来的模型进行分析,对系统的运行时间性能进行评价。

(8)维护工具。

维护工具可以帮助软件技术人员分解一个现存的程序,并帮助他们理解这个程序。软件技术人员必须利用直觉、设计观念和智慧来完成逆向工程过程及再工程。

(9)框架工具。

这些工具能够提供一个建立集成项目支撑环境(IPSE)的框架。在多数情况下,框架工具实际上提供了数据库管理和配置管理的能力与一些实用工具,能够把各种工具集成到IPSE中。

2.资源估算模型

1)静态单变量资源模型

这种模型只需设定被开发软件的一种参数,它的一般形式如下:

资源=C1×(估计的软件特征)C2

式中:资源可以是开发工作量(E)、开发时间(T)或开发人员(P)等;

估计的软件特征可以使用源程序长度(L)和开发工作量(E);

C1、C2为依赖于开发环境和软件应用领域的经验常数。

在此模型中,一条机器指令一般为一行源代码。一个软件的源代码行数不包括程序注释、作业命令、调试程序。对于非机器指令编写的源程序,如汇编语言或高级语言程序,应转换成机器指令源代码行数来考虑。

根据Walston与Felix从60个软件项目(源程序长度从4至467千行,工作量从12至11758人-月,使用28种不同高级语言)的统计中导出以下的一组参数方程:

img141

注:E(人-月)表示开发工作量为人-月,此公式引用于高等教育出版社《软件工程——原理、方法与应用》。

这组方程在计算E、T时采用源程序长度(L)作为估计特征,然后,可以用计算出来的E来计算开发时间与所需人数。

这类模型简单易懂,常数c1和c2可以从历史数据导出,但是如果没有适用于所开发的软件情况的经验常数的话,就不能直接套用。

(1)Putnam模型。

这是1978年由Putnam提出的模型,是一种动态多变量模型。它是假定在软件开发的整个生存周期中工作量所有的特定的分布。这种模型是依据在一些大型项目(总工作量达到或超过30人/年)中收集到的工作量分布情况而推导出来的,但也可以应用在一些较小的软件项目中。

Putnam模型可以导出一个“软件方程”,把已交付的源代码(源语句)行数与工作量和开发时间联系起来,可以用下面的方程式来表示:

img142

其中,L(行)与T(年)仍分别表示程序长度和开发时间,K是软件开发与维护在内的整个生存周期所花费的工作量(人-年)。对于大型软件而言,其大小约为开发工作量的2.5倍,即E≈0.4K。Ck是技术状态常数,它反映出“妨碍程序员进展的限制”,并因开发环境而异。其典型值的选取如表8-3所示。

表8-3 技术状态常数Ck的取值

img143

Putnam模型的特点,是在同一模型中给出了K(或E)、L和T三者之间的关系。例如,给定了L和T,就可以用于估计开发所需的工作量(E)。另外,Putnam还开发了一个称为SLIM的软件工具,能根据这一模型自动计算开发所需的资源,使应用该模型变得更加方便。

(2)COCOMO模型。

该模型是由TRW公司开发的。Boehm提出的“结构型成本估算模型”(Constructive Cost Model,简称COCOMO模型)。它以静态单变量模型为基础,是一种精确、易于使用的成本估算方法,它在下列两个方面作了较大的改进。

①按照软件的应用领域和复杂程度,将软件开发项目的总体类型分为3种:组织型(Organic)、嵌入型(Embadded)和介于上述两种软件之间的半独立型(Semidetached)。每类使用不同的模型方程,如表8-4中,由上而下程序的复杂度逐步提高,E和T的计算值也随之增大。

表8-4 不同类型软件的COCOMO模型

img144

②对15种影响软件工作量的因素EFA按等级打分,该因子反映各种有关因素对软件开发的影响。Boehm把这些因素归纳为4类,如表8-5所示。

表8-5 15种影响软件工作量的因素EFA的等级分

img145

每种因子的标准调节值为1,根据实际情况在一定范围内上、下浮动。模型中的调节因子的计算就是15种因子的值的乘积,其表示为

img146

为了便于说明,下面引用Boehm书中的一个例子。

例8-1 假定要在微处理器上开发一个嵌入型的电信处理程序,程序规模为10000行,试计算所需的工作量与开发时间。

解 采用表8-4的第三类方程组,可得

img147

然后,对表8-5中15种调节因子逐项研究,假定所得到的15个因子分别为1.00、0.94、1.30、1.11、1.06、1.00、1.00、0.86、0.86、1.00、1.10、1.00、0.91、1.10、1.00,则可以计算出EFA,即

img148

最后,利用EFA对E、T进行修正,便得到以下修正值:

img149

还需要说明的是,Boehm把COCOMO模型分为基本、中间和详细3个等级。以上介绍的是它的中间模型。基本模型不使用EFA,仅用于粗略估算。中间模型是从整个生存周期来衡量EFA的影响。而详细模型需要考虑各个调节因子对不同开发阶段的影响。需要深入了解的读者,可以参阅Boehm的原著。

3.软件开发成本的估算方法

软件开发成本主要是指软件开发过程中所花费的工作量及相应的代价。它不同于其他物理产品的成本,也不包括原材料和能源的消耗,主要是人的劳动消耗。人的劳动消耗所需的代价就是软件产品的开发成本。另一方面,软件产品开发成本的计算方法不同于其他物理产品成本的计算。软件产品不存在重复制造过程,它的开发成本是以一次性开发过程所花费的代价来计算的。因此软件开发成本的估算,应是从软件计划、需求分析、设计、编码、单元测试、组装测试到确认测试,以整个软件开发全过程所花费的代价作为依据的。

对于一个大型的软件项目,要进行一系列的估算处理,这主要靠分解和类推的手段进行。基本估算方法分为如下三类。

1)自顶向下的估算方法

这种方法的主要思想是从项目的整体出发进行类推,即估算人员根据以前已完成项目所消耗的总成本(或总工作量),来推算将要开发的软件的总成本(或总工作量),然后按比例将它分配到各开发任务的单元中去。这种方法的优点是估算工作量小,速度快;缺点是对项目中的特殊困难估计不足,估算出来的成本盲目性大,有时会遗漏被开发软件的某些部分。

2)自底向上的估计法

这种方法的主要思想是把待开发的软件细分,直到每一个子任务都已经明确所需的开发工作量,然后把它们加起来,得到软件开发的总工作量。这是一种常见的估算方法。它的优点是估算各个部分的准确性高,缺点是缺少各项子任务之间相互联系所需的工作量,还缺少许多与软件开发有关的系统级工作量(配置管理、质量管理、项目管理)。所以往往估算值偏低,必须用其他方法进行检验和校正。

3)差别估计法

这种方法综合了上述两种方法的优点,其主要思想是把待开发的软件项目与过去已完成的软件项目进行类比,从其开发的各个子任务中区分出类似的部分和不同的部分。类似的部分按实际量进行计算,不同的部分则采用相应的方法进行估算。这种的方法的优点是可以提高估算的准确程度,缺点是不容易明确“类似”的界限。

Boehm认为,没有一种方法能够在各个方面都优于其他的方法。就自顶向下与自底而上的估算方法而言,它们的优、缺点正好相反。所以,Boehm主张同时使用几种方法,然后将所得的结果进行对照比较,在多数的情况下,这种估计和比较要反复多次,才能取得合理的结果。

4.用Delphi技术求估算值

另外,由于单独一位专家的估计可能会有种种偏见,譬如有乐观的、悲观的、要求在竞争中取胜的、让大家都高兴的种种愿望及政治因素等。因此,最好由多位专家进行估算,取得多个估算值。Rand公司提出Deiphi技术,作为统一专家意见的方法。用Deiphi技术可得到极为准确的估算值。

Deiphi技术的步骤如下。

(1)组织者发给每位专家一份软件系统的规格说明书(略去名称和单位)和一张记录估算值的表格,请他们进行估算。

(2)专家详细研究软件规格说明书的内容,对该软件提出如下3个规模的估算值:

ai—该软件可能的最小规模(最少源代码行数);

mi—该软件最可能的规模(最可能的源代码行数);

bi—该软件可能的最大规模(最多源代码行数)。

无记名填写表格,并说明做此估算的理由。在填表的过程中,专家不相互讨论但可以向组织者提问。

(3)组织者对专家填在表格中的答复进行整理,需做以下工作。

①计算各位专家估算期的望值Ei(序号为i(i=1,2,…,n),共有n位专家),并综合各位专家估算值的期望,求出平均值img150

img151

②对专家的估算结果进行分类摘要。

(4)在综合专家估算结果的基础上,组织专家再次无记名填写表格,然后比较两次估算的结果,若差异很大,则要通过查询找出差异的原因。

(5)上述过程可重复多次,最终可获得一个得到多数专家共识的软件规模(源代码行数)。在此过程中不得进行小组讨论。

最后,通过与历史资料进行类比,根据过去完成软件项目的规模和成本等信息,推算出该软件每行源代码所需的成本,然后再乘以该软件源代码行数的估算值,就可得到该软件的成本估算值。

此方法的缺点是人们无法利用其他参加者的估算值来调整自己的估算值。宽带Deiphi技术克服了这个缺点。在专家正式将估算值填入表格之前,由组织者召集小组会议,专家与组织者一起对估算问题进行讨论,然后专家再无记名填表。组织者对各位专家在表中填写的估算值进行综合和分类后,再召集会议,请专家对其估算值有很大变动之处进行讨论,请专家重新无记名填表。这样适当重复几次,可以得到比较准确的估计值。由于增加了协商的机会,集思广益,所以估算值更趋于合理。