本资料覆盖全部 16 个 Lecture,包含每讲的核心知识点全面梳理、易错点深度分析和高频考点精讲。

目标是:读完本资料后直接掌握期末考试所需要的全部知识点。

目录

  1. Lecture 1 — 软件工程导论
  2. Lecture 2 — 软件过程模型
  3. Lecture 3 — 需求工程
  4. Lecture 4 — 系统建模
  5. Lecture 5 — 面向对象基础
  6. Lecture 6 — UML 入门
  7. Lecture 7 — 面向对象分析实例
  8. Lecture 8 — 架构设计
  9. Lecture 9 — 面向对象设计
  10. Lecture 10 — 面向对象设计实例
  11. Lecture 11 — 面向对象详细设计
  12. Lecture 12 — 结构化设计
  13. Lecture 13 — 软件测试(一)
  14. Lecture 14 — 软件测试(二)
  15. Lecture 15 — 配置管理
  16. Lecture 16 — 成本估算
  17. 必背速查表

Lecture 1 — 软件工程导论

快速理解

这是整门课的总纲,回答”什么是软件工程、为什么需要它”。从软件危机出发,引出软件工程的必要性和核心概念。理解本讲是掌握后续所有内容的基础。

核心知识点

1. 软件的定义

2. 软件危机(Software Crisis)

3. 软件工程的定义

维度 计算机科学 软件工程
关注点 理论和算法 实践和交付
核心问题 如何自动化 / 计算”正确” 如何在有限资源下构建有用的系统
产出 新算法、新理论 高质量软件产品
时间维度 追求”对”的答案 在时间 / 预算约束下做出权衡

4. 软件四大质量属性

属性 英文 解释 反面例子
可维护性 Maintainability 软件能否被容易地修改以适应新需求或修复缺陷 改一行代码要改几十个文件
可靠性 / 可信性 Dependability 软件在给定条件下正确运行的程度,包括安全性、可靠性、可用性等 银行系统偶尔算错账
效率 Efficiency 软件对系统资源(CPU、内存、磁盘、网络)的使用是否高效 一个简单查询卡死整个服务器
可用性 Usability / Acceptability 用户学习 / 使用软件是否容易,是否被用户接受 功能强大但无人会用

5. 软件工程面临的挑战

6. 专业伦理(Professional Ethics)

易错点

  1. 把”软件”等同于”程序”:考试中常考——软件 = 程序 + 文档 + 数据,三者缺一不可。例如仅仅写好了代码(程序)没有用户手册(文档)和配置数据(数据),不能称为完整的软件。
  2. 混淆四大质量属性
    • Maintainability(可维护性)关注”修改容易度”
    • Dependability(可靠性)关注”不出故障”和”坏了能恢复”
    • Efficiency(效率)关注”资源消耗”
    • Usability(可用性)关注”用户友好程度”
  3. 以为软件工程只是编码:编码只是整个生命周期中很小的一部分。需求、设计、测试、维护等同样重要。
  4. 计算机科学和软件工程混淆:CS 关心”什么是对的”(理论正确性),SE 关心”什么在现实中可行”(实用权衡)。

高频考点

Lecture 2 — 软件过程模型

快速理解

“软件开发有哪些组织方式?”本讲从瀑布模型演进到敏捷方法,展示了软件开发过程的发展脉络。核心是理解每种模型的特点、优缺点和适用场景。

核心知识点

1. 软件过程(Software Process)的概念

2. 瀑布模型(Waterfall Model)

3. 增量开发(Incremental Development)

4. 螺旋模型(Spiral Model)

5. RUP(Rational Unified Process)

阶段 英文 主要目标 耗时占比参考
初始 Inception 确定项目范围、识别用例、理解业务需求 ~10%
细化 Elaboration 建立架构基线、解决核心风险、细化用例 ~30%
构建 Construction 大规模开发和测试、构件实现 ~50%
交付 Transition Beta 测试、部署、用户培训 ~10%

6. 敏捷方法(Agile Methods)

敏捷宣言(Agile Manifesto)四句话:

  1. 个体和交互 > 流程和工具
  2. 可工作的软件 > 详尽的文档
  3. 客户合作 > 合同谈判
  4. 响应变化 > 遵循计划

敏捷的核心价值观:

XP(极限编程,Extreme Programming):

Scrum:

7. 模型对比总览

维度 瀑布 增量 螺旋 RUP 敏捷
需求明确度
风险应对 最强
用户参与度
适应变化 极差 最强
文档要求
适用规模 小-中 中-小

易错点

  1. 增量和迭代混淆:增量 = 每次加功能(搭积木),迭代 = 每次改进整体(打磨)。考试中常给出场景让你判断。
  2. 认为敏捷 = 没有文档:敏捷是”恰到好处的文档(just enough documentation)”,不是零文档。
  3. RUP 阶段的顺序:Inception → Elaboration → Construction → Transition。常见陷阱是混淆 Elaboration(精化)和 Construction(构建)。
  4. Scrum 角色混淆:Product Owner 决定”做什么”和优先级,Scrum Master 确保流程正确运行,Team 决定”怎么做”。
  5. 瀑布模型仍有价值:不要以为瀑布已经过时——对安全关键系统(如航空电子、医疗设备),瀑布的严格评审流程仍然必要。
  6. 螺旋模型的核心不是迭代,是风险分析。螺旋每一轮都是从目标设定→风险分析→开发验证→下一轮规划,风险分析才是灵魂。

高频考点

Lecture 3 — 需求工程

快速理解

“软件出问题第一原因就是需求出问题。”需求工程回答的是:我们到底要构建什么?本讲涵盖从需求获取到需求验证的全过程。

核心知识点

1. 需求工程(Requirements Engineering, RE)

2. 需求工程的四个主要活动

需求获取 (Elicitation) 
    → 需求分析与协商 (Analysis & Negotiation) 
    → 需求规格说明 (Specification) 
    → 需求验证 (Validation)

(1)需求获取(Elicitation)

技术 做法 优点 缺点
访谈(Interview) 一对一问问题 深入,可追问 耗时,涉众可能说不清
观察(Ethnography / Observation) 观察用户实际工作过程 发现”说不出的需求” 耗时,用户可能因被观察而改变行为
场景分析(Scenarios) 描述用户使用系统的具体场景 具体形象,用户易理解 不一定覆盖所有异常
原型法(Prototyping) 快速构建界面原型 用户”看到”后才知道要什么 客户可能误会原型就是最终产品
头脑风暴(Brainstorming) 集体讨论创意 激发新想法 需要好的主持人
用例(Use Cases) 描述 Actor 与系统的交互 结构化、标准化 学习曲线

(2)需求分析与协商

(3)需求规格说明(Specification)

层次 面向受众 形式 详细程度
用户需求(User Requirements) 客户 / 用户 自然语言 + 图表 高层、概述性
系统需求(System Requirements) 开发人员 结构化文本、模型 详细、精确

(4)需求验证(Validation)——五项检查

检查项 英文 解释
有效性 Validity 这个需求是否真的反映用户需要?
一致性 Consistency 需求之间没有矛盾(如:要求”快”又要”加密”但没考虑性能影响)
完整性 Completeness 没有遗漏关键需求和边界情况
可实现性 Realism / Feasibility 在现有技术和预算下能否实现?
可验证性 Verifiability 能否通过测试或检查来确认是否满足?

3. 功能需求(Functional Requirements)vs 非功能需求(Non-functional Requirements)

功能需求:

非功能需求:

非功能需求的三分类:

非功能需求
├── 产品需求(Product Requirements)
│   ├── 性能 (Performance):响应时间、吞吐量
│   ├── 可靠性 (Reliability):MTBF、可用性百分比
│   ├── 可用性 (Usability):学习时间、操作效率
│   └── 安全性 (Security):认证、授权、加密
├── 组织需求(Organizational Requirements)
│   ├── 开发标准:使用特定语言 / 框架 / 流程
│   ├── 交付时间:必须何时完成
│   └── 开发工具和环境要求
└── 外部需求(External Requirements)
    ├── 法规合规:GDPR、HIPAA、行业标准
    ├── 互操作性:必须与哪些其他系统对接
    └── 伦理要求:隐私保护、无障碍访问

非功能需求的重要性:

4. 需求管理(Requirements Management)

易错点

  1. 功能需求 vs 非功能需求判断:考试常给描述让你判断类型。关键技巧——功能需求回答”做什么”,非功能需求回答”多快 / 多好 / 多安全 / 多可靠”。
  2. 把”非功能需求”当作”不重要的需求”:事实上非功能需求往往更关键、更难满足。
  3. 误把 UI 界面设计当作需求:界面是设计方案的体现,不是原始需求。
  4. 需求验证五项检查的名称混淆:Validity(有效性)、Consistency(一致性)、Completeness(完整性)、Realism(可实现性)、Verifiability(可验证性)——五个 V / C 开头的英文词。
  5. 以为需求一次获取完毕:需求是逐步发现的(Iterative Elicitation),这是共识。
  6. “系统应是用户友好的” 是典型的不良需求——无法验证。好的需求应可量化、可测试。

高频考点

Lecture 4 — 系统建模

快速理解

“不用图形描述系统,沟通就会出问题。”系统建模是用图形化的方式抽象和描述系统,帮助理解、沟通和分析。本讲介绍四种模型的用途和各自的核心图。

核心知识点

1. 系统建模的目的

2. 系统建模的四大类型

模型类型 回答的问题 代表性图表 建模阶段
上下文模型 系统边界在哪?与谁交互? 上下文图 (Context Diagram) 早期需求分析
交互模型 系统内各部分如何协作? 序列图、用例图 分析 & 设计
结构模型 系统由什么组成?各部分关系? 类图、组件图、部署图 分析 & 设计
行为模型 系统如何响应事件和数据? 状态图、活动图、DFD 分析

3. 上下文模型(Context Models)

4. 交互模型(Interaction Models)

5. 结构模型(Structural Models)

关系 图形 说明 例子
关联 (Association) 实线 ———— 类之间有联系 学生 —— 课程
聚合 (Aggregation) 空心菱形 ◇———— 整体-部分,部分可独立存在 学校 ◇———— 老师(老师可换学校)
组合 (Composition) 实心菱形 ◆———— 整体-部分,部分随整体消亡 页面 ◆———— 按钮(按钮随页面销毁)
泛化 (Generalization) 空心三角 ——▷ 继承关系 猫 ——▷ 动物
实现 (Realization) 虚线空心三角 - - ▷ 接口实现 Circle - - ▷ Drawable
依赖 (Dependency) 虚线箭头 - - -> 一个类使用另一个类(临时) Printer - - -> Paper

6. 行为模型(Behavioral Models)

DFD 元素 图形 说明
进程 (Process) 圆形 / 椭圆 对数据做变换操作
数据流 (Data Flow) 箭头 数据在进程间流动
数据存储 (Data Store) 平行线 / 开口矩形 数据持久存放
外部实体 (External Entity) 矩形 系统外的数据源或目的地
要素 说明 例子
State(状态) 对象在特定条件下的情况 “等待输入”、”已登录”
Initial State 初始状态(实心圆)
Final State 终止状态(实心圆+圈)
Transition(转移) 状态间的变化 从”待处理”→”处理中”
Event(事件) 触发转移的事件 “用户点击提交”
Action(动作) 转移时的操作 “验证输入、保存数据”

7. 模型之间的关系

