APP下载

基于开源软件的软件工程实践教学

2022-03-25陈馨慧

软件导刊 2022年3期
关键词:补丁开发者开源

陈馨慧

(南方科技大学计算机科学与工程系,广东深圳 518055)

0 引言

随着开源软件与开源代码托管平台如GitHub的蓬勃发展,国内外许多高校已开始将开源项目应用于软件工程课程实践教学中。然而,现有课程还存在很多不足:首先,由于编程经验与背景的限制,学生对开源项目的选择自由度过小;其次,现有课程往往只关注特定软件工程概念对开源项目所带来的影响;再次,对开源项目不熟悉的学生往往会提交低质量代码,被开源软件维护人员拒收。同时,一些科技公司,如谷歌成功举办了多届谷歌编程之夏(Google Summer of Code,GSoC)[1]和FindBugs“fixit”[2]等项目,以鼓励学生为开源项目作出贡献。本文借鉴这些成功的项目经验,提出基于开源项目的“GitHub-OSS Fixit”课程作业,并对实施过程中所应用的教案以及学生对于该课程作业的反馈进行阐述。

1 相关工作

在软件工程教学方面,国外高校近年来提出了基于开源软件的实践教学模式[3-4],以培养学生“解决复杂工程问题”的能力。该方法在教学方面取得的成效较为显著,但在学生对于开源社区的选择自由度方面仍存在不足,目前暂无法大规模应用于超过100 名学生的软件工程课程。基于开源软件的实践教学模式通常由任课教师指定几个熟悉的开源软件作为课程作业的基础,使得学生无法自由选择感兴趣的开源软件。此外,学生一般缺乏开发与修改大规模软件项目代码的经验,无法系统性地学习如何参与开源社区,为其贡献代码。

企业为了推广开源软件,创办了多个以鼓励学生参与开源软件为中心的项目,其中包括谷歌编程之夏和Find-Bugs“fixit”。由谷歌举办的谷歌编程之夏[1]项目,旨在鼓励不同技术背景的学生参与开源社区,熟悉相关工作流程,利用暑假时间充分帮助他们锻炼与提升代码编写能力。虽然该项目在鼓励学生参与开源项目上取得了不错的成效,但仍存在两点不足:①有兴趣参与该项目的学生必须通过耗时繁琐的报名与选拔流程才能参与;②在开源项目选择上,参与学生仅能选择一些已提前报名参与GSoC的开源机构且只能选择该机构指定的题目。同时,为了提升静态分析工具FindBugs的质量,谷歌程序员组织了FindBugs“fixit”[2]。该活动主要基于用户所提交的缺陷报告,对Findbugs的代码进行修改,以修复用户提出的缺陷,提升FindBugs 各方面的可靠性。

本文通过基于开源软件项目的学期课程作业与基于软件工程理念的教导自动化工具,进行教学实践相关研究并提供实践教学案例,以弥补现有方法的不足。

2 基于开源项目的课程作业

为了鼓励学生参与开源项目,笔者将开源项目融入软件工程的小组课程项目中。小组课程作业共分为3 个方面:项目建议书、项目进展报告和结题报告。如图1 所示,在共16 周的软件工程课上,该课程作业贯穿课程全程共10周。在这3 个阶段中,由于学生必须在项目建议书上选择自己感兴趣的开源软件与该软件所存在的缺陷相关课程内容,因此该阶段为整个课程作业的核心部分。

Fig.1 Time schedule for team-based project assignment图1 小组课程作业时间安排

在项目建议书阶段,学生需编写4 个主要模块:①开源软件选择;②课程作业题目选择;③课程项目整体规划;④小组成员角色拟定。在进展报告阶段,学生需要对课程作业进展进行汇报,详细汇报内容包括不同静态分析工具的分析报告以及有效测试用例数量与代码覆盖率,体现出所编写代码的质量与规范性。在结题报告阶段,学生需要汇报:①整个学期所修复的开源软件缺陷的数量及所提交补丁的数量;②所选择缺陷的重要性与危害程度;③总结所学习到的软件工程知识与相关知识在项目中的应用;④未来将会继续改进的各类下一步工作。

2.1 开源软件选择

由于基于Java的程序设计课是软件工程课的先修课程,笔者认为学生已经掌握了编写基本Java 程序的技能,同时也因此限定了学生必须统一选择基于Java 编程语言的开源软件项目,但是GitHub 开源仓库上仍拥有上万个基于Java的开源软件项目供学生选择。为了解决开源软件的选择问题,笔者为学生提供了如何编写项目建议书的详细指导与说明。

