基于GitHub平台的问题驱动式编程实验教学方法

2017-09-28 02:22曾少宁李慧袁秀莲
计算机教育 2017年9期
关键词:编程语言教学方法

曾少宁++李慧++袁秀莲

摘 要:针对编程实验教学过程中,存在教师分配任务和学习提交实验代码过于耗费时间、教师评测实验代码和汇总成绩完全依赖手工等问题,分析使用云服务和开源协同开发平台功能以辅助编程实验教学的方法与过程,提出一种基于GitHub平台的问题驱动式编程实验教学方法,具体阐述在两个学期Android、Web等编程课程实验教学中对可行性和有效性的验证。

关键词:教学方法;GitHub;交互式学习;编程语言

0 引 言

GitHub是一个开源协同开发平台,支持代码库(repository)、问题跟踪(issue)、项目分支(fork)、代码提交(commit)、代码合并请求(pull request)等功能,可用于支持大规模开源和商业软件项目的开发,其最吸引人关注的研究点有GitHub开源贡献模式[1-2]、基于GitHub的商业软件开发[3-4]、社交编码[5-6]、社交行为模式[7-8]、协同工作流[9-10]、在线分布式软件开发[11]、共同创作平台[12]、推荐算法[13]及教育应用[14]。

最近,GitHub官方还推出一个面向教育的课堂工具[15],与其他用于教育的开源技术类似[16-17],GitHub也可以作为一种教学工具,用于支持软件工程专业的协同学习模式[14]。之前的研究表明,使用GitHub替代传统教学资源与教学方法,可以改进教学过程[18-19];同时,GitHub所提供的版本控制功能也可以集成到本科计算机科学课堂中[20]。一些教学工作者使用GitHub的服务优化教学过程,如专门为软件开发教学在GitHub上创建的UEC软件库[21]、在课堂中使用Github版本控制功能[22]以及使用GitHub的开源协同工作流支持课堂教学[23]。有研究案例表明,GitHub的协同开发特性可以很好地支持计算机科学和软件工程等专业学生的学习活动[24]。实际上,学生在学习过程上可以使用GitHub开展协同学习实验[25]。此外,使用GitHub布置编程课堂作业,也是一种很常见的辅助教学方法。然而,想要在GitHub上顺利执行完整的教学过程,只是将GitHub作为一种辅助教学工具使用是远远不够的。基于GitHub平台的问题驱动式编程实验教学方法,可用于支持开放协同的编程教学实验。

1 相关工作

GitHub可以看做一种特殊形式的云服务,而云技术在教学中的应用由来已久。虽然GitHub的互联网托管服务相对更适合软件工程等计算机专业教育,但是一直以来都有其他形式的云技术应用于教学过程[26]。在教学中使用云计算技术具有很多的优势[27-28],如有专门为信息技术教学创建的教育云平台[29],也有专门为材料科学基础课程创建的一种高度交互的云课堂技术[30]。此外,国内外许多高校都使用云技术创建虚拟化计算实验室[31]。实际上,云计算方法本身就非常适合用来支持实验教学过程[32],然而相对于一般的云技术,GitHub所提供的开源项目开发特性更加适合计算机编程教学,如协同开发模型、社交编码[33]、版本控制、免费代码库等。

基于GitHub平台的教学应用可以分成3类:第1类是课堂工具,其中包括前面提到的GitHub官方推出的课堂工具,但是这些工具是一种适用于教学资料管理和教学活动管理的通用技术,而不是專门针对编程教学的工具;第2类是将GitHub作为一种内容托管服务,通常只是利用GitHub开源源代码库所支持的无限空间存储和分发教学资料,如布置作业;最后1类应用相对更复杂一些,它们将协同开发模型融合到教学过程中。通常,师生都会使用GitHub的社交编码特性,如提交代码、请求合并、评论等。我们也曾经提出过一种基于GitHub平台的协同式实验教学方法[34],但是编程是一种解决问题的过程,教学中应培养学生使用代码解决问题的能力,而不仅仅是教授编程技能。

