软件工程概述
从软件与软件危机出发,理解软件工程的定义、三要素、软件生命周期与基本原理 —— 全课程的总纲。
🎯学习目标
- 理解软件的概念、特性与分类;
- 了解软件危机的表现与产生原因;
- 掌握软件工程的定义与方法、工具、过程三要素;
- 掌握软件生命周期(SDLC)各阶段的任务;
- 理解软件质量的主要要素与软件工程基本原理。
1软件是什么
软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合。
💡 经典公式软件 = 程序 + 数据 + 文档。程序是按事先设计的功能和性能要求执行的指令序列;数据是程序能正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文资料。
| 组成 | 含义 |
|---|---|
| 程序 Program | 能够完成预定功能和性能的可执行指令序列 |
| 数据 Data | 使程序能够正确处理信息的数据结构 |
| 文档 Document | 开发、维护和使用程序所需要的图文资料 |
软件与硬件最大的不同:软件是逻辑的、知识密集型的产品,没有物理磨损,但会"退化(老化)"。
2软件危机(Software Crisis)
软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。1968 年 NATO 会议首次提出"软件工程"以应对软件危机。
主要表现
| 表现 | 说明 |
|---|---|
| 成本与进度失控 | 开发成本和进度估计常常很不准确,超支、拖期普遍 |
| 用户不满意 | 软件产品往往不符合用户实际需要 |
| 质量低 | 软件可靠性差,错误多,难以保证质量 |
| 难以维护 | 软件常常是不可维护的,修改困难 |
| 缺乏文档 | 软件通常没有适当的文档资料 |
| 生产率低 | 软件生产率跟不上硬件和需求的发展 |
产生原因
🧩
软件本身复杂
逻辑复杂软件是逻辑产品,规模大、复杂度高、不可见,难以理解和度量。
🛠️
方法不当
作坊式生产忽视需求分析、轻视文档、采用个体手工作坊式开发,缺乏工程化方法。
📈
规模增大
需求膨胀软件规模和复杂性急剧增长,传统个人开发方式无法适应。
🔁
维护困难
轻视维护对软件维护的重要性认识不足,缺乏文档导致维护成本高昂。
⭐ 结论解决软件危机既要有技术措施(方法和工具),又要有必要的组织管理措施 —— 这正是软件工程诞生的原因。
3软件工程定义与三要素 ⭐(核心考点)
软件工程是应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来开发与维护软件的学科。其目标是以较低的成本开发出高质量的软件。
💡 IEEE 定义软件工程是:① 将系统化的、规范化的、可量化的方法应用于软件的开发、运行和维护;② 对上述方法的研究。
软件工程三要素:方法、工具、过程
图1 · 软件工程三要素:方法 / 工具 / 过程,三者协同以保证软件质量
| 要素 | 含义 | 举例 |
|---|---|---|
| 方法 Method | "怎样做"——完成各项任务的技术方法 | 结构化方法、面向对象方法、UML 建模 |
| 工具 Tool | "用什么做"——为方法提供自动或半自动的支持 | IDE、版本控制、CASE 工具、测试工具 |
| 过程 Process | "何时做"——将方法和工具结合起来的步骤序列 | 瀑布、增量、螺旋、敏捷等过程模型 |
⭐ 记忆口诀方法回答"怎样做",工具回答"用什么做",过程回答"何时做、做什么"。三要素都围绕一个核心目标——软件质量。
4软件的特性与分类
软件的特性
- 抽象性(逻辑产品):软件是逻辑实体,不是物理实体,无法触摸;
- 开发性:软件是"开发"或"设计"出来的,而非传统意义上"制造"出来的;
- 不磨损但会退化:软件不会像硬件那样磨损,但会因不断修改而退化(老化);
- 复杂性:软件规模大、逻辑复杂、难以度量和控制;
- 依赖硬件:软件的运行受硬件环境制约。
图2 · 软件不像硬件那样磨损,但每次变更会引入新缺陷并逐步退化
软件的分类
| 分类角度 | 类型 |
|---|---|
| 按功能 | 系统软件、支撑软件、应用软件 |
| 按规模 | 微型、小型、中型、大型、超大型 |
| 按工作方式 | 实时软件、分时软件、交互式软件、批处理软件 |
| 按服务对象 | 项目软件(定制)、产品软件(通用) |
5软件生命周期(SDLC)
软件生命周期是指一个软件从提出开发要求开始,直到该软件报废为止的整个时期,一般划分为软件定义、软件开发、运行与维护三个时期。
图3 · 软件生命周期:三大时期、八个阶段
| 时期 | 阶段 | 主要任务 |
|---|---|---|
| 定义时期 | 问题定义 | 确定"要解决的问题是什么" |
| 可行性研究 | 技术/经济/法律/社会可行性,能否做、值不值得做 | |
| 需求分析 | 确定"系统必须做什么",产出需求规格说明书 | |
| 开发时期 | 概要设计 | 设计软件总体结构(怎么做) |
| 详细设计 | 设计每个模块的算法和数据结构 | |
| 编码与单元测试 | 编写程序并对模块单独测试 | |
| 综合测试 | 集成测试、确认测试、系统测试 | |
| 运行维护 | 运行与维护 | 改正性/适应性/完善性/预防性维护 |
6软件质量要素
软件质量是软件满足明确或隐含需求的程度。经典的 McCall 质量模型从三个视角描述质量:
🎯
产品运行
正确性、可靠性、效率、完整性、易用性
🔧
产品修改
可维护性、灵活性、可测试性
🔄
产品转移
可移植性、可重用性、互操作性
| 质量要素 | 含义 |
|---|---|
| 正确性 Correctness | 程序满足规格说明及用户目标的程度 |
| 可靠性 Reliability | 在规定条件下完成预期功能的能力 |
| 效率 Efficiency | 完成功能所需的计算资源与代码量 |
| 可维护性 Maintainability | 查找和修改错误所需的工作量 |
| 可移植性 Portability | 从一个环境转移到另一个环境的难易程度 |
| 可重用性 Reusability | 程序可在其他应用中再次使用的程度 |
| 易用性 Usability | 学习、操作、准备输入和解释输出的难易程度 |
7软件工程基本原理
Boehm 综合提出软件工程的 7 条基本原理,被认为是确保软件产品质量和开发效率的最小集合:
- ① 用分阶段的生命周期计划严格管理;
- ② 坚持进行阶段评审;
- ③ 实行严格的产品控制(基准配置管理,控制需求变更);
- ④ 采用现代程序设计技术;
- ⑤ 结果应能清楚地审查;
- ⑥ 开发小组的人员应少而精;
- ⑦ 承认不断改进软件工程实践的必要性。
💡 一句话这 7 条原理的核心是:过程可控、阶段可查、变更受控、人员精干、持续改进。
⭐重点例题
例题1:辨析"软件 ≠ 程序"
问:有人说"软件就是程序",这种说法对吗?为什么?
答:不对。软件 = 程序 + 数据 + 文档。程序只是可执行的指令序列,而软件还包括使程序正确运行的数据结构,以及开发、维护、使用所需的全部文档。仅有程序而缺少文档的软件难以维护,正是软件危机的表现之一。
答:不对。软件 = 程序 + 数据 + 文档。程序只是可执行的指令序列,而软件还包括使程序正确运行的数据结构,以及开发、维护、使用所需的全部文档。仅有程序而缺少文档的软件难以维护,正是软件危机的表现之一。
例题2:解释软件工程三要素及其关系
答:软件工程三要素是方法、工具、过程。
方法(Method) —— 完成开发的技术手段,回答"怎样做"
工具(Tool) —— 为方法提供自动化支持,回答"用什么做"
过程(Process)—— 把方法和工具串成步骤序列,回答"何时做"
三者层层支撑:过程定义框架,方法在框架内提供技术,工具支持方法落地,最终共同服务于软件质量这一核心目标。
例题3:为何软件会"退化"而不"磨损"?
答:硬件随时间因物理损耗而磨损,失效率呈"浴盆曲线"。软件没有物理实体,不会磨损;但软件在生命周期中需要不断修改维护,每次修改都可能引入新缺陷,使失效率短暂回升,长期累积导致结构劣化——这就是软件的"退化(老化)"。
🎯自测(点击展开)
软件由哪三部分组成?
程序 + 数据 + 文档。
软件危机的主要表现有哪些?
成本进度失控、不符合用户需要、质量低可靠性差、难以维护、缺乏文档、生产率低等。
软件工程三要素是什么?分别回答什么问题?
方法(怎样做)、工具(用什么做)、过程(何时做)。
软件生命周期分为哪三个时期?
软件定义时期、软件开发时期、运行与维护时期。
软件维护包括哪四类?
改正性维护、适应性维护、完善性维护、预防性维护。
为什么说软件不会磨损但会退化?
软件无物理实体不会磨损;但不断修改会引入缺陷使结构劣化,称为退化(老化)。
📝强化题库
选择题点选即时判分;填空题输入后"检查"或"显示答案"。
已答 0/0答对 0正确率 —
已答 0/0答对 0