敏捷开发的起源
在90年代末期,传统软件开发的方式因为其繁杂的过程,以及对文档的过于严格的要求,造成了很大程度上的效率下降,也就是人们所说的“重型化危机”。因为这一原因,人们开始反思传统方法的利弊,并对其弊端进行了改进,提出了敏捷方法。
2001年2月,由Martin Fowler,Jim Highsmith等17位软件开发专家起草的敏捷宣言发表,敏捷联盟成立。敏捷开发作为一种新的方法正式诞生。敏捷宣言中所表述的价值观分为四个方面:
(1)个体和互动 高于 流程和工具(2)工作的软件 高于 详尽的文档
(3)客户合作 高于 合同谈判
(4)响应变化 高于 遵循计划
同时敏捷宣言还包括12条原则。这十二条原则是以上四条主要的价值观在实际工作中的体现。
总体来说,敏捷开发作为一种新的软件工程方法,与传统方法相比更加注重人的因素。不再把开发者当作一个物化的,投入多少时间可以完成相应数量代码的代码开发机器;而是注重开发者之间的互动以及开发者和用户之间的互动,同时因为增加了交流和协作使得开发的项目更加灵活和易于修改。
敏捷开发的主要特点
与传统开发方法相比,在敏捷开发的整个过程中,有以下几个主要的特点:
(1)敏捷开发的过程有着更强的适应性而不是预设性,从敏捷宣言的第四条响应变化高于预设计划便可以看出来。因为软件开发过程的本身的不可预见性,很多用户在项目开始时不可能对于这个项目有着一个完整而明确的预期。很多对软件的预期都在后期的修改和完善过程中产生。因此高适应性显然更加符合软件工程开发的实际。而敏捷开发实现其适应性的方式主要在于,第一,缩短把项目提交给用户的周期;第二,增加用户,业务人员,开发人员这三者之间的交流;第三,通过减少重构的成本以增加软件的适应性。
(2)敏捷开发的过程中,更加的注重人的因素。在传统软件工程中,个人的因素很少的被考虑到分工中,每个个体都是只是整个代码开发机器的一个小小的螺丝钉,个人的意志和创造力很大程度上的被抹去为了更好的为集体服务。而在敏捷开发过程中,每个个人的潜力被充分的考虑,应用什么技术很大程度上直接由在第一线开发的技术人员决定;每个人的特点和创造力都可以充分地发挥,这样开发出来的软件更加的具有生命力,因为他融入了开发者的心血和创意,开发者不再是进行机械的乏味的堆砌,而是创造属于自己的艺术品,这样的条件下产生的代码必然在质量上更占优势。
(3)在敏捷开发的过程中,整个项目是测试驱动的而不是文档驱动的。不仅每个模块有着自己的相应的测试单元,开发人员在开发自己的模块的过程中必须保证自己所开发的模块可以通过这一单元的测试,并且集成测试贯穿了整个开发过程的始终。集成测试每天会进行十几次甚至几十次,而不是像传统方法一样只有当各个模块的编码都结束了之后再进行联合调试。这样,在软件开发的进程中每一点改动所引起的问题都容嘉容易暴露出来,使得更加容易在错误刚刚产生的时候发现问题从而解决问题。这样就避免了在最后整个系统完成时错误隐藏的太深给调试造成极大的困难。
敏捷过程模型的一个实例:极限编程
敏捷过程作为一种开发过程模型,产生了很多不同的可以应用到实际中的编程方法。这里介绍一种应用的比较广泛的开发方法,极限编程,来具体体现一些敏捷开发过程的特点。
极限编程过程分为策划、设计、编码和测试四个阶段。
(1)策划阶段
首先在策划阶段,用户和开发这进行交流,开发者总结出一系列“用户故事”,描述软件某一部分功能。之后客户对这些功能进行优先级排序,xp团队评估每一个故事的成本。之后客户和xp团队共同决定在开发的下一个版本中将会新增哪些功能。而在版本不断的迭代的过程中,会进行很多次这样的策划过程,每一次客户都可以根据已有的功能来决定是否要新增一些功能,以及要新增哪些功能。
(2)设计阶段
在设计阶段,开发人员会根据用户故事,提出这些用户故事的实现方案。设计的过程中主要遵循简洁的原则,也就是尽量使用简介的表述而不是复杂的表述。而设计的另一个方面则是重构,重构是一种通过不改变代码的外部功能的情况下改变软件模块的内部结构从而优化软件系统的功能的过程。这是一种改进代码的设计。
在设计的这两个层面中,我们可以看到在xp开发过程中,设计和开发是同步进行的。我们在不断实现开始设计的过程中,同时要对到吗进行优化也就是重新设计。这样,大大的增强了整个软件开发的适应性,而不是始终刻板的实现最开始的第一版设计。
(3)编码阶段
xp开发的第一件任务不是直接对初步的设计和用户故事进行编码,而是针对这些设计全力开发单元测试。完成了单元测试也就确定了开发者要实现的所有功能。这样开发者就只需要全力通过单元测试,而不必在实现什么功能上再浪费不必要的时间和精力。这正体现了敏捷开发的以测试驱动的特点。
而在敏捷开发中,很重要的一个提高效率的方式就是结对编程。在结对编程的过程中,两个开发者共用一台电脑,并各有分工。其中一个人进行实际的编码实现,另一个人在旁边考虑代码在宏观上该如何实现,比如针对什么功能应该使用什么样的算法。这样,在编码者工作遇到问题时,两个人交换位置。这时在旁边思考的人更有可能可以解决这一问题。事实上,结对编程的形式不必拘泥于什么规矩。关键在于,两个人共同开发的过程中,两个人的交流可以使得大部分的问题可以在第一时间解决。并且,因为两个人中只有一个人在进行编程这一项比较疲惫的工作,另一个人较为轻松,这样可以保证开发效率一直保持在一个比较高的状态。
(4)测试阶段
每一个模块都通过自己的单元测试之后,开发者会将所有的模块集成到一起进行测试。这样可以及时发现每一模块在最近一次改动之中出现的问题同时避免一些兼容性问题。每一次改动一点小问题要比等到最后一次集中修改所有问题要容易得多。
敏捷开发生态系统
敏捷开发模型在实际中有着很多表现形式。极限过程开发(xp)时其中的最为广泛应用的一种。还有很多其他的,比如:自适应软件开发、Scrum、动态系统开发、Crystal、特征驱动开发、精益软件开发、敏捷建模、敏捷统一过程等。这里只举两个例子介绍一下其主要的特点。
自适应软件开发主要从整体上强调软件项目团队具有自我组织的动态性、人与人之间的协作、个人以及团队的学习,从而使团队更有可能取得成功。
Scrum开发方法,这个开发方法最大的特征就是每日例会。在每日例会中,每个人交流自己昨天干了什么,今天将要干什么,以及自己在工作中遇到了哪些问题。这样大大地加强了团队成员之间的交流。
我们可以看到,很多人都投入到了敏捷开发的研究和使用中。敏捷开发确实有着非常强大的生命力。
敏捷开发与传统开发方法的比较
优势
敏捷开发的高适应性,以人为本的特性,和轻量型的开发方法即以测试为驱动取代了以文档为驱动,这三个主要的特点,也就是敏捷开发相对与传统开发方式的主要有点。因为他更加的灵活并且更加充分的利用了每个开发者的优势,调动了每个人的工作热情。
劣势
与传统开发方式相比,敏捷开发的最主要的劣势在于敏捷开发欢迎新的需求,而在每次新的需求产生时都可能引起整个系统的大幅度的修改。因为开发者在开发上一个版本的时候,完全没有考虑以后的优化将要如何进行。这样的开发方式实际的软件开发过程中,并不一定总是有效的。
而另一个方面,敏捷开发因为缺乏很多在敏捷开发中被认为“不重要”的文档,这样在一个大型项目比如一个操作系统开发的时候,由于其项目周期很长,所以很难保证开发的人员不更换,而没有文档就会造成在交接的过程中出现很大的困难。
参考文献
[1]基于scrum敏捷开发的软件过程管理研究 王敏
[2]敏捷开发在软件开发的过程中的应用研究 彭志楠
[3]敏捷软件开发技术研究 周莹莹
[4]敏捷软件开发应用研究 范洪涛
[5]http://agilemanifesto.org/iso/zhchs/manifesto.html 敏捷软件开发宣言
[6]http://agilemanifesto.org/iso/zhchs/manifesto.html CSDN 敏捷开发的优缺点
[7]http://www.vaikan.com/agile-programming-10-years-on-did-it-deliver/ 外刊IT评论 敏捷十年,成效几何?
[8]http://www.infoq.com/cn/news/2010/02/scrum-failings Bob大叔关于Scrum和敏捷的七条缺陷