当前课程知识点:软件工程 > 第5章 团队开发管理 > 5.4 软件项目估算 > 讲课视频
项目估算
是要估计完成交付产品的
时间和成本
对于软件项目来说
估算最大的挑战
是项目的复杂性和不确定性
软件规模越大复杂性越高
不确定性就越大
需求的不确定性
也会对项目估算产生很大影响
另外
也缺少可靠的历史数据
为估算提供参考
现实中
许多开发人员不愿做计划
对估算缺乏信心
学生做作业可能有这样的体会
如果没有截止时间的要求
有的作业可能永远都完不成
所以我们要克服困难
努力做出一个相对有价值的估算
随着经验越来越多
估算就会越来越准确
软件项目管理
是为了产出和结果
而不是为了活动
所以估算主要是针对结果进行
估算是在预测未来
不管用什么方法
所有的估计从定义上来说
都只是概率
虽然估计存在不确定性
但是你做出的估计
在很多时候都会变成一种承诺
所以在估计时
要基于事实 考虑风险
做出合理的调整
确保对完成时间有信心
专家判断
是一种常见的估算方法
主要是依赖专家的经验
和类似项目的历史信息
对具体任务
做出时间或者成本的估算
这种方法
主要是依赖专家的能力和经验
来判断哪些项目是相似的
在哪些方面相似
但是有些
表面上看起来相似的项目
实际上可能存在很大不同
比如说一个运动员
在4分钟跑完一英里
我们不可能按照这个速度
推断出
他可以在1小时45分钟
跑完马拉松
因为跑马拉松和跑一英里
存在很大的差别
大部分专家判断
技术过于简单化
很多可能影响工作量的因素
并没有考虑进去
所以这种估算
存在很大的不准确
参数估算也是常用的一种方法
这种方法通过对大量的
项目历史数据进行统计分析
使用项目特性参数
建立经验模型
再根据模型
估算出成本和时间
我们在这里
简单的介绍 功能点 COCOMO
用例点和机器学习方法
大家只需要初步了解
这些方法的基本原理
功能点方法
是根据软件信息域的基本特征
和软件复杂性
估算出软件的规模
并以功能点为单位来进行度量
这种方法使用五种信息域
来刻划软件的基本特性
第一 是外部输入
主要是指通过界面的一些输入
像插入 更新这样的操作
也都是典型的外部输入
第二 是外部输出
像导出 报表 打印都属于输出
第三 是外部查询
查询操作一般是要先输入数据
再根据输入的数据计算得到输出
第四 是内部逻辑文件
可以理解为业务对象
有可能对应多个数据表
第五 外部接口文件
它是指其他应用提供的接口数据
功能点方法
包括以下过程
首先确定功能点计算的范围
和应用程序边界
估计出
所有数据功能及其复杂性
也就是内部逻辑文件
和外部接口文件
再估计出
所有事务功能及其复杂性
也就是外部输入 外部输出
和外部查询
根据信息域的加权因子
计算得出未调整功能点UFC
然后根据所开发系统的特点
得到这个表所列的
14项调整因子值
最后通过这个公式
计算得出已调整的功能点FP
这里功能点
代表了软件规模的度量单位
我们也可以根据
以往项目的历史数据
统计出不同编程语言
对应一个功能点的代码行
进而可以把功能点转化为代码行
结构化成本模型
COCOMO是一种利用经验模型
进行工作量和成本估算的方法
这种模型分为基本 中间 详细
三个层次
分别用于软件开发的
三个不同阶段
也就是系统开发初期
各子系统的设计
以及子系统内部各个模块的设计
这里给出的
是一个基本COCOMO的经验公式
其中PM代表工作量
以人月为单位
A是工作量调整因子
B是规模调整因子
Size代表软件规模
可以是千行代码
或者是功能点数
COCOMO模型
把软件分为组织型 嵌入型
和半独立型三种类型
不同的软件可以对应
这三类软件的适用范围
选取相应的参数
由于这种模型是根据
以前的和局部的数据得出的
不可能完全适用于
当前所有的软件项目
和开发环境
所以它的计算结果
只能是一个大概的参考
用例点估算
主要是对面向对象软件的
开发规模和工作量进行估计
它和功能点方法比较类似
但是比功能点要简单一些
这是一个顾客到银行存钱 取钱
和转帐的用例图
其中像个小人这样的一个符号
代表着和系统进行交互的角色
可以是使用者
也可以是其他系统
椭圆符号
代表着描述系统功能的用例
关于用例图的内容
我们将在有关需求建模的
相关章节
进行详细讲解
这里大家只要大概知道
用例和角色的一个含义就行
用例点估算
首先需要建立用例模型
然后通过以下步骤进行估算
第一步
计算角色复杂度
角色可以分成简单 一般
和复杂三种类型
简单角色
是通过API或者接口
和系统进行交互的其他系统
一般角色
是通过协议
比如说TCPIP和系统
进行交互的其他系统
复杂角色
是通过界面和系统进行交互的人
他们的权重分别是1 2和3
通过加权求和
可以得到角色复杂度UAW
第二步 计算用例复杂度
用例复杂度也是分成
简单 一般和复杂三种类型
可以根据涉及的数据库实体数
操作步骤数
和实现所用类的个数来区分
权重分别是5 10和15
同样
可以通过加权求和的方式
得到用例复杂度UUCW
第三步
把角色复杂度和用例复杂度相加
得到未平衡的用例点
第四步
计算技术复杂度因子
和环境复杂度因子
计算得到最终的用例点
接下来
我们还可以根据历史数据
得知完成每个用例点的平均时间
进一步可以计算出
项目开发的工作量
关于生产率
用例点发明者建议
完成每个用例点
一般会使用16-30人时
可以取平均值20人时
技术复杂度
一共有13项调整因子
可以按照上面给出的经验公式
进行计算
这里有8项环境复杂度调整因子
上面的公式
是计算环境复杂度的经验公式
机器学习方法
是使用历史项目数据
通过机器学习算法
来找出数据中的规律
并以此估算新的项目
神经网络
就是一种机器学习方法
这个图
说明了如何使用神经网络
对工作量进行估算
它把影响工作量的四个因素
也就是问题复杂性
应用新颖性
使用设计工具和团队规模
来作为输入
通过三层网络计算出工作量
它使用过去项目的历史数据
作为训练集
再用训练好的网络
来估算新的项目
还有一种基于案例推理的
机器学习方法
首先
把一个新的问题标识为一个案例
系统从历史的信息库中
检索出相似的案例
加以复用
在调整这些案例
使其适合新的项目参数
同时 把新的输出案例
加到案例库中
不断地丰富已有的案例
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)