在开源软件选择上,提供以下选择基准供学生参考:①易用性:每名小组成员需要成功编译所选择的Java 项目。如果成员所选择的是安卓应用,该应用程序需要在手机或者安卓系统模拟器上成功运行;②现有的测试用例:该项目需要有一些测试用例,以方便检查修改代码后引入的回归错误;③受欢迎程度:该软件在GitHub 需要拥有超过100颗星(stars);④开源项目近期维护积极性程度:该软件项目需要拥有近一年的代码提交记录(commit history);⑤尚未解决的缺陷报告(GitHub Issues)数量:该软件项目需要拥有至少15 个未解决(open)的缺陷报告,所选择的类型需以修复缺陷或者满足用户需求为目的,不能是回答用户问题、仅涉及文档修正或者仅优化测试用例;⑥贡献指南:需检查该开源项目是否有提供任何贡献指南(contribution guidelines),如有,附上指南链接。

以上基准皆用于指导学生选择一些受欢迎且有一群积极维护开发者的开源软件,选择受欢迎的开源软件可以确保开源软件的普及性。笔者认为,积极维护开源软件的开发者可视为学生的第二导师,通过审查学生所提交的补丁,指导学生如何提交高质量并符合该开源社区规范(符合贡献指南标准)的代码。

2.2 开源软件题目选择

当学生确定了开源软件后,需选择该软件项目上未解决(open)的缺陷。为学生提供以下选择基准:

(1)缺陷重要性。所选择的缺陷需要有一定的重要性,例如,一些重要的Issue 会被开发者添加“供选择”(“up for grab”)或者“寻求帮助”(“help wanted”)等标记。同时,大多数开源项目会在“贡献”(“contribute”)链接底下列出适合初学者修复的缺陷。

(2)无提交记录。该缺陷报告(Issue)中不能有已修复该缺陷的提交记录(commit history),要求不能选择已被开发者或者其他用户已经解决过的缺陷。

(3)缺陷可被复现。学生需要为该缺陷编写至少一个测试用例,确保该缺陷的可复现性,如果不了解该缺陷所提出的具体细节,请不要选择该缺陷。

(4)预计需要增加或修改的代码行数。学生需要选择相关项目中具有一定修复难度的缺陷,不能被轻易地解决。通常,笔者要求学生解决该缺陷需要增加或者修改至少10 行代码。

(5)预计所需使用的时间。学生所选择的缺陷如要修复需要花费一定时间。预计所花费时间至少是一到两周。

以上基准是为了保证学生选择既重要又需编写大量代码进行修复的缺陷,确保每名学生花费与其他学生相似的时间(以确保公平性),完成该课程作业。

2.3 课程项目整体规划

为了培养学生的任务规划能力,笔者让学生选择并规划整个学期的课程作业任务。学生需根据以上提到的“开源软件的题目选择基准”,选择5~10 个备选缺陷,最终所选择的缺陷数量取决于小组成员人数、缺陷难度和预计修复缺陷的时间。为了确保每个学生在课程作业中用时相当,笔者指定每名成员预计该学期共花费至少6 周的时间。由于学生在课程项目规划方面缺乏经验,笔者为学生提供了课程任务规划表的样例。表1 为学生需提交的规划表,其中包括缺陷的链接、类型、预计修复时间、负责修复缺陷的人数与预计的难度评级。由于极限编程提倡结对编程(两名程序员并坐在同一台电脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起编写程序),笔者限制每个缺陷的修复人数不超过两人,让学生可以自主地选择是否进行结对编程。

Table 1 Iteration planning for GitHub issues表1 GitHub 问题的迭代规划

由于学生可能会选择修复一些简单且无需编写代码的缺陷(例如润色开源项目文档和增加测试用例等),笔者在说明中表明只能选择缺陷或者功能需求(feature request)类型的Issue。在课程作业的最终目标说明上,笔者也提到学生需确保每名成员该学期至少修复两个缺陷(每个阶段修复一个缺陷)。此外,笔者也强调学生应该根据预计难度,先修复一些因为简单可能很快被其他人修复的缺陷,以免被别人捷足先登,同时也可以避免提交重复的补丁。

2.4 小组成员角色拟定

为了培养学生团队精神并鼓励学生互相帮助解决作业上遇到的问题,该课程作业通过学生自由组队的方式进行,通常一个完成作业的队伍由5~6 名学生组队完成。为了确保学生所提交代码的质量,让学生在项目建议书上选择每名小组成员所扮演的角色并附上表2。

Table 2 Roles of group members表2 小组成员所扮演的角色

如表2 所示,除负责编写代码的开发者外,还添加了一些重要的软件团队角色,包括设计师、测试员及开发与文档维护者,目的在于确保软件开发中各重要部分(如软件测试、软件设计、软件文档等)都有专人参与并监督其进度。同时,笔者也鼓励学生在不同阶段尝试扮演不同的角色,以提高对软件开发过程中不同角色的认知。

3 基于开源软件的软件工程教案