易错点

  1. 聚合 vs 组合:菱形是空心的还是实心的?考试常给一个场景(如”教室和椅子”——如果椅子可以搬到别的教室就是聚合,如果椅子是教室不可分割的一部分就是组合)。记住:聚合(空心◇)的部分可独立存在;组合(实心◆)的部分随整体一起销毁。
  2. DFD 不是流程图:DFD 关注的是”数据如何流动和变换”,不是”程序的控制流(先做什么后做什么)”。活动图 / 流程图才关注控制流。
  3. DFD 和活动图的混淆:两者看起来都有数据 / 控制流动,但 DFD 展示数据变换和存储,活动图展示业务流程步骤序列。
  4. 多重性方向1 ——— 0..* 要注意哪个方向。Member 1 ——— 0..* Loan 表示一个 Member 对应零或多个 Loan。
  5. 状态图只适合单个对象:状态机图描述的是”一个对象在其生命周期中的状态变化”,不是业务流程。
  6. 用例图中 actor 是人还是系统?:Actor 可以是人、其他系统、硬件设备——只要与当前系统有交互。

高频考点

Lecture 5 — 面向对象基础

快速理解

“面向对象的五个核心概念。”本讲为理解 OO 分析和设计打下基础,是后续 UML、OOA、OOD 的理论前提。

核心知识点

1. 面向对象的四大基本特征 + 类与对象

(1)抽象(Abstraction)

(2)封装(Encapsulation)

(3)继承(Inheritance)

(4)多态(Polymorphism)

(5)类(Class)与对象(Object)

2. 消息传递(Message Passing)

3. 继承 vs 组合(Inheritance vs Composition)

4. 对象之间的关系总结

关系 语义 表示
继承 (Generalization) is-a 类继承
关联 (Association) knows-a / has-a 双向或单向引用
聚合 (Aggregation) has-a (弱) 部分可独立
组合 (Composition) has-a (强) 部分随整体
依赖 (Dependency) uses-a 方法参数 / 返回值

易错点

  1. 抽象 vs 封装混淆:抽象是”从外部观察对象时看到的本质特征”(从复杂中提取关键),封装是”把内部细节藏起来”(信息隐藏)。抽象回答”这个对象是什么?”,封装回答”内部实现不让外界看到”。
  2. 多态 ≠ 方法重载(Overloading):Overloading 是”同名不同参”(编译期决定),多态更核心的是动态绑定 / 重写(运行期决定)。考试常考多态的两种形式。
  3. “is-a” vs “has-a”判断错误:给定两个类,判断是继承还是组合。如 “Student” 和 “Course” → has-a(组合 / 关联),”GraduateStudent” 和 “Student” → is-a(继承)。
  4. 抽象类 vs 接口混淆:抽象类可以有部分实现,接口只有方法签名(在 Java 8+ 之前)。但很多考试中保持传统定义。
  5. 消息传递的写法object.method(args) 不是简单的函数调用,而是”向对象发送一条消息”。

高频考点

Lecture 6 — UML 入门

快速理解

UML(统一建模语言)是 OO 分析与设计的标准建模语言。本讲详细介绍了最重要的五种 UML 图及其使用方法。

核心知识点

1. UML 概述

2. 用例图(Use Case Diagram)

3. 类图(Class Diagram)

┌─────────────────────┐
│ ClassName           │ ← 类名(粗体居中)
├─────────────────────┤
│ - attribute1: Type  │ ← 属性(可见性 名称: 类型)
│ + attribute2: Type  │
├─────────────────────┤
│ + method1(): Type   │ ← 方法(可见性 名称(参数): 返回类型)
│ - method2(p: Type)  │
└─────────────────────┘
关系 图形 弱→强
依赖 - - - -> 最弱
关联 ————  
聚合 ◇————  
组合 ◆————  
泛化 ——▷  
实现 - - -▷ 最强(类型层面)

4. 序列图(Sequence Diagram)

5. 状态图(State Machine Diagram)

6. 活动图(Activity Diagram)

7. UML 图表分类总结

类型 图表名称 动态 / 静态
结构图 (Structure) 类图、对象图、组件图、部署图、包图、组合结构图 静态
行为图 (Behavior) 用例图、活动图、状态图 动态
交互图 (Interaction) 序列图、通信图、时序图、交互概览图 动态

易错点

  1. 聚合(空心菱形) vs 组合(实心菱形)看错:最简单记忆法——”空心”意味着”部分可以独立空出来”(可分离);”实心”意味着”部分被牢牢焊在整体上”(不可分离)。
  2. <<include>><<extend>> 箭头方向混淆
    • <<include>>:A <<include>> B → A 一定会调用 B。箭头从 A 指向 B。
    • <<extend>>:A <<extend>> B → A 在特定条件下扩展 B。箭头从 A(扩展)指向 B(被扩展)。
  3. 用例图中的 Actor 必须是 “人”:错!Actor 可以是其他系统、硬件设备。
  4. 序列图中的消息箭头方向错误:同步消息用实心箭头,异步消息用普通空心箭头。混淆后含义完全不同。
  5. 状态图 vs 活动图混用:描述单个对象的行为 → 状态图;描述业务流程 → 活动图。不能搞反。
  6. 假设 UML 只用于 OO 开发:UML 可以与其他开发范式配合使用,但确实最常用于 OO 开发。
  7. 泛化(继承)箭头的方向子类指向父类,箭头在父类端。人总是想画反。

高频考点

Lecture 7 — 面向对象分析 (OOA) 实例

快速理解

OOA 是将用户需求转化为分析模型的过程。”分析”意味着理解问题域——识别出系统中有哪些类、它们之间如何交互。本讲通过一个完整案例(如图书馆系统)演示了 OOA 的实操流程。

核心知识点

1. OOA 的基本流程

需求描述 → 理解问题域 → 识别候选类 → 筛选类 → 确定类间关系 → 建立用例模型 → 构建分析类图

2. 理解问题域(Understanding the Problem Domain)

3. 识别候选类(Identifying Candidate Classes)

4. 确定类之间的关系

