You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
16 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 02 | 老生常谈:你真的知道敏捷到底是什么吗?
你好,我是宋宁。今天这节课,我要给你讲一讲到底什么是敏捷。
当我们谈到敏捷时,大家往往是仁者见仁,智者见智,有各种不同的理解。然而这里面,有不少是对它的误解,在我平时做咨询的过程中,经常会听到一些团队成员这样说它:
* 敏捷来了,太好了,我们只要负责开发软件就够了,再也不用做文档,也不用做设计了;
* 敏捷就是快原来要6个月才能完成的项目用了敏捷后周期就可以缩短到3个月了
* 敏捷就是加班,用了敏捷后,由于在迭代结束时一定要完成当初的目标,所以我们加班比原来更严重了;
* Scrum就是敏捷敏捷就是Scrum这俩是同义词
* 敏捷是自由的、无约束的,不需要那么多条条框框,随自己的心情来做就好了。
上面这些说法,我相信你多少也都听说过一些,但它们其实都是对敏捷的误解。如果你带着这些误解去做敏捷,那很可能会做得一塌糊涂。所以作为一个过来人,我想我在给你讲怎么做敏捷之前,有必要先给你捋一捋到底什么是真正的敏捷,以便你能正确地理解它。
在我看来,**大家之所以对敏捷有那么多的误解,归根结底,是忘记了做敏捷的初心,忘记了它的价值观和基本原则,而只是把注意力集中在怎么做上。**
所以你要想真正理解敏捷,就要从它的价值观、原则以及具体的方法和实践上,对它有一个全方位的认识,只从任何单一的方面去了解它,都像是盲人摸象,是片面的。
## 敏捷的价值观:正确理解敏捷的初心
我们先来看一下敏捷的价值观。2001年17个轻量级方法论的大师在美国的犹他州发布了敏捷宣言阐释了它的5条价值观
1. 个体和交互**胜过**过程和工具。
2. 可以工作的软件**胜过**面面俱到的文档。
3. 客户合作**胜过**合同谈判。
4. 响应变化**胜过**遵循计划。
5. 虽然右项有价值,但我们更重视左项。
请注意这5条价值观中的最后一条“**虽然右项有价值,但我们更重视左项。**”这一条其实是对前4条的解释说明然而很多人在传递这些价值观时其实只讲了前面4句而忽略了最后这一句很大程度上这导致了大家对敏捷的误解。
那么结合这一条来看前4条中“胜过”这两个字就可以解释为**与每一条中右面的内容相比,左面的内容是敏捷更加重视的,但要注意,这并不是说让你停止做右面的内容。**
以“敏捷来了,我们再也不用做文档了”这个误解为例,结合敏捷的价值观,我们来看看对它的误解到底体现在哪里。
价值观的第2点是这么说的“可以工作的软件比面面俱到的文档更加重要”但这并不是说我们就完全不要文档了。对这句话的正确理解应该是**敏捷重视可工作的、有价值的软件,减少一切不必要的文档。注意,是不必要的文档,而不是所有文档。**
那么对于一个项目来说,什么样的文档是没有必要的文档呢?
比如说一些交接类的文档。开发人员在开发完成后要提交给测试部门测试,需要写一个提测单,再一级一级批复,我认为这样的文档就是可以省略的。因为在敏捷里,开发人员和测试人员是在一起工作的,所以提测的工作不需要走如此麻烦的申请和审批;开发人员需要提测时,直接在软件上点击一下“提交”,再告诉测试人员一下就足够了。
那么,什么又是有必要的文档呢?
比如说一些写着重要设计方案的文件。如果系统在后期遇到了问题,你就要回头查看这类文件,找出问题所在;或者是系统后期开发完成后,需要转交给其他同事维护时,他们若想知道这个系统当初是怎么做的,也需要去查看当时的系统设计文档,所以这类设计方案是需要保留下来的。你可以根据自己的项目情况,考虑哪些是重要的文档,哪些是不重要的。
所以说,**敏捷的价值观并未否定或贬损“右项”的价值**,“流程和工具”“ 详尽的文档”“ 合同谈判”以及“遵循计划”这些右面的内容也很重要,在敏捷里并不是完全不做。比如在敏捷实践中也是有计划的,只不过它计划的方式与传统瀑布模式的计划方式不一样罢了。
敏捷的价值观体现了敏捷的初心,只有正确理解它,你才能更深层次地理解敏捷。它的初心是通过一系列方法来让我们的研发工作更加灵活、有序和高效,所以它的价值观重视人的能动性,强调人与人之间的协作,也更重视对变化的应对,这些都是为了能够更好、更灵活地组织和管理研发工作。
但如果“流程和工具”“详尽的文档”“合同谈判”以及“遵循计划”,同样能让研发工作更有序和更高效,那敏捷是不反对的,也不会放弃不做,这才是敏捷的真谛。
## 敏捷的原则:正确理解敏捷的基石
上面我带你重新理解了敏捷的价值观但对于它来说只有价值观还不够具体为了能更具体地指导工作由它的价值观又引出了12条原则
1. 我们最优先要做的是,通过尽早地、持续地交付有价值的软件使客户满意。
2. 即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
3. 经常性地交付可以工作的软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。
4. 在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。
5. 围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持,并且信任他们能够完成工作。
6. 在团队内部,最具有效果并且富有效率地传递信息方法,就是面对面地交谈。
7. 工作的软件是首要的进度度量标准。
8. 敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
9. 不断地关注优秀的技能和好的设计会增强敏捷能力。
10. 简单——使未完成的工作最大化的艺术——是根本的。
11. 最好的构架、需求和设计出自于自组织的团队。
12. 每隔一定时间,团队会针对如何才能更有效地工作进行反省,然后相应地对自己的行为进行调整。
这12条原则是正确理解敏捷的基石所以在这里我会结合开篇那几条对敏捷的误解对这其中的几条原则做个详细的解读。
有一个误解是“敏捷就是快”,你要注意,在敏捷的原则里,可从来没有说过这句话。所以你需要正确理解“快”这个词。
如果你将“快”理解为用了敏捷以后,你的代码编写速度就立马加快了,那是非常不现实的。虽然在敏捷中,我们也会用到一些方法来训练整个团队的代码编写能力,但这并不意味着,程序员敲代码的速度就得到了显著提升。况且,即使敲代码的速度加快了,项目整体上线的速度就也一定能加快吗?
那么敏捷在交付上会带来什么变化呢你可以先看一下原则中的第1条和第3条总体的意思是敏捷希望能尽快把可用的软件持续性地交付给客户交付的时间越短越好而不是最后才一次性地交给客户。
所以说,**敏捷中的“快”其实指的是反馈更快,反馈更及时。**这样,我们就能更快、更准地得到客户的真实反馈,也能尽早修正。在这个过程中,客户也可能会更早一点想清楚自己要什么样的产品,你也可能更早达成客户的目标(这里你也要注意,是有“可能”,而不是“一定”)。甚至,由于客户比预计的时间早些看到了产品,他觉得很满意,结果可能比大家预想的上线时间都要早。
但这绝不是通过快速写代码来完成的,而是通过不断检视客户的需求,总是优先做最有价值的事和减少浪费来完成的。在瀑布模式下的项目管理过程中,我们把原计划的事情全都做完后,项目也就结束了;而在敏捷的原则下,只有完成客户的目标,项目才可以结束。这是因为,敏捷是以业务价值和业务目标为导向的,在这个导向下,短迭代使客户更清楚自己的需求了,不必要做的事情减少了,所以时间才减少了,交付也就更快了。
我们再来看看“**敏捷就是加班**”这个误解。你可以回到前面的原则里重新看第8条你可以清晰地看到**敏捷强调“可持续的开发速度”**。
这指的是团队要能一直以稳定的开发速度持续下去,而不是为了加速开发,本次或几次迭代一直加班,透支团队成员的健康,这么做反而会因为员工身体不支,导致接下来的迭代开发产能下降。你要想一想,如果天天加班,员工能否能一直保持高昂的斗志和较高的工作效率?你能保证一直可以用这样的开发速度开发下去?我想这是不行的。
那怎么才能保持“可持续的开发速度”呢?我看到能做到这一点的开发团队,通常都是这样做的:
1. 他们在迭代开始的时候,不会过度承诺,也就是能完成多少工作,就承诺多少工作。
2. 严格遵守纪律。他们在迭代开始以后,原则上不会再增加需求,如果一定要往他们的迭代待办事项列表里增加其它需求,就要同时从中拿走等量的需求。
这么做有什么好处呢?我认为这可以使开发团队聚焦在自己的事情上,不受干扰,效率更高,这样就能形成稳定的开发节奏;而稳定的开发节奏可以加强我们的预见性,这样我们预计的上线时间才可能是精准的。
所以,如果你的团队用了敏捷以后加班更严重了,那么我建议你参照上面的做法来自我检视一下,看看你的团队是否在一个迭代中承诺了太多事情,也就是工作范围是否太大了,如果是的话,那你可以结合团队的实际产能,根据需求条目的优先级来进行调整;此外,还要看你的团队是否遵守了纪律,如果不遵守纪律,那额外的加班肯定是不可避免的。
现在我们再回过头看看敏捷原则里的内容你会发现它和敏捷宣言一样重视研发各方的协作并强调了持续改进、响应变化。只不过在这12条原则里对敏捷重视的价值做了更细致的阐述也涵盖了软件项目管理的所有基本流程而且这些流程又很具体让大家有了更可以参考的标准将价值观落实到具体的、可操作的原则之上。
因此正确理解这些原则,并以此为基准去做事,才能在后面具体的敏捷实践中不偏离,最终取得项目的成功。
## 敏捷的方法:正确落地敏捷的基础
但很显然,只有价值观和原则,敏捷是不能落地的,你还需要一系列的方法来推进它。
在当初提出敏捷这个概念的时候建立敏捷联盟的17位大师就创立了一些敏捷方法这包括极限编程、Scrum、特征驱动开发、动态系统开发方法、自适应软件开发以及水晶方法等等这些方法被统称为敏捷方法。到现在也出现了很多关于规模化敏捷的方法比如说SaFe和Less也有很多技术实践比如说测试驱动开发等等。**可以这么说,凡是符合敏捷价值观和原则的方法论,都可以归到敏捷的大伞下。**
怎么样,这么一看,敏捷是不是包罗万象?但方法虽然很多,你一定要结合自己的需求来选择。所以在这里我想和你强调的是,**这些方法从共性上来说都遵循了敏捷的价值观和原则,不同的是它们针对了不同的应用场景**比如说Scrum在新软件开发中更好用而看板在维护类的软件开发中更胜一筹。
所以 “Scrum就是敏捷敏捷就是Scrum”这个说法是相当片面的是对敏捷的误解。敏捷还有很多我刚刚提到的方法如果只认识这俩那你在做敏捷时无疑就受到了限制。
说到落地敏捷的方法我们还可以看看“敏捷是自由的无约束的”这个误解我想以Scrum为例来谈一下为什么这个说法是不对的。
Scrum框架看起来很简单很多人以为它不过就是“三三五五”3个角色产品负责人、团队、Scrum Master3个工件产品待办事项列表、迭代待办事项列表、产品增量5个会议迭代计划会议、每日站会、迭代回顾会议、迭代评审会议、产品Backlog梳理会议5个价值承诺 、专注、开放、尊重、勇气以为只要把上面这些事都照搬过来做完就万事大吉了。但其实Scrum也是有约束条件的如果你不按照这些约束条件去使用它是用不好这个方法的。
关于Scrum的约束条件这里我举最重要的两条来说明
1. 在迭代计划会议开始前,产品负责人需要准备好需求条目,使需求达到准入标准;
2. Scrum讲究时间盒包括迭代的周期、各个会议这些都要遵守时间盒的约定。
如果不遵守第1条约定你会发现你的团队即使用了Scrum研发节奏仍然会被打乱如果不遵守第2条约定你会发现你的团队会被耗在各个会议上会议效率又很低团队成员很快就会感到厌烦。所以说Scrum是有纪律的如果不遵守它的纪律自由自在无约束那么使用它注定是痛苦的也达不成既有目的。
从上面Scrum的例子我们可以看出了解敏捷的方法不能只了解它的表面要深度理解它背后的规则和深意只有这样才能正确地应用它让它为我们的研发管理服务。
针对敏捷的每一种方法我建议你在使用前都要问自己3个问题
1. 这个方法能解决什么样的问题?
2. 有没有使用前提?
3. 有没有相应的使用规则?
此外,你还可以看看别人是怎么用这些方法的,看他们在使用过程中有没有遇到什么坑,如果有又是怎么避免的。我希望通过这样的自我提问和借鉴,你在日后能正确使用敏捷的方法。
## 总结
说到现在,你是不是已经明白了到底什么是敏捷呢?我希望你在学完今天的课程后,能深入理解什么是真正的敏捷,并能分辨出对敏捷的误解。综合上面内容,我来总结一下,希望能给你带来帮助。
一句话,**敏捷=价值观+原则+一系列符合价值观和原则的方法。单纯说敏捷是一种方法,肯定是片面的;但只强调它的价值观和原则,而不重视方法也是不对的,因为那样敏捷就飘在空中,不能落地了**。
因此对于敏捷,你需要从敏捷的价值观、原则和具体方法上对它有全方位的认识,更重要的是,你也不能只关注具体的方法,还要时时刻刻记住做敏捷的初心,不能偏离了它的价值观和原则。
## 思考题
结合上面的内容,我想请你来思考一下,你还知道有哪些对敏捷的误解吗?你可以对照着它的价值观和原则检视一下,在留言区写出来。
我是宋宁,欢迎你在留言区与我分享你的疑问和思考。如果你觉得这篇文章对你有启发,也欢迎你把它分享给你的朋友,我们一起来探讨和学习。