基于敏捷开发的软件工程实践教学探讨

2018-04-25 07:36白晓颖李山山李明杰叶德铭
实验技术与管理 2018年4期
关键词:工作量项目管理评估

白晓颖, 李山山, 李明杰, 叶德铭

(清华大学 计算机科学与技术系, 北京 100084)

随着Web 2.0和软件即服务的兴起,软件开发模式在近几年有了很大改变。遵照Web 2.0的原则,在线更新以及频繁发布已经是大多数互联网软件的常态。作为一种轻量型的软件开发方法,敏捷开发应运而生,也成为软件工程教学的一个主要改革方向。

1 敏捷开发过程

图1是一个敏捷开发方法Scrum的过程。用户提出的产品需求被分解成小的用户故事,每个迭代周期在制定计划时选择实现一部分需求。经过1~2周到1个月的迭代过程形成可交付的软件增量。迭代过程中,团队成员每天讨论前一天完成的工作和当天的任务。

图1 Scrum开发过程

现代工业界的这种转换也推进了大学课程的改革[1-3],敏捷开发在软件工程课程中得到了越来越多的关注。传统的软件工程教学中,常常遵循划分明确的计划、需求、设计、实现和测试周期等阶段,而敏捷开发则强调拥抱变化、增量开发、以运行的软件作为评价工作的尺度、持续集成、自组织团队、用户和开发人员一起工作等理念[4],因此,如何设计基于敏捷的软件工程教学及实践环节,成为教学改革的一个挑战性问题。与一般的软件工程教学一样,敏捷开发的教和学必须通过真实开发过程训练来开展,以培养学生的实践能力[1,3]。团队开发是目前一种普遍采用的方法,学生可以通过实践来理解理论知识。有了这些来自“现实世界”的项目,学生不仅可以学习软件工程的方法,而且可以在开发过程中,更加真实地体验用户沟通、环境约束等方面的问题。

2 敏捷开发软件工程实践教学面临的挑战

但是,要支持敏捷开发的连续跟踪和反馈的课程实践模式是很困难的,尤其是当学生规模比较大的时候。总体来说,要用敏捷开发进行软件工程课程实践教学的改革,面临着以下挑战[2,5]。

(1) 项目组织。我们的课程有150多名学生,让大家做同一个项目会缺乏区分度,学生也会觉得单调没有挑战性,对课程实践缺乏兴趣。此外,随着软件融入社会生产、生活的方方面面,软件工程课程的实践教学内容也必须丰富项目的类型,开拓学生的视野并活跃思维。但是,这样做遇到的问题是:项目从哪里来,如何设计项目使其适合课程的教学内容,如何让学生选择项目,在保证公平性的同时,营造相互学习和相互竞争的项目实践氛围。

(2) 过程控制。从简要描述的用户需求到最终交付原型系统,每个项目的全部开发过程必须在一个学期内完成,软件是在连续的Scrum周期中不断快速迭代开发及交付的。为了保证敏捷开发过程的最佳效果,我们需要跟踪每个团队的进度和活动,对每个迭代周期提供反馈,并定期检查和评估进度[6-7]。这样做工作量巨大,因此在课程中需要采用大量的自动化工具来协助教师进行开发过程的管理。

(3) 过程评估。我们不仅需要评估最终交付的软件产品的质量,也需要评估团队中每个学生在软件开发过程中的表现:既要有规范量化的客观评价机制,同时也需要一些定性的工作评价(比如项目过程中的交流与合作);既要把每个团队作为一个整体进行评估,也要区分团队中每名学生在项目中的个人贡献。在评价过程中,评分和排名对于团队项目来说是很困难的,特别是对于开发质量的度量和人员的评估[8],这些都需要特别的考虑和分析。

针对以上需求,我们精心设计了软件工程课程的实践教学方案,搭建起了相应的支撑平台。本文介绍了在课程组织、过程管理、过程评估和工具开发等方面的探索以及总结的经验。介绍了课程设计的目标、项目的选择和项目团队的设置,Scrum过程和支持持续质量控制的平台,以及提出了评估的指标和度量方法,并对课程情况进行了统计分析。最后总结全文并讨论未来的工作。

4 敏捷开发软件工程实践教学课程的设计