实际上,无论是开源项目或是商业项目,都在使用GitHub的问题跟踪功能跟踪和管理软件缺陷(Bug)。在GitHub上修复一个开源项目缺陷的基本过程如下。

在这个过程中,用户、开发者和核心开发者一起协作,使用GitHub提供的代码库、分支、代码提交、评论、标签、合并请求等功能修复一个问题。经过恰当的调整,这个过程就可以用来支持编程教学活动,实现一种问题驱动式教学方法,从而更高效地锻炼和培养学生解决问题的能力。

2 问题驱动式编程教学方法

根据编程实验教学的特点,如果按照前面的GitHub解决问题过程开展编程实验教学活动,就必须对解决问题过程的角色进行调整,才能最终设计出符合实验教学要求的过程。

2.1 设计教学过程

在GitHub跟踪和修复问题的过程中,如果结合实验教学的需求,用教师与学生等相关角色替代开源协同开发的角色,并且将这个过程中的活动调整为实验教学活动,就可以得到一种问题驱动式实验教学方法。

在该方法中,教师和学生都使用相同的问题、代码库、分支、提交、评论、标签、合并请求等功能完成实验教学中的各种活动。教师在这个过程中扮演着核心开发者的角色,负责创建课程代码库、检查作业代码和给学生作业评分;学生则根据实验问题要求编写和提交代码。当学生通过合并请求提交实验作业时,教师会检查作业,通过评论功能指导学生解决作业中的问题;如果教师决定接受并合并学生的请求时,学生就算是完成实验并且会获得相应的实验分数。在这个过程中,开放协同开发平台的特点使得所有学生的全部实验活动都是互相可见的。我们的课程实验发现,这种方式对于编程学习过程非常有好处,但是为了顺利完成整个编程实验,我们还需要解决两个问题:一是自动识别学生身份;二是自动生成学生的期末总评分。

2.2 自动识别学生身份

这个过程的问题是GitHub本身并不可能支持学生账号与学号的关联。学生账号都是自行在网站上注册的,记录和跟踪学生账号会带来额外的繁重工作,但是新方法不应该增加教学工作的负担。那么,该如何确定哪一位学生提交了代码,以及他/她所提交代码对应的问题号是哪一个呢?使用GitHub的版本控制功能,恰恰能解决这个问题。在每一次代码提交中,GitHub都会跟踪所有发生修改的文件,包括文件增加或删除的代码行。此外,在一次代码提交中所有新创建、修改或删除的文件都会被记录下来。在以创建问题的方式布置实验任务时(见表2),教师需要设计一个实验要求,让学生在代码中留下一个可以鉴别学号的线索,如以学号作为文件夹或文件名。图1所示为实验课程库(hzuapps/java-web)中的一个代码提交记录,里面包含修改过的文件记录,其中就可以看到学生学号的线索(se1414080902203),因此这个线索就可以在评分程序中用于关联学生账号与学号。endprint

2.3 自动评分系统

在使用信息技术辅助教学过程时,自动考核是其中要考虑的最重要问题之一[35]。只有支持合理的评分方式,一个教学方法才称得上真正有效。GitHub提供了一套开发者应用编程接口(API)[36],允许开发者编程抓取代码库的开发活动数据,包括前面提到的贡献者、问题列表、合并请求、提交代码等,因此,在编写Java评分程序时,第1个任务就是抓取课程代码库所发生的活动数据,整个评分过程如图2所示。

我们编写的Java程序的第2个任务是分析从课程代码库抓取的活动数据。由于实验要求中定义了学生身份线索(参见2.2),因此这个程序可以将每一个问题映射到一个学号上,然后它会记录所有的实验活动,包括请求数、提交数、修改文件数等,最后,程序会根据数据分析结果为每名学生生成一份实验成绩报告。例如,表3显示了课程代码库“hzuapps/java-web”中登录名为“Mr-bingo”的学生成绩报告,这名学生实验成绩为100分。满分列指每一类数据的最高分值,而平均值显示的是整个班级中每一类数据的平均值,然后,每一项数据得分可以参照平均值计算得出。需要特别说明的是,请求数是指教师接受请求的数量(参见2.1)。这个接受请求的动作是由教师评阅作业时手工完成的,而不是评分程序自动完成的。这个Java评分程序只负责采集和统计正确作业(已接受)的得分以及自动生成学生的实验成绩报告。