5. 构建用例模型(Use Case Modeling)

6. 构建分析类图(Analysis Class Diagram)

7. OOA 与 OOD 的区别(考试中非常非常重要 ⭐)

维度 OOA(分析) OOD(设计)
关注 “做什么”(问题域) “怎么做”(解决方案域)
抽象层次 高层概念模型 具体实现细节
产出 分析类图、用例图 设计类图、序列图
与实现的关系 独立于实现 贴近特定实现技术
关注重点 业务逻辑、实体 架构模式、设计模式

易错点

  1. 把所有名词都当成类:需求中的名词不一定都是类。”书名”是 Book 的属性,”学生”既是 Actor 也可能是类。需要仔细筛选。
  2. OOA 阶段过度关注实现细节:分析阶段只做”概念建模”,不要考虑用什么数据库、什么框架、怎么存储数据。
  3. OOA 和 OOD 混淆:有时在分析和设计之间来回跳。分析没有完成之前不要进入设计。记住:分析 = 理解问题,设计 = 解决问题。
  4. 边界类、控制类、实体类放错位置:例如把”数据库连接”当成实体类——数据库是设计问题,不是分析问题。
  5. 用例建模时遗漏 Actor:除了直接用户,还要考虑管理员、外部系统等。

高频考点

Lecture 8 — 架构设计

快速理解

“建房子要先搭骨架还是直接砌砖?”架构设计就是软件系统的”骨架”设计。本讲介绍主流的架构模式和设计决策。

核心知识点

1. 架构设计(Architectural Design)的重要性

2. 架构设计的主要决策

  1. 系统的整体风格架构模式是什么?
  2. 系统如何分解为组件
  3. 组件之间如何通信
  4. 系统的数据组织方式是什么?
  5. 如何满足关键的非功能需求

3. 六大通用架构模式

(1)MVC(Model-View-Controller)

组件 职责
Model(模型) 数据和业务逻辑
View(视图) 数据展示 / 用户界面
Controller(控制器) 处理用户输入、协调 Model 和 View

(2)分层架构(Layered Architecture)

(3)客户端-服务器(Client-Server)

(4)管道-过滤器(Pipe-and-Filter)

(5)仓库模式 / 中央数据(Repository / Shared Data)

(6)事件驱动(Event-driven Architecture)

4. 架构模式对比

模式 组件通信方式 适用场景 性能特点
MVC Controller ↔ Model ↔ View Web 应用、GUI 可接受
分层 相邻层间单向调用 企业应用 层数越深越慢
Client-Server 请求-响应 / 网络 Web 系统 受限于网络
Pipe-and-Filter 数据流驱动 数据处理、编译器 可并行化
Repository 共享数据 数据密集型应用 数据访问瓶颈
Event-driven 事件发布 / 订阅 GUI、实时系统 异步、高吞吐

5. 架构设计文档

易错点

  1. MVC ≠ 三层架构:MVC 是表现层的设计模式,三层架构是宏观的分层(表现层 → 业务逻辑层 → 数据访问层)。一个系统可以有三层架构,其中的表现层内部用 MVC。
  2. 认为一种架构模式走天下:实际项目中往往是多种模式的组合。比如:整体用分层,分层中的某一层内部用 MVC,组件间通信用事件驱动。
  3. 架构设计 ≠ 详细设计:架构是”骨架”(宏观),详细设计是”血肉”(微观)。考试常考区别。
  4. 管道-过滤器适合交互式应用:错,它适合批处理 / 数据流应用,不适合需要频繁用户交互的场景。
  5. 事件驱动架构的调试困难常被忽略。

高频考点

Lecture 9 — 面向对象设计 (OOD)

快速理解

OOA 回答”系统要做什么”,OOD 回答”系统怎么用代码实现”。本讲介绍 OOD 的核心活动、设计模式和责任分配原则。

核心知识点

1. OOA → OOD 的过渡

OOA产出:分析类图、用例图 (概念层,关注"做什么")
          ↓
OOD输入:分析模型 + 非功能需求 + 技术约束
          ↓
OOD产出:设计类图(含方法签名)、序列图、接口定义 (实现层,关注"怎么做")

2. OOD 的主要活动

  1. 类设计:为每个类分配职责,设计属性和方法
  2. 协作设计:设计类之间的交互方式(用序列图建模)
  3. 设计模式应用:用成熟的设计方案解决常见的设计问题
  4. 接口设计:定义系统的对外接口
  5. 组件打包:将类组织为包 / 模块
  6. 非功能需求处理:满足性能、安全性等要求

3. 设计模式(Design Patterns)总览

设计模式 = 针对常见设计问题的可复用解决方案

(1)创建型模式(Creational)—— 处理对象创建的机制

模式 目的 例子
Singleton 确保类只有一个实例 日志管理器、配置管理器
Factory Method 在父类中定义创建对象的接口,子类决定实例化哪个类 数据库连接工厂
Abstract Factory 创建相关或依赖对象的家族,而不指定具体类 UI 组件工厂
Builder 分步骤构建复杂对象 构建复杂文档
Prototype 通过复制已有对象创建新对象 克隆图形对象

(2)结构型模式(Structural)—— 处理类 / 对象的组合

模式 目的 例子
Adapter 将一个接口转换成客户希望的另一个接口 电源适配器、新旧系统对接
Bridge 将抽象部分与实现部分分离,使它们可以独立变化 跨平台图形渲染
Composite 以树形结构表示”整体-部分”关系,使客户端统一对待单个对象和组合对象 文件系统(文件 / 目录)
Decorator 动态地给对象添加额外的职责 Java I/O Stream
Facade 为子系统提供统一的高层接口,简化使用 库的简单 API
Proxy 为另一个对象提供替身或占位符以控制对其的访问 延迟加载、访问控制

(3)行为型模式(Behavioral)—— 处理对象间的通信和责任分配

