软件212程敏捷方法的实验框架及实施

2014-07-01 22:33朱少民
计算机教育 2014年7期
关键词:软件工程框架实验教学

朱少民

摘要:在阐述了敏捷方法的特点以及引入软件工程教学中所遇到的困难之后,基于过去两年在同济大学软件工程课程的本科教学实践及探索,提出适合软件工程敏捷方法的实验框架。这个框架可将敏捷方法的理论教学和实验有效地结合起来,在本科教学中获得良好的应用效果,深受学生欢迎。

关键词:软件工程;敏捷方法;Scrum;实验教学;框架

1 问题提出

过去的软件工程课程大纲都是按照软件开发过程的瀑布模型来设置课程内容的先后次序,即在软件工程基本概念介绍后,从需求分析与定义、系统总体设计、详细设计、编程到测试这样一个过程。其相应的实验课,可以按照这个次序来安排其环节,从需求、设计、编程到测试,主要内容都被覆盖了,一个学期正好完成一个完整的软件开发过程,实验内容容易和课堂教学保持同步,两者衔接自然,这样教学实验也比较容易实施。

目前业界流行敏捷开发方法(Agile Metho-dology),多数软件公司已采用或正在采用敏捷开发方法。在软件工程课程中,为了适应这种新的变化,培养满足企业实际需要的人才,有必要在软件工程课程教学中引入敏捷开发方法。在引入敏捷方法过程中,理论教学遇到的问题会相对少些,而困难的地方是其实验教学,无论在其设计还是具体实施时都面对很大的挑战。

除了适应业界新的需求,特别是移动互联网应用开发的需求,将敏捷引入软件工程本科教学中,也有非常有利的一面,有助于提高教学质量,主要体现在以下几个方面:①敏捷方法的小团队适合学生实践,学生每个实验组一般是4-5个人。

②敏捷的趣味性也适合现在的学生,容易调动学生参与实验的积极性。

③敏捷团队强调自我管理,没有团队领导,有利于培养每个学生的责任感和团队的荣誉感,提高每个学生自我管理的能力。

④敏捷更强调可工作产品本身的价值,符合学生的期望,他们更希望早一点看到自己开发的成功,早日获得成就感,也是培养学生真正的核心实力——开发和测试的能力,而不是文档的能力。

但是,如果引入敏捷方法,软件工程课程的实验教学,特别是实验内容设计上,会遇到很大挑战,因为敏捷方法强调快速迭代,一个迭代周期一般只有2-4周。如果只让学生完成一个迭代的实验,“迭代”实质上就没有发生,和原来的瀑布模型就非常相似,学生对迭代的理解就比较困难。为了让学生能够理解迭代,进而更好地理解敏捷方法,有必要让学生在一个学期的实践过程中,完成3~4个迭代,交付多个版本,亲自践行软件开发的较完整的敏捷过程。但是,如果学生在软件工程实践中完成多个迭代,其实验设计难以和课堂理论教学内容衔接起来,因为教学内容不会按迭代来安排重复几次。这是笔者要解决的问题之一,就是如何做到软件工程课堂理论教学内容和实验环节同步起来。

第二个问题是如何让基于敏捷方法的软件工程实验达到良好的实践效果。现在所经过的软件过程包含了多个迭代,每个迭代周期时间短,学生在这样一个非常短的周期内完成若干个用户故事(即几个需求点或功能特性)的实现,包括这些功能特性的详细设计、代码编写和测试等工作。但在做这些工作的同时,还要处理系统整体的架构设计、界面设计、数据库设计等工作,还要持续维护产品需求表,这对缺乏工作经验的学生来说,无疑会面临巨大的挑战。如果实验环节设计不合理、指导方法不妥,那么实验效果可能会很差。

第三个问题是如何为基于敏捷方法的软件工程实验提供一个理想的环境。过去软件工程课程的实验环境都是基于瀑布模型建设的,不能适应敏捷方法的实践要求。例如,对于敏捷方法的Serum过程模式,许多工程元素的表达、操作和处理的方式都不一样。

①Scrum的需求是通过用户故事(UserStory)、Product Backlog等进行描述。

②任务工作量通过小组成员玩敏捷估算扑克来进行估算。

③进度通过将“任务帖子”从“To do”移到“In progress”“Testing”“Done”等栏目下进行控制,即依赖燃尽图(Bumdown Chart)来控制。

还有更多具有鲜明特点的敏捷实践,如测试驱动开发(Test Driven Development,TDD)、结对编程、持续集成、持续测试等,这也需要相适应的软件开发环境来支撑。

最后,就是在实践中,如何让学生更好地理解敏捷宣言所主张的理念,体现在以下几点:

①个人与协作胜于流程与工具。

②可工作的软件胜于完备的文档。

③客户合作胜于客户谈判。

④响应变化胜于遵循计划。

