<audio id="audio" title="02 | 老生常谈：你真的知道敏捷到底是什么吗？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d5/23/d56c9ecbd7ef118f2c33cb4ab6b86d23.mp3"></audio>

你好，我是宋宁。今天这节课，我要给你讲一讲到底什么是敏捷。

当我们谈到敏捷时，大家往往是仁者见仁，智者见智，有各种不同的理解。然而这里面，有不少是对它的误解，在我平时做咨询的过程中，经常会听到一些团队成员这样说它：

- 敏捷来了，太好了，我们只要负责开发软件就够了，再也不用做文档，也不用做设计了；
- 敏捷就是快，原来要6个月才能完成的项目，用了敏捷后，周期就可以缩短到3个月了；
- 敏捷就是加班，用了敏捷后，由于在迭代结束时一定要完成当初的目标，所以我们加班比原来更严重了；
- Scrum就是敏捷，敏捷就是Scrum，这俩是同义词；
- 敏捷是自由的、无约束的，不需要那么多条条框框，随自己的心情来做就好了。

上面这些说法，我相信你多少也都听说过一些，但它们其实都是对敏捷的误解。如果你带着这些误解去做敏捷，那很可能会做得一塌糊涂。所以作为一个过来人，我想我在给你讲怎么做敏捷之前，有必要先给你捋一捋到底什么是真正的敏捷，以便你能正确地理解它。

在我看来，**大家之所以对敏捷有那么多的误解，归根结底，是忘记了做敏捷的初心，忘记了它的价值观和基本原则，而只是把注意力集中在怎么做上。**

所以你要想真正理解敏捷，就要从它的价值观、原则以及具体的方法和实践上，对它有一个全方位的认识，只从任何单一的方面去了解它，都像是盲人摸象，是片面的。

## 敏捷的价值观：正确理解敏捷的初心

我们先来看一下敏捷的价值观。2001年，17个轻量级方法论的大师在美国的犹他州，发布了敏捷宣言，阐释了它的5条价值观：

1. 个体和交互**胜过**过程和工具。
1. 可以工作的软件**胜过**面面俱到的文档。
1. 客户合作**胜过**合同谈判。
1. 响应变化**胜过**遵循计划。
1. 虽然右项有价值，但我们更重视左项。

请注意这5条价值观中的最后一条：“**虽然右项有价值，但我们更重视左项。**”这一条其实是对前4条的解释说明，然而很多人在传递这些价值观时，其实只讲了前面4句，而忽略了最后这一句，很大程度上，这导致了大家对敏捷的误解。

那么结合这一条来看，前4条中“胜过”这两个字就可以解释为，**与每一条中右面的内容相比，左面的内容是敏捷更加重视的，但要注意，这并不是说让你停止做右面的内容。**

以“敏捷来了，我们再也不用做文档了”这个误解为例，结合敏捷的价值观，我们来看看对它的误解到底体现在哪里。

价值观的第2点是这么说的：“可以工作的软件比面面俱到的文档更加重要”，但这并不是说我们就完全不要文档了。对这句话的正确理解应该是：**敏捷重视可工作的、有价值的软件，减少一切不必要的文档。注意，是不必要的文档，而不是所有文档。**

那么对于一个项目来说，什么样的文档是没有必要的文档呢？

比如说一些交接类的文档。开发人员在开发完成后要提交给测试部门测试，需要写一个提测单，再一级一级批复，我认为这样的文档就是可以省略的。因为在敏捷里，开发人员和测试人员是在一起工作的，所以提测的工作不需要走如此麻烦的申请和审批；开发人员需要提测时，直接在软件上点击一下“提交”，再告诉测试人员一下就足够了。

那么，什么又是有必要的文档呢？

比如说一些写着重要设计方案的文件。如果系统在后期遇到了问题，你就要回头查看这类文件，找出问题所在；或者是系统后期开发完成后，需要转交给其他同事维护时，他们若想知道这个系统当初是怎么做的，也需要去查看当时的系统设计文档，所以这类设计方案是需要保留下来的。你可以根据自己的项目情况，考虑哪些是重要的文档，哪些是不重要的。

所以说，**敏捷的价值观并未否定或贬损“右项”的价值**，“流程和工具”“ 详尽的文档”“ 合同谈判”以及“遵循计划”这些右面的内容也很重要，在敏捷里并不是完全不做。比如在敏捷实践中也是有计划的，只不过它计划的方式与传统瀑布模式的计划方式不一样罢了。

敏捷的价值观体现了敏捷的初心，只有正确理解它，你才能更深层次地理解敏捷。它的初心是通过一系列方法来让我们的研发工作更加灵活、有序和高效，所以它的价值观重视人的能动性，强调人与人之间的协作，也更重视对变化的应对，这些都是为了能够更好、更灵活地组织和管理研发工作。

