第二章 软件项目计划
软件项目计划是做什么的?
1.一个软件是否值得开发:
需要多长开发时间和多少投资成本?使用多少资源?
存在哪些风险,如何预防这些风险?
————————————————————————可行性分析
2.如何制定计划,安排人员,分配任务,安排进度?
————————————————————————项目计划
2.1问题定义
目的:
-
弄清楚用户需要解决的问题——系统总目标是什么?
-
项目所需要的资源和经费(粗略估计)
任务:
编写“系统目标与范围的说明”
实例:学生到教材科购书
人工教材销售中,学生购教材,要先到系里根据教学计划用书开购书证明,然后去教材科购买学生要跑两个地方——烦!系里——烦!如果直接到教材科,为防止学生多买或错买,影响计划供应,教材科在开发票前要审查购书单,(书种类多,学生专业多!),手续繁琐效率低下!
系统目标与范围的说明——示例
2.2可行性研究
目的:
-
研究项目是否可能实现和值得进行(不是解决问题,而是分析存在风险,确定是否值得投入巨大的人力物力去做)
-
回答why to do?&YES or NO
开销:
可行性研究的成本只占预期工程总成本的5%-10%
2.2.1可行性研究步骤:
推陈出新、几套备选方案、可行性分析
1.细化和修改"系统目标和范围",得出新系统逻辑模型
- 复查"系统目标和范围",弄清用户的意图
- 研究目前正在使用的系统流程图(旧的模型,现有模型)
- 导出新系统逻辑模型——数据流图简化版(我们想要设计的模型)
2.导出新系统的几种可能的解决方案
- 提供多种开发方案,评价,择一
提出推荐的方案
- 本项目的开发价值
- 推荐这个方案的理由
3.可行性分析
- (经济可行性、技术可行性、法律可行性、用户使用可行性)
4.书写文档提交审查,给出结论意见(做or放弃?)
2.2.1.1推陈出新——>使用系统流程图:
- 描述系统物理模型
- 表达了数据在系统各部件之间的流动情况
- 包含人员、硬件、软件等子系统
- 符号:借用程序流程图符号
- 复查"系统目标和范围",弄清用户的意图
需要把系里开购书证明去掉,将审查购买的任务划归教材科的计算机售书系统。
- 研究目前正在使用的系统流程图(旧的模型,现有模型)
- 导出新系统逻辑模型——数据流图简化版(我们想要设计的模型)
2.2.1.2推荐方案,方案选择:
系统的分解和实现方案是不唯一的,
- 不同方案开发出的系统在系统功能和性能方面会有很大的差异(精度,安全性,可靠性)
- 不同方案对成本、时间、人员、技术、设备的要求不同(设计,开发,设备,编码,测试,评审,运行,维护成本……)
- 直接购买类似的商业软件VS自行开发(钱!)
反复比较
eg:停车位系统
2.2.1.3可行性分析的内容
1.可行性分析:
(1)经济可行性
- 这个系统有无经济效益,多久能收回开发成本?(投资—回报期)
- 通过成本—效益估算,确定系统是否值得投资开发
(2)技术可行性
- 风险分析:给定约束下能否设计并实现系统所需功能?
- 资源分析:现有资源下(硬、软件,技术力量)能否实现?
- 技术分析:现有科学技术能否实现?有哪些技术难点?
(3)法律可行性:
- 侵权、破坏、责任,是否与法律相抵触?
法律可行性案例:
1)邮箱进入后,30分钟后,再次刷新——能再看到原来的邮件内容么?——no,session默认为30分钟
(2)网银的动态口令的输入允许时间为60秒
(3)手机余额可以直接查询,而手机通信详单要二次手机验证码验证
2.成本——效益分析:
估计新系统所需的成本和可能产生的效益,以便从经济上衡量这个项目的价值
- 系统成本:
- 开发成本
- 运行维护成本
- 系统效益:
- 经济效益—有形(按货币)
- 社会效益—无形(学生节约购书时间)
- 分析内容:
- 成本估计:
-
计算系统的成本组成
-
成本估计使用的几个概念
-
成本估计方法
1)基于代码行技术
2)基于工作量的任务分解技术
3)基于经验公式的估算模型
a)静态单变量模型
b)动态多变量模型
c)COCOMO模型
2.效益分析
- 货币的时间价值
- 纯收入
- 投资回报期
计算系统的成本组成(四部分)
- 购置并安装软,硬件及其相关设备成本
- 系统开发费用(成本估计)
- 人员培训费用
- 系统安装、运行和维护费用
成本估计方法
-
开发成本估计使用的几个单位:
-
代码行L
-
工作量E(人—月,人—年)
-
人员数量(人)
-
开发时间T(月)
-
成本率(元/行)
-
生产率(行/月)
-
工资(元/人—月)
-
估算方法:
-
基于代码行技术
1)思想:
简单自底向上的定量的估算方法,把开发每个软件功能的成本和源程序代码行数联系起来. 若有历史数据作参考的话,方法还是有效的。
2)最佳期望行数:
L=(a+4m+b)/6 ;a:可能最小行数,b:可能最大行数,m:最可能的行数
3)行数的总误差:
L d = ∑ i = 1 n ( b − a 6 ) 2 L_d=\sum_{i=1}^{n}{(\frac{b-a}{6})}^2 Ld=∑i=1n(6b−a)2 n为所划分的子系统数目
4)计算成本:
软件成本(元)=代码行(行数)*成本率(元/行)
其中成本率取决于软件的复杂程度和工资水平
- 基于工作量的任务分解技术
把软件开发工程分解为若干个相对独立的子任务,分别估计每个子任务的成本,累加起来得到软件工程的总成本:
T = ∑ α ∗ B T=\sum{\alpha*B} T=∑α∗B T:软件总成本 B:每个单独开发任务的成本 α:系数
B=C*D
C:完成该子任务所需人力(人—月)
D:每人每月的平均工资(元/月—人)
所以: T = ∑ α ∗ C ∗ D T=\sum{\alpha*C*D} T=∑α∗C∗D
-
基于经验公式的估算模型
- 静态单变量模型:
面向KLOC的估算模型:
-
Walston_Felix模型(L->E和T)
E = 5.2 ∗ ( K L O C ) 0.91 ( 人月 ) E=5.2*(KLOC)^{0.91}(人月) E=5.2∗(KLOC)0.91(人月)
T = 2.5 ∗ E 0.35 T=2.5*E^{0.35} T=2.5∗E0.35
其中KLOC为代码行数的单位(千行)
-
Doty模型(在KLOC>9适用)
E = 5.288 ∗ ( K L O C ) 1.047 E=5.288*(KLOC)^{1.047} E=5.288∗(KLOC)1.047
-
动态多变量模型:
———————————人力资源的Rayleigh—Norden曲线
———————————Putnam模型提出的基础
-
Peyleigh曲线:
- 横坐标表示距开发起点的时间,
- 纵坐标表示在不同时间点需要的人力
- td位于曲线的峰点
-
从Rayleigh曲线上看出,若平均使用人力(虚线),则:
- 开始阶段人力过剩,如图①
- 中间人手不足,②
- 后期补偿为时已晚,③,造成人员浪费
-
信息系统的人力分配大致如Rayleigh曲线,td两边约为4:6
-
Putnam模型
-
基于Rgleigh曲线,Putanam结合4000多个当代软件项目中手机的生产率数据,推导出来动态多变量模型
-
E = ( L O C ∗ B 0.333 / P ) 3 ∗ ( 1 / t ) 4 E=(LOC*B^{0.333}/P)^3*(1/t)^4 E=(LOC∗B0.333/P)3∗(1/t)4
LOC:由前面基于LOC估算出的代码行(行)
E:工作量 单位:(人月)或(人年)
t>1:开发时间(月)或(年)
B:特殊技术因子,随规模和要求的增加而缓慢增加:
小的程序(KLOC=5~15),B=0.16
超过70KLOC的程序,B=0.39
P:生产率参数(2000—30000),
P=2000,实时嵌入式开发
P=10000,电信及系统软件
P=12000,科学计算软件
P=28000,商业系统应用软件
Putnam模型揭示了工作量与实践的四次方成反比
-
-
COCOMO模型:
效益分析:
-
系统效益:
- 经济效益—有形(按货币)
- 社会效益—无形(学生节约购书时间)
-
一般设生命周期为5年
-
经济效益分析涉及重要概念
-
货币的时间价值(折算成当前的,现在)
-
成本估算的目的是要对项目投资,但投资在前取得效益在后,因此,要考虑货币的时间价值
-
通常用利率来表示货币的时间价值
设年利率为i,现存入钱为P,则 n年后可以获得的钱数为:
F = P ( 1 + i ) n F=P(1+i)^n F=P(1+i)n这就是P元钱在n年后的价值
反之,若n年后能收入F元,则这些钱折合到现在价值为: P = F / ( 1 + i ) n P=F/(1+i)^n P=F/(1+i)n
-
eg:CAD系统的效益分析:
CAD模型每年节省多少钱?
t_draw:平均绘图时间=4小时
c:每个绘图小时的成本=20元
n:每年的绘图量=8000
p:CAD系统中已完成的绘图比=60%
采用CAD绘图时间缩减比为1/4
则每年节省的绘图费用为:
缩减比*t_draw*c*n*p=9.6万元
五年节省多少钱?(折算到现在)
-
-
纯收入
是指在整个生存周期之内系统的累计经济效益(折合成现在值)与投资之差
假如上例投资20万:纯收入=41.5630-20=21.5630
-
投资回报期
使累计的经济效益等于最初投资所需的时间。
显然投资回收期越短,就能越快地获得利润,因此这项工程也就越值得投资
CAD成本效益—分析图:
-
3.可行性研究报告(FAR)
2.2.1.4可行性论证报告
-
系统概述:
- 简述当前系统及其问题
- 新系统功能及新旧系统比较
-
可行性分析:
- 经济、技术、法律上的可行性
- 建立新系统的主客观条件分析
-
结论意见:
YES or NO
2.3软件计划
-
项目组人员安排:
-
角色细化
-
项目组成员表
-
软件开发进度的安排
-
甘特图
-
Pert图(工程网络图)
机动时间=该任务结束事件的LET-该任务开始事件的EET-任务持续时间
-
-
软件开发计划:
第三章 软件需求分析
3.1需求分析概述
3.1.1需求分析的任务和步骤:
- 任务:让用户和开发者共同明确将要开发的是什么样的系统
- 步骤:
- 获取需求
- 提炼:建立分析模型
- 描述:编写SRS 需求规格说明书
- 验证
3.1.2需求获取的常用方法:
-
收集资料
-
原有系统的数据(账册,报表)
-
借鉴已有的类似软件产品
-
-
联合分析小组
- 用户代表、领域专家和系统分析员
-
客户访谈&会议
- 充分准备,寻找共同语言
- 事先准备一些问题
- 交流时循序渐进、逐步逼近
- 每次访谈后及时分析、整理、汇总
-
实地考察——观察用户工作流程
-
快速原型法
3.1.3需求说明:
是需求分析应获取的内容,写SRS的依据
-
功能需求:
- 分析用户要求实现的全部功能(分析建模DFD,DD)
-
性能需求:
- 时间特性
- 时间精确性(响应时间,更新时间,数据转换时间,数据传输时间)
- 存储容量及后援存储
- 系统安全性
-
外部接口需求
- 用户接口(人机界面)
- 硬件接口
- 软件接口
- 通信接口
-
属性(可靠性,可用性,可维护性)
-
约束(精度,标准,语言,硬件平台)
3.1.4分析建模模型:
- 分析方法的种类:
- 传统的分析方法:
- 面向数据流的结构化分析方法(SA)
- 面向数据结构的Jackson方法(JSD)
- 结构化数据系统开发方法(DSSD)
- 面向对象的分析方法:
- 传统的分析方法:
- 各种分析模型中均包括:
- 信息(或数据)模型
- 功能模型
- 行为模型
3.2结构化分析方法:
思想:自顶向下,逐步细化
适于数据处理类型软件的需求分析
步骤:
- 自顶向下对系统进行功能分解,画出分层DFD
- 由后向前定义系统的数据
- 编制DD和PSPEC
- 最终写出SRS
3.2.1结构化分析模型
3.2.2结构化分析描述工具:
功能模型:DFD和PSPEC
行为模型:CFD、CSPEC和STD
数据模型:DD,E-R图
3.2.2.1数据流图DFD:
3.2.2.1.1什么事数据流图DFD
描述系统逻辑模型:信息在系统中的流动和处理。
- 文件与加工之间用箭头线连接,单项表示只读或只写,双向表示又读又写
- 每一图形符号都必须标上名字
- 加工框还应加上编号
- 同流程图的区别:
- 程序流程图表示程序的设计过程——怎么干
- DFD是用来软件需求分析的工具,不表示程序的控制结构(选择/循环)——干什么
- 分层:从高层到低层,分解前后的数据流必须一致
实例:学生购书系统:
张秘书开购书证明,学生凭证明到教材科王会计开购书发票向李出纳员交纳书款,拿领书单到书库找保管员领书
去掉模型中非计算机本质的因素后得到的购书逻辑模型:
- 如张、王。。人是可能变动的,但是他们的工作岗位是不变的,归结为审查、开发票、开书单、发书
- 确定人工和目标系统的功能划分,其中收费、发书必须是由人工完成的,所以在计算机目标系统模型中去掉发书。
- 经过复审需求,学生不该购买或书已经卖完,则“无效书单“
改进后的学生购买教材的系统模型:
3.2.2.1.2DFD绘制步骤:
1.找到外部实体,确定系统边界
2.从数据源出发,按系统的逻辑需求,逐步画出加工框,直至数据终点
3.DFD分层,自顶向下
4.对DFD进行复审
3.2.2.1.3DFD绘制一般原则
-
每个加工必须有输入输出流
-
两个加工之间可以有多股数据流
-
每个数据流必须有一个合适的名字
-
DFD描述的是数据流不是控制流
-
分解中的**父子平衡**
平衡:子图的所有输入(输出)数据流必须是父图中相应加工的输入(输出)(4号)
不平衡:
特殊的平衡:父图只称为“订货单”的数据流是由“客户”、“帐号”和“数量”三部分数据组成的
-
局部文件
合理运用局部文件进行信息隐蔽:
例:子图中的文件ALPHA完全局部于加工4根据“抽象”原则,父图只需画出加工和加工之间的联系,而不必画出各个加工内部的细节,所以父图中不必画文件ALPHA,数据流XXX、YYY也不必画出。
当文件被用作数据流图中某些加工之间的交界面时,才必须画出来
-
注意分解速度
- 最多不要超过7个
- 上层快些,下层慢些
-
当每个加工都已足够简单时,分解就可以结束
3.2.2.1.4**数据流图的基本图元素:**
附加符号:
- *表示数据流之间是AND关系(同时存在)
-
+表示数据流之间是OR关系
-
$$\bigoplus$$表示数据流之间是XOR关系(互斥关系)
输入:
与:
登陆界面:只有用户名和密码都输对了才能登陆
火车实名制:只有乘客拿着身份证A 和钱(数额)才能买票成功(C车票)
或:
教材销售(超市)付款:要么付现金(A),要么刷卡(B),也可以刷卡+余额现金,输出是付款成功(C)
考勤系统的门禁:输密码A或刷卡B,进入实验室的门禁(门开状态C)
异或:要么开、要么关:
水闸的关闭系统 开:A ,关:B ,输出C:闸的位置
输出:
与:
教材系统:发票这个数据流(A),购买模块输出购买记录(B),并领书单(C)
订票系统,订票成功这个模块,同时写入车票购买记录(B),并打印输出车票(C)
或:
教材销售记录查询之后(A),显示报表输出(B)或者流向提示是否打印报表(C)
存折查询也查询之后(A),提示要么显示输出(B)或者要么提示打印存折(C)
异或:
教材系统的入口功能选择 功能选择(A),销售(B)、采购(C)
销售系统的付款加工(A),结果,要么成功(B)、要么付款失败(C),这种异或案例也见网上付款。
3.2.2.1.5实例1-1:教材购销系统:
(1)顶层DFD:
这个数据流图只是一个高层的系统逻辑模型,它反映了目标系统要实现的功能
-
首先确定系统的输入和输出
-
顶层数据流图,反映最主要业务处理流程
(2)第一层DFD:
(3)第二层DFD:1销售子系统:
分成两部分:补售、初售
3.2.2.2数据字典DD
与DFD配合,给出DFD中所有数据的定义和属性:
-
DD的用途:
- 分析阶段的交流工具
- 包含控制信息
- 数据库设计的基础
-
内容:
- 数据项(一个数据元素)
- 数据流(包含多个数据项)
- 数据文件或数据库
-
定义数据的方法:自顶向下分解数据
-
表示方法:表格、公式法
-
表格:(自顶向下:从文件->数据流->数据项)
-
公式法定义DD:
-
存折=户名+帐号+性质+(印密) //存折由户名、帐号、性质和可选印密组成
-
户名=2{字母}24 //户名为2-24个字母
-
账号 = 账号码+“*”
-
帐号码=“00000001”…“99999999” // 帐号位于1-99999999的区间
-
性质=[普通用户|工资用户|结算用户] //帐户性质为普通用户、工资用户中一种
-
印密=“0” // 默认无印密
-
-
课堂练习:
-
( 笔记本)
3.2.2.3 E—R图:对复杂数据分析和建模
一对一、一对多、多对多————>>>>产生第三张表
主码(唯一标识记录),外码
教师:主码为工号
课程:主码为课程号
详见:笔记本(E-R图)
3.2.2.4加工说明PSPEC
###判定树:
###结构化语言:
###判定表: