「软件项目管理」一文详解软件项目成本计划

2,427 阅读12分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

序言

大家都知道,软件项目管理包含项目初始、项目计划、项目执行控制和项目结束这四大模块。其中,项目计划包含范围计划、成本计划、时间计划等9大计划。

那在今天的文章中,就带大家来了解项目计划中的成本计划。

叮,开始学习吧~🎩

一、成本估算的定义

  • 成本估算是成本管理的核心,是预测开发一个软件系统所需要的总工作量的过程

  • 软件项目成本是指软件开发过程中所花费的工作量及相应的代价

  • 成本估算应该以软件项目管理、分析、设计、编程、测试等过程所花费的代价作为依据

  • 成本估算贯穿于软件的生命周期

二、估算的基本概念

1、关于估算

  • 估算不是很准确,会有误差
  • 项目经验数据非常重要;
  • 不要太迷信某些数学模型。

2、软件项目规模

  • 软件项目规模即工作量
  • 例如:软件规划,软件管理,需求,设计,编码,测试,以及后期的维护等任务。

3、软件规模单位

  • LOC (Line of Code) → 表示源代码长度的测量;
  • FP (Function Point) → 用系统的功能数量来测量;
  • 人月;
  • 人天;
  • 人年。

4、软件项目成本

  • 完成软件规模相应付出的代价
  • 待开发的软件项目需要的资金
  • 人的劳动的消耗所需要的代价是软件产品的主要成本

5、成本单位

成本单位通常是各种货币单位比如:

  • 人民币元
  • 美元
  • 英镑
  • ……

6、软件规模和软件成本的关系

  • 规模是成本的主要因素,是成本估算的基础
  • 有了规模就确定了成本。

7、成本估算结果

直接成本:具体项目相关的成本(如:人员工资、材料费、外包外购成本等)

间接成本: 可以分摊到各个具体项目中的成本(如:培训、房租水电、员工福利、市场费用、管理费、其他等等)

三、成本估算过程

1、估算输入

需求、资源要求、资源消耗率、进度规划、历史项目数据、学习曲线等

2、估算处理

采用一定的估算方法进行,包含直接成本间接成本的估算。

3、估算输出

简略详细的形式表示,对项目所需的所有资源的成本均需要加以估计。

四、成本估算方法

1、代码行估算法

(1)定义

  • 从软件程序量的角度定义项目规模。
  • 与具体的编程语言有关。
  • 分解足够详细。
  • 有一定的经验数据(类比和经验方法)。

(2)代码行估算的优点

代码是所有软件开发项目都有的“产品”,而且很容易计算代码行数。

(3)代码行估算的缺点

  • 对代码行没有公认的可接受的标准定义
  • 代码行数量依赖于所用的编程语言和个人的编程风格
  • 在项目早期、需求不稳定、设计不成熟、实现不确定的情况下很难准确地估算代码量。
  • 代码行强调编码的工作量,只是项目实现阶段的一部分。

2、功能点估算法(重点)

(1)定义

  • 实现的语言和技术没有关系;
  • 用系统的功能数量来测量其规模;
  • 通过评估、加权、量化得出功能点。

(2)功能点公式

  • FP = UFC * TCF
  • UFC:未调整功能点计数
  • TCF:技术复杂度因子

(3)UFC-未调整功能点计数

从处理逻辑的角度出发, UFC 可以分为 5功能计数项分别是:

  • 外部输入
  • 外部输出
  • 外部查询
  • 外部接口文件
  • 内部逻辑文件

接下来我们将依据这 5 个功能计数项进行详细细述。

(4)功能计数项详述

1)外部输入(External Inputs:EI)

软件提供面向应用的数据的项(如屏幕、表单、对话框、控件,文件等);在这个过程中,数据穿越外部边界进入到系统内部。 如下图所示:

外部输入

2)外部输出(External Outputs:EO)

向用户提供(经过处理的)面向应用的信息,例如,报表和出错信息等。 如下图所示:

外部输出

3)外部查询(External Inquiry:EQ)

