第6章 软件项目成本计划
软件项目规模
软件项目规模即工作量
例如:软件规划,软件管理,需求,设计,编码,测试,以及后期的维护等任务。
规模单位
- LOC(Loc of Code)
- 源代码程序长度的测量
- FP(Function Point)
- 用系统的功能数量来测量
- 人月
- 人天
- 人年
软件项目成本
- 完成软件规模相应付出的代价。
- 待开发的软件项目需要的资金。
- 人的劳动的消耗所需要的代价是软件产品的主要成本
规模是成本的主要因素,是成本估算的基础
成本估算结果
- 直接成本
- 与具体项目相关的成本
- 间接成本
- 可以分摊到各个具体项目中的成本,例如水电费
估算方法(掌握每种估算方法的计算法)
- 代码行估算法
- 功能点估算法
- 用例点估算法
- 类比(自顶向下)算法
- 自下而上估算法
- 参数估算法
- 专家估算法
代码行估算法
- 从软件程序量的角度定义项目规模。
- 与具体的编程语言有关
- 分解足够详细
- 有一定的经验数据(类比和经验方法)
缺点
- 对代码行没有公认的可接受的标准定义
- 代码行数量依赖于所用的编程语言和个人的编程风格.
- 在项目早期,需求不稳定、设计不成熟、实现不确定的情况下很难准确地估算代码量.
- 代码行强调编码的工作量,只是项目实现阶段的一部分
功能点估算
- 与实现的语言和技术没有关系
- 用系统的功能数量来测量其规模
- 通过评估、加权、量化得出功能点
FP =UFC*TCF
- UFC:未调整功能点计数
- TCF:技术复杂度因子
UFC
- 功能计数项:(从处理逻辑的角度)
- 外部输入 EI
- 给软件提供面向应用的数据的项(如屏幕、表单、对话框、控件,文件等);在这个过程中,数据穿越外部边界进入到系统内部。
- 外部输出 EU
- 给软件提供面向应用的数据的项(如屏幕、表单、对话框、控件,文件等);在这个过程中,数据穿越外部边界进入到系统内部
- 外部查询 EQ External Inquiry
- 外部查询是一个输入引出一个即时的简单输出。没有处理过程。
- 外部接口文件 EIF's External Interface Files
- 外部接口文件是用户可以识别的一组逻辑相关数据,这组数据只能被引用。用这些接口把信息传送给另一个系统。
- 内部逻辑文件 Internal Logical Files ILF's
- 用户可以识别的一组逻辑相关的数据,而且完全存在于应用的边界之内,并且通过外部输入维护,是逻辑主文件的数目。
- 用户可以识别的一组逻辑相关的数据,而且完全存在于应用的边界之内,并且通过外部输入维护,是逻辑主文件的数目。
TCF
用例点计算模型
- 计算未调整的角色的权值UAW;
- 计算未调整的用例权值UUCW ;
- 计算未调整的用例点UUCP;
- 计算技术和环境因子TEF;
- 计算调整的用例点UCP ;
- 计算工作量( man-hours)
未调整的角色权值UAW
未调整的用例权值UUCW
计算UUCP
UUCP = UAW + UUCW
计算技术因子TCF
计算环境因子ECF
计算调整后的用例点UCP
UCP = UUCP * TCF * ECF
计算工作量
Effort = UCP * PF
例:设PF = 20 工时/用例点
类比(自顶向下)估算法
估算人员根据以往的完成类似项目所消耗的总成本(或工作量),来推算将要开发的软件的总成本(或工作量),然后按比例将它分配到各个开发任务单元中
使用情况
- 有类似的历史项目数据
- 信息不足(例如市场招标)的时候
- 要求不是非常精确估算的时候
自下而上估算法
利用任务分解图(WBS),对各个具体工作包进行详细的成本估算,然后将结果累加起来得出项目总成本。
特点
- 相对比较准确,它的准确度来源于每个任务的估算情况
- 花费时间
参数估算法
通过项目数据,进行回归分析,得出回归模型,参数模型来估算(规模)成本的方法。
特点
比较简单,而且也比较准确 如果模型选择不当或者数据不准,也会导致偏差
具体公式
- 面向LOC驱动的
- Walston-Felix(IBM)
- E= 5.2*(KLOC)^0.91
- Balley-Basili
- E=5.5+0.73*(KLOC)^1.16
- .COCOMO
- E=3.2*(KLOC)^1.05
- Doty
- E=5.288*(KLOC)^1.047
- Walston-Felix(IBM)
- 面向FP驱动的
- Albrecht and Gaffney
- E=-12.39+0.0545FP
- Matson,Barnett
- E=585.7+15.12FP
- Albrecht and Gaffney
- 整体公式:E=a+b*SC
- E:以人月表示的工作量
- a,b,c:经验导出的系数
- S:主要的输入参数(通常是LOC,FP等)
建议掌握模型
Walston-felix模型
E = 5.2×L ^0.91 ,L是源代码行数(以KLOC计),E是工作量(以PM计)
D = 4.1×L ^ 0.36,D是项目持续时间(以月计)
S = 0.54×E ^ 0.6,S是人员需要量(以人计)
DOC = 49×L ^ 1.01,DOC是文档数量(以页计)
例子:
采用java 完成项目,估计有366功能点,则
L = 366×46 = 16386行 = 16.386KLOC
E = 5.2×L ^ 0.91 = 5.2×16.386 ^ 0.91 = 66人月
DOC = 49×L ^ 1.01 = 49×16.386 ^ 1.01 = 826页
COCOMO(Constructive Cost model)
系列
COCOMO 81 COCOMO II 模型系列
基本原理
将开发所需要的工作量表示为软件规模和一系列成本因子的函数,基本估算公式:
A:可以校准的常量; S为软件规模; E为规模的指数,说明不同规模软件具有的相对规模经济和不经济性;EM为工作量乘数,反映某个项目特征对完成项目开发所需工作量的影响程度;n为描述软件项目特征的成本驱动因子的个数
模型级别
- 基本COCOMO
- 静态单变量模型
- 中等COCOMO
- 基本模型基础上考虑影响因素,调整模型
- 高级COCOMO
- 中等COCOMO模型基础上考虑各个步骤的影响
项目类型
- 有机: Organic,
- 各类应用程序,例如数据处理、科学计算 等
- 受硬件的约束比较小,程序的规模不是很大
- 嵌入式: Embedded
- 系统程序,例如实时处理、控制程序等
- 紧密联系的硬件、软件和操作的限制条件下运行,软件规模任意
- 半有机: Semidetached
- 各类实用程序,介于上述两种软件之间,例如编译器(程序)
- 规模和复杂度都属于中等或者更高
基本COCOMO-81
E= a * (KLOC)^b
- E是所需的人力(人月)
- KLOC是交付的代码行
- a , b是依赖于项目自然属性的系数
中等COCOMO-8
中等COCOMO-81乘法因子的成本驱动属性
- 产品属性
- 平台属性
- 人员属性
- 过程属性
乘法因子为各项相乘
高级(详细)COCOMO
将项目分解为一系列的子系统或者子模型
在一组子模型的基础上更加精确地调整一个模型的属性,
COCOMO II
- 应用组装模型---规划阶段
- 早期设计模型---设计阶段
- 后体系结构模型---开发阶段
专家估算法
由多位专家进行成本估算,一个专家可能会有偏见,最好由多位专家进行估算,取得多个估算值,最后得出综合的估算值。
Delphi
- 组织者确定专家,这些专家互相不见面
- 组织者发给每位专家一份软件规格说明
- 专家以无记名对该软件给出3个规模的估算值
- 最小ai
- 最可能的mi
- 最大bi
- 组织者计算每位专家的Ei=(ai+4mi+bi)/6
- 如果各个专家的估算差异超出规定的范围(例如:15%),则需重复上述过程
- 最终可以获得一个多数专家共识的软件规模:E=E1+E2+…En/n(N:表示N 个专家)
实用软件估算模型
是一种自下而上和参数法的结合模型,步骤如下:
-
对任务进行分解:1,2,…,I,…n
-
估算每个工作包的成本Ei
- 直接估算成本Ei
- 先估算规模Qi,然后估算成本Ei= Qi *人力成本参数
-
直接成本=E1+E2+……+ Ei+……+ En
- 开发成本
- 管理成本,质量成本
- Scale(Mgn)=a* Scale(Dev)
- [a为比例系数:例如:20%--25%]
-
间接成本估算
- 按照企业模型直接估算
- 间接成本=直接成本*间接成本系数
- 间接成本= 规模人力成本参数间接成本系数
-
项目总估算成本= 直接成本+间接成本
- 估算成本=直接成本+间接成本
- 估算成本=直接成本(1+间接成本系数)
- 估算成本=规模*人力成本参数(1+间接成本系数)
- 成本系数=人力成本参数* (1+间接成本系数)
-
项目总报价
- 项目总报价=项目总估算成本+风险利润
- 项目总报价=(1+(a+b+c) %) *项目总估算成本
- 项目利润=估算成本*a%
- 风险基金=估算成本*b%
- 税=估算成本*c% (例如:c为5.5左右)
成本预算
- 成本预算是将项目的总成本按照项目的进度分摊到各个工作单元中去
- 成本预算的目的是产生成本基线
- 包括三种情况
- 给任务分配资源成本
- 与资源的基本费率紧密相连,如加班费...
- 给任务分配固定资源成本
- 当一个项目的资源需要固定数量的资金时,可以向任务分配固定资源成本。如兼职人员成本
- 给任务分配固定成本
- 有些任务是固定成本的类型的任务,也就是说,管理者知道某项任务的成本不变,不管任务的工期有多长,或不管任务使用了那些资源。在这种情况下,管理者向任务直接分配成本
- 给任务分配资源成本