第 9 周 · 软件工程课程阅读笔记

这页整理的是 IN4MATX 43 第 9 周 的课程笔记,方便快速回顾软件工程里的定义、原则、框架和课堂重点。下面这条路径可以带你回到 Notes、Course Notes、课程主页,或定位到当前笔记。将鼠标悬停在右侧的 ≡ 图标上可以打开目录。

最后编辑于 2026 年 5 月 31 日

Informatics 43 — 第九周课程笔记

涵盖 Lecture 17 与 Lecture 18:"我们遵循什么流程来开发软件?(第 1、2 部分)"

目录

  1. 我们现在在哪 — 从测试走向流程
  2. 为什么我们需要流程 — 软件工程的固有困难
  3. 模型是什么,又是用来做什么的?
  4. 软件生命周期模型 — 目录总览
  5. 边写边改(Build-and-Fix)
  6. 瀑布模型(Waterfall)
  7. 快速原型(Rapid Prototyping)
  8. 增量模型(Incremental)
  9. 螺旋模型(Spiral)
  10. 统一软件开发过程(RUP)
  11. 极限编程(XP)
  12. XP 的十四条实践
  13. 从 XP 到敏捷 — 敏捷宣言
  14. 敏捷原则、Ziv 定律与 Scrum
  15. 敏捷 — 优点、缺点与采纳情况
  16. 全景图 — 八种模型横向对比
  17. Quiz 9 / 期末考复习指南
  18. 总结与记忆框架

1. 我们现在在哪 — 从测试走向流程

第七周和第八周都活在同一个活动里:质量保证与测试。上一讲收尾了白盒测试 —— 用从源代码导出的程序图来推导测试用例,挑选这些用例去命中不同类型的覆盖(节点、边、循环、条件、路径),并巡视了其他几类 QA 方法(检查 / 评审、形式化方法、静态分析)。

第九周一下子拉到最远。我们不再问怎么把某一个活动做好,而是开始问整个工作是如何被组织起来的:

我们遵循什么流程来开发软件?\boxed{\textbf{我们遵循什么流程来开发软件?}}

整门课的脉络至此已经完整,而流程模型正是统筹底下一切的那一层元结构(meta-layer):

需求→架构→设计→以用户为中心的设计→编码→QA 与测试  ⇒  流程模型\boxed{\textbf{需求} \to \textbf{架构} \to \textbf{设计} \to \textbf{以用户为中心的设计} \to \textbf{编码} \to \textbf{QA 与测试} \;\Rightarrow\; \textbf{流程模型}}

两节课覆盖这块领地。Lecture 17(第 1 部分)讲为什么我们需要流程(软件工程本质上就是难的),定义什么是流程模型,并走完前五个模型 —— 边写边改、瀑布、快速原型、增量、螺旋 —— 并引入 RUP。Lecture 18(第 2 部分)深入讲 RUP,再到极限编程(XP)和敏捷(Agile),并把整个单元框在一条历史性的转变之上:从僵化、重量级、文档驱动的流程,转向轻量、敏捷的流程。


2. 为什么我们需要流程 — 软件工程的固有困难

出发的前提很直白:软件工程是难的,我们需要流程来帮忙。 本讲把这一点扎根在 Fred Brooks 的经典论文 《没有银弹》("No Silver Bullet")的论证里 —— 软件有一组本质性的属性(固有困难),任何工具或技巧都无法把它们变没。

固有困难 为什么它让软件工程变难
复杂性(Complexity) 软件是人类构建的最复杂的造物之一;没有两个部分是一样的,而复杂性随规模以超线性的速度增长。没有可以退守的简化物理规律
一致性(Conformity) 软件必须迎合大量任意的外部接口、机构和既有系统,而它无法重新设计这些东西 —— 它的复杂性很大一部分是被强加的,而非自己选的
可变性(Changeability) 软件持续承受变更的压力,恰恰因为它是可塑的,又承载着系统的功能。大家都想改的那个东西,永远是软件
不可见性(Invisibility) 软件没有天然的几何或空间表示。你没法像看一座桥或一块电路板那样"看见"它,这让它难以推理、也难以沟通

