软件到软件工程
软件危机
在计算机软件的开发和维护过程中所遇到的一系列严重问题。
进程与成本估计不准确,不满足需求,不可维护,质量不佳,无文档,成本上升
原因
-
软件本身特点
-
复杂性
-
一致性
-
不可见性
-
可变性
-
-
与软件开发与维护的方法不正确有关
- 软件=程序+文档+数据
- 只重视程序而忽视软件配置其余成分
- 软件开发人员在定义时期没有正确全面地理解用户需求,直到测试阶段或软件交付使用后才发现 “已完 成的 ”软件不完全符合用户的需要。
- 在软件开发的不同阶段进行修改需要付出的代价是很不相同的
概念
软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。
软件工程7条基本原理
- 用分阶段的生命周期计划严格管理
- 坚持进行阶段评审
- 实行严格的产品控制
- 采用现代程序设计技术
- 结果应能清楚地审查
- 开发小组的人员应该少而精
- 承认不断改进软件工程实践的必要性
软件工程方法学
- 三要素
- 方法
- 完成软件开发的各项任务的技术方法
- 工具
- 为运用方法而提供的自动的或半自动的软件工程支撑环境
- 过程
- 完成各项任务的工作步骤以获得高质量的软件
- 方法
- 传统方法:
- 面向数据流的传统软件开发方法
- 传统方法学把软件生命周期的全过程依次划分为若干个阶段, 然后顺序地完成每个阶段的任务。
- 在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审
- 采用生命周期方法学可以大大提高软件开发的成功率,软件开发的生产率也能明显提高
- 面向过程设计,以计算为核心,数据与操作分离,不易理解
- 结构依赖于功能,不稳定
- 可维护性是最令人头痛的问题
- 面向对象方法学:
- 把数据和行为看成是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法
- 以object 为核心,强调对现实概念的模拟而不强调算法,开发出尽可能直观、自然地表现求解方法的软件系统”
- 以object模拟实体,需求变化不会引起结构的整体变化,因为实体相对稳定,故系统也相应稳定
- 改善了可维护性:稳定性好,Class 独立性强,容易理解, 容易测试、调试
- OOM并不是减少了开发时间,而是通过提高可重用性、可维护性,进行扩充和修改的容易程度等,从长远角度改进了软件的质量。
软件生命周期
软件过程模型
瀑布模型
- 需求稳定,完整的,一致的
- 阶段间具有顺序性和依赖性
- 质量保证:①每个阶段都必须完成规定的文档 ②每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。
增量模型
- 能在较短时间内向用户提交可完成部分工作的产品。
- 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品
- 在把每个新的增量构件集成到现有软件体系结构中时,必须不破坏原来已经开发出的产品
演化模型
-
快速原型
- 适合需求不清晰,经常变化
- 规模不是很大,不太复杂
-
快速原型模型是不带反馈环的,不会发生较大的返工,这正是这种过程模型的主要优点
-
螺旋模型
- 每个阶段之前都增加了风险分析过程的快速原型模型
- 庞大,复杂,高风险系统
喷泉模型
- “喷泉”这个词体现了面向对象软件开发过程迭代和无缝的特性。
RUP (Rational Unified Process)统一过程模型
-
迭代式开发
-
管理需求
-
使用基于构件的体系结构
-
可视化建模语言UML
-
验证软件质量
-
控制软件变更
敏捷开发
- 极限编程XP模型
敏捷开发方法是一个较主流的开发方法,敏捷宣言给出了所有敏捷开发方法的基本理念。XP是一种主要的敏捷开发方法,其十二个最佳实践包括:计划游戏、小的发布、系统隐喻、简单设计(只关心当前需求)、测试驱动(先写测试)、重构、结对编程、集体所有权、持续集成、每周工作40小时、现场客户和编码标准
- 水晶球法
- SCRUM并列征求法
- 30天一冲刺
- 多个小组并行递增实现产品
- AUP
微软过程
每一个生命周期发布一个递进的软件版本,各个生命周期持续、快速地迭代循环