外部查询是一个输入引出一个即时的简单输出,没有处理过程。 如下图所示:

外部查询

4)外部接口文件(External Interface Files :EIF’s)

用户可以识别的一组逻辑相关数据,这组数据只能被引用。用这些接口把信息传送给另一个系统如下图所示:

内部逻辑文件

5)内部逻辑文件(Internal Logical Files:ILF’S)

用户可以识别的一组逻辑相关的数据,而且完全存在于应用的边界之内,并且通过外部输入维护,是逻辑主文件的数目如下图所示:

内部逻辑文件

(5)功能计数项的复杂度等级

下面给出功能计数项的复杂度等级,如下图所示:

功能计数项的复杂度等级

(6)UFC计算实例

下面,我们用一个例子来举例。

某外贸订单项目的需求评估为:

外部输入3 项;外部输出1 项;外部查询1 项;外部接口文件1 项;内部逻辑文件2 项。请计算出该项目的 UFC

他们的复杂程度如下表所示:

功能点
简单一般复杂
外部输入2 * 31 * 40 * 6
外部输出0 * 40 * 51 * 7
外部查询0 * 31 * 40 * 6
外部接口文件0 * 51 * 70 * 10
内部逻辑文件1 * 71 * 100 * 15
总计13257
UFC45

(7)TCF-技术复杂度因子

TCF = 0.65 + 0.01(sum(Fi)),其中 Fi 为技术复杂度因子,其范围是 0-5TCF 的取值范围是 0.65-1.35

Fi 技术复杂度因子有 14 项,如下表所示:

技术复杂度因子
F1可靠的备份和恢复F2数据通信
F3分布式函数F4性能
F5大量使用的配置F6联机数据输入
F7操作简单性F8在线升级
F9复杂界面F10复杂数据处理
F11重复使用性F12安装简易型
F13多重站点F14易于修改

技术复杂度因子的取值范围,如下表所示:

调整系数描述
0不存在或者没有影响
1不显著的影响
2相当的影响
3平均的影响
4显著的影响
5强大的影响

(8)TCF计算实例

同样,我们用外贸订单项目的例子来计算 TCF 。假设 14 个复杂度因子的影响值都是平均,计算出该项目的功能点。

UFC=45UFC=45

TCF=0.65+0.01(143)=1.07TCF=0.65+0.01(14*3)=1.07

FP=UFCTCF=451.07=48FP=UFC*TCF=45*1.07=48

如果PE=15工时/功能点,那么:Effort=4815=720工时如果PE=15工时/功能点,那么:Effort=48*15=720工时

(9)功能点与代码行的转换

语言代码行/FP
Assembly320
C150
COBOL105
FORTRAN105
PASCAL91
ADA71
PL/165
PROLOG/LISP64
SMALLTALK21
SPREADSHEET6

3、用例点估算法(重点)

(1)图例

用例模型如下图所示:

用例模型图示

(2)基本步骤

用例点估算方法的基本步骤为:

  • 计算未调整的角色的权值 UAW ;
  • 计算未调整的用例的权值 UUCW ;
  • 计算未调整的用例点 UUCP ;
  • 计算技术环境因子 TCFECF ;
  • 计算调整的用例点 UCP ;
  • 计算工作量 ( man-hours ) 。

接下来将依据这几个内容进行展开介绍。

(3)计算未调整的角色的权值UAW

公式: UAW=C=caWeight(c)×aCardinality(c)UAW=∑_{C=c}aWeight(c) × aCardinality(c)

下面给出 Actor 权值定义表,如下表所示:

序号复杂度级别复杂度标准权值
1simple角色通过API与系统交互1
2average角色通过协议与系统交互2
3complex用户通过GUI与系统交互3

(4)计算未调整的用例的权值UUCW

公式: Uucw=C=cuWeight(c)×uCardinality(c)Uucw=∑_{C=c}uWeight(c) × uCardinality(c)

下面给出 Use Case 权值定义表,如下表所示:

序号复杂度级别事务/场景个数权值
1simple1-35
2average4-710
3complex>715

