6.2 敏捷开发
在Web开发领域你大概听到过“敏捷开发”,或者接触过一些敏捷的方法和工具,比如站立会议、结对编程(Pair Programming)、持续集成,等等,你甚至可能正某个使用XP或Scrum开发方式的团队里工作(XP和Scrum都是敏捷的一种流派)。那么敏捷究竟是什么?为什么要敏捷以及如何做到敏捷呢?
什么是敏捷开发?为什么要敏捷?
敏捷开发是一套软件工程理论,同时也是一套实践方法;区别于传统的瀑布流(waterfall)模式,敏捷强调积极地适应需求的变化(与之相对,传统瀑布流模式在一开始就锁定需求,直至最终产品完成),通过渐进的开发方法。
按照Wiki的定义——“敏捷开发(agile software development)是指一系列的软件开发原则,在这种开发中需求和解决方案都逐渐演化,通过由自组织(self-organizing)、跨功能(cross-functional)的开发人员组成的开发团队的合作来达到。”1
这句话概述了敏捷的目标和方法:敏捷是为了适应需求的变化,提供逐渐演化的解决方案,由自组织和跨功能的开发人员组成的团队合作达成。下面详细阐述这句话的含义。
变化的需求
需求会变化,主要是因为有些软件在一开始难以预计最终的需求,或者需求随着时间的推移在改变(比如三月前的需求跟三个月后的不一样,如果一个软件按三个月前的需求开发了三个月,那么完成之后也是无用的)。这些都是传统瀑布流模式难以应对的,而敏捷开发可以做得很好。
迭代
逐渐演化的解决方案一般通过迭代(iteration)来完成。下图通过与瀑布流模式的对比解释了什么是迭代:
通常瀑布流模式通常包含“计划”、“分析”、“设计”、“编码”、“测试”、“部署”这几个阶段,最后产出可用的软件产品;迭代则是把整个产品开发周期分割为若干个小的迭代周期(一般1~4个礼拜),在每个迭代周期内完成从“计划”到“部署”的全部工作,并且在每个迭代周期结束时都产出可以工作的软件。通过在每个迭代周期新增或改进一部分产品功能,使产品变得越来越完善;同时,需求的变化也会得到及时的处理。
自组织
自组织(self-organizing)的团队是一个自治团队:
- 每个成员都能自主工作,而不是由他人指派工作
- 成员之间可以有效地(面对面)交流
- 相互信任,相互配合,共同完成工作
敏捷开发强调自治团队的重要性和积极性2。如果团队不能按照敏捷的方式工作,那么开发就无法达到敏捷。
跨功能
跨功能(cross-functional)是指团队成员来自相关的各个部门。其中很重要的一点是:须要有客户代表加入,共同开发。客户代表的作用是传达客户的业务需求、随时解答各种关于业务的细节问题;并在每个迭代周期结束时验收产品,保证产品的功能都是客户需要的并且达到了客户的需求。这是敏捷开发适应变化的关键之一:如果没有客户的参与,开发会很快失去方向或者向错误的方向进行。
如何进行敏捷开发?
上面提到,敏捷需要“组织自治、跨功能的团队进行迭代式开发”。但这句话还是太宽泛了,不足以指导具体的开发活动。实际上,敏捷不只是一套理论,更是一套详细的实践指南,告诉你具体应该怎么做,包括:如何在一个迭代中做计划、如何进行有效率的沟通、每个开发者如何领取任务……等等。这套行动指南的内容十分丰富,而且在具体做法上形成了不同的流派,如XP(eXtreme Programming,极限编程)和Scrum等。但不论是何流派,在敏捷的宗旨上都是一致的。如果你想进一步了解敏捷开发,我推荐:
- 敏捷开发的Wiki——对敏捷涉及的概念、方法和流派有丰富的说明和链接
- 《The Art of Agile Development》,中译《敏捷开发的艺术》——这本书深入浅出地介绍了敏捷实践,值得一读
另外,敏捷还涉及一些工具,它们能帮助你更好/更容易地达到敏捷,包括:
- 版本控制系统,如Git——敏捷对版本控制系统没有特殊的要求,但是敏捷的实践要求这种版本控制系统必须具有很好的“分支-合并”功能,在这方面Git是一个上佳选择。
- 持续集成(Continuous Integration)工具,如Jenkins
- 项目管理/协作系统,如Rally
- 敏捷的Web开发框架,如Ruby on Rails
敏捷开发的内涵和实践都十分丰富,即使你不能从头到尾读完一本敏捷专著,了解一下敏捷的基本概念也是十分有益的。
最后,我想以敏捷宣言(The Agile Manifesto)——敏捷的“宪法”——的十二条基本原则作为结束:
- Customer satisfaction by early and continuous delivery of valuable software
- Welcome changing requirements, even in late development
- Working software is delivered frequently (weeks rather than months)
- Close, daily cooperation between business people and developers
- Projects are built around motivated individuals, who should be trusted
- Face-to-face conversation is the best form of communication (co-location)
- Working software is the principal measure of progress
- Sustainable development, able to maintain a constant pace
- Continuous attention to technical excellence and good design
- Simplicity—the art of maximizing the amount of work not done—is essential
- Best architectures, requirements, and designs emerge from self-organizing teams
- Regularly, the team reflects on how to become more effective, and adjusts accordingly
1. "Agile software development describes a set of principles for software development under which requirements and solutions evolve through the collaborative effort of self-organizing cross-functional teams." - https://en.wikipedia.org/wiki/Agile_software_development ↩
2. "Best architectures, requirements, and designs emerge from self-organizing teams" - 《敏捷宣言(Agile Manifesto)》的十二条原则之一 ↩