敏捷软件开发与传统软件工程
一、前言
随着社会和科技的不断发展,信息产业己经和人们的生活息息相关,成为不可或缺的一部分。软件工程作为信息产业的核心部分发生了翻天覆地的变化。传统的软件工程思想己经越来越不适应快速变化的信息社会,为此一种新软件工程思想-----敏捷软件开发进入了我们的视野。
二、软件工程
(一)概述
Software engineering is the application of engineering to the design, development, implementation, testing and maintenance of software in a systematic method. [1][2][3]
——Wikipedia
软件工程是以系统方法对工程设计,开发,实施,测试和维护软件的应用。
(二)传统软件工程
软件开发模型是跨越整个软件生存周期的系统开发、运行和维护所实施的全部工作和任务的结构框架,它给出了软件开发活动各阶段之间的关系。[4]常见的传统软件开发模型有瀑布模型、快速原型模型、螺旋模型、增量模型、喷泉模型、形式化方法模型等。
由于本课程目前一直在围绕瀑布模型进行有关训练,而且由于模型数量较多,毫无疑问我的了解并不全面,倘若一一言及势必有很多缺失,因此我将主要以瀑布模型为代表进行讨论。
(三)瀑布模型
瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编码、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落,这也是瀑布开发名称的由来。从本质来讲,它是一个软件开发架构,开发过程是通过一系列阶段顺序展开的,从系统需求分析开始直到产品发布和维护。
其主要特点是:与一般系统工程一致,易于使用,不要求特别的技术与工具也能较好地进行软件开发;其缺点是:难于很好地表达和描述用户的需求。[5]
图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. [6] It advocates adaptive planning, evolutionary development, early delivery, and continuous improvement, and it encourages rapid and flexible response to change. [7] These principles support the definition and continuing evolution of many software development methods. [8]
——Wikipedia
敏捷软件开发描述了一套软件开发的原则,通过自组织跨职能团队的协作努力,需求和解决方案得以发展。它倡导适应性规划,进化发展,早期交付和持续改进,并鼓励快速灵活地应对变化。这些原则支持许多软件开发方法的定义和持续发展。
(二)简介
敏捷开发是近些年兴起的一种软件开发与管理的思想,以其灵活性,易操作性得到软件行业的广泛关注。敏捷开发方法是一组开发方法的统称,主要包括极限编程、Scrum、精益开发和动态系统开发方法(DSDM)、特征驱动开发(FDD)等。它的基本原则有迭代式开发、增量交付、互动式开发、持续集成等。在软件开发过程中,敏捷开发具有开发精确、高质量、高速度、高投资回报、高效率等优点。
敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
1. 敏捷开发十二条准则[9]
(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.
每隔一定时间,团队都要总结如何更有效率,然后相应地调整自己的行为。
2.敏捷软件开发宣言[10]
个体和交互 胜过 过程和工具;
可以工作的软件 胜过 面面俱到的文档;
客户合作 胜过 合同谈判;
响应变化 胜过 遵循计划。
3.敏捷开发概念的理解
(1)敏捷开发是一种以人为核心,增量迭代、及时交付的开发方法;
(2)是一种自下而上的轻量级开发方法,提升开发效率和产品质量;
(3)是一种应对需求快速变化的软件开发能力,重在实践。
四、敏捷软件开发与传统软件工程的对比
1.了解有关信息后,我决定这样定义敏捷软件开发——positive response to change。也许这样定义并不确切,但我觉得与传统软件开发相比,敏捷软件开发最显著的特点是对变化“友好的”,认为变化是不可避免的,并始终致力于解决变化带来的问题。
2.它们主要有以下区别:
(1)敏捷开发以人为中心,而传统开发以过程为中心。在传统开发中,设计在初始阶段就已经完成了,并且在实现阶段将不再修改。换句话说,实现阶段就是对设计的完成,设计方案是不会改变的。这样就忽略了用户的反馈、忽略了开发人员的设计的主观能动性,使得开发人员只是专注于代码层面的事情。而敏捷开发提倡的是迭代,在每次迭代中都有分析、设计,也就意味着在迭代阶段可以把一部分完成的系统给用户演示,允许用户提意见、需求,也允许开发人员将上一次迭代中得到的想法提出来,并且把这些需求意见想法融入到迭代的分析、设计中,从而在根本上、在理念上,促进了双方的交流沟通,发挥了用户的分析评价和开发人员设计的主观能动性。
(2)需求变化是不可避免的,传统开发模式采取“堵”的思想来控制变更,变更对项目进度、质量造成不利影响,而敏捷面对变化采取“疏”的思想坦然面对,通过多次短期迭代快速响应变更。
(3)传统方法开发软件的过程,往往是用户与开发团队的利益博弈的过程,所以在开发过程中用户的参与度不高。这也往往会是导致最终开发软件与用户理想软件有差距的重要原因。 而在敏捷开发中,要求用户和开发团队一起开发,这在一定程度上解决了两方之间的“断层”,提高了效率。
(4)传统方法中集成是在后期的一个重要阶段,而且是一个独立的阶段。 由于通常很长时间才会做一次集成,所以这个时候问题往往会非常多,如果要进行调试的话,难度很大。而在敏捷开发中,集成很频繁,因此每一次集成的改变也有限,即使集成失败也容易定位错误。
(5)传统方法往往要到最后才能得到可执行的产品,而敏捷开发很早就可以得到可执行的产品。不论是从实用性还是从心理层面,有可执行的产品在手总能让人更加愉快一点。
五、个人感悟
软件项目的最大挑战在于既要应付变动中的需求,又要在紧张的工期内完成项目。敏捷开发方法善于吸收其他方法的优点,它强调改进,在近年来较为流行。
敏捷开发是一种以人为核心、迭代、循序渐进的开发方法,相对于传统软件开发的“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通、频繁的交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中人的作用。[11]
虽然敏捷开发是一种新方法,但是事实上它是一种综合了多种传统开发方法的优点,整理出来的一套开发组织方法。 因此敏捷开发是一个新的思路,不一定是所有软件开发的终极选择。我们仍然不能摒弃传统的软件开发方式。传统的软件开发方式是新兴开发方式的基础,只有在传统的开发方式的基础上才能更好研究出新的开发方式。
六、参考文献
[1]Abran et al. 2004, pp. 1–1
[2]ACM (2007). "Computing Degrees & Careers". ACM. Retrieved 2010-11-23.
[3]Laplante, Phillip (2007). What Every Engineer Should Know about Software Engineering. Boca Raton: CRC. ISBN 978-0-8493-7228-5. Retrieved 2011-01-21.
[4]张友生, 李雄. 软件开发模型研究综述[J]. 计算机工程与应用, 2006, 42(3):109-115.
[5]王冲. 敏捷开发与传统瀑布模型的比较及教学[J]. 福建电脑, 2011, 27(4):61-62.
[6]Collier, Ken W. (2011). Agile Analytics: A Value-Driven Approach to Business Intelligence and Data Warehousing. Pearson Education. pp. 121 ff. ISBN 9780321669544. "What is a self-organizing team?"
[7]"What is Agile Software Development?". Agile Alliance. 8 June 2013. Retrieved 4 April 2015.
[8]Larman, Craig (2004). Agile and Iterative Development: A Manager‘s Guide. Addison-Wesley. p. 27. ISBN 978-0-13-111155-4.
[9] Kent Beck, James Grenning, Robert C. Martin, Mike Beedle, Jim Highsmith, ||Steve Mellor, Arie van Bennekum, Andrew Hunt, Ken Schwaber, Alistair Cockburn, Ron Jeffries, Jeff Sutherland, Ward Cunningham, Jon Kern, Dave Thomas, Martin Fowler, Brian Marick (2001). "Principles behind the Agile Manifesto". Agile Alliance. Archived from the original on 14 June 2010. Retrieved 6 June 2010.
[10]ROBERT C.MARTIN(美). 敏捷软件开发 : 原则、模式与实践[M]. 清华大学出版社, 2008.
[11]梁永幸. 浅谈敏捷开发与其他传统开发方式的区别[J]. 电子世界, 2012(24):128-128.