在软件项目成本计算中引入估算、预算和决算体系

发表于:2009-05-22来源:作者:点击数: 标签:项目决算成本计算预算软件
引言 软件成本超支是软件项目中经常遇到的问题。很多软件项目经理都曾经历过这样的情况,由于 开发 成本的超支,软件项目做完之后,不仅不能得到上级领导的表扬,甚至连项目奖金都拿不到,而这一切都来源于当初对项目成本 估算 的不准。 随着软件 开发技术 的
引言

    软件成本超支是软件项目中经常遇到的问题。很多软件项目经理都曾经历过这样的情况,由于开发成本的超支,软件项目做完之后,不仅不能得到上级领导的表扬,甚至连项目奖金都拿不到,而这一切都来源于当初对项目成本估算的不准。

    随着软件开发技术的发展,软件成本在计算机系统总成本中影响越来越大,它直接影响到投资者的决策和软件项目的开发。没有合理而准确的软件成本估算,就无法很好地进行软件项目的管理。

    据国际数据公司的研究报告显示,全球500 强企业中,信息技术投资超过生产设备投资的企业达65%。然而软件项目的开发情况却不容乐观,1995 年,美国大概只有10%的软件项目可以按时交付,而且费用也不超支,约30%的项目没有完成就被取消了。

    项目超支的原因是多方面的,其中一个主要原因是由于软件开发过程中,成本控制工作没有做好,没有对资源配置进行优化,因此造成了成本浪费。而更多的原因则来自对软件项目成本的错误估算,用一个不可能的成本来实现一个比预算昂对得多的软件,不管如何控制都将无法避免成本超支的噩运。

    常用软件成本估算模型介绍

    在软件成本估算领域,有很多的估算模型,这些模型经过了几十年的发展,其中部分模型成为了目前软件成本估算的常用模型,如功能点、DELPHI、SDC和COCOMO等。其中以功能点和COCOMO模型应用最广。

    功能点估算模型

    功能点方法的本质是站在客户的角度度量系统,它认为系统的功能可以分为以下5 类:内部逻辑文件、外部接口文件、外部输入、外部输出和外部查询。根据计算规则首先确定每个功能的分类及其功能复杂度,从而可以得到每个功能的权值,全部功能的权值相加就得到“未调整的功能点数”。

    功能点方法可以在早期度量软件的规模,软件的规模与它的工作量、进度和成本关系紧密,早期准确的软件规模度量有助于确定软件价格和提高策划过程中估算的能力。

    软件项目管理过程从项目计划开始,估算是项目计划的第1个活动。估算时需要考虑很多因素,其中最重要的就是要交付软件的规模。在软件开发生命周期的早期阶段,与用代码行表示软件规模相比,用功能点表示软件规模作为估算的输入要准确得多,Kemerer 的研究显示,采用功能点进行估算的误差是85%,而采用代码行估算的误差是601%。

    由于软件项目都是从需求分析开始,需求分析的主要目的就是确定用户的需求,也即系统要实现的功能,因此功能点方法能够在需求分析阶段引入,如果有比较丰富的经验积累,则可以进行准确度很高的成本估算。

    COCOMO模型

    COCOMO(Constructive Cost Model)是Boehm利用加利福尼亚的一个咨询公司的大量项目数据推导出的一个成本模型。该模型于1981 年首次发

    表了原始COCOMO 模型。 为适应软件工程领域的快速变化, COCOMO 经过多次的更新,如1987年的Ada版本,1994年发展演变为COCOMOII模型。

    COCOMO 模型按详细程度可划分为三级, 即基本COCOMO 模型, 中间COCOMO 模型和详细COCOMO 模型。

    (1)基本COCOMO 模型。它是静态、单变量模型, 不考虑任何成本驱动, 仅以规模为基准进行估算只适于粗略迅速估算。

    (2)中间COCOMO 模型。它是用15 个成本驱动改进基本模型, 这是对产品、硬件、工作人员、项目的特性等因素的主观评估。成本驱动的影响定为项目级的,在考虑任何进度限制时进一步调整工作量。

    (3)详细COCOMO 模型。这是三种模型中最精确的模型。它是基于不同的成本驱动对项目的分段有不同的影响, 是用于考虑成本驱动的阶段性影响时进一步改进估算, 这时的计算细化到子系统/模块。它假定层次有三级:系统含有子系统, 子系统含有模块。

    在COCOMO模型中,首先需要确定的是待开发软件的KLOC(千行代码),因此COCOMO模型要进行准确的成本估算需要等到详细设计阶段结束后,因为只有详细设计完成后,才能根据详细设计的结果对每个模块和类的代码数量根据代码功能的复杂程度进行较准确的估算。

程序结构分解和工作结构分解

    结构化分析和设计遵从自顶向下,逐层分解的设计原则。设计师在把握的大的框架之后,在此基础上进行逐步细化,最后才能完成一个复杂系统的设计工作。

    在结构化设计方法中,先根据用户的需求规格说明书,确定系统的边界,绘制顶层数据流图,然后对顶层图中的加工进行细化,一层一层的细化下去,一直到得到系统的所有基本功能。

    面向对象的设计虽然与结构化设计有了很大的区别,但是对对象的设计过程同样是一个细化的过程。在确定了对象后,需将其抽象成类,并要对类的属性,方法进行设计,这也是一个分解的过程。

原文转自:http://www.ltesting.net