在这四点之上,本讲还加了第五个动因:软件可能带来潜在严重甚至灾难性的后果(第七周那些失败案例 —— 波音 737 Max、Therac 类的危害、千年虫 —— 正是这里的背景)。

流程作为解药。 既然这些困难是本质性的,回应之道就是纪律,而不是某个魔法工具。软件是通过一个定义良好的流程被工程化出来的,这个流程的存在是为了:

  • 确保我们做对的事、把事做对、并且不遗漏任何东西;
  • 同时还要因地制宜 —— 不同的流程适合不同种类的软件、公司和情境。

⚠️ Brooks 的那句点睛之笔很可能是 quiz / 考试考点:流程不是银弹[Brooks,《没有银弹》]。Brooks 论证:没有任何单项进展 —— 无论在技术还是管理上 —— 能凭一己之力在十年内带来软件生产率、可靠性或简洁性上一个数量级的改善。流程帮我们管理固有困难,但消除不了它们。


3. 模型是什么,又是用来做什么的?

本讲首先消解"模型"一词的歧义,因为它在日常语言里带着两种含义:

"模型"的含义 例子 这里说的是这个吗?
模型 = 理想典范 时装模特;"模范学生" —— 被树立为标准、供人效仿的东西 ❌ 不是这个意思
模型 = 简化表示 一辆缩比模型车;一个架构模型(分层、客户端-服务器、Model-View-Controller);一个软件流程模型(瀑布、快速原型、螺旋) ✅ 我们用的是这个意思

所以一个软件流程模型就是对软件开发如何推进的一种简化表示 —— 它抽掉细节,抓住工作在高层次上的形状。

软件生命周期模型就是一个高层次的流程。\boxed{\textbf{软件生命周期模型就是一个高层次的流程。}}

流程模型是用来做什么的? 它可以扮演两种角色,同一个模型也可以两者兼任:

角色 含义
规范性(Prescriptive) 强制规则 —— 告诉团队应当做什么、以什么顺序做
描述性(Descriptive) 用来描述或刻画 —— 捕捉一个团队实际在做什么,以便研究和改进

规范性 / 描述性这个区分值得分清楚:白板上一个规定"先需求再设计再编码"的流程模型,是在被规范性地使用;而一位研究者观察真实团队怎么工作、画出由此得到的流程,则是在描述性地使用模型。大多数真实的模型两种用法兼有。


4. 软件生命周期模型 — 目录总览

本课程覆盖八个生命周期模型。大致按历史顺序排列,它们也勾勒出一条从重量级 / 僵化到轻量 / 敏捷的宏观弧线:

# 模型 一句话特征
1 边写边改(Build-and-fix) 没有真正的流程 —— 先写代码,然后永远打补丁
2 瀑布(Waterfall) 严格的顺序阶段,文档极多
3 快速原型(Rapid prototyping) 用一次性原型先把需求钉死
4 增量(Incremental) 分块构建并交付系统
5 螺旋(Spiral) 风险驱动;先做风险最高的部分
6 统一软件开发过程(RUP) 重量级、用例驱动、迭代式
7 极限编程(XP) 轻量、反馈驱动,是对重量级流程的反动
8 敏捷(Agile) 一把伞,XP、Scrum、Kanban 等都归在它底下

本讲的组织主线(在 Lecture 18 的总结里被明确点出)是一条随时间发生的转变:从僵化、重量级、文档驱动的流程(瀑布、RUP)转向轻量、敏捷的流程(XP、Scrum、敏捷)。边写边改连这条弧线的起点都还排不上 —— 它是流程的缺席,是其他一切要反对的对象。


5. 边写边改(Build-and-Fix)

边写边改是退化的极端情形:没有需求阶段,没有设计阶段,没有计划。你就直接写代码,然后一直打补丁。

生命周期:

构建第一个版本→修改直到客户满意→运行(运维)模式→退役\text{构建第一个版本} \to \text{修改直到客户满意} \to \text{运行(运维)模式} \to \text{退役}

幻灯片上的示意图用两种箭头画出这个循环:实线箭头表示开发,虚线箭头表示维护("修改直到客户满意"那个框自己绕回自己,维护箭头从运行模式回到修改)。

本讲的

优点 缺点
适合不需要太多维护、也不需要很多开发者的小程序 对于任何非平凡的项目都不够严谨 —— 没有规格、没有设计、没有文档、没有计划

边写边改是衡量其他每个模型改进幅度的基准线。它唯一的优点 —— 你能立刻开始写代码 —— 也正是它在任何大型项目上崩溃的原因:没有需求、没有设计,复杂性、可变性以及协调众多开发者的需要,全都无处安放。


6. 瀑布模型(Waterfall)

瀑布模型施加一套严格、有序的阶段序列。每个阶段都被完整地做完(并形成文档)之后,下一个阶段才开始,就像水沿着一级级台阶往下流。

各个阶段:

需求→设计→实现→集成→测试→运行模式→退役\text{需求} \to \text{设计} \to \text{实现} \to \text{集成} \to \text{测试} \to \text{运行模式} \to \text{退役}

在幻灯片的示意图里,实线(开发)箭头严格地一级级向下穿过各阶段,而虚线(维护)箭头则向上折回 —— 还有一个"需求变更"框反馈回各阶段,表示系统投入运行后的维护。

本讲的

优点 缺点
促使团队先理解需求 僵化,难以适应变化
有纪律、严谨、正式 用户参与有限
产出大量文档 对于需求或技术上存在任何含糊的项目很糟糕
适合需求明确、不太会变的项目 常常留给测试的时间不够(测试在最后,进度一拖就吃掉测试时间)
为其他软件流程模型提供了一个起点 现实失败案例:Healthcare.gov

⚠️ 值得记的名言(很可能是考点)—— Clay Shirky 评 Healthcare.gov 上线(2013):"瀑布模型相当于各方共同立下的一个誓言:在真正干活的过程中,谁都不许学到任何东西。"("The waterfall model amounts to a pledge by all parties not to learn anything while doing the actual work.")这一批评指出,瀑布把所有的学习都冻结在前期的需求阶段,并且禁止团队在发现 —— 他们总会发现 —— 计划本来就是错的之后再去调整。


7. 快速原型(Rapid Prototyping)

快速原型针对的是瀑布"用户参与有限"这个弱点。与其先在纸面上把需求锁死,不如构建并丢弃一个简单的原型 —— 一个快速、用完即弃的版本,它唯一的任务就是引出并验证用户真正想要什么。一旦这个原型完成了使命,你就把它扔掉,再去开发真正的系统。

生命周期:

构建并丢弃一个简单原型→设计→实现→集成→测试→运行模式→退役\text{构建并丢弃一个简单原型} \to \text{设计} \to \text{实现} \to \text{集成} \to \text{测试} \to \text{运行模式} \to \text{退役}

"构建并丢弃简单原型"这个框替换掉了一个在其余部分都像瀑布的流程开头的需求阶段;图的其余部分用的是同样的开发 / 维护箭头和"需求变更"反馈。

本讲的

幻灯片上的两句名言道出了原型法为什么有用:

"人们在你把东西摆到他们面前之前,并不知道自己想要什么。" — Steve Jobs

"人们在见到自己不想要什么之前,并不知道自己想要什么。" — Humphrey 定律

关键词是丢弃。原型是一件学习工具,而不是产品的第一个版本。把它廉价地造出来、又愿意把它扔掉,才让团队能在投入一次完整而昂贵的构建之前,把隐藏的或被误解的需求暴露出来。


8. 增量模型(Incremental)

增量模型把系统分块(增量)交付,而不是一次性全部交付。你先把需求和高层架构做一遍,然后反复地一次构建、测试、发布一个增量。

生命周期:

需求→架构设计→[详细设计→实现→集成→测试→交付]⏟对每个增量→运行模式→退役\text{需求} \to \text{架构设计} \to \underbrace{[\text{详细设计} \to \text{实现} \to \text{集成} \to \text{测试} \to \text{交付}]}_{\textbf{对每个增量}} \to \text{运行模式} \to \text{退役}

中间那个"对每个增量"框写着:进行详细设计、实现与集成。测试。交付给客户。 另一张幻灯片把这一过程可视化成一段下行的阶梯:分析 → 设计 → 实现 → 测试 → 部署 → 维护,每一段阶梯产出 Release 1、Release 2、Release 3、…… Release n。

本讲的

第二张

案例 — 微软改进它的流程:

时期 做法
之前(Windows 8 及更早) "哒哒"式("Ta-da")做法 —— 秘密开发,然后在一次盛大的揭幕里端出一个成品版本
之后(Windows 10) 迭代式,由用户反馈驱动(本讲甚至反问:会不会太多了?),并用 A/B 测试在真实用户身上比较不同方案

增量是第一个让客户尽早且经常看到可工作软件的模型。这种早期反馈是它最大的优势 —— 而这正是同一种直觉,再过几个模型,XP 和敏捷会把它推向极致。


9. 螺旋模型(Spiral)

螺旋模型(Boehm)是风险驱动的。开发沿着一条螺旋绕圈推进;每一圈的开头都做风险分析,而这一圈里所采取的步骤是可变的,取决于风险分析发现了什么(某一圈可能是一次快速原型,或一份规格说明,或一次设计,或一次实现 —— 然后跟一个"验证"步骤)。风险最高、最不确定的部分被最先啃下来。

幻灯片上的示意图画出一条逐圈扩张的螺旋,每一圈都以风险分析开始、以验证结束,内层活动标注为快速原型?/ 规格说明?/ 设计?/ 实现? —— 那些问号强调究竟做哪个活动,是由风险分析决定的,而非事先固定。

本讲的

Boehm 的十大软件风险(展示了其中六条),及其管理技术:

风险 风险管理技术
人员短缺 配备顶尖人才、人岗匹配、提振士气
不切实际的进度与预算 详尽的成本 / 进度估算、复用、增量式开发
开发了错误的软件功能 用户调查、原型法
持续不断的软件变更流 信息隐藏、增量式开发
外部提供的组件存在缺口 兼容性分析
外部执行的任务存在缺口 资质核查、竞争性设计或原型法

(改编自 Hans Schaefer 的 "Software Risk Management: A Calculated Gamble"。)

优点 缺点
适合需求不确定、复杂的新项目 开发者必须擅长风险分析
风险最高的部分被最先开发(失败会及早浮现,那时修复最便宜) "项目终点"可能不可知 —— 螺旋可以一直绕下去

螺旋的标志性动作是把风险前置。瀑布先做容易、好理解的需求工作,到很晚才发现难题;螺旋则刻意先去攻坚那些吓人、不确定的部分,好让一个注定失败的项目早早失败,而不是在投入数年之后才失败。


10. 统一软件开发过程(RUP)

RUP 是一个重量级、高度结构化的迭代式流程,由三个特征定义:

  • 用例驱动(Use case driven) —— 开发围绕用例(用户想要完成什么)来组织。
  • 以架构为中心(Architecture centric) —— 系统架构是一个核心的、一等公民式的工件。
  • 迭代且增量(Iterative and incremental) —— 在一轮轮迭代中构建,每一轮都增加一部分能力。

RUP 模型是一个二维结构(那张著名的"驼峰"图):

轴 内容
阶段(Phases,横轴 / 时间) 初始(Inception)→ 细化(Elaboration)→ 构造(Construction)→ 移交(Transition)
流程工作流(Process workflows,纵向) 业务建模、需求、分析与设计、实现、测试、部署
支持工作流(Supporting workflows,纵向) 配置管理、(项目)管理、环境

