软件工程
软件无处不在
软件
是软件工程的研究对象,也是软件工程的产品形态与客观存在
工程
是将理论和知识应用于实践的科学,其目的是经济有效的解决实际问题
软件的本质特性
软件 = 程序 + 数据 + 文档
- 程序:计算机可以接受的一系列指令,运行时可以提供所要求的的功能和性能
- 数据:使得程序能够适当地操作信息的数据结构
- 文档:描述程序的研制过程,方法和使用的图文资料
软件具有
- 复杂性
- 一致性
- 可变性
- 不可见性
上面是软件开发困难的根本原因
一致性
- 软件不能独立存在,需要依附于一定的环境(如硬件,网络以及其他软件)
- 软件必须遵从人为的惯例并适应已有的技术和系统
- 软件需要随接口不同而改变,随时间推移而变化,而这些变化是不同人设计的结果
可变性
- 软件一直在变化更新
- 人们总认为软件是容易修改的,但忽视了修改的副作用
- 不断的修改最终导致软件的退化,从而结束其生命周期
不可见性
- 软件是一种
看不见
摸不着的逻辑实体,不具有空间的形体特征 - 开发人员可以直接看到程序代码,但是源代码并不是软件本身
- 软件是以机器代码得形式运行,但是开发人员无法看到源代码是如何执行的
软件所具有的复杂性,一致性,可变性,不可见性等特性,使得软件开发过程变得难以控制,开发团队如同在焦油坑中挣扎的巨兽
软件工程的产生与发展
软件开发面临的挑战
- 客户不满意
- 交付的许多功能不是客户需要的
- 交付的日期没有保障
- 客户使用时发现许多bug
- 项目过程失控
- 客户需求变化频繁,无力应对
- 无法预见软件的交付质量
- 对流程盲目遵从,忽视客户业务价值
- 风险与成本问题
- 开发团队专注技术,忽视风险
- 无能力预测成本,导致预算超支
- 无力管理团队
- 无法评估开发人员能力及工作进度
- 困扰于如何提升团队的能力与效率
软件工程
一直致力于探索软件开发问题的解决之道
1968年,北大西洋公约组织提出软件工程
概念和术语
软件工程的基本概念
软件工程
- 将系统的,规范的,可定量的方法应用与软件的开发,运行和维护,即工程化应用到软件上
- 对1中所述方法的研究
好的软件
- 较低的开发成本
- 按时完成开发任务并及时交付
- 实现客户要求的功能
- 具有良好性能,可靠性,可扩展性,可移植性等
- 软件维护费用低
软件工程的基本要素
- 过程
支持软件开发各个环节的控制和管理 - 方法
完成软件开发任务的技术手段 - 工具
为软件开发方法提供自动或半自动的软件支撑环境
软件开发的基本策略
- 软件复用
- 分而治之
- 逐步演进
- 优化折中
软件工程的wasserman规范
- 抽象
- 软件建模方法
- 用户界面原型化
- 软件体系结构
- 软件过程
- 软件复用
- 度量
- 工具与集成环境
软件质量实现
什么是好的软件
- 功能质量
- 软件符合指定需求
- 软件几乎没有缺陷
- 软件性能正常
- 软件容易上手,操作方便
- 结构质量
- 代码可测试性
- 可维护性
- 可读性
- 代码效率:高效管理资源
- 代码安全:可预防常见威胁
- 过程质量
- 软件按时交付
- 软件满足预算
- 可复用的开发过程,确保交付质量
产品质量维度
- 性能
- 特色
- 可靠性
- 符合型
- 耐久性
- 可服务性
- 审美
- 感知
ISO9126质量模型
- 功能性
- 适合性:当软件在指定条件下使用,其满足明确和隐含要求功能的能力
- 准确性:软件提供给用户功能的精确度是否符合目标
- 互操作性:软件与其他系统进行交互的能力
- 安全性:软件保护信息和数据的安全能力
- 可靠性
- 成熟性:软件产品避免因软件错误发生而导致失效的能力
- 容错性:防止外部接口错误扩散而导致系统失效的能力
- 可恢复性:系统失效后,重新恢复原有的功能和性能的能力
- 易用性
- 易理解性
- 易学习性
- 易操作性
- 吸引性
- 效率
- 时间特性
- 资源利用
- 可维护性
- 易分析性
- 易改变性
- 稳定性
- 易测试性
- 可移植性
- 适应性
- 易安装性
- 共存性
- 替换性