2 敏捷软件开发 - sebestp/coursewise GitHub Wiki

2-敏捷软件开发

第一部分:为什么需要敏捷

软件开发的现实困境

一个熟悉的场景:客户说「我要一个学生选课系统」——第 6 周需求规格说明书评审通过(400 页 UML),第 12 周编码中客户又说「其实我们还想要手机端」,第 20 周交付演示时客户皱眉:「这不是我想要的。」

灵魂拷问:问题出在哪一环?是需求没写清楚,还是流程本身就有问题?

CHAOS 报告

Standish 集团(1994–2020 长期跟踪数万个项目):

  • 需求变更是首要失败因素
  • 平均超支 >40%,超期 >60%
  • 大型项目失败率约为小型项目的 2 倍
  • 结论:软件项目的敌人不是「复杂」,而是「不确定性」

瀑布模型的问题

瀑布模型(Royce, 1970):需求 → 设计 → 编码 → 测试 → 运维,各阶段顺序执行、不可回退。它的隐含假设与软件开发现实对比:

瀑布的假设 软件开发的现实
需求稳定不变 需求必然随认知深化而变化
前期设计可以完备 很多设计决策只有写了代码才能验证
缺陷越晚发现越便宜 恰恰相反——越晚发现修复代价越高(10–100 倍)
客户知道自己要什么 客户往往看到之后才知道要什么

讽刺的是:Royce 本人把「一次做完、不回头」当作反面教材,主张带反馈回路,业界却把它当标准流程推广了三十年。

重量级方法论之痛

  • 文档驱动:需求规格说明书、概要设计、详细设计、测试计划……文档写完已经过时
  • 流程驱动:CMM/CMMI 5 级评估、ISO 9000、阶段闸门评审、变更控制委员会
  • 工具驱动:UML 9 种图全套画完,工具产出被误认为价值本身
  • 共同症状:团队 60% 的时间在「证明自己在做事」,只有 40% 的时间真正交付客户可用的软件

敏捷的诞生

  • 1990 年代:Scrum、极限编程、动态系统开发方法等「轻量级方法」各自萌芽
  • 2001 年 2 月:17 位软件开发者在美国犹他州雪鸟(Snowbird)开会,产出《敏捷软件开发宣言》
  • 2005 年:敏捷联盟成立
  • 2010 年代:Spotify 模型、DevOps、规模化敏捷框架
  • 2020 年代:AI 编程时代,敏捷理念被重新审视

敏捷不是一种具体方法或固定流程,而是一种价值观、一组原则、一个方法家族、面对不确定性时的思维模式。

第二部分:敏捷宣言

4 条价值观

我们一直在实践中探寻更好的软件开发方法,并帮助他人也这样做。由此我们建立了如下价值观:

  • 个体和互动 高于 流程和工具
  • 工作的软件 高于 详尽的文档
  • 客户合作 高于 合同谈判
  • 响应变化 高于 遵循计划

也就是说,尽管右项有其价值,我们更重视左项的价值。

价值观 解读 落地
个体和互动 > 流程和工具 再好的工具替代不了人与人沟通 每日站会、结对编程、开放办公
工作的软件 > 详尽的文档 衡量进展的首要指标是能跑起来的软件 每个迭代末演示可运行版本
客户合作 > 合同谈判 客户是队友不是甲乙方 产品负责人深度参与
响应变化 > 遵循计划 计划是假设,变化是事实 迭代计划会、需求池精炼、拥抱变更

「X 高于 Y」不代表抛弃 Y——文档、计划、合同、工具都还要,只是不再是「神」。

12 条原则(分三组)

客户与交付:

# 原则 落地实践
1 最高优先级是通过早期和持续交付有价值软件让客户满意 最小可行产品、增量交付
2 拥抱需求变更,即使在开发后期 需求池精炼、变更友好
3 频繁交付可运行的软件,周期越短越好 迭代 2–4 周
7 可运行的软件是衡量进展的首要指标 迭代评审现场演示

团队与协作:

# 原则 落地实践
4 业务人员和开发人员必须每日共同工作 产品负责人常驻、结对
5 围绕有积极性的个体构建项目,给予环境和信任 自组织团队
6 面对面交谈是最高效的信息传递方式 站会、白板、共同办公
8 倡导可持续开发,节奏应能长期维持 拒绝英雄式加班
11 最好的架构、需求和设计出自自组织团队 无强指派、集体决策