图上的两句说明道出了核心思想:

  • "工作流在逻辑上把活动归类" —— 每个工作流是一类连贯的工作(例如,与需求有关的一切)。
  • "在一次迭代中,你会走过所有工作流" —— 在单次迭代里你会触及每一个工作流,但每个工作流投入的工作量会随阶段而变化(那些彩色的"驼峰"在早期对需求很高,在中期对实现很高,在接近尾声时对部署很高)。

经典的

本讲还展示了三个详细的 RUP 工作流作为示例,说明 RUP 提供了多少指导:架构分析(Architectural Analysis)、分析与设计(Analysis & Design)、用例分析(Use Case Analysis)(每一个都是自成一体、关于角色、活动和工件的精细图)。

优点 缺点
风险驱动、增量式 重量级(非常!)
大量工具支持 复杂 —— 需要专门的专业知识才能落地
提供大量指导(详细的工作流、角色、工件)

RUP 是重量级传统的最高水位线:庞大、规范性强、有工具支持、面面俱到。它的优点(指导、工具)和缺点(重量级、复杂)是同一枚硬币的两面 —— 而正是 RUP 这类流程的沉重,催生了 XP 和敏捷的反抗。


11. 极限编程(XP)

XP(Kent Beck)是对瀑布以及其他重量级 / 传统流程一次刻意"极端"的反动。本讲列出了 XP 所反对的那些传统流程的问题:

  • 开发周期冗长
  • 无力应对变化的需求
  • 假设在项目开始之前需求就已被完全理解
  • 过度依赖英雄式的开发投入
  • 方法论复杂
  • 工作的浪费 / 重复

(幻灯片字面上用一个巨大的红色 X 把这些划掉,传达出:XP 拒绝这一切。)

本讲的

XP 的流程步骤:

  1. 确定想要的功能(以用户故事(story)的形式)。
  2. 估算、排优先级、细化这些故事。
  3. 实现 / 交付每项任务 —— 通常采用测试驱动开发和结对编程。
  4. 全程遵循 XP 的价值观与原则(见 §12)。

XP 的精神:把传统流程当作偶尔为之或项目末期才做的活动 —— 测试、集成、设计评审、客户反馈 —— 改成一直做、以极小的增量做。"极限"意味着把每一项好的实践都调到最高频率。


12. XP 的十四条实践

XP 由一组相互强化的实践与原则定义:

# 实践 它的含义
1 整个团队(Whole team) 客户、开发者,以及一切必要的人,坐在一起、作为一个团队工作
2 小版本发布(Small releases) 交付小的、频繁的、可工作的增量,而不是一次大交付
3 客户测试(Customer tests) 由客户指定验收测试,定义一个功能何时算"做完了"
4 简单设计(Simple design) 构建能跑起来的最简单的东西;不做投机性的通用化
5 结对编程(Pair programming) 两个开发者共用一个键盘 —— 持续、实时的代码评审
6 测试驱动开发(TDD) 在写代码之前先写测试(见下面的红-绿-重构循环)
7 设计改进(Design improvement) 持续重构 —— 在不改变行为的前提下改进设计
8 持续集成(Continuous integration) 不断地集成并测试变更,而不是在最后做一次大合并
9 代码集体所有(Collective code ownership) 任何人都可以改任何代码;没有私有的孤岛
10 编码规范(Coding standards) 共享的约定,让所有代码看起来像出自同一人之手
11 可持续的节奏 / 开发者福祉(Sustainable pace) 不搞死亡行军;避免燃尽(幻灯片划掉了一个精疲力竭、瘫倒的开发者)
12 开放空间(Open space) 一个共享的物理工作空间,促进沟通
13 共同理解(Shared understanding) 每个人都持有相同的心智模型(那张"我很高兴大家意见一致……哦……啊哈!"的漫画)
14 快速、细粒度的反馈(Rapid, fine feedback) 在从秒到月的每个时间尺度上都有反馈回路

