极限编程 - 不断发展的实践

极限编程自诞生以来就一直在不断发展,极限编程实践也被发现在其他敏捷方法中是有效的。

下表显示了极限编程实践是如何发展的。

极限编程实践 演变
现场客户 整个团队
规划游戏

发布规划

迭代规划

测试

验收测试

单元测试

测试驱动开发

重构 设计改进
每周 40 小时 可持续节奏

现场客户 - 整个团队

极限编程依赖于项目社区,强调以团队为中心的方法。极限编程项目的所有贡献者,包括客户,都是一个团队。

客户提供需求,设定优先级并指导项目。这使客户能够了解开发的实际细节,并相应地设定优先级和期望。这从"按客户要求开发"变为"按客户理解并配合开发"。

项目目标是共同的责任,开发是整个团队的持续对话。这是一场发明和沟通的合作游戏。我们发现,面对面的沟通是开发过程中最有效、最有效的方法,可以消除等待时间和延迟。

规划游戏 - 发布和迭代规划

增量项目规划被发现是有效的,因为它可以促进准确的计划。随着基于实际性能的开发进展,可以了解更多更好的信息。首先制定一个粗略的计划,然后逐步完善它。

发布计划设定长期目标,并掌握总体情况。客户提出所需的功能,开发人员进行估算,双方同意并承诺发布日期。由于发布计划在每次发布后都会进行修订,因此随着项目的进展,它会变得更加精确。

迭代计划设置短期迭代时间框,通常为 1 周到 1 个月。迭代计划的主要目标是在每次迭代结束时提供可用的软件。开发人员选择迭代的功能/故事,将其分解为任务,估算任务并致力于分配的任务。通过平衡团队的负载系数来确保可持续的速度,考虑到每周 40 小时的工作时间。

验收测试

客户为某个功能编写一个或多个自动验收测试,以确保系统正确实现所需的功能。验收测试与故事一起编写,并在实施之前提供。

团队自动执行这些测试以验证功能是否正确实施。测试运行后,团队通过执行迄今为止实施的所有验收测试,确保测试在回归时继续正确运行。

验收测试提供功能需求的明确规范。此外,验收测试通过的百分比衡量了发布的完成情况,没有最后一刻的意外。

系统始终在改进,永不倒退。

单元测试

开发人员编写具有足够覆盖范围的单元测试,结合代码模块和方法的意图和使用。单元测试是自动化的,具有明确的通过/失败。大多数语言都有一个 xUnit 框架(例如,nUnit、jUnit)。

所有单元测试都执行得非常频繁,并且只有在所有单元测试都通过后才能签入代码。单元测试结果也有助于重构。

测试驱动开发

测试驱动开发被认为是最具创新性的极限编程实践。

在测试驱动开发中,开发人员在编写代码之前编写单元测试。目的是使单元测试失败。由于代码尚未实现,因此单元测试失败。开发人员编写的代码足以通过单元测试,然后开发人员进行重构以确保代码简单干净(没有重复和复杂性)。

开发人员不断迭代,直到编码完成并且验收测试通过。

单元测试全部收集在一起,每次一对开发人员集成并将代码发布到存储库时,该对开发人员都需要确保每个测试都能正确运行。如果任何测试失败,该对开发人员就知道需要纠正的是他们的代码,因为之前的集成没有任何缺陷。

测试驱动开发往往会产生 100% 的单元测试覆盖率,并确保代码简单且精简。

重构 - 设计改进

重构允许设计逐步发展,保持简单,消除您注意到的重复和复杂性。它通过重构改进了现有代码的设计,而无需改变其功能。

重构应该通过学习新的实现来驱动。建议在编写新代码后立即进行重构。重构将代码推向更高级别的设计模式,并得到测试的支持。

每周 40 小时 - 可持续的节奏

以可以无限期维持的速度工作。可持续的节奏确保人类对项目成功的贡献,考虑到−

  • 疲劳和压力会降低生产力和产品质量。这可能会 导致员工流失。

  • 开发不会因短跑而停止,而应该瞄准长期目标

  • 除非团队就期望达成一致,否则不会有承诺和责任。

  • 确切的工作时间并不像执行能力那么重要。

  • 应避免微观管理,同时确保在需要时可用