模式 目的 例子
Observer 定义一对多的依赖,当一个对象状态改变时所有依赖者自动收到通知 事件监听、推送通知
Strategy 定义一系列算法,封装每个算法,并使它们可以互换 排序策略、支付方式
Command 将请求封装为对象,支持参数化、排队和撤销 撤销 / 重做
State 允许对象在其内部状态改变时改变其行为 电梯状态
Template Method 在父类中定义算法骨架,将一些步骤延迟到子类实现 框架中的钩子方法
Iterator 提供顺序访问聚合对象元素的方法而不暴露内部表示 遍历集合

4. GRASP 原则(General Responsibility Assignment Software Patterns)

GRASP 是责任分配(谁该做什么)的指导原则:

原则 解释 例子
Information Expert 谁拥有完成职责所需的信息,谁负责完成 订单类负责计算总价(它拥有商品信息)
Creator 谁负责创建对象?通常由包含或紧密使用该对象的类创建 Member 创建 Loan 实例
Controller 谁处理系统事件?通常用一个控制类处理外部输入 控制器接收 GUI 请求并委派给 Model
Low Coupling(低耦合) 尽量减少类之间的依赖 通过接口而非具体类引用
High Cohesion(高内聚) 类内部的职责应高度相关 不要将”打印报表”和”管理用户”放在同一个类
Polymorphism(多态) 用多态替代条件判断(if-else / switch) 用接口+不同实现替代类型判断
Pure Fabrication 当 Expert 不适用时,创建一个新的类来承担职责 Controller 类、Service 类
Indirection 通过中间对象来解耦两个组件 适配器模式
Protected Variations 在不稳定点周围设置保护接口 接口隔离、抽象封装变化

易错点

  1. OOA 和 OOD 混为一谈:再次强调——OOA 是”分析问题”,OOD 是”设计方案”。考试最爱考这俩的区别。
  2. 设计模式用错场景:例如,需要在运行时切换算法 → Strategy;需要对象状态变化时通知其他对象 → Observer;需要确保只有一个实例 → Singleton。需要根据场景匹配模式。
  3. GRASP 的 Information Expert 和 Controller 混淆:Expert 关注”谁能做”,Controller 关注”谁接收外部事件”。
  4. Low Coupling 和 High Cohesion 的区别
    • Low Coupling = 类之间的依赖少(松散)
    • High Cohesion = 类内部职责集中(专注)
  5. 设计模式过度使用:不是任何问题都需要设计模式。保持简单。

高频考点

Lecture 10 — 面向对象设计实例

快速理解

通过一个完整案例(如 ATM / POS / 图书馆系统)从头到尾走一遍 OOD 流程,把 Lecture 9 的理论付诸实践。

核心知识点

1. OOD 实例的完整流程(从需求到设计)

需求描述 → 用例分析(用例图) → 识别领域类(领域模型) → 
序列图(用例实现) → 提取方法签名(设计类图) → 设计优化(应用设计模式)

2. 第一步:从需求到用例

3. 第二步:构建领域模型(Domain Model)

4. 第三步:构建序列图(Sequence Diagrams)

5. 第四步:设计类图(Design Class Diagram)

6. 第五步:设计优化

7. 实例中的关键教训

易错点

  1. 序列图中缺少返回消息:序列图中不仅要画调用消息,也要画返回消息。很多初学者的序列图中只有调用没有返回。
  2. 把领域模型当作数据库设计:领域模型是概念层次的,不需要考虑外键、主键、索引等数据库细节。
  3. 设计时过早优化:先让设计正确(功能正确),再考虑性能优化。
  4. 一个序列图试图展示所有情况:每个序列图对应一个具体场景,而不是”所有可能的场景”。
  5. 忽略 Actor → 生命线的映射:每个 Actor 在序列图中会变成一条生命线。

高频考点

Lecture 11 — 面向对象详细设计

快速理解

在架构和 OOD 完成之后,深入到方法和属性级别的设计决策。SOLID 原则是本讲的核心。

核心知识点

1. SOLID 原则(五条面向对象设计核心原则)

S — 单一职责原则(Single Responsibility Principle, SRP)

O — 开闭原则(Open / Closed Principle, OCP)

L — 里氏替换原则(Liskov Substitution Principle, LSP)

I — 接口隔离原则(Interface Segregation Principle, ISP)

D — 依赖反转原则(Dependency Inversion Principle, DIP)

2. 设计契约(Design by Contract, DbC)

元素 时机 解释 例子
前置条件(Precondition) 方法调用前 调用方必须满足的条件 num >= 0(计算平方根)
后置条件(Postcondition) 方法调用后 方法执行后保证的条件 返回值的平方等于输入
不变式(Invariant) 始终成立 对象在其整个生命周期中始终保持的条件 余额 = 收入 - 支出

3. 接口设计(Interface Design)

4. 详细设计的产出物

易错点

  1. SOLID 原则之间的混淆
    • SRP(类只做一件事) vs ISP(接口不要太宽泛)—— SRP 是类层面的,ISP 是接口层面的
    • OCP(对扩展开放) vs DIP(依赖抽象)—— OCP 是目标(不改已有代码),DIP 是手段(依赖抽象)
  2. 里氏替换原则(LSP)只与继承相关:考试中给”正方形继承长方形”的经典反例让你分析为什么违反 LSP。
  3. DIP 与 DI 混淆:DIP 是原则(依赖抽象),DI 是实现(把依赖注入进来)。
  4. 设计契约三要素的顺序:前置条件(调用前必须满足)→ 方法执行 → 后置条件(执行后保证),不变式始终成立。
  5. 开闭原则不是”完全不修改”:系统核心的抽象需要维护和扩展(这就是”开放”的部分),但稳定部分的实现代码不因功能扩展而修改。

高频考点

Lecture 12 — 结构化设计

快速理解