技术与改进:

# 原则 落地实践
9 持续关注技术卓越和良好设计 重构、测试驱动开发、持续集成
10 简洁——最大化未完成工作量的艺术 「你不会需要它」原则、最小可行产品
12 团队定期反思如何更有效,然后调整行为 迭代回顾会、持续改善

第三部分:主流敏捷框架

Scrum:3-3-5 骨架

  • 3 个角色:产品负责人(管需求优先级、代表客户)/ 敏捷教练 Scrum Master(服务型领导,移除障碍、守护流程)/ 开发团队(3–9 人自组织)
  • 3 个工件:产品待办列表 / 迭代待办列表 / 产品增量
  • 5 个事件:迭代(Sprint)/ 迭代计划会 / 每日站会 / 迭代评审会 / 迭代回顾会

Scrum 迭代节奏(2–4 周,时间盒固定):

迭代 N
├── 迭代计划会(≤8h)→ 确定迭代目标 + 拆解任务
├── 每日站会(15min/天)→ 昨天做了啥 / 今天做啥 / 有啥阻碍
├── 开发工作(编码 + 测试 + 集成 + 文档同步进行)
├── 需求池精炼 → 为下个迭代准备候选用户故事
├── 迭代评审会(≤4h)→ 向客户演示可运行增量,收集反馈
└── 迭代回顾会(≤3h)→ 团队自省 + 承诺改进行动

迭代目标比具体任务更重要——任务可以调整,目标不能轻易改。 完成定义:代码合并 + 单元测试通过 + 代码评审完成 + 集成测试通过 + 文档更新 + 演示可跑。不达成完成定义 = 不算完成,不进增量。

极限编程(XP)

核心价值观:沟通 · 简单 · 反馈 · 勇气 · 尊重(Kent Beck, 1999)

关键实践:结对编程 / 测试驱动开发(红→绿→重构)/ 持续集成(每天多次合并)/ 重构 / 简单设计 / 集体代码所有权 / 编码规范 / 可持续节奏(每周 40 小时)/ 现场客户 / 小版本频繁发布

Scrum 与 XP 的关系:Scrum 管「做什么、何时做、谁来做」(管理框架),XP 管「怎么做才能做好」(工程实践)。业界常见「Scrum 骨架 + XP 肌肉」。

看板方法

五大核心属性:可视化工作流 / 限制在制品数量 / 管理流动 / 明确过程策略 / 协作改进

「停止启动,开始完成」——在制品上限逼你先完成手头工作再启动新任务。

维度 Scrum 看板
节奏 固定迭代(2–4 周) 持续流动,无固定节奏
变更 迭代中锁定 随时可加入新任务
度量 燃尽图、速率 前置时间、累积流图
适用 产品迭代开发 运维、技术支持、持续交付

三框架对比

维度 Scrum 极限编程 看板
定位 管理框架 工程实践 流动管理
节奏 2–4 周迭代 1–2 周迭代 无固定节奏
强项 结构清晰、易上手 代码质量高 灵活、适合运维
弱项 仪式易形式化 门槛高、纪律严 缺乏节奏感

本课程建议:Scrum 骨架 + XP 工程实践 + 看板可视化 = 16 周项目实践的混合方案。

第四部分:关键实践与工具

用户故事与 INVEST 原则

模板:作为 <角色>,我想要 <功能>,以便 <价值>

例:作为学生,我想要用学号登录系统,以便快速查询他的课表

INVEST 六条标准(Bill Wake 提出):

字母 含义 反例
I 独立 故事之间尽量独立可交付 登录+选课+成绩全塞一个故事
N 可协商 故事是讨论起点,不是合同 写成规格说明书,字字不能改
V 有价值 对客户有可感知的价值 「重构数据库连接池」客户无感
E 可估算 团队能估算其规模 「支持大数据量」无法量化
S 足够小 一个迭代内能完成 一个故事 = 一个月工作量
T 可测试 有明确的验收标准 「界面美观」无法判定通过