TDD 循环(红-绿-重构):

添加测试→看测试失败(红)→写代码→运行测试(绿)→重构→(重复)\text{添加测试} \to \text{看测试失败(红)} \to \text{写代码} \to \text{运行测试(绿)} \to \text{重构} \to (\text{重复})

本讲的测试驱动开发循环示意图:六个彩色圆圈排成一环,箭头顺时针流动 ——

XP 的嵌套反馈回路在所有时间尺度上同时运转:

发布计划(月)→迭代计划(周)→验收测试(天)→站会(一天)→结对协商(小时)→单元测试(分钟)→结对编程(秒)→代码\text{发布计划(月)} \to \text{迭代计划(周)} \to \text{验收测试(天)} \to \text{站会(一天)} \to \text{结对协商(小时)} \to \text{单元测试(分钟)} \to \text{结对编程(秒)} \to \text{代码}

考试时你不需要把这十四条全背下来。要知道 XP 是一束轻量实践,并能说出几条招牌实践 —— 结对编程、测试驱动开发、小版本发布、持续集成、简单设计 —— 并解释它们如何相互强化,共同服务于 XP 那个频繁、低风险、富含反馈的交付目标。


13. 从 XP 到敏捷 — 敏捷宣言

敏捷(Agile)是 XP 帮助催生的那个更宽广的哲学。它包含并演化自 极限编程、Scrum、Crystal、Kanban 等等。

它的奠基文件是 《敏捷宣言》(The Agile Manifesto,2001),行文为"我们逐渐认识到……更有价值" 的一组四项权衡:

我们更看重这个…… ……胜过这个(仍有价值,只是相对次之)
个体与互动 流程与工具
可工作的软件 详尽的文档
客户协作 合同谈判
响应变化 遵循计划

⚠️ 这四条价值陈述是头号考点。关键的微妙之处在于:宣言说左边的项更被看重,但"右边的项仍然有价值"。敏捷并不是说文档或计划一文不值 —— 它是说,当它们与可工作的软件和响应力发生冲突时,左边的赢。


14. 敏捷原则、Ziv 定律与 Scrum

一些敏捷原则(本讲的选取):

  • 欢迎需求变化 —— 即便在开发后期也如此。
  • 业务人员与开发者在整个项目中每天一起工作。
  • 围绕积极主动的个体来组建项目 —— 信任他们能把事情做成。
  • 面对面交谈是传递信息的最佳方式。
  • 文档只是达成目的的手段 —— 它本身不是目的。
  • 可工作软件的持续交付。

Ziv 定律 —— 敏捷立场的理论依据:

软件开发是不可预测的,而像需求这样的文档化工件永远不会被完全理解。\boxed{\textbf{软件开发是不可预测的,而像需求这样的文档化工件永远不会被完全理解。}}

Ziv 定律说不确定性在软件工程的流程和产品中是内在且不可避免的。这是对瀑布核心假设(需求可以在前期被完全理解)的直接反驳:如果不确定性永远无法被消除,那么一个拥抱变化的流程,就会胜过一个试图把计划冻结的流程。

Scrum —— 最流行的敏捷框架。本讲是通过一段"Scrum 十分钟讲明白"的短视频引入它的,而非用大量幻灯片深讲,但它所覆盖的词汇值得知道:

Scrum 要素 作用
产品待办列表(Product backlog) 产品可能需要的一切,按优先级排好的完整清单
发布待办列表(Release backlog) 为即将到来的某次发布所选取的子集
冲刺(Sprints) 短的、定长的开发周期
团队角色(Team roles) 如产品负责人(Product Owner)、Scrum Master、开发团队
每日站会(Daily standups) 简短的每日同步会议
燃尽图(Burndown charts) 跟踪一个冲刺内剩余的工作量
回顾会(Retrospectives) 冲刺结束后的复盘,以改进流程
估算(Estimations) 给工作定大小(如故事点,story points)

