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