第5章 软件工程 / 5.1
5.1 软件工程定义
一句话讲明白
软件工程就是"别再靠天才程序员拍脑袋写程序,改用盖大楼那套工程办法:定流程、分工种、留文档、可度量"。
生活类比
一个人给自己搭个狗窝:拎几块木板、钉子一敲,两小时搞定,不需要图纸,不需要验收。
但要盖一栋 30 层住宅:必须先做可行性研究(这块地值不值)、出设计图(结构/水电/消防)、分班组施工、每道工序验收、交付后还有物业运维。规模一大,"个人手艺"就不够用了,必须靠"工程"——这就是软件危机的由来,也是软件工程诞生的原因。
正经定义
软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程,其目的是提高软件生产率、提高软件质量、降低软件成本。
- IEEE 定义:将系统的、规范的、可度量的工程化方法应用于软件开发、运行和维护的全过程,及上述方法的研究。
- Fritz Bauer 定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
拆解与流程
一、为什么会有软件工程:软件危机
1968 年首次提出"软件危机(Software Crisis)",典型表现有 6 条:
| 表现 | 大白话 |
|---|---|
| 开发进度难以预测 | 说好三个月,做了一年 |
| 开发成本难以控制 | 预算越花越多 |
| 功能难以满足用户期望 | 做出来不是用户想要的 |
| 软件质量无法保证 | Bug 满天飞 |
| 软件难以维护 | 没人看得懂、没人敢改 |
| 缺少适当的文档资料 | 只有代码,啥说明都没有 |
二、软件工程三要素
| 要素 | 是什么 | 大白话 |
|---|---|---|
| 方法 | 完成软件项目的技术手段,支持整个软件生命周期 | 怎么干的套路 |
| 工具 | 智力与体力的扩展延伸,自动或半自动支持开发与管理、生成文档 | 拿什么干 |
| 过程 | 为获得软件产品,在工具支持下由软件工程师完成的一系列工程活动 | 按什么顺序干 |
三、软件生命周期七个阶段(必背顺序)
flowchart LR
A[可行性研究<br/>与计划] --> B[需求分析] --> C[概要设计] --> D[详细设计] --> E[编码] --> F[测试] --> G[运行维护]
| 阶段 | 要回答的问题 | 关键产出 |
|---|---|---|
| 可行性研究与计划 | 这事值不值得干、能不能干 | 可行性研究报告、项目开发计划 |
| 需求分析 | 用户到底要什么 | SRS 需求规格说明书 |
| 概要设计(总体结构设计) | 系统分成几块、块之间怎么调 | 软件结构图、模块划分 |
| 详细设计 | 每个模块内部具体怎么实现 | 详细设计说明书、伪码 |
| 编码 | 翻译成程序语言 | 源程序 |
| 测试 | 做对了没有 | 测试报告 |
| 运行维护 | 上线后持续改 | 维护记录 |
考试怎么考
- 题型:选择题为主;案例题常用"该项目缺少可行性研究/没有设计文档"作为失分点。
- 必背数字/年份:1968 年提出软件危机;三要素;生命周期 7 阶段。
- 必背原话:IEEE 定义的三个形容词——系统的、规范的、可度量的。
- 常见问法:
- "以下哪项不属于软件工程的三个组成部分?"(方法/工具/过程,其他都是干扰项)
- "软件生命周期中,确定软件系统'怎么做'的阶段是?" → 设计阶段(概要+详细)
- "软件需求规格说明书在哪个阶段产生?" → 需求分析阶段
易混辨析
| 对比 | 程序 | 软件 |
|---|---|---|
| 组成 | 只是代码 | 程序 + 数据 + 文档 |
| 阶段归属 | 只是编码阶段产物 | 全生命周期产物 |
另一个常混:概要设计(分模块、定接口,解决"系统有哪些块")vs 详细设计(每个模块内部的算法和局部数据结构,解决"块里面怎么算")。
一秒记忆
"1968 闹危机,工程三件:方法、工具、过程;生命周期七步:可需概详编测维。" (谐音:可需概详编测维 = 可行、需求、概要、详细、编码、测试、维护)