(5)计算未调整的用例点UUCP

公式: UUCP=UAW+UUCWUUCP=UAW+UUCW例如:

表1: Actor 权值

序号复杂度级别权值参与角色数UAWi
1simple122
2average248
3complex3515

表2:Use Case 权值

序号复杂度级别权值用例数UUCWi
1simple5525
2average10220
3complex15345

(6)计算技术因子TCF

公式: TCF=0.6+(0.01×\sum_\limits{i=1}^{13})TCF_Weighti×ValueiWeight_i×Value_i

假设现有某项目的复杂度因子如下图表所示:

序号技术因子说明权值
1TCF1分布式系统2.0
2TCF2性能要求1.0
3TCF3最终用户使用效率1.0
4TCF4内部处理复杂度1.0
5TCF5复用程度1.0
6TCF6易于安装0.5
7TCF7系统易于使用0.5
8TCF8可移植性2.0
9TCF9系统易于修改1.0
10TCF10并发性1.0
11TCF11安全功能特性1.0
12TCF12为第三方系统提供直接系统直接系统访问1.0
13TCF13特殊的用户培训设施1.0

具体的 TCF 值为:

TCF=0.6+0.01×(2.0×3+1.0×5+1.0×3+1.0×5+1.0×0+0.5×3+0.5×5+2.0×3+1.0×5+1.0×3+1.0×5+1.0×0+1.0×0)=1.02TCF=0.6+0.01×(2.0×3+1.0×5+1.0×3+1.0×5+1.0×0+0.5×3+0.5×5+2.0×3+1.0×5+1.0×3+1.0×5+1.0×0+1.0×0)=1.02

其中,调整系数为给定数值

(7)计算环境因子ECF

公式: ECF=1.4+(-0.03×\sum_\limits{i=1}^{8}TCF_Weighti×Valuei)Weight_i×Value_i)

假设现有某项目的环境因子如下表所示:

序号环境因子说明权值
1ECF1UML 精通程度1.5
2ECF2系统应用经验0.5
3ECF3面向对象经验1.0
4ECF4系统分析员能力0.5
5ECF5团队士气1.0
6ECF6需求稳定度2.0
7ECF7兼职人员比例高低1.0
8ECF8编程语言难易程度1.0

假设调整系数已给定,那么具体的 ECF 值为:

ECF=1.4+(0.03×(1.5×3+0.5×3+1.0×3+0.5×5+1.0×3+2.0×3+1.0×0+1.0×0))=0.785ECF=1.4+(-0.03×(1.5×3+0.5×3+1.0×3+0.5×5+1.0×3+2.0×3+1.0×0+1.0×0))=0.785

(8)计算调整的用例点UCP

公式: UCP=UUCP×TCF×ECFUCP=UUCP×TCF×ECF

依据上面所给出的结果,那么最终 UCP=UUCP×TCF×ECF=115×1.02×0.785=92UCP =UUCP×TCF×ECF = 115×1.02×0.785 = 92

(9)计算工作量

公式: Effort=UCP×PEEffort=UCP×PE

依据上面的数据,假设 PE=20工时/用例点 。那么: Effort=UCP×PE=92×20=1840工时=230人天Effort=UCP×PE=92×20=1840工时=230人天

4、类比(自顶向下)估算法

(1)定义

对于类比估算法来说,估算人员根据以往完成类似项目所消耗的总成本(或工作量),来推算将要开发的软件总成本(或工作量),然后按比例将它分配到各个开发任务单元中。

是一种自上而下的估算形式。

(2)什么时候使用

  • 有类似的历史项目数据
  • 信息不足(例如市场招标)的时候;
  • 要求不是非常精确估算的时候。

(3)主观判断举例

假设现在要开发某个证券交易网站,它的需求与往常开发的网站项目类似,且其历史数据是10万的开发成本。因此,用类比估算法来进行估算,它也是10万的开发成本。

5、自下而上估算法

(1)定义

