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


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

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

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

发布计划

迭代计划

测试

验收测试

单元测试

测试驱动开发

重构 设计改进
每周 40 小时 可持续的步伐

现场客户 – 整个团队

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

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

项目目标是共同的责任,开发是整个团队持续进行的对话。这是一个发明和交流的合作游戏。研究发现,面对面的沟通是发展道路上最高效、最有效的方法,消除了等待时间和延误。

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

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

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

迭代计划设置迭代的短期时间框,通常范围为 1 周到 1 个月。迭代计划的主要目标是在每次迭代结束时获得一个可工作的软件。开发人员选择迭代的功能/故事,将它们分解为任务,估计任务并提交分配的任务。考虑到每周工作 40 小时,通过平衡整个团队的负载系数来确保可持续的节奏。

验收测试

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

团队自动执行这些测试,以验证功能是否正确实现。测试运行后,团队通过执行在此之前实施的所有验收测试,确保测试在回归时保持正确运行。

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

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

单元测试

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

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

测试驱动开发

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

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

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

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

测试驱动开发往往会导致 100% 的单元测试覆盖率,并确保代码简单且最少。

重构——设计改进

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

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

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

以可以无限期持续的速度工作。考虑到以下事实,可持续步伐确保人类对项目成功的贡献 -

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

  • 发展不能止步于冲刺,而应着眼长远目标

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

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

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