XP 方法可以说是敏捷联盟中最鲜艳的一面旗帜,也是相对来说最成熟的一种。XP 方法的雏形最初形成于 1996—1999 年间,Kent Beck、Ward Cunningham、Ron Jeffery 夫妇在开发 C3 项目(Chrysler Comprehensive Compensation)的实践中总结出了 XP 的基本元素。在此之后,Kent Beck 和他的一些好朋友们一起在实践中完善提高,终于形成了极限编程方法。
XP 是一种轻量(敏捷)、高效、低风险、柔性、可预测、科学而且充满乐趣的软件开发方式。与其他方法论相比,其最大的不同在于:
(1)在更短的周期内,更早地提供具体、持续的反馈信息。
(2)迭代地进行计划编制,首先在最开始迅速生成一个总体计划,然后在整个项目开发过程中不断地发展它。
(3)依赖于自动测试程序来监控开发进度,并及早地捕获缺陷。
(4)依赖于口头交流、测试和源程序进行沟通。
(5)倡导持续的、演化式的设计。
(6)依赖于开发团队内部的紧密协作。
(7)尽可能达到程序员短期利益和项目长期利益的平衡。
XP 由价值观、原则、实践和行为四个部分组成,它们彼此相互依赖、关联,并通过行为贯穿于整个生命周期。
1.四大价值观
XP 的核心是其总结的沟通、简单、反馈、勇气四大价值观,它们是 XP 的基础,也是XP 的灵魂。
(1)沟通。通常,程序员给人留下的印象就是“内向、不善言谈”,项目中的许多问题就出在这些缺乏沟通的开发人员身上。由于某个程序员做出了一个设计决定,但是却不能够及时地通知团队中的其他成员,结果使得团队在协作与配合上出现很多麻烦。而在传统的开发方法中,并不在意这种口头沟通不畅的问题,而是希望借助于完善的流程和面面俱到的文档、报表、计划来替代,但是,这又引入了效率不高的新问题。
XP 方法认为,如果小组成员之间无法做到持续的、无间断的交流,那么协作就无从谈起。从这个角度来看,通过文档、报表等人工制品进行交流,具有很大的局限性。因此, XP 组合了诸如结对编程这样的最佳实践,鼓励大家进行口头交流、通过交流解决问题,提高效率。
(2)简单。XP 方法在工作中秉承“够用即好”的思路,也就是尽量地简单化,只要今天够用就行,不考虑明天会出现的新问题。这一点看上去十分容易,但要真正做到保持简单的工作其实是很难的,因为在传统的开发方法中,都要求开发人员对未来做一些预先规划,以便对今后可能发生的变化预留一些扩展空间。
沟通和简单之间还有一种相当微妙的互相支持关系。一方面,团队成员之间沟通得越多,就越容易明白哪些工作需要做,哪些工作不需要做;另一方面,系统越简单,需要沟通的内容也就越少,沟通也将更加全面。
(3)反馈。是什么原因使得客户、管理层这么不理解开发团队?究其症结,就是开发的过程中缺乏必要的反馈。在很多项目中,当开发团队经历过了需求分析阶段之后,在一个相当长的时间段中,是没有任何反馈信息的。整个开发过程对于客户和管理层而言就像一个黑盒子,进度完全看不到。而且,在项目开发过程中,这样的现象不仅出现在开发团队与客户、管理层之间,还包括在开发团队内部。因此,开发团队需要更加注重反馈。反馈对于任何软件项目的成功都是至关重要的,而在 XP 方法论中则更进一步,通过持续、明确的反馈来暴露软件状态的问题。
反馈与沟通有着良好的配合,及时和良好的反馈有助于沟通。而简单的系统,更有利于测试和反馈。
(4)勇气。在应用 XP 方法时,每时每刻都在应对变化:由于沟通良好,会有更多需求变更的机会;由于时刻保持系统的简单,新的变化会带来一些重新开发的需要;由于反馈及时,会有更多中间打断思路的新需求。总之,这一切使得开发团队处于变化之中,因此,这时就需要有勇气来面对快速开发,面对可能的重新开发。勇气可以来源于沟通,因为它使得高风险、高回报的试验成为可能;勇气可以来源于简单,因为面对简单的系统,更容易鼓起勇气;勇气可以来源于反馈,因为可以及时获得每一步前进的状态(自动测试),会让人更勇于重构代码。
在 XP 的四大价值观之下,隐藏着一种更深刻的东西,那就是尊重。因为这一切都建立在团队成员之间相互关心、相互理解的基础之上。
2.十二个最佳实践
在 XP 中,集成了 12 个最佳实践,有趣的是,它们没有一个是创新的概念,大多数概念和编程一样老。其主要的创新点在于提供一种良好的思路将这些最佳实践结合在一起,并且确保尽可能彻底地执行,使得它们能够在最大程度上互相支持。
(1)计划游戏。计划游戏的主要思想就是先快速地制定一份概要的计划,然后,随着项目细节的不断清晰,再逐步完善这份计划。计划游戏产生的结果是一套用户故事及后续的一两次迭代的概要计划。
(2)小型发布。XP 方法秉承的是“持续集成、小步快走”的哲学思维,也就是说每一次发布的版本应该尽可能地小,当然前提条件是每个版本有足够的商业价值,值得发布。由于小型发布可以使得集成更频繁,客户获得的中间结果越频繁,反馈也就越频繁,客户就能够实时地了解项目的进展情况,从而提出更多的意见,以便在下一次迭代中计划进去,以实现更高的客户满意度。
(3)隐喻。相对而言,隐喻比较令人费解。根据词典中的解释是:“一种语言的表达手段,它用来暗示字面意义不相似的事物之间的相似之处”。隐喻常用于四个方面:寻求共识、发明共享语汇、创新的武器、描述架构。
如果能够找到合适的隐喻是十分快乐的,但并不是每一种情况都可以找到恰当的隐喻,因此,没有必要去强求,而是顺其自然。
(4)简单设计。强调简单的价值观,引出了简单性假设原则,落到实处就是“简单设计”实践。这个实践看上去似乎很容易理解,但却又经常被误解,许多批评者就指责 XP 忽略设计是不正确的。其实,XP 的简单设计实践并不是要忽略设计,而是认为设计不应该在编码之前一次性完成,因为那样只能建立在“情况不会发生变化”或者“我们可以预见所有的变化”之类的谎言的基础上。
(5)测试先行。对于有些团队而言,有时候程序员会以“开发工作太紧张”为理由,继而忽略测试工作。这样,就导致了一个恶性循环,越是没空编写测试程序,代码的效率与质量越差,花在找缺陷、解决缺陷的时间也越来越多,实际产能大大降低。由于产能降低,因此时间更紧张,压力就更大。
(6)重构。重构是一种对代码进行改进而不影响功能实现的技术,XP 需要开发人员在“闻到代码的坏味道”时,就有重构代码的勇气。重构的目的是降低变化引发的风险、使得代码优化更加容易。
(7)结对编程。从 20 世纪 60 年代开始,就有类似的实践在进行,长年以来的研究结果给出的结论是,结对编程的效率反而比单独编程更高。一开始虽然会牺牲一些速度,但慢慢地,开发速度会逐渐加快。究其原因,主要是结对编程大大降低了沟通的成本,提高了工作的质量。结对编程技术被誉于 XP 保证工作质量、强调人文主义的一个最典型的实践,应用得当还能够使开发团队协作更加顺畅、知识交流与共享更加频繁、团队稳定性也会更加牢固。
(8)集体代码所有制。由于 XP 方法鼓励团队进行结对编程,而且认为结对编程的组合应该动态地搭配,根据任务的不同、专业技能的不同进行最优组合。因此,每一个人都会遇到不同的代码,代码的所有制就不再适合于私有,因为那样会给修改工作带来巨大的不便。所谓集体代码所有制,就是团队中的每个成员都拥有对代码进行改进的权利,每个人都拥有全部代码,也都需要对全部代码负责。同时,XP 强调代码是谁破坏的(修改后出现问题),就应该由谁来修复。
集体代码所有制是 XP 与其他敏捷方法的一个较大不同,也是从另一个侧面体现了 XP 中蕴含的很深厚的编码情节。
(9)持续集成。在前面谈到小型发布、重构、结对编程、集体代码所有制等最佳实践的时候,多次提到“持续集成”,可以说持续集成是这些最佳实践的基本支撑条件。
(10)每周工作 40 小时。这是最让开发人员开心、管理者反对的一个最佳实践了,加班、再加班早已成为开发人员的家常便饭,也是管理者最常使用的一种策略。而 XP 方法认为,加班最终会扼杀团队的积极性,最终导致项目的失败,这也充分体现了 XP 方法关注人的因素比关注过程的因素更多一些。不过,有一点是需要解释的,“每周工作 40 小时”中的“40”不是一个绝对数,它所代表的意思是团队应该保证按照“正常的时间” 进行工作。
(11)现场客户。为了保证开发出来的结果与客户的预想接近,XP 方法认为最重要的是需要将客户请到开发现场。就像计划游戏中提到过的,在 XP 项目中,应该时刻保证客户负责业务决策,开发团队负责技术决策。因此,在项目中有客户在现场明确用户故事,并做出相应的业务决策,对于 XP 项目而言有着十分重要的意义。
(12)编码标准。拥有编码标准可以避免团队在一些与开发进度无关的细枝末节问题上发生争论,而且会给重构、结对编程带来很大的麻烦。不过,XP 方法的编码标准的目的不是创建一个事无巨细的规则列表,而是要能够提供一个确保代码清晰,便于交流的指导方针。
有句经典名言“1+1>2”最适合表达 XP 的观点,Kent Beck 认为,XP 方法的最大价值在于,在项目中融会贯通地运用这 12 个最佳实践,而非单独使用。当然,可以使用其中的一些实践,但这并不意味着就应用了 XP 方法。XP 方法真正能够发挥其效能,就必须完整地运用 12 个实践。
文章出处登录后可见!