敏捷开发与传统瀑布模型的比较及教学
2011年第4期福建电脑
61
敏捷开发与传统瀑布模型的比较及教学
王
冲
(汕头职业技术学院广东汕头515078)
【摘要】:敏捷开发是软件工程领域中新兴的一种软件开发模式,作为一种流行趋势的新兴技术,不少公司都在尝试实施敏捷开发转型。本文对这种新兴的敏捷开发与传统软件开发模式作了比较,通过比较阐述敏捷开发思想的优越性,并给出了敏捷开发在教学中的一些建议。
【关键词】:敏捷开发;开发模式;瀑布模型;软件工程
1、引言
在高等院校的计算机专业中,高年级学生一般都开设了《软件工程》这一课程。但是根据笔者近五、六年的《软件工程》教学实践总结发现,《软件工程》这一课程在实习实践中的应用效果差强人意。笔者曾经对学过本课程的毕业班学生做过一个非正式的调查访问。调查结果显示,只有少部分同学在他们毕业设计或毕业实习等过程中能主动、自然地应用软件工程中的相应规范,并能切实体会到《软件工程》这门课程给他们带来的好处。但绝大部分同学实习结束后,回校毕业答辩时的也都认为"软件工程的理论对于他们的以后的工作有指导性作用"。基于这样的调查结果,笔者认为在职业教育中引入了近年来在我国软件行业非常热门,且较容易上手的敏捷开发,作为对传统软件开发模式的完善,非常之有必要的。本文通过与传统开发方法的一一对比来剖析该方法。2、传统方法学
在现阶段的《软件工程》教学中,有相当大的篇幅都是用来介绍传统方法学。而传统方法学的特点是比较抽象的,这个特性要求学生具有较高的抽象能力和数学归纳能力。但是由于高等教育的普及,招生人数扩大,学生素质相对来说下降。加上学生对软件工程认识不够,认为软件工程在实际应用中用处不大。传统方法学,瀑布模型是其最典型的代表。
瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落,这也是瀑布开发名称的由来。从本质来讲,它是一个软件开发架构,开发过程是通过一系列阶段顺序展开的,从系统需求分析开始直到产品发布和维护。其主要特点是:与一般系统工程一致,易于使用,不要求特别的技术与工具也能较好地进行软件开发;其缺点是:难于很好地表达和描述用户的需求。
瀑布模型的软件过程如下图所示:
3、敏捷开发方法
敏捷开发是近些年兴起的一种软件开发与管理的思想,以其灵活性,易操作性得到软件行业的广泛关注。敏捷开发方法是一组开发方法的统称,主要包括极限编程、Scrum、精益开发和动态系统开发方法(DS-DM)、特征驱动开发(FDD)等。它的基本原则有迭代式开发、增量交付、互动式开发、持续集成等。在软件开发过程中,敏捷开发具有开发精确、高质量、高速度、高投资回报、高效率等优点,因此敏捷开发方法越来越受到广大程序员的青睐。
敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
敏捷开发路线图如下:
3.1Test-DrivenDevelopment,测试驱动开发。3.2ContinuousIntegration,持续集成。3.3Refactoring,重构。
3.4Pair-Programming,结对编程。3.5Standup,站立会议。
3.6FrequentReleases,小版本发布
。
62
福建电脑2011年第4期
3.7MinimalDocumentation,较少的文档。
3.8CollaborativeFocus,以合作为中心,表现为代
码共享。
3.9CustomerEngagement,现场客户。3.10AutomatedTesting,自动化测试。3.11AdaptivePlanning,可调整计划。
敏捷软件开发宣言个体和交互胜过过程和工具;
可以工作的软件胜过面面俱到的文档;客户合作胜过合同谈判;响应变化胜过遵循计划。
4、方法学比较
敏捷开发强调改进,它善于吸收其他方法的优点,它不是凭空而来的新事物。
4.1分工:传统方法学阶段划分分明,一般来说每个阶段由不同的人来完成,即分析员做分析,测试员做测试。如果在分组完成课程设计或毕业设计时,采用传统方法学,容易造成学生参与度的不高,完成前部分的学生,不会去关注其后续部分,不利于学习。但是敏捷开发强调简单设计,团队每个成员都从接触客户到分析设计,到编码,全部承担。
4.2传统方法要求用户需求明确,只有在正确的需求下才能得到正确的下一步结果。但是在实际的软件开发过程中,软件的需求往往是变化的。原因有时是顾客不能很好的表达自己的需求,或者顾客和开发者理解上的差异。而且大多数情况下软件开发过程需求还会不断随时间变化而变化,而瀑布开发模型很难适应这种变化。虽然针对瀑布模型的这一不足,涌现了许多开发模型,比如螺旋模型和统一过程开发模型。尽管与瀑布模型相比,这两种模型有了很大改进,但它们应用起来仍然无法适应需求的快速变化。敏捷拥抱变化,允许变化可以随时随地发生。在敏捷开发中,变化与增加新功能是没有矛盾的。
4.3传统方法是文档驱动的,每一阶段没有得到相应的文档,是无法进行下一阶段工作的。在教学中,对学生尤其是理科学生而言,撰写文档是枯燥的,它会降低学生的学习积极性。而敏捷开发实现任何一个功能
都是从测试开始,它是以测试驱动开发的。所以它对文档的要求较低,这对学生而言,比较容易保持兴趣。敏捷开发首先对业务需求进行分析,分解为一个一个的Story,记录在StoryCard上。然后两个人同时坐在电脑前面,一个人依照Story,从业务需求的角度来编写测试代码,另一个人看着他并且进行思考,如果有不同的意见就会提出来进行讨论,直到达成共识。
4.4传统方法开发软件的过程,往往是顾客与开发团队的利益博弈的过程,所以在开发过程中顾客的参与度不高。这也往往会是导致最终开发软件与顾客理想软件有差距的重要原因。而在敏捷开发中,要求顾客和开发团队一起开发。在敏捷开发中,代码是归团队所有而不是哪些模块的代码属于哪些人,每个人都有权利获得系统任何一部分的代码然后修改它,如果有人看到某些代码不爽的话,那他能够对这部分代码重构而不需要征求代码作者的同意,很可能也不知道是谁写的这部分代码。这样每个人都能熟悉系统的代码,即使团队的人员变动,也没有风险。
4.5传统方法中集成是在后期的一个重要阶段,它是一个独立的阶段。集成是一件很痛苦的事情,通常很长时间才会做一次集成,这时候的集成往往问题众多,要进行调试的话,难度很大。一般来说,人在这个过程中,容易产生疲劳感。敏捷开发中,软件集成很频繁,每一次集成的改变也很少,即使集成失败也容易定位错误。而且敏捷开发往往是自动化测试的。
4.6传统方法往往要到最后才能得到可执行的产品,而敏捷开发很早就可以的到可执行的产品。
当然敏捷开发和面向对象方法也有一定的联系。迭代也是敏捷开发的推动力,同样迭代和无缝性是面向对象方法学的两大特性。掌握迭代,敏捷的大部分事情往往就迎刃而解了。不论长度,所有的迭代都有相同的模式,这也是敏捷开发规律的一部分。在迭代的每次过程中,我们都要重复做分析、设计、编码等过程,这个过程和小瀑布又有点类似。
通过上面比较我们看到,敏捷开发和传统方法相比做了不少改进,但是它并不是全新的一种方法学,它是一种综合了各种方法学优点的方法学。在学习过程中,我们对比其他方法学来学习,可以达到事半功倍的效果。在教学过程中,特别是程序设计语言的课程设计中,由于在这个时间较紧张,在这个过程中,如果采用敏捷开发的话,即可节省时间,又可以增强学生的团队合作能力。同时,由于学生学习程度的差异性,我们在结对的时候,可以以好带差,所以说敏捷是一种不错的选择。同时在教学过程中,我们完全可以在用实践来体验它的优越性。5、一些问题
敏捷开发不是万能的,敏捷开发并不是一种一成不变的方法,它允许我们对它进行改(下转第129页
)
2011年第4期2009%";
福建电脑
129
即使在Sno列上建立了索引,优化器还是会采用顺序扫描方式处理该SELECT语句。如果把SELECT语句改为:
SELECT*FROMStudentWHERESno>"20090000"ANDSno
用索引来执行查询,显然会大大提高查询速度。3.4避免相关子查询
查询嵌套层数每增加一层,查询的效率成几何级的降低。要想提高嵌套语句的执行效率,则应减少嵌套语句的嵌套的层次。所以在实际应用中,若可以用连接查询代替的子查询,则用连接查询实现。
例:查询选修了"3-105"号课程的学生基本信息用子查询的方法如下所示:
SELECT职工号FROM职工ASe1WHERE月工资=(SELECTMAX(月工资)FROM职工ASe2WHEREe1.部门号=e2.部门号)
以上的查询对于外层的职工关系e1中的每一个元组,都要对内层的整个职工关系e2进行检索,因此
查询效率不高。可以构建临时关系提高查询效率。
SELECTMAX(月工资)AS最高工资,部门号IN-TOtempFROM职工GROUPBY部门号
SELECT职工号FROM职工,tempWHERE月工资=最高工资AND职工.部门号=temp.部门号3.7用排序存取来取代非顺序存取
非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。4、结束语
查询处理是数据管理系统的核心,而查询优化技术是查询处理的关键技术。在数据库的开发和维护过程中,查询优化设计可以提高系统的性能,尤其对于数据量大的数据库系统最为重要。本文提到一些优化方法是笔者根据自己的经验,并查阅了大量的文献资料总结出来的。具体到应用程序中要根据实际情况,才能合理制定出良好的优化方法,实现快速、高效的数据查询。
参考文献:
[1]萨师煊,王珊.数据库系统概论[M].高等教育出版社,2002.5.[2]周志易,江海.数据库系统理论与新技术[M].北京理工大学出版社,2001
[3]陶宏才.数据库原理及设计[M].清华大学出版社,2004.
SELECT*FROMstudentWHERESNOIN(SE-LECTsnoFROMscWHEREcno='3-105')3.5合理使用存储过程
存储过程是数据库服务器上一组预先定义并编译好的Transact-SQL语句。它可以接受参数、返回状态值和参数值,并且还可以嵌套调用。当一个存储过程被第一次运行时,将被放入内存并完全编译,在该存储过程被再次调用时(无论是由同一用户还是不同用户调用),可以被马上处理而没有任何额外开销。另外存储过程是一种模式化的程序设计,通过将公共集合编写为合理的存储过程,可避免冗余代码,减少程序员的工作量。因此,使用存储过程可提高数据库执行速度。3.6使用临时表优化查询
在涉及相关查询的某些情形中,构造临时关系可以提高查询效率。如:查询每个部门中月工资最高的"职工号"
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(上接第62页)
进。在敏捷开发中存在一些问题,这些问题在教学中可能感觉不到,但是的确存在。
5.1顾客和开发团队作为两个不同的组织,不管是企业文化还是工作习惯都是有差异的,而敏捷开发要求顾客和开发团队一起合作。如何在开发中消除或减少这种差异。
5.2对传统团队中的项目经理来说,如何从原来的管理模式中转换过来,这也是个挑战。
5.3由于敏捷开发没有建模、工具及框架,有部分人就认为敏捷开发不需要这些,这是一个误区。在这种情况下,如何启动项目,如何建模,如何将功能特性加入产品。
5.4敏捷基层化和敏捷神圣化。等等以及其他一些观念上的问题,如何转变。6、结论
虽然说敏捷开发是一种新方法,但是事实上我们看到,他是一综合了多种传统开发方法的优点,整理出来的一套开发组织方法。因此敏捷开发是一个新的思路,它不一定是所有软件开发的终极选择。它也存在一些问题,但只要我们遵循敏捷开发最基本的务实精神,用变化的而不是死板的观点来思考,我们相信问题肯定可以解决。在理解这种新方法的过程中,了解其他方法的优缺点,然后适应变化而做出改进。最后,笔者的建议:鼓励深入并持续去认识敏捷,了解它背后的思想基础,并且尝试不同的实践去加深理解。
参考文献:
[1]张海藩,软件工程,人民邮电出版社,2009:15-16
[2]邓辉,敏捷软件开发:原则、模式与实践.清华大学出版社,2003:9,132