软件课程是我校本科三年级的必修课,学生已经经历了编程语言、数据结构和算法的学习。在本门课程中需要培养学生系统的软件开发方法,掌握软件开发的技能,并参与真实的软件工程实践过程中。因此,设立以下目标,并设计了相应的实践内容来配合这些目标。

3.1 实践教学课程的目标

(1) 全过程参与。通过完成一个真实项目,学生体验到软件开发的全过程,包括从用户界面到应用逻辑,从数据存储到网络交互,从模块设计到层次管理,以及满足功能和非功能需求的权衡,这些都是在真实软件开发过程中会遇到的。

(2) 工程素养。学生需要在实践过程中遵循软件工程规范,养成良好的开发习惯,如消除不良代码、连续的版本控制、进行基于覆盖的单元测试等。学生需要掌握了解工具链的重要性,并实践各种软件开发工具,以帮助检查编码风格、检查错误和测试覆盖率等。经过一个学期的软件项目开发中的反复使用及强化,这种做法应该成为学生今后在工程开发中的良好习惯。

(3) 迭代开发和增量开发。对于一个只具有基本编程技能的学生来说,从一开始就设计一个复杂的系统是非常困难的。学生需要逐步理解需求,熟悉各种开发框架和软件工具。因此,课程的实践教学过程需要精心的设计,以指导学生逐步搭建起系统,并逐步完善。通过这一过程,学生了解到需要将需求分解成可实现的小任务,并逐渐掌握如何将系统分解成耦合度较小的模块,方便其开发。

(4) 团队的组织与协作。在团队中,每一个学生承担着不同的角色和职责,有团队领导,也有系统构架师,也包括负责质量控制的人员。在实践教学中,需要推动团队成员密切合作,不仅仅与团队成员之间需要合作,他们也需要与用户密切合作。同时团队成员需要学会平衡成员之间的工作量,以激发每个参与者的积极性,并做出相应的贡献。同时,学生也可能需要与其他团队进行合作,组成和整合自己的子系统。

3.2 项目的多样性

实践项目的选择是实际教学中的一个关键问题,许多学校都尝试引入真正工业界的项目,但是,考虑到学生的背景和课程设置的局限性,很难找到具有适当规模、复杂性和工作量适中的工业项目[9]。在我们的尝试中,也有同样的问题,主要是:

(1) 班级规模很大。每年有140~180人选修此课程,造成小组指导和监督需要大量的工作量。

(2) 学生水平参差不齐,80%名学生是三年级的学生,20%是二年级的学生。在全部学生中,大约只有20%的学生有较丰富的开发经验,而其他学生只有几百行规模代码的编写经历。

为了解决这个问题,一个合理的解决方案就是提供多样化的项目选择,使不同层次、不同兴趣的学生都能找到适合自己的项目。

因此,选择了来自不同领域的项目供学生选择,这些项目有工业界的、学校内部的,也有学生自己挑选的,代表了不同客户类型、不同复杂性和难度级别、不同体系结构风格和技术的项目。表1显示了过去3年中项目来源的统计数据,其中包括与其他课程的联合项目、校园用户、学生组织的项目和真正的工业客户的项目。一些典型的项目有:学生电台的点播(VOD)系统、工业界公司的高可用信息分发系统、基于人脸识别Web API的签到系统、基于Android蓝牙协议的车辆娱乐系统等。

表1 项目来源

项目来源的多重性使得项目种类丰富,让学生在选择过程中有了很高的灵活性,激发了学习兴趣,同时通过跨个项目之间的交流也丰富了学生在实践中的经验。

3.3 双赢团队

在一个学期的课程实践教学中,这些大三为主的学生需要大量的教师指导、频繁的项目交流和快速的开发反馈才能建立起课程知识系统的概念,因此需要寻找更多的资源来帮助学生进行学习,更好地掌握课程知识。

在课程教学中,邀请了用户代表提供相关领域的知识,并为每个项目设置一个助教。助教一般由高年级修过软件工程课程的学生担任,这样,每个项目小组由多个开发团队、一名高年级学生助教和一名用户代表组成。一般来说,每个开发团队由3~5名成员组成,学生自由结合。这样,每个学期大约有40个小组,每个项目大约有5个小组。图2描述了项目小组和团队的组织结构。

图2 项目小组构成

这样的团队方式被称为“双赢团队”,我们希望通过这种方式来倡导一种团队文化,使队友都在团队中占有举足轻重的地位,作为一个整体共进退的集体。