特别是如何让学生不要忘记宣言最后一句话:“也就是说,尽管右项有其价值,我们更重视左项的价值”,右边项“流程、文档、工具、计划”等还是有价值的。

2 目前研究现状

在2001年敏捷宣言发布之前,大家对敏捷没有统一的认识,但敏捷方法已存在,而最早敏捷方法的代表之一则是极限编程(eXtremeProgramming,XP)。KentBeck在1996年3月成为C3(Chrysler Comprehensive Compensation System)项目负责人,开始对项目的开发方法学进行改善。之后他写了一本关于改善后的方法学的书《极限编程解析》,并于1999年10月出版,意味着极限编程的诞生。敏捷方法引起业界广泛关注,还是在敏捷宣言发布之后,这方面的研究文章从2001年开始就逐渐多起来了,讨论如何将敏捷方法引入软件工程教育中,要落后于业界的研究,最早研究出现在2003年,之后开始有比较多的研究。刚开始还是集中整体考虑如何在软件工程相关课程中引入敏捷方法。直到2-3年后,人们开始关注其实践或实验环节,而且侧重讨论极限编程、TDD(测试驱动开发)的引入。而目前流行的敏捷方法,是以Scrum为代表,而不是极限编程,对Scrum的研究相对要落后得多,这方面的论文不多见。在国内,关于如何在软件工程引入敏捷方法的论文也不多,主要因为国内业界在采用敏捷方法的时间,相对国外也迟得多。其次,国内大学和业界之间的交流和协作相对国外也比较少。当然,更重要的原因是,敏捷方法没有得到官方IEEE-CS/ACM计算教程指南(Guidelines for Computing Curricula)以及国内软件工程教学指导委员会的明确支持。endprint

3 敏捷方法的实验框架

软件工程课程是一门实践性很强的课程,需要实验的支撑,只有理论联系实际,才能达到良好的教学效果。例如,在同济大学,设置了一门与软件工程课程并行教学的实验课程:软件工程设计。这样,实验教学就是“强制要求的”。

同济大学用一学期完成软件工程课程教学及其实验,敏捷方法采用Scrum过程框架。在国内大学,一个学期时间为4个月,将一个学期的时间分为4个阶段,每一阶段为1个月。第1阶段为软件开发的前期准备阶段,包括产品定义、基本需求分析、数据流及其数据结构分析、系统架构设计和产品发布计划(Release Planning)等工作。而第2、3、4阶段,对应敏捷开发的3个迭代周期,即Scrum过程模式中sprint。后面3个阶段才是学生真正动手实践的阶段。

除了完成产品的开发,我们还是要将分析与需求定义、相关的设计技术、持续构建与集成、单元测试、功能测试和非功能测试等内容融入到迭代过程,还要让学生理解软件工程思想、质量管理、配置管理等内容,所以在设计实验框架时,要考虑上述内容的难易程度、不同的优先级和相互依赖性,分别对待,有先有后,有轻有重。根据这样的思想,第一个迭代要尽量简单,每个Serum环节过一遍就可以了,然后在第2、3个迭代中逐步增加内容(如结对编程、单元测试、持续集成、TDD或ATDD等),逐步加强实验环节。

从敏捷本身来看,也可以分为思想、原则、流程、方法和工具、实践等,先要理解敏捷产生的背景、思想和原则,其中对开源软件运动、软件即服务(Software as a Service)等对软件开发模式的影响也是要讲解的要点。例如,SaaS模式发生后,产品发布即刻就能部署到公司内部的服务器上,用户几乎同时就能使用服务。相对发布包装盒产品,SaaS的交付速度快得多、交付成本忽略不计,这也大大降低了修复缺陷的成本,使之持续交付成为可能。基于敏捷思想和原则,指导学生运用敏捷流程和方法,指导学生开展具体的活动,但同时,通过敏捷过程、敏捷实践更好地帮助学生理解敏捷的思想和原则。这些敏捷的要素相辅相成,贯穿整个实验过程。

根据上述分析,最终形成如表1所示的基于敏捷方法的软件工程课程实验的框架,以阶段来安排,通过任务分层展开,并通过交付内容来考核实验效果。同时,在设计时,保持和理论教学的同步,实验和理论教学两边都要做相应的调整,达到教学和实验的目标。

4 具体实施

对于基于敏捷的软件工程实验环节,缺乏可参考的优秀实践,更需要教师和助教更多的投入,参与到每个团队的实验过程中。理想情况下,每个学生实验团队,在其中一个迭代中能全程得到教师或助教的示范作用。如果做不到这点,至少在其中一个迭代的各个关键环节(如发布计划、Spring计划、某天的站立晨会、产品review会议、反思会)中,教师或助教至少出现一次。教师参加学生实验组的各种会议时,也可以观察员身份参加,不参与讨论。但发现问题时,会及时指出或给予示范。如果把时间错开,教师和学生可以支持12个组,以每组4~5个学生计算,最多支持60个学生。所以在基于敏捷的软件过程课程教学中,应该有更多的教师参与教学,每个教师教30个学生为佳。

