XP
背景
变更成本曲线:变更成本随时间呈指数增长
传统瀑布模型方法只能早期做好一切
- 需求必须一次锁死
- 设计必须覆盖未来
- 测试留到最后
极限:把测试先行、持续集成、重构这些实践做到极致,让改变不再昂贵
XP的核心在开发阶段 程序员把一个工程任务实现并集成系统
一次工程任务的十步循环 从一张任务卡出发,十步走完即测试已集成
- 找一个结对伙伴
- 领最前面的任务卡
- 讨论任务
- 不确定就求助
- 设计测试用例
- 先想清楚对的样子
- 编写测试并让它失败
- 红灯——确认测试有效
- 编写业务代码
- 写到测试通过为止
- 跑全部测试
- 绿灯——没打破已有能力
- 迭代测试与代码
- 加下一个用例
- 按需重构
- 结构变丑就重构,测试就是安全网
- 立即集成
- 进主干并跑集成测试
- 领下一张卡
- 循环再来
四条纪律
- 结对编程
- 测试驱动 TDD
- 结对不只是让测试通过 加值
- 结对为分析、设计、实现、测试同时加值
- 即时集成
平坦曲线的五根支柱
- 面向对象
- 修改局部化,动一处不牵全局
- 简单设计
- 不写未来可能用但现在没用的元素
- 自动化测试
- 安全网:改完立刻知道是否打破行为
- 重构技术
- 让代码持续保持可维护
- CI/CD
- 频繁部署和集成
XP 通过把反馈周期从月级压缩到分钟级,阻止错误和错误假设长期累积,因此压平了变更成本曲线
十二项实践
四大价值观
- 交流
- 简单
- 反馈
- 勇气
尊重是底座
四项基本活动
- 编码
- 测试
- 倾听
- 设计
倾听决定编码什么;编码产生结果;测试验证结果;设计让循环持续跑下去
好设计的四条判据
- 局部隔离
- 唯一实现位
- 逻辑近数据
- 扩展单点
十二项实践
- 计划游戏
- 业务决策要建在技术评估之上,技术评估要服务业务价值,两者双向依赖
- 小发布
- 每次发布尽可能小但是作为整体有意义
- 隐喻
- 用一个简单、生动、团队共享的比喻来描述系统整体结构,让大家更容易沟通、设计和扩展系统
- 简单设计
- 四条判据
- 运行所有测试
- 没有重复的逻辑
- 表面每一个对程序员重要的意图
- 尽可能少的类和方法
- 四条判据
- 测试TDD
- 程序员单元测试 客户功能测试
- 重构
- 触发:新功能进不去或很难进去
- 识别信号:系统在要求你重构
- 小步改
- 改完再加新功能
- 结对编程
- 动态结对
- 集体拥有代码
- 谁发现能为代码增加价值,就随时去做
- 持续集成
- 责任明确可追溯
- 40小时工作制
- 不靠加班维持进度
- 现场客户
- 真实客户必须与团队同坐办公,随时解答问题、解决争议
- 编码标准
- 统一标准

TDD与演进式设计
传统计划设计的问题是设计离代码太远;纯 Code-fix 的问题是代码没有设计约束。XP 要找的是中间路线:让设计贴着代码持续演进
敏捷测试的四条纪律
- 独立
- 自动
- 即时
- 永存
五种测试类型
- 单元测试
- 功能测试
- 并行测试
- 压力测试
- 随机测试
红绿重构
- 红 写失败测试
- 绿 最小代码过测 写刚好能让测试通过的最少代码(允许硬编码,目标仅让红变绿)
- 三角测试 再补一条测试
- 重构 在测试保护下