4 对项目管理的持续质量控制

如图3所示,项目分成3个管理阶段。

在开课前的4周,教师就开始联系潜在用户并收集项目建议书,要求项目按照课程进行调整,从中筛选出适合课程实践教学需求的项目作为学生实验备选项目。在开学的第一周,项目助教对每个项目进行介绍,然后学生自由组成开发团队,选择相应的项目。这样,项目小组就由用户代表、助教和学生开发团队形成了。在接下来的9周内,整个团队共同完成系统的开发过程。在每个项目小组的Scrum过程中,用户代表、助教和开发团队在每一个迭代周期(1~2周)中见面,给用户展示迭代成果,并由用户提出建议或者新的需求;而项目助教每周都与开发团队见面,讨论开发进度。在这过程中,我们把文档作为一个反思过程,让学生进一步回顾和总结开发过程和经验。整个开发结束后,每个开发团队的项目成果都需要打包,并部署在指定的云平台或客户提供的环境中,并与必要的描述文件和配置文件一并交付给用户。

为了更好地支持过程管理,我们在GitLab版本控制系统[10-11]基础上搭建了一个项目管理平台,图4为此项目管理平台的体系结构。

图3 项目开发过程

图4 项目管理平台

学生的日常开发工作是使用GitLab进行版本控制的,每次提交到GitLab后会自动运行Jenkins和Codeface,进行编译、测试和分析。Jenkins和Codeface对每次提交产生不同的报告,这些报告自动发送给学生,同时也发送给系统中的评估工具来对本次提交进行评估。Jenkins和Codeface都是开源的软件工具,Jenkins可以集成各种插件工具,这样它就可以支持各种类型的项目分析,包括编码风格等。它也可以与Docker和xUnit框架整合,支持自动编译和测试。Codeface具有各种项目统计的功能,如版本号、代码行数、注释行数等。它也可用于连接到GitLab的数据库进行更深入的过程分析。

5 项目评估和结果

在项目的评估中有以下原则:

(1) 不只评价团体成果, 也评估各成员的贡献。尽管我们鼓励学生在一个团队中同甘共苦,但仍然会有个别学生表现得非常突出,也有的在团队中贡献很少。在团队得分的基础之上,评估会根据个人的表现和贡献赋予相应的奖励或惩罚分数。

(2) 不只评价最终成果, 也评估开发中间结果。在项目管理平台的支持下,我们不断采集项目报告并评估项目进度,每次项目提交都会有相应的评价,与传统的项目评价相比,全过程中的评价能给学生快速反馈和指导。

(3) 不只评价软件产品, 也评估项目管理过程。我们设置了一些项目管理的评估点,包括工作计划的安排和执行、团队成员之间的工作量平衡、客户参与度和团队建设等。

在课程的项目开发过程中,项目管理平台会根据收集到的各种统计数据,产生当前各个项目开发团队的评估结果,并实时显示在项目管理平台上,同时也会给出相应的分数以及各团队的排名情况。有了这些评分和排名,将会激励各个开发团队,产生同行竞争。如图5所示为系统产生的报告,图5(a)显示的是对课程中所有的项目进行的包括提交、协作、分支、工作量和工作计划在内的不同方面项目健康状态的统计。每个方面都划分了4个等级,优秀、良好、一般和差,并显示了每个等级包含项目的数量。图5(b)是对每个开发团队的统计数据,它表明了每个学生的行为,如提交、更新、问题等。

课程的评价标准就是根据这些评估原则进行设计的,如分支评价、提交评价和协作评价等。

图5 项目管理平台统计

在软件的并行开发过程中,项目管理上有着不同的分支模式[12]。尽管在版本控制系统中广泛使用分支,但是并行开发中各成员并不能很好地遵守开发规范,往往导致分支和合并无法顺利完成,并行开发无法顺利进行下去。这通常是学生使用版本控制中遇到的一个严重的问题,可以通过避免分支来解决此问题,但这就失去了并行开发的意义。在课程中,定义一个指标来评估一个项目的分支是否合理、是否符合团队开发的模式。例如,一个评估点是“不同的任务应该在不同的分支上实现,这些任务应该在稍后合并到主分支”。如果一个项目没有分支,或者没有及时合并分支,项目评分将会被拉低。