考试提示:Scrum 拿到的是一段视频,而非一节详尽的讲解 —— 所以期望的是认得这些词汇、并知道 Scrum 是一个敏捷框架,而不是对各项仪式的深入演练。


15. 敏捷 — 优点、缺点与采纳情况

优点 缺点
客户(以及开发者)满意度高 缺少文档
能适应变化的情境 需求不稳定
适合需求不明确、会变化的项目 技术债(Technical debt)
适合小团队 最初的敏捷理念对大团队、安全攸关的需求,或无法让客户参与的项目并不理想

行业采纳情况(并排展示两项调查):

本讲的行业采纳幻灯片,并排展示两项调查。左侧是来自 Stack Overflow 开发者调查 2018(

Stack Overflow 开发者调查 2018 ——"开发者使用哪些方法论?"(多选,58,981 份回应):

方法论 受访者占比
敏捷(Agile) 85.4%
Scrum 62.7%
Kanban 35.2%
结对编程 28.4%
极限编程(XP) 15.7%
正式标准(ISO 9001 / IEEE 12207,"瀑布") 15.1%
精益(Lean) 9.6%

Kassab 等人,"Software Testing: The State of the Practice",IEEE Software,2017 —— 最能描述每个项目的那一种方法论:

方法论 占比
Scrum 39.29%
瀑布模型 11.90%
螺旋模型 7.14%
原型法 5.95%
特性驱动开发 4.76%
极限编程 3.57%
V 模型 2.38%
精益软件开发 2.38%
统一过程(RUP) 1.19%
(无 / 未知 / 其他) 各 7.14%

数据把整个单元的故事讲完了:敏捷和 Scrum 主导着实践,而重量级、文档驱动的流程(瀑布、RUP / 统一过程)已经萎缩成一小撮少数。这就是"从重量级转向轻量"这条弧线背后的经验证据。


16. 全景图 — 八种模型横向对比

模型 核心思想 迭代? 最适合 关键弱点 重量
边写边改 先写代码再打补丁 —— 没有流程 有循环,但无计划 极小、用完即弃的程序 不严谨;在非平凡项目上崩溃 无
瀑布 严格的顺序阶段,文档极多 否 需求明确、稳定 僵化;遇含糊则糟;测试被挤压 重
快速原型 用一次性原型来学习需求 先原型,之后类瀑布 需求不明确;需要用户输入 原型可能被误当成产品 中
增量 分块(一次次发布)交付系统 是(每个增量) 能从早期、部分交付中受益的项目 架构必须在前期定好 中
螺旋 风险驱动;风险最高的部分先做 是(每一圈) 需求不确定、复杂的新项目 需要风险分析的专业能力;"终点"模糊 中-重
RUP 用例驱动、以架构为中心、迭代式 是 需要结构 + 工具支持的大型项目 重量级;复杂;需要专业知识 非常重
XP 富含反馈的实践的轻量集合 是(持续) 小团队;变化的需求 文档偏少;不适合大型 / 安全攸关 轻
敏捷 一把伞式哲学(XP、Scrum、Kanban……) 是(持续) 小团队;不明确 / 变化的需求 文档、不稳定需求、技术债;不适合大型 / 安全攸关 轻
历史弧线:僵化、重量级、文档驱动(瀑布、RUP)  ⟶  轻量、敏捷(XP、Scrum、敏捷)。\boxed{\textbf{历史弧线:僵化、重量级、文档驱动(瀑布、RUP)} \;\longrightarrow\; \textbf{轻量、敏捷(XP、Scrum、敏捷)。}}

17. Quiz 9 / 期末考复习指南

这是本课程最后一个内容单元 —— 下一节课是全课总结、期末考复习,以及一次不计分的迷你练习 quiz。下面的一切都可能考。

17.1 你必须能定义的词汇

术语 一句话定义
软件生命周期模型 一个用于开发软件的高层次(简化表示式)流程
规范性模型(Prescriptive model) 用来强制规则、规定该做什么的模型
描述性模型(Descriptive model) 用来描述或刻画实际所做之事的模型
边写边改 先写一个版本,然后修改直到客户满意 —— 没有规格、没有设计
瀑布 严格的顺序阶段(需求 → 设计 → 实现 → 集成 → 测试 → 运行 → 退役),文档极多
快速原型 在真正开发之前,构建并丢弃一个简单原型以钉死需求
增量 需求 + 架构只做一次,然后分增量构建并交付系统
螺旋 风险驱动;每一圈以风险分析开始;风险最高的部分先开发
RUP 重量级流程,用例驱动、以架构为中心、迭代且增量
极限编程(XP) 轻量、富含反馈的流程,由 TDD、结对编程等实践构成
敏捷 一把伞式哲学(XP、Scrum、Kanban、Crystal……),由《敏捷宣言》定义
Scrum 最流行的敏捷框架 —— 冲刺、待办列表、站会、回顾会

17.2 四大固有困难(Brooks)

复杂性、一致性、可变性、不可见性 —— 软件工程为什么本质上就是难的。外加:流程不是银弹(Brooks)。

17.3 八种模型,按顺序

边写边改 → 瀑布 → 快速原型 → 增量 → 螺旋 → RUP → XP → 敏捷。要能给出每一个的核心思想、一个优点和一个缺点,并能把某个模型匹配到某个场景(例如,需求不确定且复杂 → 螺旋或原型法;需求稳定、明确 → 瀑布;小团队、需求会变 → 敏捷 / XP;安全攸关、大团队 → 不要用纯敏捷)。

17.4 那些名言(背下原文措辞)

名言 出处 要点
"没有银弹(No silver bullet)" Brooks 没有任何单项进展能在十年内带来软件工程一个数量级的改善
"瀑布模型相当于各方共同立下的一个誓言:在真正干活的过程中,谁都不许学到任何东西。" Clay Shirky(Healthcare.gov) 瀑布禁止你根据所学去调整
"人们在你把东西摆到他们面前之前,并不知道自己想要什么。" Steve Jobs 为原型法提供依据
"人们在见到自己不想要什么之前,并不知道自己想要什么。" Humphrey 定律 为原型法提供依据
软件开发是不可预测的;不确定性是内在且不可避免的 Ziv 定律 为敏捷 / 拥抱变化提供依据

17.5 RUP 的细节

三个特征(用例驱动、以架构为中心、迭代且增量);四个阶段(初始、细化、构造、移交);在一次迭代中你会走过所有工作流这个观念;优点(指导、工具、风险驱动)与缺点(重量级、复杂)。

17.6 XP 与敏捷的细节

XP 是对重量级流程的一次反动;要知道那些招牌实践(结对编程、TDD、小版本发布、持续集成、简单设计)以及 TDD 红-绿-重构循环。要知道《敏捷宣言》的四条价值(以及右边的项仍有价值这个微妙之处)、几条敏捷原则,以及 Scrum 是最流行的敏捷框架。

17.7 那条大弧线 + 数据

要能陈述从重量级 / 文档驱动转向轻量 / 敏捷这条转变,并引用调查证据(敏捷约 85%、Scrum 是最常见的单一方法论;瀑布 / RUP 如今已是少数)。


18. 总结与记忆框架

一句话总结

因为软件工程本质上就是难的(Brooks 的复杂性、一致性、可变性、不可见性),而且没有任何流程是银弹,团队便采用一个软件生命周期模型 —— 一个被规范性或描述性地使用的高层次流程 —— 而这些模型沿着一条清晰的弧线演化,从僵化、重量级、文档驱动的方法(边写边改 → 瀑布 → 快速原型 → 增量 → 螺旋 → RUP)走向轻量、反馈驱动、拥抱变化的方法(XP → 敏捷 / Scrum),这一转变如今已被调查证实 —— 在实践中敏捷和 Scrum 占据主导,而瀑布和 RUP 已沦为少数。

快捷键[ 上一篇] 下一篇L 切换语言