基于Moodle平台数据驱动的机试系统研发
2019-04-01唐宇鹏唐亚哲朱海萍吴茜媛
唐宇鹏,唐亚哲,朱海萍,吴茜媛
(西安交通大学 电子与信息工程学院, 陕西 西安710049)
1 研究背景
计算机编程目前已经成为高校理工科专业的必修课,而许多高校编程课程的考核还停留在传统的笔试方式。编程类课程的教学目的是让学生具备程序设计、编码和调试的全流程能力。在纸上书写编程题不但与编程学习的初衷相悖,也给考生和阅卷教师带来了很多不便[1]。因此,只有进行机试,才能科学衡量一个学生的编程水平,引导学生提升自己的编程能力[2-3]。
目前机试在高校中并不普遍,主要原因如下。
(1)现有的机试系统,要么仅采用了机试形式,学生提交源代码,但要教师手工评测;要么采用比较先进的程序源代码结构分析、相似性分析等技术,在源代码层面上评估学生的编程水平。这种方式的问题在于:技术不够成熟,评估的客观性和正确性存在争议。总之,没有简单好用的机试系统是机试没有被普遍应用的重要原因。
(2)虽然很多学校有针对编程竞赛的在线评测(Online Judge,OJ) 和题库,但这类OJ都是对外开放的,其封闭性无法满足考试要求,也无法导入考生信息。更重要的,OJ的评测方式是竞赛的评测机制,通过就是满分,未通过就是0分。这样的评测方式有些极端,不适合计算机编程课程的考核。
(3)现有的机试系统题目和顺序都是固定的,没有给予学生自主选择题目的权限,考核方式缺乏科学性。
基于上述分析,笔者提出了机试系统的基本要求:机试系统必须能够自动评分、简单可靠,又能正确客观地评估学生的水平,还能提供各种辅助功能协助教师组织和实施机试。
目前Moodle在高校计算机教学工作中得到了较好的普及[4],学生和教师已熟悉了Moodle的基本使用方法。Moodle中可以安装OJ(Online Judge)插件[5],可以完成在线评测和自动评分[6],为基于Moodle开发机试系统提供了可行性。本文提出的基于Moodle的机试系统原则是尽量使用Moodle本身提供的各种功能特性,减少对Moodle系统源代码的修改,使机试系统像Moodle一样简单可靠[7-8]。具体来说,机试系统使用Moodle提供的OJ插件完成学生提交程序的自动在线评分[9],通过建立大容量分难度的题库,给学生在同一难度上提供多个题目选择,减少偶然性带来的评估误差。
2 Moodle系统分析及机试方案的提出
Moodle(Modular Object- Oriented Dynamic Learning Environment)是一个开源的课程管理系统(CMS)[7],优点是开源、免费,平台界面简洁、美观、实用。由于其强大的功能和先进的教育理念,Moodle得到了国际广泛认可和使用[8]。我国各大高校也在教学工作中广泛使用Moodle。通过引入OJ功能,Moodle系统为程序设计类课程提供了非常方便的作业在线评测。
本文机试系统的研发来自学校的教学改革项目,根据计算机系机试需求,机试系统需要支持用户上载源程序、自动在线评测、分数统计等功能,能支持200人同时机试,机试系统的生成时间不大于60秒,系统响应时间小于2秒。基于Moodle系统开发时,应尽量减少对原Moodle系统的修改,以保持系统的可靠性和简单性。换句话说,应尽量以增量的方式而不是以修改的方式研发机试系统。
分析Moodle的源代码可以发现,Moodle系统中在线评测部分的主要流程见图1[9]。通过跟踪发现,该流程的运行过程其实就是对课程分类(course category)、课程(course)、节(section)、模 块(modules)、 题 目(assignment)和 用 户(user)等多个数据库表单进行操作的过程[10]。具体来说,每一个课程分类中含有若干课程,每个课程的题目分为若干的节,每个节中有若干模块,而模块和题目一一对应。上述所有数据,最终通过上下文(mdl_context)表单中的路径联系在一起,Moodle课程核心部分E-R图见图1。
图1 Moodle系统OJ部分数据库E-R图
基于Moodle开发机试系统的原则,本着尽量少修改源代码以保持可靠性的目标,本文提出了通过数据库层面的操作来完成机试系统研发的思路。具体来说,就是仅仅对之前提到的课程分类(course category)、课程(course)、节(section)、模块(modules)、题目(assignment)和用户(user)等数据库表单,根据机试需求进行记录的插入和修改,而保持Moodle的基本架构和基本运行流程不变,可称之为数据驱动的机试系统开发。基于这个机试方案,本文进行了简单的可行性实验,实验结果验证了该方案的有效性。
3 系统设计
系统设计的重要一环就是分析Moodle的OJ系统的流程以及流程中每个步骤完成的相关数据库操作,包括其操作的数据库名称和操作的具体内容,见表1。
机试系统的核心思想就是为每位参加机试的考生创建一门课程,课程名称就是考生的学号。同时,为每位任课教师创建一个课程分类,该课程分类包含所有参加此次机试的考生对应的课程。为了更科学地评估学生的编程能力,机试系统从题库选取4种难度的题目,每种难度的题目随机选取4道,分别放在4节中,考生可根据自身情况从每个难度中选择一道题目完成,这样可以有效避免机试题目的偶然性。教师还可以根据实际情况划分4道题的分数占比。基于表1,新建构的机试系统流程及每个流程所操作数据库见表2。
基于上述研发思路,机试系统在Moodle的基础上增加了考试课程生成模块。教师上传学生信息之后,只需点击添加课程按钮,机试系统便自动从题库中按照1—4的难度顺序随机挑选题目,并在mdl_assignment和mdl_assignment_oj_tests中添加相应的记录。系统会为代课教师在mdl_course_categories中添加课程分类,并根据上传的学生信息在mdl_course中为每个学生在该课程分类下建立课程。之后,系统按照之前生成的题目在表mdl_course_modules中生成相应的题目模块。最终,系统在表单mdl_context中将生成的题目模块与各个学生课程进行连接,整个过程见图2 。
表1 Moodle的OJ系统流程及其与相关数据库的对应关系
表2 新的机试系统流程及其与相关数据库的对应关系
图2 考试课程生成模块
4 具体实现
机试系统研发的实现工作包括搭建Moodle系统平台、建立数据库、编写操作数据库元素的应用程序、程序测试与系统调试、考试现场的环境搭建。对数据库进行的操作都存放在系统外的PHP文件中,且在Moodle教学网页中可以通过自定义按钮直接跳转到这些PHP文件中,所有修改均没有大范围改变Moodle源代码,而是将自己独立的代码通过这样的“接口”和Moodle系统连接。对数据库元素进行的核心操作均直接作用在Moodle数据库的原有表单中,这样不但可以方便快捷地布置机试系统,还可以最大程度地保证系统的可靠性和稳定性。
5 系统测试
系统以1 000人的课程为例进行功能测试,教师首先生成机试系统,为1 000个学生分别建立课程,也为教师创建了课程分类,该课程分类包含所有的1 000门课程。任意打开一个学生的课程,系统会显示该学生本次机试的题目,见图3。题目难度分为4个等级,且每个等级有4道题目,考生从同一难度中的4道题中选一题作答。
为检验机试系统的性能,需要进行两方面的测试。首先,需要测试教师生成机试系统的时间,分别测试100~1 000人时机试系统的生成时间,以100人为间隔,测试结果见图4。
图3 学生考试题目总界面
由图4可以看出,机试系统的生成时间随着课程人数的增长呈现线性增长趋势。考虑到机试系统是对Moodle平台进行数据层面上的修改,人数越多,需要增加的课程数量就越多,需要配置的题目数量就越多,因此,生成时间的线性增长是合理的。200个学生时,机试系统生成时间基本在10秒以下,满足系统性能需求。学生人数达到1 000人时,生成时间也在一分钟以内。
图 4 生成课程平均用时图
其次,为了测试机试系统的并发能力,本文借助Apache Bench[11-12]工具对1 000个考生同时在线进行了模拟测试。经过多次测试,计算出的平均响应时间为72.816 3毫秒,完全满足性能要求。
6 结语
针对目前存在的程序设计笔试、机试考核方式的缺陷,本文基于Moodle系统,在数据层面上对系统进行改造,实现了机试系统的全部功能。系统易于搭建,功能齐全,运行稳定,相比传统的笔试形式更为科学、客观。目前,该系统满足机试系统的功能和性能要求,并已进行了小规模试用,效果良好,可为促进计算机编程类课程的实验教学改革起到积极作用,计划在200~300人规模下进行更多的测试后,开始正式部署应用。