3.3 极限编程
极限编程(XP)是一种核心敏捷方法,它主要关注面向构造的实践。尽管极限编程实践方法的含义表面上看起来很显而易见,但其中大多数除了需要专业技术能力外,还要求从业者有严谨的纪律意识。下面将介绍DAD过程框架中所采用的极限编程实践方法。
编码规范(开发指南)。团队成员应该遵循现有的编码指南和规范,这包括推荐的编码模式和机制,以确保一致性,减少缺陷,并增强可读性和简化维护。DAD明确将这些扩展到所有类型的开发指南,包括数据开发指南、用户界面规范、系统架构指南及安全指南等。
集体负责制。每一个团队成员都可以查看和编辑另一个团队成员的代码或任何其他项目构件,这可以增强工作透明度和工作质量的可靠性。对代码的共同理解和所有权的共享可以降低个别组员离开团队带来的风险。所有团队人员都能更好地维护或改进系统里每一块代码,这意味着,任何团队成员都有能力实现每一个新功能特性或修复每一个代码缺陷,因而可以加快产品开发进度。值得注意的是,结对编程则便于实现开发人员之间的代码和逻辑共享。
持续集成。团队成员应该频繁地将修改后的代码集成到系统中,以确保所做的更改能够正常运行,这样团队的其他成员可以一直基于最新版本的代码工作。代码集成工作应该重点通过自动化回归测试或者甚至动态和静态代码来验证系统是否能够正常运作。
客户测试(验收测试驱动开发)。严格执行即时(JIT)方式,通过验收测试(也称为用户故事测试)来验证是否满足详细的用户需求。具体内容请参照本节后面关于测试驱动开发的介绍。
重构。重构是指通过对系统某个构件的一个很小的更改,以改进系统构架设计,从而让它更容易理解和修改。因此,代码重构是对代码的简洁更改,数据库重构是对数据库模式的简单修改,用户界面(UI)重构则是对UI的简单改变,等等。重构通过采用迭代和增量开发模式,使得工作随着时间的推移一点点地进步。
结对编程(非独立工作)。结对编程实践是指两名开发人员一起同时为一个系统模块工作。在一名开发人员编写代码的同时,另外一名开发人员则把握大方向并进行实时的代码审查。结对编程是非独立工作的一个典型例子,如同敏捷建模实践中需要两人或更多人一起工作来共同完成一项任务。非独立工作为大家提供了互相学习的机会,可以提高产品质量,因为缺陷注入后,常常被大家相互发现,同时,由于工作制品的扩散,使得更多人有机会加深对工作制品的理解(当经常更换结对编程搭档时,更是如此)。
规划游戏(发布计划和迭代计划)。规划游戏的目的是指导产品能够成功地交付。这包括贯穿整个生命周期的高层面发布计划、全程监控“大问题”以及详细的即时(JIT)迭代计划。
简单设计。开发人员应该在保证实现所需功能的前提下,寻求编写代码的最简单的方式。这可以提高生产力。值得注意的是,定期的重构可以确保简单和高质量的设计。
小版本发布。我们鼓励经常将工作环境部署到生产环境中。我们应该以增量的方式来交付软件功能,给客户带来最大的商业价值。频繁的产品部署可以帮助团队建立自信并得到客户的信任。DAD目光则更长远,不仅关注交付可工作的软件,还关注交付可工作的解决方案。
可持续的速度。尽管偶尔加下班是必不可少的,但这绝对不是一种长期可持续发展的方法。它会明显降低团队士气、生产力以及产品质量。团队应该能够保持一种充满活力的工作方式,维持稳定的、逐渐进步的速度。
测试驱动开发。测试驱动开发的基本过程如下:第一步,快速编写一个测试,只需足够的代码,使该测试失败即可。它可能是高层面的验收测试或者更详细的开发人员测试(大家经常误认为是单元测试)。第二步,运行测试,以确保新的测试确实会失败。通常是运行完整的测试套件,但是考虑到速度原因,可以只运行完整测试套件的一个子集。第三步,对相应的功能代码做一些小小的改动,使它能通过新的测试。第四步,再次运行测试。如果测试失败,回到第三步。第五步,重构代码,以消除重复设计,优化设计结构,并循环完成所有功能的开发。TDD的基本思想就是先编写测试,然后编写代码以实现测试。测试不仅验证和确认了代码是否按预期工作,而且以即时(JIT)的方式细化了需求。
完整团队。团队成员整体上已经具备交付解决方案的所有技能,但是在第5章中,我们会看到有时候敏捷团队需要在短时期内借助队外专家来解决某些特定和特殊的问题。另外,利益相关者或他们的代表,如产品负责人或业务分析人员应该能够保证及时地回复相关问题,并做出相应的决策。