敏捷软件开发VS传统软件工程
敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力。
与传统软件工程相比,它们的具体名称、理念、过程、术语都不尽相同,相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中“人”的作用。
本文将介绍敏捷软件开发的历史背景与发展,探讨敏捷软件工程相对于传统软件工程的特点,并阐述一些我个人在学习过程中的认识和思考。
20世纪六十年代,计算机硬件技术有了很大的发展,为计算机的广泛应用创造了条件,并要求软件与之相适应。当时的软件生产具有个体化、作坊式特点,开发工具落后,开发平台单一,程序设计语言功能差。尤其是软件维护工作,耗费大量的人力、物力和计算机资源,许多程序的个体化特性使得它们无法修改和维护。有的干脆废弃原有系统不用,从头编写新软件。
与此同时,七十年代时,软件的规模越来越大,结构越来越复杂,软件管理和维护困难,开发费用不断增加。这种软件开发技术、开发工具和生产方式落后的状况与计算机应用迅速普及和对软件的需求日益增加形成了尖锐的矛盾,由此而产生了“软件危机”。
软件危机的产生使计算机软件专家认识到软件开发必须以新的方法作指导,原有的软件开发方法必须改变,他们决定把工程技术的思想引入软件开发领域,使软件开发走上工程学科的途径,以摆脱日益严重的软件危机。于是,美国和西欧的一些科学家在1968年的NATO(北大西洋公约组织)会议上第一次提出了“软件工程”这个名词,是利用工程学的方法开发和维护计算机软件的一门学科。从此,软件工程正式诞生,人们开始了软件工程的研究。
八十年代,软件工程引入成熟生产制造管理方法,以“过程为中心”分阶段来控制软件开发(瀑布模型),一定程度上缓解了软件危机。至九十年代,软件失败的经验促使过程不断增加约束和限制,软件开发过程日益“重型化”,开发效率降低、响应速度变慢。
从2000年代开始,随着信息时代到来,需求变化更快速,软件的交付周期成为企业的一项核心竞争力,因此,轻量级的,更能适应变化的敏捷软件开发方法被普遍认可并迅速流行开来。2001年初,由于许多公司的软件团队陷入了不断增长的过程的泥潭,一批业界专家聚集在一起概括出一些可以让软件开发团队具有快速工作、响应变化能力的价值观和原则,并称自己为敏捷联盟。
我对敏捷联盟的宣言的理解大致为:
1)个体和交互胜过过程和工具。
“人和人之间的交互是复杂的,并且其效果从来都难以预期,但却是工作中最为重要的方面。” 人是获得成功的最为重要的因素。一个优秀的团队不一定由一群最顶尖优秀的程序员组成,在团队中,能够和他人很好的合作、顺利的沟通以及高效的交互能力比单纯的编程能力更为重要。即使有一群高水平的程序员,如果没有良好的沟通,也未必可以组成一个高效的团队,毕竟人不是“插入即兼容的编程装置”。项目的顺利进行需要由具有合作精神、自组织且有凝聚力的团队来保证,合适的工具虽然也非常重要,但是工具的作用不应该被过分的夸大,我们应该明白物极必反,过多或过于庞大复杂的工具和缺少工具一样都是不合适的。总之,团队的构建要比环境的构建重要的多,应该首先致力于构建合适的团队,再基于需要来配置合适的环境。
2)可以工作的软件胜过面面俱到的文档。
没有文档的软件是一种灾难,这意味着没有严格规划和明确目标的盲目行动,显然是非常低效的,然而,过多的文档并不意味着高效,相反,这会花费大量的时间和精力来编制和更新。因此,编写和维护一份恰如其分的文档是明智的,文档应该简短,主题鲜明,逻辑概括性强。在团队成员的交流中,近距离的培训和交互是最有效的方式。应该竭力避免注重文档而非软件导致进度拖延的情况发生。Martin文档第一定律告诉我们:直到迫切需要并且意义重大时,才来编制文档。
3)客户合作胜过合同谈判。
传统:你想清楚你具体要个啥?
敏捷:你再看看还有啥要改的。
Just kidding,但是,确实,我们无法像订购其他用品一样来订购一个软件,在我的认识里,软将更大程度上像是一个“作品”而非一个严格意义上的“产品”,所以像大多数艺术创作一样,让人在固定的时间内以固定的成本来复刻客户的需求,是难以达到的,即使这种简单的交易模式非常具有诱惑力,但一个指明需求、进度以及项目成本的合同其实存在根本上的缺陷,如果仅仅依赖于此,则很大可能会导致项目的失败。因此,“敏捷”认为,成功的项目需要的是有序和频繁的客户反馈,而不仅仅是冰冷的合同和死板的工作汇报会议。软件开发团队客户在工作上建立密切的联系,尽量经常的沟通和反馈。合同的编制也应该对项目的开发协作起指导作用,而非去约束和规定进度和成本上的细节来试图使开发工作受到完全的控制。
4)响应变化胜过遵循计划。
在瞬息万变的现代信息社会,响应变化的能力常常决定着一个软件项目的成败。因此计划的构建应该保证足够灵活来适应商务和技术方面的变化。
计划不可考虑的过远,因为商务环境以及客户需求的变化往往是不可预见的。即使需求被确定下来也并不代表开发时间就随之确定。因此,较好的策略是,先进行短期的详细计划,和稍长的粗略计划。以便灵活地作出改变。计划中这种逐渐降低的细致度,意味着我们仅仅对于迫切的任务才花费时间进行详细的计划,这样可以保证短期内工作的有序高效和长期上的灵活适应性。
此外,敏捷软件开发开发提出了12条更详尽的原则,宗旨和宣言一致,也是体现了与传统软件工程的区别所在。
1、最优先要做的是:通过尽早地、持续地交付有价值的软件来使客户满意。
2、即使到了开发后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
3、经常交付可工作的软件,其时间间隔可以是几周到几个月。 交付的时间间隔越短越好。
4、在整个项目开发期间,业务人员和开发人员必须天天在一起工作。
5、不断激励开发人员,开展项目的有关工作。给他们提供所需要的环境和⽀支持,并信任他们能够完成所承担的工作。
6、在团队内部,最有效果的、最有效率的传递信息的方法,就是面对面的交谈。
7、首要的进度度量标准是工作的软件。
8、敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
9、不断关注优秀的技能和设计,增强敏捷能力。
10、简单是根本的。
11、最好的体系结构、需求和设计,出自自己组织的团队。
12、每隔一段时间,团队对如何才能有效的工作进行反省,然后对自己的行为进行适当的调整。
我们知道,传统的软件开发采用的是瀑布式开发的流程,包括收集需求、定义、设计、编码、测试、发布等阶段。前一阶段的完成为后一阶段开始的先决条件,每个阶段都有其明确的目标和审核标准,整个过程严格有序,可预测性逐步增强,这样的好处是避免资源的无效投入,步步为营,保证开发质量。
但传统开发模式也存在着明显的缺陷,这种瀑布式流程的每个阶段间具有强烈的依赖关系,导致问题的产生可能会导致连锁的后果。如果前一阶段未达到标准,也会造成后续阶段的停滞。举个似乎是我的编译课老师举过的例子,一个工程有五个部分的话,如果每个部分做到90分,那么最终的工程就只能得到59分,就是一个不合格的工程。因此这种模式的灵活性差,很难应对后期需求的变化,调整的代价高昂。
所以,在这样的背景下诞生了敏捷开发的理念,灵活性的提高便是其最大的优势。市场需求瞬息万变导致成品需求收集完整性难以保证,可以说在瀑布式开发中的前几阶段我们连九十分都很难做到,所以传统软件工程的失败率之高便不言而喻了。
我很认可一种说法,敏捷开发相对于传统开发是一个核心思维的转换:从“Fix scope,Flex time”转向“Fix time,Flex scope”。在市场变化和技术变化背景下,既然市场需求和产品定义的“范围”无法实现固化,因而资源需求也不确定,那不妨切换重心,旋转一下我们的坐标系,固定资源,来尽可能达到“范围”的最大化实现。从“计划驱动”转向为“价值驱动”。而且敏捷开发更强调“人”的价值功效,康德说,“人即目的”,从这个角度来说,敏捷软件开发的宗旨像是软件工程发展史上的“文艺复兴”运动。
最后表达一些我个人不成熟的想法,敏捷软件开发的出现根本上来自于商业环境的现实,人力成本高昂,商业市场上“快鱼吃慢鱼”的竞争模式等等。敏捷开发这种模式取“敏捷”二字为名,但“敏捷”并不仅仅意味着“多快好省”,速度只是敏捷的一部分,正如我前文提到的,软件开发更像一门艺术,应该在合理范围内尽量高效,但浮躁和急功近利是无所裨益的,真正以“人”为驱动力并不应该意味着使开发人员心力交瘁,开发生理潜能的极限,如何协调个中利害关系,想必还是任重道远。
敏捷软件开发VS传统软件工程的更多相关文章
- 敏捷软件开发 VS. 传统软件工程
敏捷软件开发 VS. 传统软件工程 软件工程这一术语1968年被提出,之后美国软件工程专家巴利·玻姆对十多年间研究软件工程的专家学者们提出的一些准则与信条,于1983年对提出软件工程的七条基本定理,将 ...
- 敏捷软件开发vs传统软件开发
摘要 本文介绍了传统软件开发(着重介绍了传统软件开发中常用的瀑布模型)和敏捷软件开发,以及敏捷开发和传统开发的对比. 一.传统软件开发 比较常用的几种传统软件开发方法:瀑布式开发.迭代式开发.螺旋开发 ...
- AgileEAS.NET SOA中间件平台/敏捷软件开发平台
AgileEAS.NET SOA中间件平台/敏捷软件开发平台 最新下载 一.前言 AgileEAS.NET SOA中间件平台,简称EAS.NET,是基于敏捷并行开发思想和Microsoft .Net构 ...
- Agile Development敏捷软件开发之何为敏捷开发
敏捷软件开发之何为敏捷开发 敏捷开发,Agile Development,就是指能够在需求迅速变化的情况下快速开发软件.我们接触最多敏捷实践方式有:极限编程(XP).结对编程.测试驱动开发(TDD)等 ...
- 敏捷软件开发实践-Code Review Process(转)
介绍: 在敏捷软件开发中,从代码的产生速度上来看,要比 传统Waterfall产生速度高很多.因为我们把时间安排的更加紧凑了.那么这么多的代码,如何能保证这些代码质量呢?很多人可能直接想到静态代码检测 ...
- 敏捷软件开发:原则、模式与实践——第11章 DIP:依赖倒置原则
第11章 DIP:依赖倒置原则 DIP:依赖倒置原则: a.高层模块不应该依赖于低层模块.二者都应该依赖于抽象. b.抽象不应该依赖于细节.细节应该依赖于抽象. 11.1 层次化 下图展示了一个简单的 ...
- ThoughtWorks、Teambition、Trello、Slack、DevCloud 主流敏捷软件开发工具平台比较
在大公司做了6年程序员,2年项目经理的小王,正在创业公司迎来他焦虑的而立之年. 但是对于3个月前加入创业公司的决定,他现在有些烦躁和怀疑人生.在他过往的经验看来,公司新接的小项目,在过去的大公司里1个 ...
- 敏捷软件开发_设计原则<三>
敏捷软件开发_设计原则 单一职责原则(single responsibilities principle,SRP) 原理:一个类应该只有一个变化 分离职责:如果不耦合的职责那么很简单,如果两个职责耦合 ...
- 敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式
1.TEMPLATE METHOD 泛型,也就是这个模式,是可以基于泛型的. 我们往往会有一些算法,比如排序算法.它的算法部分,我可以把它放在一个基类里面,这样具体类型的比较可以放在子类里面. 看如下 ...
随机推荐
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- 【SQLServer】记一次数据迁移-标识重复的简单处理
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 今天在数据迁移的时候因为手贱遇到一个坑爹问题,发来大家乐乐,也传授新手点经验 迁移惯用就 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- spring注解源码分析--how does autowired works?
1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...
- Angular源码分析之$compile
@(Angular) $compile,在Angular中即"编译"服务,它涉及到Angular应用的"编译"和"链接"两个阶段,根据从DO ...
- javascript 笔记!
1.通过javascript向文档中输出文本 document是javascript的内置对象,代表浏览器的文档部分 document.write("Hello Javascript&quo ...
- ES6之let命令详解
let与块级作用域 { var foo='foo'; let bar='bar'; } console.log(foo,'var'); //foo varconsole.log(bar ,'bar') ...
- ECharts数据图表系统? 5分钟上手!
目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. ...
- Jexus 服务器部署导航
说明:本索引只是方便本人查找,不涉及版权问题,所有博客,还是到元博客地址访问. <script async src="//pagead2.googlesyndication.com/p ...
- MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析
在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...