南方科技大学的软件工程课程以极限编程方法论为基础,对多个涉及软件开发与维护的重要概念进行教学。该课程共有16 周,每周有2 小时的理论课与2 小时的实验课。软件工程课程教案如表3 所示。

Table 3 Lesson plan for Software Engineering course表3 软件工程课程教案

如表3 所示,软件工程课程通过在理论课上灌输版本控制、程序分析、软件测试与持续集成的理念,加强学生对软件开发与维护的理解。同时,笔者针对每个重要理念,设计相关的实践练习题,将一些自动化工具(如单元测试工具JUnit、变异测试工具PIT 和静态分析工具PMD 等)作为实践练习题的基础,目的在于教导学生如何应用自动化工具分析与维护代码,从而保证代码质量,降低软件维护时间与成本。

4 同伴辅导

同伴辅导(Peer Tutoring)指一个有经验的学生在教师的适当指导下去帮助另一个或者多个年龄相仿的学生去学习某个技能或概念。目前,同伴辅导已广泛应用于各类教学活动。由于大部分学生对开源项目不熟悉且对自己的编程能力不自信,笔者使用同伴辅导的方式,通过借鉴学长学姐的开源项目经验,以建立学生的自信心。笔者分别通过两种不同的方式进行同伴辅导:①微信采访;②分享学长学姐录制的视频。同伴辅导的主题为“如何从零开始参与开源项目”,在微信采访环节,笔者采访了软件工程课程的前助教王同学,该生曾为知名开源项目Kubernetes贡献过代码。他提到以下几个方面:①熟悉Git 操作及GitHub的工作流程;②使用某个开源软件,然后发现不足;③参与开源软件维护,帮助开发者解决问题。在学长录制的视频方面,笔者邀请曾上过软件工程和软件测试课的徐同学录制视频。该生在所录制的视频中[8]展现了从零开始参与开源项目的亲身经历:①在开源安卓应用程序上寻找合适的缺陷;②基于测试驱动开发理念,准备用于复现缺陷的测试用例;③在开源安卓应用程序上进行缺陷的细粒度分析;④编写详细的缺陷报告;⑤提交修复该缺陷的补丁;⑥该补丁被开发者接受并归入开源项目。

5 实验结果

本文从两方面评估了基于开源项目的课程作业对学生的影响:①学生对该课程作业的评价;②学生对开源项目的贡献度。在评估学生对该课程作业的总体评价方面,采用李克特五点量表(选项包括:1.强烈反对;2.反对;3.不赞同也不反对;4.赞同;5.强烈赞同),调查学生对于“总的来说,我会推荐基于开源软件的课程作业为日后的课程项目”问题的想法。图2 显示了学生对课程作业的评价,大部分学生(82%)强烈赞同或赞同基于开源软件的课程作业并且会推荐该项目为日后的课程项目。

Fig.2 Students’feedback for team-based project assignment图2 学生对课程作业的评价

此外,在评估学生对开源项目的贡献度上,本文收集了学生所提交的补丁数量和补丁被开发者合入开源代码库的数量。该课程总共有154 名学生,在该学期结束前共为24 个不同的开源软件提交了总计214 个补丁,其中有93个补丁被开发者接受并合入开源代码库,有46 个缺陷报告被开发者标记为已解决。根据收集到的这些数据,该项目在鼓励学生为开源项目作出贡献方面效果突出。

6 结语

本文提出了基于开源软件的课程作业并详细阐述了课程作业的说明及实践教学案例。本次共有154 名学生参与软件工程课程学习,共为各大开源软件提交了214 个补丁且大部分补丁都被开发者接受并合入开源代码库。此外,经统计后的评价结果表明,学生对于基于开源软件的课程项目大致上表示认可并愿意推荐为日后的课程作业。然而,在学生所提交的补丁中有部分仍未被开发者接受,这些补丁的代码质量仍有待提升,后续将进一步加强代码规范性与可读性的教学环节,以提升学生所提交补丁的质量,达到更好的授课效果。整体而言,基于开源软件的课程项目在提升软件工程实践能力上成效显著。详细的教学实践实施方法可以参见相关教材[9],包括:课件、课程作业及详细说明与学生录制的视频等。在今后教学工作中,还将引入更多前沿的软件工程技术与工具,进一步提升教学内容的新颖性与多样化,增强学生的理论基础并提升实践动手能力。

猜你喜欢

补丁开发者开源
五毛钱能买多少头牛
健胃补丁
补丁奶奶
大家说:开源、人工智能及创新
开源中国开源世界高峰论坛圆桌会议纵论开源与互联网+创新2.0
开源计算机辅助翻译工具研究
iOS开发者调查
iOS开发者调查
栝楼产业开发者谢献忠
大病医保期待政策“补丁”