利用任务分解图(WBS),对各个具体的工具包进行详细的成本估算,然后将结果累加起来得出项目总成本。如下图所示:

自下而上估算法

大家可以看到,左下方是一些估算的内容自下而上的原则右上方估算的结果

(2)特点

  • 相对比较准确,它的准确度来源于每个任务的估算情况。
  • 花费时间。

6、参数模型估算法(重点)

(1)定义

通过参数模型来估算(规模)成本的方法。

(2)使用条件

使用该模型的条件如下:

  • 具有良好的项目数据为基础;
  • 存在成熟的项目估算模型。

(3)特点

  • 比较简单,而且也比较准确
  • 如果模型选择不当或者数据不准,也会导致偏差

(4)参数模型:规模(成本)模型

1)面向LOC驱动的

  • WalstonFelix(IBM):E=5.2(KLOC)Walston-Felix(IBM):E= 5.2*(KLOC)^0.91 ⭐⭐⭐
  • BalleyBasili:E=5.5+0.73(KLOC)Balley-Basili:E=5.5+0.73*(KLOC)^1.16
  • 基本COCOMO:E=3.2(KLOC)基本COCOMO:E=3.2*(KLOC)^1.05 ⭐⭐⭐
  • Doty:E=5.288(KLOC)Doty:E=5.288*(KLOC)^1.047

2)面向FP驱动的

  • AlbrechtandGaffney:E=12.39+0.0545FPAlbrecht and Gaffney:E=-12.39+0.0545FP
  • Matson,Barnett:E=585.7+15.12FPMatson,Barnett:E=585.7+15.12FP

3)整体公式

整体公式为:E=a+bSCE=a+b*S^C

E:以人月表示的工作量

a,b,c:经验导出的系数

S:主要的输入参数(通常是 LOCFP 等)

7、专家估算法(重点)

(1)定义

由多位专家进行成本估算,一个专家可能会有偏见,最好由多位专家进行估算,取得多个估算值,最后得出综合的估算值。

(2)专家估算法—Delphi

  • 组织者确定专家,这些专家互相不见面;
  • 组织者发给每位专家一份软件规格说明;
  • 专家以无记名对该软件给出3个规模的估算值;
    • 最小aia_i
    • 最可能的mim_i
    • 最大bib_i
  • 组织者计算每位专家的Ei=(ai+4mi+bi)/6E_i=(a_i+4m_i+b_i)/6
  • 如果各个专家的估算差异超出规定的范围(例如:15%),则需重复上述过程;
  • 最终可以获得一个多数专家共识的软件规模:E=(E1+E2+En)/nE=(E_1+E_2+…E_n)/n(N: 表示 N 个专家)。

五、成本预算

1、成本预算的定义

  • 成本预算是将项目的总成本按照项目的进度分摊到各个工作单元中去
  • 成本预算的目的是产生成本基线

2、项目成本预算

分配项目成本预算包括三种情况:

  • 给任务分配资源成本
  • 给任务分配固定资源成本
  • 给任务分配固定成本

下面依据这三种情况进行一一介绍。

(1)给任务分配资源成本

  • 与资源的基本费率紧密相连
  • 设置资源费率
    • 标准费率
    • 加班费率
    • 每次使用费率
    • 。。。。。。

(2)分配固定资源成本

  • 当一个项目的资源需要固定数量的资金时,可以向任务分配固定资源成本。
  • 例如:项目中的一个兼职人员的成本。

(3)分配固定成本

  • 有些任务是固定成本的类型的任务,也就是说,管理者知道某项任务的成本不变,不管任务的工期有多长,或不管任务使用了哪些资源。在这种情况下,管理者可以向任务直接分配成本。
  • 例如:某外包任务、培训任务。

六、结束语

在上面的文章中,我们讲解软件项目中成本估算的基本概念,以及7种成本估算的方法。同时,我们还简单了解了一下成本预算

到这里,关于软件项目中的成本计划讲到这里就结束啦!不知道是否对小伙伴们有帮助呢?

🛵专栏直通车

软件项目管理👉juejin.cn/column/7024…