简单设计的四重准则
- 通过所有测试
- 消除重复
- 清晰表达意图
- 最小化元素数量
YAGNI You Aren‘t Gonna Need It 不要因为“以后可能需要”就提前开发功能。超前功能多数不会被使用,却会持续增加维护成本
重构的纪律:不改行为,只改结构
生长式架构 疼痛出现前不引入核心元素
- 起步 什么都不上
- 海量数据到来 引入数据库
- 业务复杂度到来 引入领域模型
- 存疑时 依YAGNI
UML 应该作为低成本的沟通草图,而不是高成本的最终设计文档。真正可靠的信息源是代码和测试,而不是长期维护的图
可逆性 把复杂性挤出系统
- 如果决策可更改,就不必一次做对
- 推迟决策到信息最充分的时刻
- 让决策可逆转
- 版本控制是代码级的可逆保险
设计
- 保持代码清晰简洁
- 通过重构改进代码
- 精通设计模式 懂应用时机和演进路径
- 预见变化
- 以代码、图标、对话传达设计
持续集成
传统集成
- bug难定位
- 上下文切换
- 回避重构
恶性循环 怕集成->回避重构->结构腐坏->集成更痛
开发者四步脚本(有三步是跑构建)
- 从主线拉最新代码
- 本地改+跑完整自动化构建
- 推送前再pull一次,再构建一次
- git push到主线
十条核心实践
-
显性(开发者日常要做)
-
维护单一主线代码库
-
自动化构建
-
让构建自测试
- 每人每天向主线提交
- 每次主线提交都触发构建
- 保持构建快速
-
-
隐含(平台层保障)
- 在类生产环境里跑测试
- 任何人都能方便取到最新可执行文件
- 自动化部署
自测试构建
- 构建=编译+完整自动化测试
构建流水线要按“快反馈在前、重验证在后”的原则组织:先用编译、单元测试、静态检查快速拦截低级错误,再用集成测试、端到端测试、性能和安全测试逐层兜底
- 提交阶段
- 编译 单元测试 静态检查
- 集成测试
- 跨模块 真实数据库 外部服务
- 端到端测试
- UI API 真实业务场景
- 性能测试
- 安全扫描
构建坏了怎么办
- 首选:Revert那次提交
- 在revert后的主线上重修
- 特殊情况才主线快修
未完成的功能
- 代码里加配置开关
- 未完成功能默认关
- 按环境或用户分组开放
- 上线后可灰度、可紧急关闭
- 大规模重构时的“不开分支的分支”
- 引入抽象层,新旧实现并存
- 通过配置切换,逐步迁移
- 完成后删旧实现和抽象层
- 新功能部署到生产但对用户不可见
- 只做内部监控和压测
- 观察性能和稳定性
- 信心足够后再开放
CI CD 持续部署
-
持续集成(CI)
-
自动化内容:构建 + 快速测试(编译、单元测试、静态检查)
-
人工环节:后续测试、部署、发布
-
目标:保证主线始终是可构建和初步验证过的状态
-
典型做法:每次提交触发构建和单元测试
-
-
持续交付(CD, Continuous Delivery)
-
自动化内容:完整流水线到类似生产环境
-
人工环节:上线生产只保留一个按钮触发
-
目标:主线随时可以发布,用户随时获得最新版本
-
特点:自动化流程更长,需要更高信心的测试
-
-
持续部署(Continuous Deployment)
-
自动化内容:流水线所有阶段直接上生产
-
人工环节:只保留紧急刹车/发布控制
-
目标:每次通过流水线的变更都能自动发布到生产
-
特点:最极致自动化,依赖强大的测试和监控保障
feature branch 上跑自动化测试,只是“分支验证”;真正的 CI 要求开发者频繁把小变更集成回主线,让主线始终保持可工作状态
PR 前置评审能保证质量,但如果所有变更都被慢速评审卡住,就会让代码长期停留在分支上,从而破坏 CI 的核心:快速、频繁地集成到主线
XP 的沉寂与胜利
XP 后来作为“品牌”逐渐沉寂,但其核心工程实践并没有消失,而是以 DevOps、CI/CD、TDD、重构、持续交付等形式进入主流软件工程。
XP 品牌沉寂的原因:
- 发源项目 C3 后来被取消,给批评者留下口实
- 12 项实践整体性很强,难以部分采用
- 结对编程存在文化阻力
- Scrum 更容易被培训和认证市场包装
- TDD、重构、CI 等实践门槛较高,短期不容易见效
Scrum 和 XP 的区别:
- Scrum 更偏项目管理和团队协作
- XP 更偏工程实践和代码质量
- Scrum 不强制规定 TDD、CI、重构
- XP 直接规定具体工程纪律
- 只做 Scrum 仪式而没有工程实践,容易变成 Dark Scrum
XP 的实践扩散:
- TDD 进入测试驱动和规格驱动开发
- 重构成为现代代码维护的基本能力
- CI/CD 成为 DevOps 工具链核心
- 简单设计、YAGNI、持续反馈成为现代敏捷开发共识
CI 的进一步理解
真正的 CI 不是“有 Jenkins/GitHub Actions”,而是频繁把代码集成回主线。
feature branch 上跑自动化测试,只能算分支验证,不一定算真正 CI。
原因:
- 分支没有及时合回主线
- 代码仍然和团队最新状态隔离
- 长期分支会积累冲突
- 自动测试通过不代表已经完成集成
判断是否是真正 CI:
- 是否每天至少合回主线
- 分支生命周期是否很短
- 主线是否始终可构建、可运行
- 构建失败后是否立即修复
前置 PR 评审和 CI 存在张力:
- PR 评审需要时间
- CI 需要快速反馈
- 如果每个 PR 都被慢速评审卡住,代码会长期停留在分支上
- 这会破坏 CI 的快速集成节奏
应对方式:
- 小步提交,降低评审成本
- 结对编程,让评审前移
- 重要变更重评审,琐碎变更轻流程
- 集成后继续评审和修正
AI 时代的 XP
AI 让代码生成变得便宜,但验证变得更重要。因此 XP 的核心实践在 AI 时代反而更有价值。
AI 时代的变化:
- 代码生成不是瓶颈
- 需求澄清、规格定义、测试验证成为瓶颈
- 工程师的价值从“写代码”转向“判断什么是正确的”
XP 实践的新形态:
- TDD → 规格驱动开发
- CI → 持续验证
- 结对编程 → 人机协作 / 人机结对
- 重构 → AI 生成代码后的结构治理
TDD 在 AI 时代的重要性:
- 测试相当于可执行规格
- 先写测试可以约束 AI 生成代码
- AI 生成的是“看起来合理”的代码,不等于正确代码
- 测试可以把自然语言需求转化成可验证目标
核心结论:
XP 的品牌可能沉寂,但它训练的是现代软件工程最关键的能力:
- 快速反馈
- 持续验证
- 小步集成
- 简单设计
- 在测试保护下安全演进