课件
软件项目估算
项目估算是要估计完成交付产品的时间和成本。
对于软件项目来说,估算最大的挑战是项目的复杂性和不确定性。主要体现在:
- 软件规模越大,复杂性越高、不确定性就越大。
- 需求的不确定性也会对项目估算产生很大影响。
- 另外,缺少可靠的历史数据使项目估算缺少参照物。
现实中许多开发人员不愿做计划,对估算缺乏信心,我们要克服困难,努力做出一个相对有价值的估算,随着经验越来越多估算就会越来越准确。
软件项目管理是为了产出和结果,而不是为了活动,所以估算主要是针对结果进行。估算是在预测未来,不管用什么方法,所有的估计从定义上来说都只是概率。虽然估计存在不确定性,但是你做出的估计在很多时候都会变成一种承诺,所以在估计时要基于事实,考虑风险,进而做出合理的调整,确保对完成时间有信心。
基本估算方法
专家判断
专家判断是一种常见的估算方法,主要依赖专家的经验和类似项目的历史信息,对具体任务做出时间或者成本的估算。
这种方法依赖专家的能力和经验来判断哪些项目是相以的,在哪些方面相以。但是有些表面上看起来相以的项目实际上可能存在很大不同,比如说一个运动员在 4 分钟跑完一英里,我们不可能按照这个速度推断出他可以在 1 小时 45 分钟跑完马拉松,因为跑马拉松和跑一英里存在很大的差别。
大部分专家判断技术过于简单化,很多可能影响工作量的因素并没有考虑进去,所以这种估算存在很大的不准确。
参数估算
参数估算也是常用的一种方法,这种方法通过对大量的项目历史数据进行统计分析,使用项目特性参数建立经验模型,再根据模型估算出成本和时间。
这里简单介绍功能点、COCOMO、用例点和机器学习方法,了解这些方法的基本原理。
功能点
功能点方法是根据软件信息域的基本特征和软件复杂性,估算出软件的规模,并以功能点为单位来进行度量。该方法适合于在开发初期进行估算。
功能点方法使用五种信息域来刻划软件的基本特性:
- 第一是外部输入,主要是指通过界面的一些输入,像插入更新这样的操作也都是典型的外部输入;
- 第二是外部输出,像导出、报表、打印都属于输出;
- 第三是外部查询,查询操作一般是要先输入数据,再根据输入的数据计算得到输出;
- 第四是内部逻辑文件,可以理解为业务对象,有可能对应多个数据表;
- 第五外部接口文件,它是指其他应用提供的接口数据;
功能点方法包括以下过程:
1、首先确定功能点计算的范围和应用程序边界,估计出所有数据功能及其复杂性,也就是内部逻辑文件和外部接口文件。
2、然后再估计出所有事务功能及其复杂性,也就是外部输入、外部输出和外部查询。
3、根据信息域的加权因子,计算得出未调整功能点 UFC:
4、然后根据所开发系统的特点得到下图表格所列的 14 项调整因子值:
5、最后,通过公式计算得出已调整的功能点 FP。
这里功能点代表了软件规模的度量单位,也可以根据以往项目的历史数据统计出不同编程语言对应一个功能点的代码行,进而可以把功能点转化为代码行。
COCOMO 模型
结构性成本模型 COCOMO (COnstructive COst MOdel)是一种利用经验模型进行工作量和成本估算的方法。
这种模型分为基本、中间、详细三个层次,分别用于软件开发的三个不同阶段,也就是系统开发初期各子系统的设计,以及子系统内部各个模块的设计。
是一个基本 COCOMO 的经验公式,其中:
- PMnominal:代表工作量,以人月为单位;
- A:是工作量调整因子;
- B:是规模调整因子;
- Size:代表软件规模,单位是千行代码或功能点数;
COCOMO 模型把软件分成组织型、嵌入型和半独立型三种类型:
不同的软件可以对应这三类软件的适用范围,选取相应的参数。
由于这种模型是根据以前的和局部的数据得出的,不可能完全适用于当前所有的软件项目和开发环境,所以它的计算结果只能是一个大概的参考。
用例点估算
用例点估算是在面向对象软件开发项目中用于估计规模和工作量的方法,它比功能点方法要简单一些。
上图是一个顾客到银行存钱、取钱和转帐的用例图,其中像个小人这样的一个符号代表着和系统进行交互的角色,可以是使用者也可以是其他系统。椭圆符号代表着描述系统功能的用例。关于用例图的内容将在有关需求建模的相关章节进行详细讲解。
用例点估算首先需要建立用例模型,然后通过以下步骤进行估算:
第 1 步,计算角色复杂度。角色可以分成简单、一般、复杂三种类型:
- 简单角色是通过 API 或者接口和系统进行交互的其他系统,权重为1;
- 一般角色是通过协议(如 TCP/IP)与系统进行交互的其他系统,权重为2;
- 复杂角色是通过 GUI 或 Web 界面与系统进行交互的人,权重为3;
- 通过加权求和得到角色复杂度 UAW;
第 2 步,计算用例复杂度。也是分成简单、一般、复杂三种类型:
- 根据涉及的数据库实体数、操作步骤数和实现所用类的个数来区分;
- 权重分别为5、10和15;
- 通过加权求和得到用例复杂度 UUCW;
第 3 步,计算未平衡用例点。把角色复杂度和用例复杂度相加,得到未平衡用例点,即 UUCP = UAW+UUCW。
第 4 步,用技术复杂度因子 TCF 和环境复杂度因子 ECF 进行调整,得到用例点 UCP,即 UCP =TCF ECF UUCP。
第 5 步,估算项目开发工作量。我门还可以根据历史数据得知完成每个用例点的平均时间,进一步可以计算出项目开发的工作量,即 工作量 = UCP * 生产率。关于生产率,用例点发明者建议,完成每个用例点(UCP)一般会使用 16-30 人时,可以取平均值 20 人时。
备注:
- 技术复杂度共有 13 项调整因子,可按下表给出的经验公式进行计算:
- 环境复杂度因子有 8 项调整因子,可按下表给出的经验公式进行计算:
机器学习方法
机器学习方法是使用历史项目数据,通过机器学习算法来找出数据中的规律,并以此估算新的项目。
神经网络就是一种机器学习方法:
上图说明了如何使用神经网络对工作量进行估算,它把影响工作量的 4 个因素,即问题复杂性、应用新颖性、使用设计工具和团队规模来作为输入,通过三层网络计算出工作量,它使用过去项目的历史数据作为训练集,再用训练好的网络来估算新的项目。
还有一种基于案例推理的机器学习方法:
首先把一个新的问题标识为一个案例,系统从历史的信息库中检索出相以的案例加以复用,在调整这些案例使其适合新的项目参数,同时把新的输出案例加到案例库中,不断地丰富已有的案例。