在面向对象之前,结构化设计是主流的软件设计方法。它以 功能(Function)数据流(Data Flow) 为中心。本讲的核心是:DFD → 结构图,以及耦合 / 内聚评估。

核心知识点

1. 结构化设计 vs 面向对象设计

维度 结构化设计 面向对象设计
核心 功能 / 过程驱动 对象 / 数据驱动
基本单位 模块(Module)、函数 类(Class)、对象
主要工具 DFD、结构图 (Structure Chart) UML 类图、序列图
设计过程 功能分解(顶层→底层) 职责分配 + 协作
数据与操作 分离(数据仓库 + 功能模块) 封装(数据和操作在一起)
评估标准 耦合度 + 内聚度 耦合度 + 内聚度(同样重要)

2. 结构化设计的主要流程

需求 / 规格 → DFD(数据流建模) → 变换 / 事务分析 → 结构图 → 模块设计 → 耦合/内聚评估

3. 数据流图(Data Flow Diagram, DFD)

四个核心元素:

元素 图形 说明 例子
进程 (Process / Bubble) 圆形 / 椭圆 对数据进行变换 / 处理 “计算工资”、”验证订单”
数据流 (Data Flow) 箭头 数据在进程间流动,标注数据名称 “会员信息”、”订单数据”
数据存储 (Data Store) 两条平行线 / 开口矩形 存储数据的仓库 “会员数据库”、”库存文件”
外部实体 (External Entity) 矩形 系统的数据源或数据目标 “顾客”、”银行系统”

DFD 的分层抽象

DFD 规则

4. 变换分析(Transform Analysis)

5. 事务分析(Transaction Analysis)

6. 结构图(Structure Chart)

7. 耦合度(Coupling)——从低到高,好的到差的

耦合类型 英文 说明 好坏 例子
数据耦合 Data Coupling 模块之间只传递简单数据 ✅ 最好 calcTax(amount)
印记耦合 Stamp Coupling 传递结构体 / 记录,但只用其中一部分 ⚠️ 一般 calcPrice(Order order) 但只用了 order.date
控制耦合 Control Coupling 一个模块传递控制标志影响另一个模块的逻辑 ⚠️ 差 process(type, data) 其中 type 控制内部 if-else
公共耦合 Common Coupling 多个模块共享同一全局数据 ❌ 很差 使用全局变量 config
内容耦合 Content Coupling 一个模块直接访问另一个模块的内部 ❌ 极差 直接访问另一个模块的私有数据

8. 内聚度(Cohesion)——从高到低,好的到差的

内聚类型 英文 说明 好坏
功能内聚 Functional Cohesion 模块所有元素为完成单一功能 ✅ 最好
顺序内聚 Sequential Cohesion 模块的输出是下一个元素的输入 ✅ 好
通信内聚 Communication Cohesion 模块内元素操作同一数据 ⚠️ 可接受
过程内聚 Procedural Cohesion 模块内元素按特定执行顺序组合 ⚠️ 可接受
时间内聚 Temporal Cohesion 模块内元素仅在同一时间执行(如初始化) ❌ 差
逻辑内聚 Logical Cohesion 功能相关但逻辑不同(如一个函数同时处理多种打印) ❌ 差
偶然内聚 Coincidental Cohesion 元素之间无任何有意义的关系 ❌ 极差

好设计的目标高内聚 + 低耦合(High Cohesion, Low Coupling)

易错点

  1. DFD 不是流程图 / 活动图:DFD 展示”数据如何流动和转换”,不是”控制流”(先做什么后做什么)。
  2. 变换分析 vs 事务分析混淆:变换分析 = 数据处理(输入→处理→输出),事务分析 = 分派(根据类型选择不同路径)。
  3. 耦合度排序从好到差:数据 < 印记 < 控制 < 公共 < 内容。考试中常给场景让你判断类型。
  4. 内聚度排序从好到差:功能 > 顺序 > 通信 > 过程 > 时间 > 逻辑 > 偶然。
  5. 结构图没有表达执行顺序:结构图展示调用层次关系,不是时间序列。
  6. DFD 中进程必须同时有输入和输出:没有输入的进程不能存在(不可能凭空产生数据),没有输出的进程也是无效的。

高频考点

Lecture 13 — 软件测试(一)

快速理解

测试是保证软件质量的核心手段。本讲介绍测试的基础理论和黑盒测试方法。

核心知识点

1. 测试的基本概念

2. 验证(Verification)vs 确认(Validation)

概念 回答的问题 解释 关注
Verification(验证) “Are we building the product right?” 产品是否按规格正确构建? 过程正确性
Validation(确认) “Are we building the right product?” 是否构建了客户真正需要的产品? 需求满足度

3. V-Model(V 模型)

需求分析 →               ← 验收测试
  设计 →               ← 系统测试
    详细设计 →         ← 集成测试
      编码 → 单元测试

4. 测试层级(Testing Levels)

(1)单元测试(Unit Testing)

(2)集成测试(Integration Testing)

(3)系统测试(System Testing)

(4)验收测试(Acceptance Testing)

5. 黑盒测试(Black-box Testing)

定义:不查看内部代码结构,仅基于需求规格设计测试用例

(1)等价类划分(Equivalence Partitioning)

等价类类型 定义 例子(年龄输入 0-150)
有效等价类 合法输入 0 ≤ age ≤ 150 的整数
无效等价类 非法输入 age < 0, age > 150, 非整数

(2)边界值分析(Boundary Value Analysis, BVA)

6. 测试用例设计原则

易错点

  1. Verification vs Validation 考英文选择题:最经典的考法。记住——Verification = 验证实现正确(building product right),Validation = 验证需求正确(building right product)。
  2. 等价类划分时遗漏无效等价类:很多考生只划分了有效等价类,忘记了无效等价类(如负数、非数字等非法输入)。
  3. 边界值分析是否包含边界本身:标准的 BVA 包含边界值。如 0-150,测试 -1, 0, 1, 149, 150, 151。
  4. 测试四个层级的具体测试内容搞混:单元测试(最小单元)→ 集成测试(接口)→ 系统测试(全系统)→ 验收测试(用户验收)。
  5. 系统测试和验收测试的执行者搞反:系统测试由独立测试团队做,验收测试由客户 / 用户做。

