徐建军等
[摘 要]软件工程的工程教育属性决定了其对实践环节要求非常高。针对传统瀑布模型在软件工程实践课程教学中存在的问题,探索使用Scrum敏捷软件开发模型指导学生进行软件项目开发的方法,并根据实际情况在选题、分组、Scrum实践和考核等方面进行改革,有效提高了学生的学习积极性、软件开发能力和软件工程素质等。
[关键词]软件工程实践 敏捷开发方法 Scrum
[中图分类号] TP311.5-4;G642 [文献标识码] A [文章编号] 2095-3437(2015)04-0115-03
软件工程的工程教育属性决定了其对实践环节要求非常高。学生只有真正地去开发一个具有一定规模的软件项目,才能够掌握并加深对软件工程基本理论知识的理解;才能通过具体工程实践熟练使用相应的工具完成需求分析、设计建模、协作开发、测试和评估各个环节,掌握主流的软件开发方法和软件项目管理方法,全面提高软件工程素质和能力,为将来从事软件项目的研发奠定基础。
软件工程实践课程为软件工程专业学生提供了必不可少的实践环节。目前一般指导学生按瀑布模型进行开发,使学生能够体验到完整的软件开发过程。但学生通常没有项目开发经验,难以一步到位,过多的文档极大地增加了学生的工作量,组内分工不均,往往过多依赖少数优秀学生工作。在教学过程中不同程度地存在重结果轻过程、重技术轻管理、重个人能力轻团队作用的现象。[1]
软件工程实践课程需要一种能够提高开发效率,适合小团队并能够充分调动团队成员积极性的实践方法。敏捷软件开发方法是一种以人为本、轻文档重产品的软件开发方法,与“非敏捷”方法相比,敏捷软件开发方法强调适度的过程管理、高效的沟通、快速的适应变化能力和紧凑自组织的团队等。Scrum作为敏捷开发方法的一种实践框架,提出了敏捷开发过程的预定义角色和最佳实践方案。笔者近几年在软件工程实践教学中指导学生应用Scrum模型进行项目开发,本文介绍这方面的探索经验。
一、Scrum敏捷开发方法
Scrum于1993年由Jeff Sutherland和Ken Schwaber创立,是一种迭代式增量敏捷软件开发框架,为敏捷开发实践提供了具体的行动纲领[2],目前Scrum已在Google、华为等大型软件公司得到广泛应用。如图1所示,Scrum模型需要将整个项目周期划分为多个Sprint(冲刺),Spritn为一个迭代过程,每个Sprint从整个项目的待开发产品Backlog(清单)中选出多个构成Sprint Backlog,迭代完成后则发布一个可交付的软件版本。
项目参与人员在Scrum模型中被划分为3种角色:产品负责人、Scrum Master和开发团队。产品负责人是客户利益的代表,主要负责确定产品功能、合理安排功能实现优先级以及评估开发团队的工作成果等;Scrum Master作为项目经理同产品负责人紧密工作,确保开发过程按计划进行、排除遇到的困难、保证开发团队的工作效率和成员间的合作不受外界影响;开发团队包括设计人员、开发人员、测试人员等,具体负责按承诺及时完成开发任务,有高度的自我组织能力。
在Scrum模型中,还包括3个制品和4种会议。[3]3个制品为:①产品Backlog,以用户故事形式表示的产品需求列表,由产品负责人维护具体条目,开发团队估算工作量;②Sprint Backlog,定义了一个Sprint的开发目标,在Sprint过程中不允许发生变更;③燃尽图,公开展示的图表用于记录任务完成情况,直观反映了Sprint的执行过程。4种会议为:①Sprint计划会议,产品负责人向开发团队介绍和分析产品Backlog,开发团队挑选出本次Sprint承诺要完成的条目;②每日站立会议,团队所有成员参加的短会,所有人站立开会,交流项目进展情况;③Sprint评审会议,开发团队向产品负责人和其他相关人员演示产品功能;④Sprint回顾会议,所有人员都要反思这个Sprint,为了进行持续的过程改进。
二、软件工程实践教学
由于Scrum模型适用于规模较小的团队,并具有可检查、适应性强、透明性好和学习成本低等优点,适合在软件工程实践课程中指导项目开发。[4] [5]然而,学校环境与软件公司环境有所不同,学生在能力和经验方面与公司员工的也存在差距,课程的主要任务还是培养和锻炼学生。因此,应结合实际教学情况对Scrum模型进行适当调整。
(一)分组和选题
首先根据自愿原则把学生分为多个项目组,每组5-7人,划分小组时需考虑沟通效率和学生开发能力等因素。Scrum模型要求团队成员之间密切沟通,而且项目开发更多是在课外时间进行,所以要求学生根据所在宿舍、选课等情况分组,确保小组内部交流顺畅。同时每组应至少安排1-2名软件开发经验较丰富的学生,以保证项目开发的顺利进行。分组后需按Scrum框架给组内学生分派角色,刚开始每个组内软件开发能力最强的学生往往被选为Scrum Master,此处需要纠正的是,Scrum Master更注重管理和协调能力。
实践题目一般由教师提供,也鼓励项目组向教师推荐,但要征得教师的认可。实践选题的难度不宜太大,最好是开发团队熟悉并感兴趣的领域,课程的目标是体验软件开发的过程,并注重软件的完成质量,要求作品质量能达到与市场上的产品媲美的程度。已有的选题包括:二手交易、网上书店、社交平台、新闻聚合、手机游戏等。
(二)Scrum实践
我校软件工程实践课程安排两个月左右的时间,被划分成3个Sprint,每个Sprint约3周。这里介绍其中关键环节的实施情况。
(1)制订Sprint计划
项目组通过Sprint计划会议制订工作计划,确定本次Sprint的目标。产品负责人首先需要与客户代表(即教师)充分沟通后,创建整个产品的Backlog,然后在计划会议上向开发团队详细介绍每个条目,并说明完成的优先级。开发团队从产品Backlog挑选出本次Sprint承诺要完成的条目构成Sprint Backlog,并估算完成各个条目所需的工作量,将其分解成具体的开发任务,然后通过自愿领取的方式分派给开发团队的某个成员。由于课堂时间有限,选择一个准备充分的项目组在课上进行展示,其余组在课后完成,并向教师提交会议成果。
(2)每日站立会议
每日站立会议由项目组的Scrum Master组织,教师旁听,仅在必要时给出意见。按Scrum框架要求,会上每个人必须解释和回答3个问题:昨天完成了什么?今天计划做什么?还需要哪些帮助?会议限定时间少于15分钟,Scrum Master会后根据进展情况相应更新燃尽图。由于每周仅一次课,要求项目组每周至少进行3次站立会议。
(3)结对编程
在校学生没有太多的软件开发经验,编程能力参差不齐,所以笔者在教学过程还引入极限编程中的结对编程方法。让两名学生构成一个开发小组,他们之间能够有效交流、相互学习和传递经验,提高整个团队的工作效率。
(4)Sprint评审及回顾
在一个Sprint完成后,由开发团队中的测试人员向产品负责人和客户代表(即教师)演示阶段成果,产品负责人和教师给出改进意见。Scrum Master汇报本次Sprint的完成情况,并展示燃尽图,教师进行点评。在Sprint回顾会议上,项目组通过投票的方式选出本次Sprint做得好的3个环节和下次Sprint迫切需要改进的3个问题。
(5)文档撰写
敏捷开发方法强调可用的软件重于完备的文档,但并不意味着不写文档。软件工程实践课程要求学生编写适量的文档,这也是培养软件工程能力的一方面。文档撰写按照Scrum的角色进行分配,Scrum Master负责软件开发计划和实施过程文档,产品负责人负责可行性论证报告和需求分析文档,开发团队负责软件设计文档、软件测试文档和安装手册等。
(三)考核方式
为使课程考核尽可能客观、公正,在课程验收阶段,每个项目组都要进行公开演示,其余项目组和教师一起对该组进行量化打分,评价内容包括难度、质量、创新和界面四个方面。教员结合演示情况和文档对项目进行综合评价,小组互评占80%,教员评价占20%。其次,Scrum Master要给出组内每个成员的具体业绩系数,然后在项目组总成绩的基础上再确定每个成员的最终成绩。
三、教学效果
我们已经在2个学期的软件工程实践课程中使用了Scrum模型,在激发学生学习兴趣、提高软件开发质量等方面取得了较好的效果,主要体现在以下几个方面。
(1)激发了学生的创造力和主动性。在实践过程中,开发团队是通过自愿领取的方式分派开发任务,每日例会和燃尽图将小组成员的开发进度公开展示出来。后进学生体会到项目压力,努力上进,使项目组内部形成一种良性竞争机制,从而使学生更积极主动地参与项目开发。
(2)提高了学生的软件工程素质。将项目开发过程拆分为多个Sprint,最终形成一个软件产品,这符合软件开发的基本规律,而且这种“计划、实施、评价、改进”的迭代开发体验对于经验不多的软件工程专业学生来说帮助非常大。一般而言,第一个Sprint效果不会太好,到第三个Sprint基本上每个项目组都有很大改进。
(3)学生的软件开发能力得到明显增强。在敏捷开发框架下,学生只编写一些重要文档,能够将精力重点放在编码和调试上。通过结对编程,基础差的学生可以向好的学生学习(实践证明相互学习的效果很好),也提供更好的设计质量和代码质量,改善了工作纪律性,。
(4)评价更加客观公正。由于Scrum透明性好的特点,每位学生的工作完成情况在实践过程中一目了然,所以对学生的评价相对是比较容易的。项目组之间互评的机制也保证了评价的公正性。
但目前也还存在一些不足,主要体现在:计划制订不尽合理,项目组成员之间的交流还不够积极,课后工作落实不到位,文档作用体现不明显,部分学生因为基础差、自觉性差等原因参与度不高。这些都是我们下一步重点解决的问题。
四、结语
Scrum敏捷开发模型具有可检查、适应性强和学习成本低等优点,适用于小规模的软件开发团队。在软件工程实践课程教学中,我们尝试用改进的Scrum模型指导学生进行软件项目开发,能够有效激发学生的积极性和主动性,使其参与开发互动,从而了解软件项目开发过程,提高软件开发能力和软件工程素质,项目完成质量和教学效果有明显改进。
[ 注 释 ]
[1] 曾红卫,刘悦,刘炜.软件工程实践教学方法探索[J].计算机工程与科学,2011(A1):15-18.
[2] Scrum(software development)[J / OL].http://en.wikipedia.org / wiki / Scrum_(software_development), lasted visited ,2014
-10-20.
[3] Henrik Kniberg著.李剑译.硝烟中的Scrum和XP——我们如何实施Scrum[M].北京:清华大学出版社.http://infoq.com / cn / minibooks / scrum-xp-from-the-trenches,lasted visited 2014-10-20.
[4] 林晓宇.基于Scrum敏捷方法的软件工程实践教学探索[J].电脑知识与技术,2011(19):4762-4765.
[5] 徐海涛,吴昊.基于Scrum和极限编程结合的软件项目实践课程教学改革与实践[J].福建电脑,2013(4):44-46.
[责任编辑:覃侣冰]