3 教学方法的实践及结果

为了验证所提出方法的可行性,我们在2门课程的编程实验教学过程中实践了问题驱动式实验教学方法,分别是“基于Android的移动应用设计与开发”和“基于Java EE的高级网页设计”。我们使用Java编写数据抓取程序,通过GitHub开发者API抓取实验活动数据,包括请求数、提交数、用户、评论等,再根据这些数据评估教学方法的有效性。在程序抓取到数据后,有时需人工处理少量出现问题的数据。具体地,需要进行2个人工处理操作:①删除所有没有关联到一个有效问题号的数据;②删除未能解析到一个有效学号的数据。

3.1 基于Android的移动应用设计与开发课程实验

这个课程(2016年春季)一共有4个班级162名学生选课,都使用同一个GitHub代码库(hzuapps/android-labs)。我们一共从数据中获取到162个有效问题号,但是有一些问题并没有任何的请求和提交数据,如图3和图4所示,这是因为这个课程并不是一个必修课程,一些学生可能在提交问题后选择中途退出课程。

这个实验课程一共设置了9个作业,其中包括5个必选作业和4个可选作业,这表示所有学生必须有5个以上请求获得接受,如图3(虚线)所示,有29.6%的学生完成了规定的实验;同时,一共有83个问题出现4个请求,另外有111个问题出现3个请求,换算成比例分别是51.2%和68.5%。全部学生发送的平均请求数量为4.735个,稍低于合格实验数量(5个),但在正常的范围之内,完成实验的学生数量也符合正态分布。

为了准确评估学生的实验表现,还需要进一步分析学生的代码提交数量和修改过的文件数量,如图4所示,每一个学生平均修改的文件数量为17.710个,而平均提交代码次数为7.136次,这个数字高于平均请求数(4.735)。请求数量较低的原因是一些学生会在一次请求中提交多次作业的代码。除此之外,一些学生可能会在一次实验中多次提交代码,如修改之前的错误。经过统计,我们发现学生大约需要1.5次提交代码才能完成一个请求。按照问题关联数据的分析,有50个问题(30.8%)出现了7次以上提交代码,而这个数字与平均请求数更接近一些,因此有必要在评分时考虑提交数和修改文件数所体现的实验工作量。

3.2 基于Java EE的高级网页设计课程实验

第2个课程(2016年秋季)有2个班级共79名学生选课。这些数据都来源于GitHub库“hzuapps/java-web”。我们从代码库一共获得79个有效问题,同时也抓取了请求数、提交数、修改文件数等数据,具体如图5和图6所示。这个课程一共有8个实验,其中只有1个是选做实验。

课程数据分析得到的平均请求数为6.835,比较接近要求的7个实验数,意味着这两个班级的学生完成实验情况非常好,如图5所示,一共有30个问题(38.0%)有7个以上合并的请求,另外有67个问题(84.8%)有4个合并的请求,这些学生至少可以得到合格以上的成绩;如图6所示,在提交代码次数和修改文件数量上,它们的平均值分别是12.6和20.4,因此选修这个课程的学生至少需要1.8次代码提交才能完成一次请求,这表明这个课程的学生在完成实验过程中投入了更多的时间和精力,但可能是由课程难度造成的。

4 结 语

随着GitHub逐渐成为一个最流行的开源软件开发平台,出现了许多基于GitHub社交编码服务、特性和方法的教学方法,而且GitHub也越来越多地被用作教学工具,然而相对于它所提供的工具功能,這个平台的社交编码方法对于编程学习的作用更大。我们提出一种问题驱动式编程课程实验教学方法,更注重培养学生解决问题的习惯和能力。这个方法使用GitHub的许多核心功能,如代码库、分支、提交代码、合并请求等,可以很好地支持编程实验教学活动。我们在两个编程课程中实践了这个新的教学方法,结果证明这个教学方法有效。未来,我们将探索这个教学方法在非计算机编程课程上的应用可行性。