但如果“流程和工具”“详尽的文档”“合同谈判”以及“遵循计划”，同样能让研发工作更有序和更高效，那敏捷是不反对的，也不会放弃不做，这才是敏捷的真谛。

## 敏捷的原则：正确理解敏捷的基石

上面我带你重新理解了敏捷的价值观，但对于它来说，只有价值观还不够具体，为了能更具体地指导工作，由它的价值观又引出了12条原则：

1. 我们最优先要做的是，通过尽早地、持续地交付有价值的软件使客户满意。
1. 即使到了开发的后期，也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
1. 经常性地交付可以工作的软件，交付的间隔可以从几个星期到几个月，交付的时间间隔越短越好。
1. 在整个项目开发期间，业务人员和开发人员必须天天都在一起工作。
1. 围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持，并且信任他们能够完成工作。
1. 在团队内部，最具有效果并且富有效率地传递信息方法，就是面对面地交谈。
1. 工作的软件是首要的进度度量标准。
1. 敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
1. 不断地关注优秀的技能和好的设计会增强敏捷能力。
1. 简单——使未完成的工作最大化的艺术——是根本的。
1. 最好的构架、需求和设计出自于自组织的团队。
1. 每隔一定时间，团队会针对如何才能更有效地工作进行反省，然后相应地对自己的行为进行调整。

这12条原则是正确理解敏捷的基石，所以在这里，我会结合开篇那几条对敏捷的误解，对这其中的几条原则做个详细的解读。

有一个误解是“敏捷就是快”，你要注意，在敏捷的原则里，可从来没有说过这句话。所以你需要正确理解“快”这个词。

如果你将“快”理解为用了敏捷以后，你的代码编写速度就立马加快了，那是非常不现实的。虽然在敏捷中，我们也会用到一些方法来训练整个团队的代码编写能力，但这并不意味着，程序员敲代码的速度就得到了显著提升。况且，即使敲代码的速度加快了，项目整体上线的速度就也一定能加快吗？

那么敏捷在交付上会带来什么变化呢？你可以先看一下原则中的第1条和第3条，总体的意思是：敏捷希望能尽快把可用的软件持续性地交付给客户，交付的时间越短越好，而不是最后才一次性地交给客户。

所以说，**敏捷中的“快”其实指的是反馈更快，反馈更及时。**这样，我们就能更快、更准地得到客户的真实反馈，也能尽早修正。在这个过程中，客户也可能会更早一点想清楚自己要什么样的产品，你也可能更早达成客户的目标（这里你也要注意，是有“可能”，而不是“一定”）。甚至，由于客户比预计的时间早些看到了产品，他觉得很满意，结果可能比大家预想的上线时间都要早。

但这绝不是通过快速写代码来完成的，而是通过不断检视客户的需求，总是优先做最有价值的事和减少浪费来完成的。在瀑布模式下的项目管理过程中，我们把原计划的事情全都做完后，项目也就结束了；而在敏捷的原则下，只有完成客户的目标，项目才可以结束。这是因为，敏捷是以业务价值和业务目标为导向的，在这个导向下，短迭代使客户更清楚自己的需求了，不必要做的事情减少了，所以时间才减少了，交付也就更快了。

我们再来看看“**敏捷就是加班**”这个误解。你可以回到前面的原则里，重新看第8条，你可以清晰地看到，**敏捷强调“可持续的开发速度”**。

这指的是团队要能一直以稳定的开发速度持续下去，而不是为了加速开发，本次或几次迭代一直加班，透支团队成员的健康，这么做反而会因为员工身体不支，导致接下来的迭代开发产能下降。你要想一想，如果天天加班，员工能否能一直保持高昂的斗志和较高的工作效率？你能保证一直可以用这样的开发速度开发下去？我想这是不行的。

那怎么才能保持“可持续的开发速度”呢？我看到能做到这一点的开发团队，通常都是这样做的：

1. 他们在迭代开始的时候，不会过度承诺，也就是能完成多少工作，就承诺多少工作。
1. 严格遵守纪律。他们在迭代开始以后，原则上不会再增加需求，如果一定要往他们的迭代待办事项列表里增加其它需求，就要同时从中拿走等量的需求。

这么做有什么好处呢？我认为这可以使开发团队聚焦在自己的事情上，不受干扰，效率更高，这样就能形成稳定的开发节奏；而稳定的开发节奏可以加强我们的预见性，这样我们预计的上线时间才可能是精准的。

所以，如果你的团队用了敏捷以后加班更严重了，那么我建议你参照上面的做法来自我检视一下，看看你的团队是否在一个迭代中承诺了太多事情，也就是工作范围是否太大了，如果是的话，那你可以结合团队的实际产能，根据需求条目的优先级来进行调整；此外，还要看你的团队是否遵守了纪律，如果不遵守纪律，那额外的加班肯定是不可避免的。

