张海清,赵卫东,李代伟,唐聃,魏维,吴四九
(1.成都信息工程大学 软件工程学院,四川成都 610225;2.成都大学 计算机学院,四川成都 610100)
Github是一个开源协同平台,是一个面向开源及私有软件项目的托管平台,支持Git协议作为唯一的版本库格式。Github是基于Git的代码托管平台,缴费客户可建设私人仓库,免费的客户只能使用公共仓库,代码需要公开。Github由Chris Wanstrath,PJ Hyett 与Tom Preston-Werner三位创始人在2008年4月发布。除了Git代码仓库托管及基本的Web管理界面外,还提供了订阅、在线文件编辑器、讨论组、文本渲染、协作图谱及代码片段分享(Gist)等功能。现在,托管版本数量很多,也有其他知名开源项目Ruby on Rails、jQuery、python等。Git分布式版本控制系统主要应用在软件项目托管平台,通过网页访问公开或者私人项目,浏览源代码、修改代码及注释。其最突出的特点在于“阶段版本控制”,它可以浏览任意提交过的版本并提供文件历史库,团队成员也可以在其内置聊天程序中进行交流,非常便捷[1-2]。随着版本控制系统Git的广泛应用,越来越多的项目被移植到Github上[3]。由于Github基于版本控制技术,其突出的版本控制性和团队协作性,可以用来作为一个辅助教学系统工具[4-6]。
学生的实验数据和实验报告文档可以存储在学生自己的本地仓库中,本地仓库由Git维护的三棵“树”组成。一是工作目录,持有实际文件;二是暂存区(Index),临时保存改动;三是HEAD,指向最后一次提交的结果。学生可以提出修改(把它添加到暂存区内),有如下使用命令:
git add <filename>
git add *
这是Git工作流程的第一步。使用以下命令以实际提交改动:
git commit -m “提交信息”
改动现在已经在本地仓库的HEAD中了。执行以下命令以将这些改动提交到远端仓库中:
git push origin master
可把master改成要推送的任何分支。分支用来将特性开发绝缘开来。在创建仓库时,master是“默认”分支。在其他分支上面进行开发,开发后再将它们合并到主分支上。
如还没有克隆现有仓库,并将仓库连接到某远程服务器上,可用如下命令:
git remote add origin <server>
这样就能够将改动发送到所添加的服务器上。
Markdown是一种可使用普通文本编辑器编写的标记语言。设计它的目的是用最简单的语言快速生成网页页面,无须复杂的程序设计。用简单的标记语法,就可使普通文本内容具有富文本的格式。Markdown有系列的衍生版本,用来扩展Markdown的功能,比如表格、内嵌HTML、脚注等。Markdown的语法简单、易学,并且功能要比纯文本更强,所以Github用它作为平台的基本文本样式,平台以“README.md”的文件名作为默认页面文件,当用户进入页面时,自动以网页形式呈现该文件的内容。
由于Markdown的原文是普通文本,所以可以使用同一个IDE编辑器编写程序和文档,这样就极大提高了程序和文档的可维护性,同时也方便教师的批改,既可线上修改,也可线下修改。
Markdown文件除了可以在网页直接呈现之外,还可以用像RStudio这样的编辑器,快速将Markdown转化为演讲PPT、Word产品文档、LaTex论文。因此Markdown语言必将越来越广泛地应用于信息工程领域的文档编写工作中。
在实验开始前,与所有平台一样,每名教师和学生必须要注册一个账号。所以实验前的准备工作首先应是专门针对Github平台使用技能进行训练,通过搭建Github实验环境,可以让学生熟悉和掌握Github平台工具的基本用法,这是后续实验的基础[7]。申请Github账号的过程比较简单,但是要将教师的账号和学生的账号绑定在一起就比较繁琐。最简单有效的方法是通过代码仓库(repository)进行联系,见图1。教师和学生都必须先申请一个账号,然后各自创建自己的仓库。通常,教师仓库TeacherRepo是公开的,便于所有学生直接查看,而学生仓库StudentRepo是私有的,这样学生之间就不能互相访问对方的仓库。这样设计是为了避免学生互相抄袭。教师仓库TeacherRepo用来存储教师的课程资料和实验指导材料相关文档,学生仓库StudentRepo用来存储学生的实验结果文档。
实验准备阶段中有一个对教师来讲比较繁琐的工作,就是批量确认学生发出的申请邮件。由于这个工作是在教师的邮箱界面进行的,不属于Github的管理范围,因此必须逐个手工确认。一旦邮件确认成功,对于每个学生的StudentRepo仓库而言,就有了两个成员,一是学生本人,二是教师,允许学生和教师共同维护StudentRepo。实验教学过程中允许学生提交实验报告,允许教师批改实验报告。
在师生都准备好了仓库之后,就可以开始实验,教师和学生的实验过程是一个协同工作流,见图2。教师应将每个实验分配到TeacherRepo中的不同目录,学生可以Fork到自己的仓库中。学生应按照TeacherRepo中的实验要求完成实验,最好以Markdown格式编写,在教师规定的时间内将实验结果和实验报告推送(push)到StudentRepo中,完成实验。系统会自动记录推送日期,教师可以查看学生是否按时提交。
在实验截止日期到达之后,教师需要将学生的实验结果通过Git命令下载到教师本地电脑中,然后进行实验报告的批阅。批阅过程很简单,就是在学生原代码或者原文件上直接写上正确的文字。特别是对于代码文件,教师只管将正确的代码替换学生的代码即可,无须专门指出学生哪里有错误。教师逐一批改完每名学生的实验文档之后,应将文档分别推送到每个学生对应的StudentRepo中,让学生查阅实验批改情况。
特别需要强调的是,相比Word或者PDF文字处理工具,教师的批阅过程极其方便和快捷。教师对实验报告的审阅无须像文字处理工具那样添加批注,只需要专注学生出现的问题,在学生的原始文件上直接修改即可。而且由于同一个实验的标准答案都是一样的,在很多情况下教师可以直接复制粘贴,大大提高了评阅的效率。
教师上传到StudentRepo的批改后的实验报告是标准答案或者是对学生错误的批注,学生看到的也是最新版本的内容。由于Github完全基于Git协议,所以它提供了一个非常强大的功能就是查看文件历史(history),该功能可以在界面上直接呈现教师批阅的文件痕迹,见表1,学生在Github界面上查看教师评阅痕迹。这些批注都是在教师在批改报告的时候自动生成的,学生看到这样的批注,就立即知道教师修改了哪些地方。
在整个实验协同工作流中,教师需要使用Git命令批量下载和推送实验报告文档,也可能需要批量查询学生的完成情况或者完成一些自定义的操作,手工对每名学生进行这些操作可能会需要花费大量的时间。Github对外提供了一套开发者应用编程接口(API),允许开发者编程抓取代码库的开发活动数据[4],教师可以通过编写应用程序或者脚本,自动访问Github资料库中的用户和资源。
表1 学生在Github界面上查看教师评阅痕迹
在实验过程中,除了通过文档的交换完成实验工作流之外,Github还通过Issues功能提供了成员之间的沟通渠道。教师和学生可以非常方便地在Issues实现沟通和交流,同时教师也可以了解学生之间交流的情况,教师在学生项目开发过程中的控制和管理更加方便,测评也有了合理的依据[8-9]。对于这些数据信息的处理,还可通过第三方工具Miningit和Bicho来实现。通过这两个工具,用户可以抓取项目的相关数据信息并存储到本地数据库中,以便进一步研究和使用[10]。
通过以上讨论,可以看出Github特别适合作为软件工程专业及信息科学专业学生的实验教学平台。不仅在校园内,学生毕业进入到社会工作之后,Git机制还可在公司内部进行高效的代码管控。同时,也应该看到,这个工作流也有一些局限性,如无法判断学生抄袭情况,无法自动给实验评分[11],对其他非软件工程专业的实验管理不方便等。而Github系统平台也意识到了其对教育教学的辅助功能,线上已经推出面向教育的课堂工具[12-14],Github课堂提供了教师面对众多学生进行高效的辅助实验教学的功能模块。