敏捷软件开发与传统软件开发的对比
最早了解敏捷开发是通过大二的一次博雅课堂,一位在百度工作的北航学长跟我们分享了他近年来从事敏捷开发的经历。印象最深的一句话是一个延迟3个月交付100%功能的软件和一个按时交付75%核心功能的软件,敏捷软件开发者更愿意选择后者。本学期的软件工程基础课又向我们讲授了传统软件开发,经过课上和课后的学习,对于敏捷软件开发和传统软件开发有了浅显的认识和理解。由于课上学习的重点是传统软件开发,所以课下对敏捷软件开发进行了更多的涉猎,本文以敏捷软件开发为主体,来分析其与传统软件开发的对比。
敏捷软件开发与传统开发方法相比具有很大的不同,其特点是适应性而不是预测性,强调沟通和反馈,开发团队不仅包括开发人员,还包括管理人员和客户。它鼓励团队成员的相互交流通过反馈机制尽早纠正软件中的错误,提高开发效率,同时为需求的调整提供更多机会,保证软件向正确的方向发展。
传统软件开发如瀑布模型强调预见性,严格遵循计划、分析、设计、编码、测试和维护等几个阶段。瀑布模型开发各阶段间具有严格的顺序性和依赖性,必须等到前一阶段的工作结束后才能开始下一阶段的工作,前一阶段的输出文档是后一阶段的输入文档,只有前一阶段的输出文档完全正确,后一阶段才能获得正确的结果。
对敏捷联盟宣言的理解
1.个体和交互胜过过程和工具,强调软件开发必须发挥人的积极性和创造性,更看重人的沟通和团队的力量;
2.可以工作的软件胜过面面俱到的文档,敏捷软件开发要求文档短小简明,能说明系统的高层结构和概括的设计原理,将精力集中在代码和测试上;
3.客户合作胜过合同谈判,满足合同的软件并不一定是成功的软件,只有满足客户真实需求的软件才是成功的。客户与开发团队密切工作在一起,不断沟通和反馈;
4.响应变化胜过遵循计划,只为下两周做详细的计划,为下三个月做粗略的计划,为以后做极为粗糙的计划。
常见的敏捷软件开发方法的特点
1.极限编程(XP):沟通,简单,反馈,胆识,为四项基本准则,快速反馈,假设简单,递增更改,优质工作,为5条法则,几乎无文档。在所有的敏捷方法中,XP对日期产生的兴趣最多,并且在对良好不定的问题领域的特殊实践方面最为具体。
2.SCRUM:特别强调开发队伍和管理层的交流协作。每天,开发队伍都会向管理层汇报进度,如果有问题,也会向管理层要求帮助解决。
3.动态系统开发方法:坚持功能在项目的全过程中都可以改变,当功能被允许改变时,通过使用时间框控制的目的就能达到。重视为项目营造一个正确的文化氛围,如手册中描述了项目有不同的侧重点,并指出对于那些缺陷在传统方法中转变起来是多么的困难。也非常重视协作价值和原理,以及文档。
4.功能驱动开发方法,短时间的迭代阶段和可见可用的功能,适合于那些不确定或常变更的需求的系统。它抓住了软件开发的核心问题领域,即正确和及时地构造软件。
5.水晶系列方法:相对于其它敏捷方法,水晶系列方法强调软件开发流程的纪律性,所以它比其它敏捷方法易于使用,但它的生产率不如Xp等其它敏捷方法。水晶系列与Xp一样,都有以人为中心的理念,但在实践上有所不同。人们一般很难严格遵循一个纪律约束很强的过程,因此,与Xp的高度纪律性不同,水晶系列方法试图用最少纪律约束而仍能成功的方法,从而在产出效率与易于运作上达到一种平衡。
6.自适应软件开发(ASD):ASD强调开发方法的适应性,这一思想来源于复杂系统的混沌理论。ASD不像其他方法那样有很多具体的实践做法,它更侧重为ASD的重要性提供最根本的基础,并从更高的组织和管理层次来阐述开发方法为什么要具备适应性。
各种敏捷软件开发方面的共同特征
(1)迭代式开发。整个开发过程被分为几个迭代周期,每个迭代期是一个定长或不定长的时间块,每个迭代周期持续的时间一般较短,通常为1~6 周。
(2)增量交付。产品在每个迭代周期结束时被逐步交付使用,而不是在整个开发过程结束时一次性交付。每次交付的都是可被部署到用户应用环境中的、能给用户带来即时效益和价值的产品。
(3)开发团队和用户反馈推动产品开发。敏捷开发方法主张用户能够全程参与整个开发过程。这使需求变化和用户反馈能动态管理并及时集成到产品中。同时,团队也能及时对用户的需求提供反馈意见。
(4)持续集成。新的功能或需求变化总是尽可能频繁地被整合到产品中。一些项目是在每个迭代周期结束的时候集成,有些项目则每天都在集成。
(5)开发团队自我管理。拥有一个积极的、自我管理的、具备自由交流风格的开发团队,是每个敏捷项目的必要条件。敏捷开发总是以人为中心建立开发的过程和机制,而非把过程和机制强加给人。
项目角度分析区别
下面从敏捷管理、敏捷需求分析、敏捷软件开发三个主要方面来探讨敏捷开发与传统软件开发的主要区别和特点。
敏捷管理,建立自组织的团队,敏捷团队一个重要的目标是实现快速适应现实的变化,所以敏捷项目管理把控制和计划移交给整个团队,而不是管理者。客户被看做团队成员。管理者主要是对团队进行指导,提供必需的资料以及扫清工作障碍。
敏捷需求分析,传统软件工程是一个不断反复的需求定义、文档记录、需求演进的过程,并最终在验证的基础上冻结需求。敏捷软件开发以迭代思想为核心,项目需要通过多次构建,它的需求需要在最后一次构建版本时才能完整的定义。敏捷需求分析会把客户的各种需求按优先级排列,从高到低进行实现,优先级低的需求也可能被抛弃。
敏捷软件开发,主张演化设计或迭代设计,不做大型的预先设计,快速进入编码阶段,通过重构来维持改进设计。
敏捷开发在人的层面和技术层面都强调及时反馈,测试、设计、编码交替进行。在尽可能短的迭代周期内完成一个小的功能模块,并快速测试,展示给客户,获得反馈。
主要特点分析区别
下面从团队建设、管理流程、用户参与程度、业务需求、交付频率和文档量六个方面来总结一下敏捷软件开发和传统软件开发的区别。
1.团队建设:以团队为单位,强调团队建设,赋予高度的责任,支持开发、透明的交流环境;以项目经理为领导核心,团队成员之间交付很少
2.管理流程:流程可以简单,但规划与执行必须严谨;复杂,繁琐,静态,变更成本大
3.用户参与程度:强调用户保持密切的联系和交流;很少涉及用户参与
4.业务需求:需求具有优先级次序,开发以增量方式逐步完成功能,有助于量化项目过程;假设需求是明确的,一旦需求变更势必增加其余环节的复杂度
5.交付频率:经常交付,交付周期短;项目结束时交付,交付周期长
6.文档量:最必要最实用,高的应用度和阅读度;产生大量中间文档,低的应用度和阅读度
传统开发生命周期中两个重要缺陷及敏捷软件开发的应对策略
1.测试阶段往往是整个代码编写完成后进行,测试无问题后将产品交付给客户。假如在测试阶段发现了问题,则有可能需要对整个模块进行返工来修改。
2.由于开发早期客户往往不能明确自己需要实现什么,因此早期建立的需求模型往往不能准确包含系统所需的功能,而在整个产品按照线性模式开发完后,客户则提出改变需求的要求,这样对系统进行频繁修改后,将导致整个系统的兼容性受到影响,尤其在大型系统中更是表现突出。
相对于传统软件开发方法,敏捷方法中避免了客户在开发初期不能提供准确详细需求导致的问题,采用迭代式的开发。通过不断发布新版本并演示给客户,使得客户在与系统交互的过程中发现自己需要的系统特性,从而改善在每次迭代前提供的需求。这种开发方式中允许客户延迟某些决定,等有价值的信息出现或对技术优化后才去决定,这也是敏捷开发的一个优势。实际的敏捷开发中,甚至可以在任何需求都未知的情况下开始开发。另一方面,敏捷开发可以提供给客户一个更符合需求的最终产品。每一个短的迭代,都为客户提供一个完整的模块以便于讨论,由于这些模块并不是完整的系统,所以之后的任何新增功能的开发都不会增加开发费用。这样开发者可以随时为客户增加任何功能,并且系统将在客户没有再需要添加的功能后进行整合。因此,敏捷开发的产品将是完全符合客户需求的完整的系统。
误区解读
经过与传统软件开发的对比,可能会有很多人陷入几个误区,下面对此进行说明。
首先,敏捷开发并不是说可以不要规范不要文档,敏捷开发同样需要文档,只不过它对规范和文档像对开发人员一样,要求把它们组织得更加清晰,高效,要求简化的只是不必要的部分。
其次,不是说敏捷软件开发与传统软件开发相比有这么多优点就十全十美了,它当然也有自己的缺陷。
敏捷软件开发的缺陷
下面就通过与传统软件开发的对比来看看敏捷软件开发的缺陷。
敏捷方法明显地降低了文档的数量,甚至声明代码本身就是文档。这就需要开发人员为代码添加更多的注释,但是对于不习惯敏捷开发或团队新成员则很难做到,他们必须不断询问有经验的开发人员,这样会导致延迟迭代交付时间,甚至增加开发费用。而传统开发则强调文档对团队成员的指导作用,开发人员可以在不知道项目细节的情况下完成开发。
敏捷开发中强调交互和客户的参与。每次迭代前,团队和客户都将召开一个会议,团队成员将介绍在这次迭代中所作的工作,而客户则根据成员的介绍给出新的功能要求。实际中大部分情况,这种例会是非常乏味和沉闷的,因为团队成员必须重复地向其他
成员和客户展示自己负责的模块,接受给出各种对需求的更改,而且每次迭代都是如此,通常为迭代分配的时间都是以周为单位的,开发人员经常感到时间不够用,尤其是自己负责的模块中包含一些复杂的算法时,时间就变得越紧,经常使得迭代延迟。而传统开发中客户不会参与开发过程,实现过程中开发人员只是根据文档编写代码,然后交付最终产品。这样开发人员不必关心那些频繁的迭代会议,而且时间上更加宽泛,有利于开发出更好的产品。
敏捷开发对开发人员的个人技能要求更高。敏捷开发强调交互和客户的参与,这就意味着每个团队成员都要具备一定的个人能力和社交技能。每次迭代都必须给客户提供完整的功能模块,并且需要让客户明白当前的开发进程以及开发中遇到的一些问题,开发人员不但需要将自己的工作描述清楚,还得正确理解客户提出的新需求,这需要具备较好的沟通技能。而实际中,不一定每一个开发人员都能具备这样的技能,一旦某一个人不能正确理解一些重要信息,将可能导致下一次迭代不能准确交付,更糟糕的是,如果理解有误,会使得开发的模块中包含多余的功能,结果是对模块进行修改,从而增加开发费用。因此,开发人员社交技能的提升将增加开发过程的稳定性。
敏捷开发允许增加需求也导致两个设计中的问题:系统过于僵硬和机动性强。僵硬是指系统中一旦有更改的地方容易引起其他模块的级联改动。机动性是指可能由于需求改变而压缩一些可重复使用的组件,这意味着大量的工作量和对系统整体稳健性带来风险。如果系统中存在这些问题,会违反面向对象设计中的接口隔离原则,从而导致部署过程中的很多问题。
所以,敏捷软件开发和传统软件开发在当今都有属于自己的舞台,都会向着更好的方向发展。
来源:oschina
链接:https://my.oschina.net/u/2277088/blog/1611931