参考文献:

[1] Tsay J, Dabbish L, Herbsleb J. Influence of social and technical factors for evaluating contribution in GitHub[C]//ICSE. Hyderabad: ACM, 2014: 356-366.endprint

[2] Guzman E, Azócar D, Li Y, et al. Sentiment analysis of commit comments in GitHub: An empirical study[C]//Working Conference on Mining Software Repositories. Hyderabad: ACM, 2014: 352-355.

[3] Peterson K. The GitHub open source development process[J]. Mayo Clinic, 2013(1): 1-10.

[4] Kalliamvakou E, Damian D, Blincoe K, et al. Open source-style collaborative development practices in commercial projects using GitHub[C]//37th IEEE International Conference on Software Engineering. Florence: IEEE, 2015: 574-585.

[5] Dabbish L, Stuart C, Tsay J, et al. Social coding in GitHub: Transparency and collaboration in an open software repository[C]//CSCW 2012 Computer Supported Cooperative Work. Seattle: DBLP, 2012: 1277-1286.

[6] Thung F, Bissyande T F, Lo D, et al. Network structure of social coding in GitHub[C]//2013 17th European Conference on Software Maintenance and Reengineering.Washington D C: IEEE, 2013: 323-326.

[7] Mcdonald N, Goggins S. Performance and participation in open source software on GitHub[C]//CHI '13 Extended Abstracts on Human Factors in Computing Systems. Paris: ACM, 2013: 139-144.

[8] Yu Y, Yin G, Wang H, et al. Exploring the patterns of social behavior in GitHub[C]//Proceedings of the 1st International Workshop on Crowd-Based Software Development Methods and Technologies. Hong Kong: ACM, 2014: 31-36.

[9] Rahman M M, Roy C K. An insight into the pull requests of GitHub[C]//Proceedings of the 11th Working Conference on Mining Software Repositories. Hyderabad: ACM, 2014: 364-367.

[10] Tsay J, Dabbish L, Herbsleb J. Let's talk about it: Evaluating contributions through discussion in GitHub[C]//Proceedings of the 22nd ACM SIGSOFT international symposium on foundations of software engineering. Hong Kong: ACM, 2014: 144-154.

[11] Marlow J, Dabbish L, Herbsleb J. Impression formation in online peer production: Activity traces and personal profiles in github[C]//Proceedings of the 2013 Conference on Computer Supported Cooperative Work. San Antonio: ACM, 2013: 117-128.

[12] Longo J, Kelley T M. Use of GitHub as a platform for open collaboration on text documents[C]//Proceedings of the 11th International Symposium on Open Collaboration (OpenSym). San Francisco: ACM, 2015: 1-2.

[13] Yu Y, Wang H, Yin G, et al. Reviewer recommender of pull-requests in GitHub[C]//IEEE International Conference on Software Maintenance and Evolution.Victoria: IEEE, 2014: 609-612.endprint

[14] Zakiah A, Fauzan M N. Collaborative learning model of software engineering using Github for informatics student[C]//2016 4th International Conference on Cyber and IT Service Management. Jakarta: IEEE, 2016: 1-5.

[15] Github classroom[EB/OL]. [2017-05-18]. https://classroom.github.com/.

[16] Stracquadanio G, Yang K, Boeke J D, et al. BioPartsDB: A synthetic biology workflow web-application for education and research[J]. Bioinformatics, 2016, 32(22): 394.

[17] Izbicki M. Open Sourcing the Classroom(Abstract Only)[C]//ACM Technical Symposium on Computing Science Education. Memphis: ACM, 2016: 723-723.

[18] Murray J. Open education: A revolution of resources and community[C]// TCC Worldwide Online Conference. Honolulu: TCC,2014: 65-72.

