软件危机
软件危机的定义
软件在开发和维护过程中遇到的一系列问题
软件危机的表现
- 成本高
- 软件质量得不到保证
- 进度难以控制
- 维护非常困难
软件危机包含两方面问题
- 如何开发软件,以满足不断增长,日趋复杂的需求
- 如何维护数量不断膨胀的软件产品
软件危机产生的原因
- 复杂性高
- 规模大
- 影响软件生产率和质量的因素比较复杂
- 缺乏有效的系统原理、原则、方法和工具的指导和辅助
软件危机的技术解决途径
- 1968年提出软件工程概念和思想
- 20世纪70年代的结构化软件开发方法
- 20世纪80年代的面向对象的软件开发方法
软件工程的定义
软件工程是研究软件开发和软件管理的一门工程学科
软件工程的基本原则
- 严格按照软件生命周期各阶段的计划进行管理
- 坚持阶段评审
- 实施严格的产品控制
- 采用现代程序设计技术
- 开发小组的成员应该少而精
- 结果应能清楚地审查
- 认识不断改进软件工程实践的必要性
软件生存周期
提出软件生存周期的意义
- 降低整个软件开发工程的难度
- 便于不同人员分工协作
- 便于在各个阶段采用先进的开发方法和技术
- 便于对软件开发的全过程的组织和管理
软件过程的定义
软件过程就是为建造高质量软件所需完成的任务的框架,即形成软件产品的一系列步骤,包括中间产品、资源角色及过程中采取的方法、工具等范畴
软件能力成熟度模型(CMM)
(1)初始级
工作无序,项目进行过程中常放弃当初的计划
(2)可重复级
管理制度化,建立了基本的管理制度和规程,管理工作有章可循
(3)已定义级
建立了完善的培训制度和专家评审制度,全部技术活动和管理活动均可控制
(4)已管理级
产品和过程已建立了定量的质量目标,已建立过程数据库,已实现项目产品和过程的控制
(5)优化级
可集中精力改进过程,采用新技术、新方法
瀑布模型
特点
- 顺序性和依赖性
- 推迟实现的观点
- 文档驱动,每个阶段必须完成规定的文档
- 每个阶段结束前完成文档审查,及早改正错误
缺点
- 缺乏灵活性,需求阶段要求全部需求
- 项目开发晚期才能得到程序的运行版本
- 采用线性模型组织项目开发经常发生开发小组人员堵塞状态
适用的场景
- 产品需求确定、技术解决方案成熟
- 开发队伍的技术力量薄弱 缺乏经验
- 质量需求高于成本需求和进度需求
快速原型模型
原型
软件开发过程中,软件的一个早期可运行的版本,它反映了最终系统的部分重要特性
原型模型的分类
- 抛弃型原型
- 进化型原型
优点
- 在实践中学习
- 改善客户关系
- 保证主体需求的正确性
- 克服瀑布模型的缺点,减少需求不确定带来的开发风险
- 减少过程文档
缺点
扫描二维码关注公众号,回复:
16458321 查看本文章
- 容易退化为边做边改
- 构造一个原型需要10%的额外花费
- 原型的迭代的周期难以控制
适用场景
- 项目的需求在项目开始时不明确
- 开发新产品,验证技术可行性
增量模型
先完成一个系统子集的开发,再按同样的开发步骤增加系统子集,如此递增下去指直到满足全部系统需求
增量
满足用户需求的一个子集,是能够完成一定功能的、小而可用的软件
每一个增量都是一个瀑布模型的基本成分
优点
- 客户无需等到整个系统的实现
- 可以将早期的增量作为原型,获得后面增量的经验
- 项目总体失败的风险比较低
- 系统结构接受了最多的测试
缺点
- 要求待开发的软件系统可以被模块化
适用场景
- 项目中明确了大部分需求,但需求可能发生变化
- 市场和用户把握不准确,希望尽早进入市场
螺旋模型
螺旋模型综合楼传统的瀑布模型和快速原型模型的优点,同时增加了风险分析
瀑布模型+快速原型模型+风险分析
优点
- 支持需求的动态变化
- 尽早发现软件中的错误
- 支持风险分析
缺点
- 风险分析需要有丰富的风险评估知识和方法
适用场景
- 需求不明确或可能发生变化的大型复杂软件系统
- 支持面向过程、面向对象开发方法、具有广阔前景
统一过程模型RUP
捕获了现代软件开发的最佳实践
问题定义
什么是问题定义
- 建立项目范围,确定要开发的新系统的问题域
- 对项目进行功能性分割
问题定义关键问题
- 如何解析问题
- 用自然语言描述清楚问题的关键问题
- 问题定义举例
问题定义报告
可行性研究
可行性研究前提
- 假设问题定义已经清晰
- 是不是所有问题都有解决办法
可行性研究目标
- 用最小的代价,在尽可能短的时间内,确定问题是否有可行的解决方案
可行性研究内容
- 经济可行性
- 技术可行性
- 操作可行性
- 社会可行性
可行性研究的特征
- 不是解决问题,而是确定是否可解
- 占总成本的5%-10%
- 可行性研究一般由系统分析员负责
可行性研究的步骤
- 复查系统规模和目标
- 研究目前正在使用的系统
- 确定新系统的高层逻辑模型
- 重新定义问题
- 推荐行动方针
- 草拟软件项目开发计划
- 书写可行性研究报告,并提交审查
系统流程图
系统流程图SFD用于在可行性研究阶段描述系统的物理模型
成本/效益分析
成本/效益分析从经济角度分析开发一个新系统是否核算,从而帮助客户组织的负责人正确地做出是否投资开发软件
成本估算
- 软件的成本主要是人员开支,因此,成本估算主要估算工作量
- 估算出软件开发或维护的工作量,然后计算各类人员工作量的比例,再分别计算每类人员的工资总额,即可求出人员开支成本
需求分析
需求问题
- 需求是软件项目成败的关键所在
- 越早发现需求错误,越早改正它,其代价越小
- 需求是系统必须具有的能力
- 好需求的特征:无歧义、完整、一致、可检验、确定、可跟踪的、正确的、
需求定义
- 用户解决问题或达到目标所需的条件
- 系统或系统部件要满足合同、标准、规范或其他正式规定文档所需具有的条件
- 反映上述两种条件的文档说明
需求性质
- 必要的
- 无歧义的
- 可测的
- 可跟踪的
需求的分类
- 业务需求
- 用户需求
- 软件功能需求
- 非功能需求
业务需求
- 系统建立的战略出发点,表现为高层次的目标
- 系统应该具备的特性
- 参与各方建立一个共同的前景
- 限定系统的范围
用户需求
- 用户需求是指描述用户使用软件需要完成什么任务、怎么完成
- 通常是在业务需求定义的基础上通过用户访谈、调查,对用户使用的场景进行整理,从而建立用户角度的需求
- 用户需求是需求捕获的结果
功能需求
- 软件功能需求可以直接映射为系统行为,定义了系统中需要实现的功能,描述了开发人员需要实现什么
- 将用户需求转化为软件功能需求的过程是一个复杂的过程
非功能需求
- 速度
- 容量
- 吞吐量
面向对象的提出
- 第一阶段:以计算为中心
分析设计围绕程序的运行效率、算法优劣来进行 - 第二阶段:以过程为中心
分析设计围绕数据流进行,以数据流程来模拟业务流程。面向过程的设计是以程序模块来构建软件结构
典型模型:E-R图、数据流图、状态转换图、判定表、判定树
面向对象的优点
- 从认知学的角度来看,面向对象方法符合人们对客观世界的认识规律
- 面向对象方法开发的软件系统易于维护,其体系结构易于理解、扩充和修改
- 面向对象方法中的继承机制有力支持软件的复用