敏捷方法体现以人为本的知识管理,更重要的是体现敏捷团队“自我组织或自我管理”的特点。所以,在其实验管理中,也尽量相信学生、尊重学生,以更开放的态度对待学生的实验,培养学生积极参与管理过程,提高学生自我管理的意识。笔者尝试的有益做法主要有:

(1)以前多数是教师命题,而现在鼓励学生自主命题,自己定义待开发的产品,可以是web应用系统,也可以是移动App应用,还可以在上个年级的遗留系统上进行二次开发。这不仅可以提高学生实验的积极性,更重要的是培养他们的责任感,兑现自己的承诺。

(2)以前每个成员贡献是由组长给出百分比,但在敏捷情况下,没有组长,采用每个学生给自己团队的各个组员(包括自己)打分,最后选择合适公式如[(Max+4×Average+Min)/6]算出各组员所得的分数。

(3)实验答辩的成绩评定也让学生参加。例如,第一个组答辩成绩由第2、3、4组评定,第2组由第3、4、5组评定,以此类推,最后一组由第1、2、3组评定。最后学生评分占总分35%,教师和助教评分占65%。

在过去两年的软件工程教学过程中,还尝试了一些其他敏捷开发的实验方法,经过检验,达到了预期效果,例如:

(1)构建一个集软件开发过程管理、配置管理和项目管理为一体的平台来支撑课程实验,有利于教师全程跟踪和管理实验过程,并营造一个真实的企业环境,使学生的实验更规范、更贴近业界的实际操作。这里推荐开源系统Redmine(http:∥www.redmine.org/)。

(2)学生分组人数一般4~5人,但以前实验团队是由学生自由、自愿组合而成,现在可以考虑随机产生,团队成立前,组员之间关系不能保证融洽。这样会增加学生沟通的困难性,更有利于培养学生的团队意识,提高学生的沟通能力。

(3)为了让每个学生得到全面的训练,在每个迭代中学生可以扮演不同的角色。在Scrum里总共有3个角色:ScrumMaster、Product Owner和团队一般成员,这样一个组有4~5人,在3轮迭代中,每个学生都有机会扮演不同的角色。

5 结语

从事软件工程课程的教学已有两年了,感觉这门课程教学不容易,其实验就更不容易,对教师很有挑战。教师不仅需要深刻理解软件工程敏捷思想的真谛,熟悉敏捷方法的各个要素,还需要能够通过具体示例、神谕等说明敏捷开发的原则,才能使学生真正理解敏捷方法。教师还要熟知从需求、设计、代码、测试、部署到项目管理等各个方面,而且能把这些内容整合起来,前后贯通,形成可实践、可应用的实验体系。

要教好软件工程这门课程,应结合学生特点和能力,精心设计整个教学过程,使学生能够学中做、做中学,理论和实践交替进行,达到良好的教学效果。endprint

参考文献:

[1]Dingsoyr T,Nerur S,Balijepally V,et a1.A decade of agile methodologies:towards explaining agile software development[J].The Journal of Systems and Software,2012,85(6):1213-1221.

[2]Highsmith J,CockbumA.Agile software development:thebusiness of irmovation[J].Computer,2011,34(9):120-122.

[3]Hedin G,Bendix L,Magnusson B.Introducing software engineering by means 0f extreme programming[C]∥Boris Magnusson. International Conference on Software Engineering.Springer,2003-05-03:586-593.

[4]Hazzan O.Teaching a software development methodology:the ease of extreme programming[C]∥Soffware Engineering Education and Training,2003.IEEE,2003-03-20:176-184.

[5]LeJeune N F.Teaching software enfmeering practices wish extreme programming[J].JCSC,2006(21):3.

[6]RicoDE SayaniHH.Use of agilemethodsin software engineering education[C]#2009AgileConference.IEEE,2009:174-179.

[7]林晓宇,钟一文,黄世国,等.基于Scrum敏捷方法的软件工程实践教学探索[J].电脑知识与技术:学术交流,2011(19):4762-4764.

[8]李中华.倪明涛,敏捷开发模式在本科计算机科学与技术专业教学中的应用探索[J].科技信息,2010(21):137-138.

[9]Vladan D,Milenkovic S R.Teaching agile software development:a case study[J].IEEE Transactions on Education,2011,54(2):273.

(见习编辑:刘丽丽)endprint

猜你喜欢
软件工程框架实验教学
基于科学探究的高中生物实验教学探索
网络与云技术在实验教学中的应用
框架
浅谈框架网页的学习
基于Jmeter对Node框架性能的测试研究
初中化学实验教学中“微课”教学模式的探讨
谈初中化学实验教学的初探
依托工作室的软件工程实践教学研究
基于工程教育认证的《软件工程》课程教学质量建设研究 
关于如何创新和完善计算机软件工程管理的探讨