[19] Kamvar Z N, Lópezuribe M M, Coughlan S, et al. Developing educational resources for population genetics in R: An open and collaborative approach[J]. Molecular Ecology Resources, 2016, 17(1): 120-128.

[20] Bonakdarian E. Pushing Git & GitHub in undergraduate computer science classes[J]. Journal of Computing Sciences in Colleges, 2017, 32(3): 119-125.

[21] Goto T, Homma T, Tsuchida K, et al. Software development education based on UEC software repository[M]. Berlin: Springer, 2012: 55-65.

[22] Griffin T, Seals S. GitHub in the classroom: Not just for group projects[J]. Journal of Computing Sciences in Colleges, 2013, 28(4): 74.

[23] Zagalsky A, Feliciano J, Storey M A, et al. The emergence of GitHub as a collaborative platform for education[C]//The ACM Conference on Motivation and Dynamics of the Open Classroom CSCW 2015. Vancouver: ACM, 2015: 1906-1917.

[24] Feliciano J, Storey M A, Zagalsky A. Student experiences using GitHub in software engineering courses: A case study[C]//International Conference on Software Engineering Companion. Washington D C: IEEE Computer Society, 2016: 422-431.

[25] Kertesz C Z. Using GitHub in the classroom: A collaborative learning experience[C]//2015 IEEE 21st International Symposium for Design and Technology in Electronic Packaging. Brasov: IEEE, 2015: 381-386.

[26] Ercan T. Effective use of cloud computing in educational institutions[J]. Procedia-Social and Behavioral Sciences, 2010, 2(2): 938-942.

[27] González-Martínez J A, Bote-Lorenzo M L, Gómez-Sánchez E, et al. Cloud computing and education: A state-of-the-art survey[J]. Computers & Education, 2015(80): 132-151.

[28] Liou W K, Bhagat K K, Chang C Y. Beyond the flipped classroom: A highly interactive cloud-classroom(HIC) embedded into basic materials science courses[J]. Journal of Science Education and Technology, 2016, 25(3): 460-473.endprint

[29] Yokoyama S, Yoshioka N, Shida T. Cloud in a cloud for cloud education[C]//International Workshop on Principles of Engineering Service-Oriented Systems. Zurich: IEEE, 2012: 63-64.

[30] Burd S D, Luo X, Seazzu A F. Cloud-based virtual computing laboratories[C]//Hawaii International Conference on System Sciences. Hawii: IEEE, 2013: 5079-5088.

[31] Khmelevsky Y, Voytenko V. Cloud computing infrastructure prototype for university education and research[C]//Western Canadian Conference on Computing Education. Kelowna: ACM, 2010: 8.

[32] Yang G Z, Zhou F, Zhu Z. The application of SaaS-based cloud computing in the University Research and Teaching Platform[C]//International Conference on Intelligence Science and Information Engineering. Wuhan: IEEE, 2011: 210-213.

[33] Lima A, Rossi L, Musolesi M. Coding together at scale: GitHub as a collaborative social network[J]. Eprint Arxiv, 2014(7): 25-35.

[34] 曾少寧. 基于GitHub平台的协同式实验教学方法[J]. 计算机教育, 2016(12): 144-148.

[35] Zamyatina O M, Mozgaleva P I. IT implementation in the educational process of future engineers by means of project activities and competences assessment[C]//Global Engineering Education Conference. Berlin: IEEE, 2013: 1170-1176.

[36] Github Developer. REST API v3[EB/OL]. [2017-05-18]. https://developer.github.com/v3/ .

(编辑:宋文婷)endprint

猜你喜欢
编程语言教学方法
基于JavaScript编程语言之 闭包技术在焦点轮播上的应用
计算机软件Java编程特点及其技术研究
计算机软件JAVA编程优势及其应用
基于gitee的皮肤科教学方法研究
高职院校音乐选修课信息化教学方法与实践探索
开发者小副业Python,为何成全球最热编程语言
《计算方法》关于插值法的教学方法研讨
《计算方法》关于插值法的教学方法研讨
基于计算机应用软件开发的Java编程语言研究
小学语文字理教学方法探析