验收标准与估算

  • 验收标准(给定-当-那么三段式):给定学生已登录 → 当点击「我的课表」→ 那么显示本学期所有课程。每个故事至少写 3 条。
  • 故事点:斐波那契数列 1, 2, 3, 5, 8, 13, 21。1 分 = 改个文案;3 分 = 新增一个简单表单;8 分 = 涉及 3 个模块;21 分以上 = 太大必须拆分。
  • 规划扑克:每人同时出牌,避免「锚定效应」。
  • 速率:团队每个迭代能完成的故事点数,用于预测剩余需求池。

速率是团队级指标,禁止用于个人考核。

每日站会 · 迭代评审 · 迭代回顾

  • 每日站会(15 分钟,站着开):三个问题——昨天为达成迭代目标做了什么?今天打算做什么?有什么阻碍?站会不讨论技术方案。
  • 迭代评审会:现场演示可运行软件,收集反馈,更新需求池。不是 PPT 汇报会。
  • 迭代回顾会:四段式——建立安全氛围 → 收集数据 → 产生洞察 → 决定行动。

回顾会黄金规则:对事不对人;每人至少说一条改进建议;每次只挑 1–2 条真正去改;下次回顾会先检查上次行动项。

工具生态(含国产方案)

类别 国际主流 国产/高校友好
项目管理/看板 Jira、Trello Teambition、飞书项目、PingCode、禅道
文档协作 Confluence 飞书文档、语雀
代码托管 GitHub Gitee(校园网快)
持续集成/部署 GitHub Actions 云效、Gitee Go
AI 编程助手 Copilot、Cursor Qoder CN(阿里)、Trae(字节)、CodeBuddy(腾讯)、CodeGeeX(智谱)
即时沟通 Slack 飞书、钉钉

选型三原则:① 团队已经在用的优先 ② 免费/学生版优先 ③ 能整合的优先。16 周项目实践中,建议全组统一一套工具链。

第五部分:AI 时代的敏捷 + 16 周落地路径

AI 时代的敏捷实践

敏捷仪式 AI 如何加持
需求池精炼 大模型辅助拆解用户故事、生成验收标准
结对编程 AI 编程助手作为「第三个人」
代码评审 AI 先做静态检查和风格检查,人聚焦设计与业务逻辑
站会/回顾 自动生成进度摘要、提炼行动项
文档 从代码和提交记录自动生成接口文档、变更日志

⚠ 提示词就是新的需求文档——写不清需求,AI 生成的代码谁负责?提交者负责。AI 不是免责金牌,敏捷核心没变:个体互动、可运行软件、客户合作、响应变化。

敏捷实施的常见误区

  • 僵尸 Scrum:仪式都在做但没有灵魂
  • 敏捷 ≠ 没计划:敏捷做滚动式计划——长期粗、短期细
  • 敏捷 ≠ 没文档:要「刚好够用的文档」,服务于沟通而非合规
  • 敏捷 ≠ 更快加班:违反原则 8(可持续节奏)
  • 敏捷 ≠ 换个头衔:权责必须真转移

判断一个团队是否真敏捷的唯一标准:当需求变了,团队的反应是「拥抱」还是「抱怨」?

16 周项目实践:敏捷落地路径

周次 阶段 关键活动 交付物
第 1 周 迭代 0·组建 团队组建、角色分配、工具链选型、编码规范 团队章程
第 2 周 迭代 0·探索 需求收集、撰写用户故事、初始化产品待办列表 需求池 v1(≥30 个故事)
第 3–6 周 迭代 1(4 周) 计划会→站会→评审→回顾;聚焦最小可行产品 最小可运行产品
第 7–10 周 迭代 2(4 周) 功能扩展 + 用户体验优化 v0.5 + 速率数据
第 11–14 周 迭代 3(4 周) 质量强化 + 性能优化 + 文档补全 v0.9 + 测试报告
第 15 周 迭代 4·收尾 缺陷修复、部署上线、演示准备 v1.0 + 部署文档
第 16 周 结课 项目答辩、总回顾、经验沉淀 结课报告 + 演示视频

建议:迭代 0 不写代码,先把需求池和团队规则建好;每个迭代必须有可运行的东西;站会不缺席;回顾会真的去改至少 1 条。