高频考点

Lecture 14 — 软件测试(二)

快速理解

测试(二)延续测试(一),重点讲白盒测试(覆盖度分析、圈复杂度)和集成测试策略。这部分偏向技术实现层面。

核心知识点

1. 白盒测试(White-box Testing)

2. 代码覆盖度(Code Coverage)——四种主要标准

(1)语句覆盖(Statement Coverage)

(2)分支覆盖(Branch Coverage)

(3)条件覆盖(Condition Coverage)

(4)路径覆盖(Path Coverage)

覆盖度强弱关系

路径覆盖 ⊃ 分支覆盖 ⊃ 语句覆盖
条件覆盖 ⊃ 语句覆盖(但条件覆盖不保证分支覆盖)

3. 圈复杂度(Cyclomatic Complexity)

4. 集成测试策略

(1)大爆炸集成(Big Bang Integration)

(2)自顶向下集成(Top-down Integration)

(3)自底向上集成(Bottom-up Integration)

(4)三明治 / 混合集成(Sandwich / Hybrid Integration)

(5)持续集成(Continuous Integration, CI)

5. Stub vs Driver —— 常考对比 ⭐

Stub(桩) Driver(驱动)
模拟下层被调模块 模拟上层调用模块
自顶向下测试使用 自底向上测试使用
就是一个”假装的下层函数” 就是一个”假装的上层调用器”
返回预设的数据 调用被测试模块的方法

记忆技巧

6. 回归测试(Regression Testing)

易错点

  1. 覆盖度标准之间的包含关系
    • 路径覆盖 ⊃ 分支覆盖 ⊃ 语句覆盖(是对的)
    • 条件覆盖 ⊃ 分支覆盖(不一定! 条件覆盖可能不满足分支覆盖的要求)
  2. 圈复杂度计算公式记混:最实用的是”判定节点数 + 1”。不要记错了。
  3. Stub 和 Driver 的方向搞反Stub 在下层(被调用者),Driver 在上层(调用者)。自顶向下需要 Stub;自底向上需要 Driver。
  4. 语句覆盖 = 100% = 程序没有 bug:错!即使语句覆盖 100%,仍然可能有逻辑 bug。
  5. 大爆炸集成仅适合小项目:对于大型项目,大爆炸集成几乎不可能定位错误。

高频考点

Lecture 15 — 配置管理

快速理解

“多人协作开发时,谁改了什么?谁改了哪个版本?怎么合并?”配置管理解决的就是这些问题。本讲介绍配置管理的四大活动、核心概念和版本控制基础。

核心知识点

1. 配置管理(Configuration Management, CM)的定义

2. 配置管理的四大活动

(1)配置识别(Configuration Identification)

(2)配置控制(Configuration Control)

(3)配置状态报告(Configuration Status Accounting)

(4)配置审计(Configuration Auditing)

3. 核心概念

概念 定义 要点
配置项 (CI) 被配置管理控制的基本单元 代码、文档、脚本、数据均在范围内
基线 (Baseline) 经过正式评审和批准的配置快照,是后续变更的参照起点 里程碑性质、不可随意修改
版本 (Version) 配置项在特定时间点的状态 每个版本都是 CI 的特定实例
分支 (Branch) 从主线分离的独立开发线 支持并行开发
合并 (Merge) 将不同分支的变更整合 可能产生冲突,需要人工解决
标签 / 标记 (Tag / Label) 给特定版本打上标识,便于后续引用 通常用于标记 Release 版本

基线的重要性

4. 版本控制系统(VCS)

集中式(Centralized VCS)—— 如 SVN、CVS

优点 缺点
管理集中,权限控制简单 服务器单点故障
易于管理 网络中断无法提交
学习曲线平缓 分支操作较慢且存储冗余

分布式(Distributed VCS)—— 如 Git、Mercurial

优点 缺点
每个开发者都有完整仓库副本 学习曲线较陡
支持离线操作 仓库容量大
分支 / 合并操作快速高效 权限管理相对复杂
强大的社区支持(GitHub / GitLab)  

5. 分支策略(Branching Strategy)

(1)主干开发(Trunk-based Development)

(2)GitFlow

(3)GitHub Flow / Feature Branch

易错点

  1. 配置项(CI)不仅是代码:很多考生误以为只有代码需要配置管理。实际上,需求文档、设计文档、测试用例、部署脚本等所有软件元素都是 CI。
  2. 基线 vs 版本混淆:每个版本是 CI 的一个快照,但基线是经过正式评审的特殊版本,具有里程碑意义。不是每个版本都能称为基线。
  3. 版本控制 ≠ 配置管理:版本控制是配置管理的一个部分(主要对应配置识别和变更控制)。配置管理还包括配置审计、状态报告等。
  4. 变更不是都该批准的:不要以为所有变更请求都应该被 CCB 批准。变更需要评估影响,不合理的不批。
  5. SVN = 集中式,Git = 分布式:考试中常考这两种类型的特点对比。
  6. GitFlow 各分支的命名和用途容易混淆:master 是生产发布;develop 是集成开发;feature 是功能开发;release 是发布准备;hotfix 是紧急修复。

高频考点

Lecture 16 — 成本估算

快速理解

“这个项目需要多少人做多久?要花多少钱?”成本估算是项目启动前最关键也最困难的活动之一。本讲介绍几种常见的估算方法,核心是 COCOMO 模型。

核心知识点

1. 为什么软件成本估算这么难?

2. 主要估算方法总览