现在，我们再回过头看看敏捷原则里的内容，你会发现它和敏捷宣言一样，重视研发各方的协作，并强调了持续改进、响应变化。只不过在这12条原则里，对敏捷重视的价值做了更细致的阐述，也涵盖了软件项目管理的所有基本流程，而且这些流程又很具体，让大家有了更可以参考的标准，将价值观落实到具体的、可操作的原则之上。

因此正确理解这些原则，并以此为基准去做事，才能在后面具体的敏捷实践中不偏离，最终取得项目的成功。

## 敏捷的方法：正确落地敏捷的基础

但很显然，只有价值观和原则，敏捷是不能落地的，你还需要一系列的方法来推进它。

在当初提出敏捷这个概念的时候，建立敏捷联盟的17位大师就创立了一些敏捷方法，这包括极限编程、Scrum、特征驱动开发、动态系统开发方法、自适应软件开发，以及水晶方法等等，这些方法被统称为敏捷方法。到现在也出现了很多关于规模化敏捷的方法，比如说SaFe和Less；也有很多技术实践，比如说测试驱动开发等等。**可以这么说，凡是符合敏捷价值观和原则的方法论，都可以归到敏捷的大伞下。**

怎么样，这么一看，敏捷是不是包罗万象？但方法虽然很多，你一定要结合自己的需求来选择。所以在这里我想和你强调的是，**这些方法从共性上来说都遵循了敏捷的价值观和原则，不同的是它们针对了不同的应用场景**，比如说Scrum在新软件开发中更好用，而看板在维护类的软件开发中更胜一筹。

所以 “Scrum就是敏捷，敏捷就是Scrum”这个说法，是相当片面的，是对敏捷的误解。敏捷还有很多我刚刚提到的方法，如果只认识这俩，那你在做敏捷时，无疑就受到了限制。

说到落地敏捷的方法，我们还可以看看“敏捷是自由的，无约束的”这个误解，我想以Scrum为例，来谈一下为什么这个说法是不对的。

Scrum框架看起来很简单，很多人以为它不过就是“三三五五”：3个角色（产品负责人、团队、Scrum Master），3个工件（产品待办事项列表、迭代待办事项列表、产品增量），5个会议（迭代计划会议、每日站会、迭代回顾会议、迭代评审会议、产品Backlog梳理会议），5个价值（承诺 、专注、开放、尊重、勇气），以为只要把上面这些事都照搬过来做完，就万事大吉了。但其实Scrum也是有约束条件的，如果你不按照这些约束条件去使用它，是用不好这个方法的。

关于Scrum的约束条件，这里我举最重要的两条来说明：

1. 在迭代计划会议开始前，产品负责人需要准备好需求条目，使需求达到准入标准；
1. Scrum讲究时间盒，包括迭代的周期、各个会议，这些都要遵守时间盒的约定。

如果不遵守第1条约定，你会发现你的团队即使用了Scrum，研发节奏仍然会被打乱；如果不遵守第2条约定，你会发现你的团队会被耗在各个会议上，会议效率又很低，团队成员很快就会感到厌烦。所以说，Scrum是有纪律的，如果不遵守它的纪律，自由自在无约束，那么使用它注定是痛苦的，也达不成既有目的。

从上面Scrum的例子我们可以看出，了解敏捷的方法，不能只了解它的表面，要深度理解它背后的规则和深意，只有这样才能正确地应用它，让它为我们的研发管理服务。

针对敏捷的每一种方法，我建议你在使用前，都要问自己3个问题：

1. 这个方法能解决什么样的问题？
1. 有没有使用前提？
1. 有没有相应的使用规则？

此外，你还可以看看别人是怎么用这些方法的，看他们在使用过程中有没有遇到什么坑，如果有又是怎么避免的。我希望通过这样的自我提问和借鉴，你在日后能正确使用敏捷的方法。

## 总结

说到现在，你是不是已经明白了到底什么是敏捷呢？我希望你在学完今天的课程后，能深入理解什么是真正的敏捷，并能分辨出对敏捷的误解。综合上面内容，我来总结一下，希望能给你带来帮助。

一句话，**敏捷=价值观+原则+一系列符合价值观和原则的方法。单纯说敏捷是一种方法，肯定是片面的；但只强调它的价值观和原则，而不重视方法也是不对的，因为那样敏捷就飘在空中，不能落地了**。

因此对于敏捷，你需要从敏捷的价值观、原则和具体方法上对它有全方位的认识，更重要的是，你也不能只关注具体的方法，还要时时刻刻记住做敏捷的初心，不能偏离了它的价值观和原则。

## 思考题

结合上面的内容，我想请你来思考一下，你还知道有哪些对敏捷的误解吗？你可以对照着它的价值观和原则检视一下，在留言区写出来。

我是宋宁，欢迎你在留言区与我分享你的疑问和思考。如果你觉得这篇文章对你有启发，也欢迎你把它分享给你的朋友，我们一起来探讨和学习。