版本管理中提交到项目库也需要遵循一定的准则,例如应以合理的频率提交更改,过于频繁的提交可能表明不够谨慎,未经测试就提交了;而过少的提交数量表明缺乏足够的版本控制,这两种情况都将受到处罚。另一个指标是提交的注释的质量,提交应该有高质量的文档,这意味着提交应该包含足够的说明,短于长度阈值的注释将被扣分。

团队协作可以衡量团队成员之间的工作量是否平衡,一个指标是根据代码贡献量来评估工作量,然后根据每个团队成员的工作量的标准差来进行评价各成员工作量是否平衡,也就是团队协作的情况,较小的标准差表明团队有更好的合作。图6显示了一个开发团队的各项评估指标,其中雷达图显示了该团队项目质量的一个多维评价,包括分支、合作、工作量等。

图6 项目质量度量

为了激励学生的积极参与和踊跃竞争,每个团队成员个人和团体也有排名,图7显示了每个人的提交排名统计,包括总提交数、每周提交数和每月提交数。

图7 提交排名情况

通过频繁的反馈和评估,学生的工程实践能力明显得到了提高。与其他没有使用敏捷开发和强化质量控制课程的学生相比,我们课程的学生在团队协作方面的表现要明显好于他们。在工程素养方面,图8显示了整个学期分支和协作的平均分数变化曲线,可以看出2个分数在逐渐提高,这表明学生越来越习惯于良好的工程习惯。

图8 持续改善

6 结语

本文介绍了在软件工程课程实践教学中3年的探索与研究。课程实践采用多样化的项目设置,使用定制的敏捷开发模式,设计开发了项目管理平台能够支持持续的质量监控和评估,同时设计定义了评估标准。通过课程的实践教学过程,希望能够帮助学生在尽可能真实的环境中体验现代开发技术和开发过程,积累软件工程的经验。

致谢:感谢所有参与到本课程中的教师、用户以及学生的支持,特别感谢Wolfgang Mauerer博士和他的团队提供的Codeface工具,共享他们的知识和经验。

参考文献(References)

[1] Anslow C,Maurer F. An experience report at teaching a group based agile software development project course [J]. ACM SIGCSE’, 2015(15):500-505.

[2] Chatley R, Field T. Lean learning: applying lean techniques to improve software engineering education [J]. ICSE-SEET’,2017(17):117-126.

[3] Laplante P A. An agile, graduate, software studio course [J]. IEEE Transactions on Education, 2006, 49(4):417-419.

[4] Martin R. Agile Software Development: Principles, Patterns, and Practices [M]. London: Pearson, 2013.

[5] Ghezzi C, Mandrioli D. The challenges of software engineering education [J]. ICSE’,2005(5):115-127.

[6] Marques M. Monitoring - an intervention to improve team results in software engineering education [J]. ACM SIGCSE’,2016(16):724-724.

[7] Paasivaara M, Vanhanen J, Heikkila V T, et al. Do High and Low Performing Student Teams Use Scrum Differently in Capstone Projects? [J]. ICSE-SEET’,2017(17):146-149.

[8] Alperowitz L, Dzvonyar D, Bruegge B. Metrics in Agile project courses [J]. ACM ICSE’,2016(16):323-326.

[9] van Vilet H. Reflections on software engineering education [J]. IEEE Software, 2006,23(3):55-61.

[10] Feliciano J, Storey M A, Zagalsky A. Student experiences using GitHub in software engineering courses: a case study [J]. ICSE’, 2016(16):422-431.

[11] Rayana R B, Killian S, Trangez N, et al. GitWaterFlow: a successful branching model and tooling, for achieving continuous delivery with multiple version branches [J]. RELENG 2016,2016:17-20.

[12] Appleton B, Berczuk S P, Cabrera R, et al. Streamed lines: Branching patterns for parallel software development [J]. Proceedings of PloP,1998.

猜你喜欢
工作量项目管理评估
装配式EPC总承包项目管理
基于大数据分析的集合式EPC总承包项目管理软件技术的应用
项目管理在科研项目管理中的应用
第四代评估理论对我国学科评估的启示
未来如何更高效地进行工程项目管理
一个兼顾教学科研的高校教师绩效考核模型及其应用
思科发布云计算市场发展报告
评估依据
网上互动教学工作量管理的困境及对策
儿科病房护理工作量与护理人员配置调查研究