敏捷开发的缘来
随着信息技术的迅速发展和经济的全球化,对软件开发的生产率提出了更高的要求。因此,软件开发界为了满足市场需要,同时也为了减小软件开发项目希望能够有更多的可预测性和实际需求的模糊和快速变化不相协调这一因素给软件的开发按期完成所造成的风险,逐渐兴起了一类以快捷、轻便的思维方式迅速解决了一些传统软件开发企业的生产效率的新的开发方法,这类方法称为敏捷软件开发方法。2001年2月11日到13日,17位软件开发领域的领军人物聚集在美国犹他州的滑雪胜地雪鸟(Snowbird)雪场。经过两天的讨论,“敏捷”(Agile)这个词为全体聚会者所接受,用以概括一套全新的软件开发价值观。这套价值观,通过一份简明扼要的《敏捷宣言》传递给世界,该宣言中写道:我们一直在实践中探寻更好的软件开发方法,身体力行的同时也帮助他人。由此我们建立了如下价值观:个体和互动高于流程和工具、工作的软件高于详尽的文档、客户合作高于合同谈判、响应变化高于遵循计划也就是说,尽管右项有其价值,我们更重视左项的价值。从而宣告了敏捷开发运动的开始。
敏捷软件开发和传统软件工程的简介
敏捷软件开发方法其实不是一个具体的过程,而是一个用于概括那些应需而生的具有类似价值观的软件开发方式和方法的涵盖性术语。这些方法基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作,一般都具有以人为核心、循环迭代、响应变化等特点,着眼于能高质量地快速交付客户满意的工作软件,从而来应对快速变化的需求。在敏捷开发中,软件项目的构建被切分成多个经过测试且具备集成和可运行特征的子项目,并分别完成,在此过程中软件一直处于可使用状态。而我们所说的传统软件工程方法主要是指结构化软件工程方法,传统软件开发是以软件架构为核心的预测型开发过程,将传统软件工程方法分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个分离的基本活动,每个基本活动的输出作为下一个阶段的输入,如同瀑布的流水一般,各个阶段的通过文档相互流通。代码为预先规划、完全设计然后完成。在传统软件开发方法中,分析和设计是其最为重要的阶段,其前期的工作主要集中在分析和设计阶段,其中分析阶段对数据、数据流和功能进行分析。前期就要设计好整个软件大厦的框架来指导和支撑后面各个方面的开发和维护工作,后面在根据前期设计的蓝图来逐步实现。
敏捷软件开发和传统软件开发的差异
在敏捷软件开发中以极限编程为代表,12 个详细原则组成了宣言中提到的 4 个观点,这些原则是区别于传统软件工程的特征所在:① 最高优先级是通过尽早和经常交付有价值的软件来令客户满意;② 不断地交付软件,以每两周或每两个月为周期,推荐使用较短的周期;③ 可运行的软件是工作进展的主要度量标准;④ 以积极的态度对待需求的变化,即使在开发阶段末期也不例外。 敏捷过程利用变化来为客户创造竞争优势;⑤ 在整个开发过程中,业务人员和开发人员最好能每天一起工作;⑥ 项目由积极主动的人员来完成,给他们提供所需的环境和支持,信任他们能把工作做好;⑦ 在开发团队中,最具有效果和最有效率的信息交流手段是面对面的交谈;⑧ 最好的系统构架、 需求和设计产生于自组织的团队;⑨ 应时刻关注技术上的精益求精和合理的设计,这样可以提高应变能力;敏捷过程提倡可持续开发思想。出资人、开发者、用户应该保持长期、恒定的开发速度;简单化——最佳化未完成的工作的艺术——是至关重要的;团队应该定期对其运作方法进行反思,考虑如何能变得更有效,提出改进意见,并据此进行相应的调整。而以“瀑布模型”( Waterfall Model)[1]为代表的传统软件开发方法,团队在开发的前期总是希望把需求分析做细、做完整,尽可能把变化排除在软件开发过程之外从而来减小因为需求变化对软件开发进度、软件质量以及用户的满意程度所产生的影响,也就是说,其软件开发活动是严格按照线性方式进行的,软件活动自由度相对敏捷软件开发较低。
敏捷软件开发相比传统软件工程的的优势
从对比中我们可以发现,相对于传统软件开发而言,敏捷软件开发具有以下特点:1.以为为本,强调客户和开发团队间的有效沟通和紧密协作,而相比之下,传统软件工程更加依赖于合同和规格的说明。2.适应性较强,接受开发过程中需求的频繁修改,能有效地应对需求的变更,而传统软件工程中开发活动是严格按照线性方式进行的,所以较不能接受开发过程中对需求进行频繁更改。3.高度迭代,持续集成。在敏捷软件开发中,将开发过程划分为尽可能短的周期,每次迭代完成用户的部分需求,后面的迭代都是在前面迭代的基础上对系统功能进行修改、细化以及扩展的功能,设计随着需求而发展,直至系统功能完善,相比之下,传统软件开发方法中,代码为预先规划,完全设计,然后生成,对需求和架构设计的不确定性较低[2]。
传统软件开发的两个重要缺陷
相比于敏捷软件开发,传统软件开发有两个重要缺陷:1.由于软件开发早期客户往往不确定自己真实的需要,所以在早期建立的需求模型往往不能准确包含系统所需的功能,但是传统软件工程的开发又是按照计划在线性模式下开发,所以在开发完成后,若客户提出改变需求的要求,将会对系统进行频繁的修改,这会大大影响到系统的兼容性。而另一方面,传统软件工程开发的测试阶段往往都是在整个代码编写完后才进行测试,假如在测试中发现问题,有可能要对整个模块进行修改,这样的返工成本往往是巨大的[3]。而相比之下,由于敏捷软件开发采用迭代式开发的方式,通过不断发布新版本并演示给客户,似的客户在交互过程中发现自己需要的系统特性,可以避免客户在开发初期不能提供准确详细需求而导致的问题。从这可以看出传统软件工程在需求频繁更变的情况下所变现出的巨大局限性。
传统软件开发的优势之处
尽管如此,这并不意味着传统的软件开发就一无是处,正是因为传统软件开发强调文档对于团队成员的指导作用,开发人员可以在不知道项目细节的情况下进行开发,同时,由于开发计划一开始就已经订好,这样避免了大量同客户沟通交流的迭代会议的召开从而拥有更加富裕的开发时间,有利于开发出更好的产品。而另一方面,超前的预见性和每一阶段都要通过严格的审查才能进行下一个阶段,保证了软件的质量。
小结
敏捷软件开发和传统软件开发这两种方法各有各自擅长的领域,差异很大但是各有千秋。传统软件开发在大型、复杂的系统中优势更为明显,因为这些系统一般都具有安全关键或者其他高可靠性的属性,需求经常相当稳定,环境也具有相当的可预见性。而敏捷软件开发擅长的则是那些系统和开发团队规模较小、客户和系统的使用随时可以到位、需求和环境相对容易变更的项目。在他们各自的领域中它们的优势明显优于对手,并不能一概而论的说哪种开发方式更好、更为优秀。在未来,应用开发领域的发展趋势既需要敏捷,又离不开规范。我们可以看到,一些平衡这两者的方法正在显现,逐步建立方法,而不是自上而下剪枝,而另一方面,方法固然重要,但是同时也应该关注人、价值观念、沟通以及期望管理有关的领域[4]。
[1] 李龙澍.实用软件工程[M].北京:人民邮电出版社,2005
[2] 吴洁明,万励,莫智懿,陆科达 敏捷方法与传统软件工程方法在通用型网络考试系统开发中的应用比较 梧州学院学报 第20卷第6期
[3] 张智丽 软件开发生命周期比较之敏捷与传统 电脑开发与应用 2013年12期
[4] 夏显鄂,梁洪峻. 敏捷软件开发与计划驱动开发的概述比较 计算机工程与设计 第28卷第16期