方法 原理 适用阶段 准确性 客观性
专家判断 (Expert Judgment) 请有经验的专家来估算 任何阶段 取决于专家水平 主观
类比估算 (Estimation by Analogy) 参考类似项目的实际数据 早期
算法模型 (Algorithmic Model) 使用数学公式(如 COCOMO) 有规模估算后 较高 客观
功能点分析 (Function Points) 基于功能需求估算规模 需求完成后 较高 客观
LOC 估算 (Lines of Code) 基于代码行数估算 设计 / 实现阶段 随阶段推进提高 客观
Pricing to Win 按客户出价确定”成本” 任何阶段 🚫 不推荐 操控

3. COCOMO 模型(Constructive Cost Model)

COCOMO 81:由 Barry Boehm 在 1981 年提出,有三个层次:

三种项目类型

类型 英文 说明 a (Effort) b c (Time) d 例子
组织型 Organic 小团队、熟悉领域、开发环境好、低复杂度 2.4 1.05 2.5 0.38 简单的 MIS 系统
半分离型 Semi-detached 中等规模、团队成员经验混合、中等复杂度 3.0 1.12 2.5 0.35 数据库系统、OS 实用程序
嵌入型 Embedded 强约束(硬件、实时、安全)、高复杂度 3.6 1.20 2.5 0.32 飞行控制系统、ATM 系统

基本 COCOMO 公式:

工作量:Effort = a × (KLOC)^b      (单位:人月,Person-Months)
工期:   Time   = c × (Effort)^d   (单位:月,Months)
人数:   Staff  = Effort / Time    (约数)

例子:估计为 10 KLOC 的组织型项目:

中级 COCOMO 的 15 个成本驱动因子(只需知道有这些类别):

中级 COCOMO:Effort = a × (KLOC)^b × EAF

COCOMO II(1995 年更新):

4. 功能点分析(Function Point Analysis)

五个功能维度:

维度 英文缩写 说明 例子
外部输入 EI 外部实体向系统输入数据 新增订单、修改客户信息
外部输出 EO 系统向外部输出数据(含计算 / 处理) 生成报表、打印发票
外部查询 EQ 查询请求 + 返回结果(不含计算) 查询订单状态
内部逻辑文件 ILF 系统内部维护的逻辑数据集合 客户信息表、产品目录
外部接口文件 EIF 系统引用的外部数据集合 外部汇率表

5. 三条重要的估算法则

法则 内容 管理含义
Parkinson’s Law 工作会膨胀以填满可用时间 设置合理的截止期限很重要
Brooks’ Law 给延期的项目加人会使其更延期 人月不是可互换的;加人增加沟通成本而非降低工作量
Pricing to Win 按客户预算倒推成本 ⚠️ 不道德——可能牺牲质量和团队成员利益

Brooks’ Law 的深层原因(记住常考 ⭐):

  1. 新人需要学习时间(ramp-up time),不仅不贡献还在消耗团队精力
  2. 沟通成本非线性增长:n 个人的沟通链路数 = $n(n-1)/2$
  3. 工作不可分解:有些任务没法分配给多人并行做

易错点

  1. COCOMO 三种项目类型的特征混淆:Organic(小 / 熟悉 / 简单)→ Semi-detached(中等)→ Embedded(强约束 / 高复杂度)。考试中常给场景让你判断类型。
  2. 功能点五个维度的名称记忆顺序混乱:记住 EI(输入)、EO(输出)、EQ(查询)、ILF(内部文件)、EIF(外部文件)。
  3. LOC 估算 vs 功能点估算:LOC 依赖编程语言、可量化;功能点与技术无关、可早期估算。不是同一个东西!
  4. Brooks’ Law 的精髓:人月不可交换——给一个延期的项目加人只会让它更延期。不是”加人没用”,而是”加人短期会拖慢进度”。
  5. Pricing to Win 不是合理的估算方法:这是按客户预算报价,而不是按实际工作量估算,可能导致项目亏本或质量下降。
  6. 基本 vs 中级 COCOMO 的区别:中级多了 15 个成本驱动因子(EAF 调整因子)。

高频考点

必背速查表

1. SOLID 原则速查

缩写 全称 一句话
S Single Responsibility Principle 一个类一个职责
O Open / Closed Principle 对扩展开放,对修改封闭
L Liskov Substitution Principle 子类可替换父类
I Interface Segregation Principle 接口要小
D Dependency Inversion Principle 依赖抽象不依赖细节

2. 耦合度从好到差

数据耦合 → 印记耦合 → 控制耦合 → 公共耦合 → 内容耦合

3. 内聚度从好到差

功能内聚 → 顺序内聚 → 通信内聚 → 过程内聚 → 时间内聚 → 逻辑内聚 → 偶然内聚

4. 测试覆盖标准从弱到强

语句覆盖 → 分支覆盖 → 条件覆盖 → 路径覆盖 (注意:条件覆盖不一定满足分支覆盖)

5. 圈复杂度口诀

判定节点数 + 1 (最简单版本)

6. Stub vs Driver

Stub Driver
模拟下层(被调)模块 模拟上层(调用)模块
用于自顶向下集成测试 用于自底向上集成测试

7. Verification vs Validation

Verification Validation
“Building the product right” “Building the right product”
验证规格正确性 确认需求满足度

8. 聚合 vs 组合

聚合 (Aggregation) 组合 (Composition)
空心菱形 ◇ 实心菱形 ◆
部分可独立存在 部分随整体消灭
弱整体-部分 强整体-部分

9. 功能点五个维度

EI(外部输入)→ EO(外部输出)→ EQ(外部查询)→ ILF(内部逻辑文件)→ EIF(外部接口文件)

10. COCOMO 三种项目类型

Organic(组织型) < Semi-detached(半分离型) < Embedded(嵌入型) (越往右规模越大、复杂度越高、约束越强)

整理完成,祝你复习顺利,考试高分!

声明:以上内容均由 Claude Code 根据课程课件进行整理,用于期末复习