房晓南, 徐功文,2, 孙云晨, 张化祥, 杜颜伶
(1.山东师范大学信息科学与工程学院,山东济南250014;2.山东建筑大学计算机科学与技术学院,山东济南250101;3.山东中医药大学理工学院,山东济南250355)
高校程序设计类课程包括计算机相关专业开设的“C/C++程序设计”、“Java程序设计”、“数据结构”和“算法设计”等专业课程和非计算机专业开设的一系列程序设计类计算机公共课程。这类课程的一个共同特点就是特别强调实践动手环节,学生只有通过大量的编程练习,才能真正理解和掌握此类课程中的相关概念和技术并形成应用开发能力[1-3]。
目前国内大部分程序设计类课程采用的都是“课堂+实验”的模式,即课堂教学和上机实验分别进行。这种模式的优点是实施简单、有利于安排课程进度,但是也存在一些问题。首先,部分教师会形成“重课堂、轻实验”的习惯,将大部分精力放到课堂讲授,而实验环节却得不到应有的重视;其次,该模式容易造成教学和实验的脱节,学生在课堂所学和在机房练习的内容往往存在一定距离,很难完全同步;最后,学生程序的评测环节存在较大缺陷。由于时间和精力所限,对于学生提交的实验作业和考试程序很难做到一一批阅,也很难进行有效的作弊检测,影响了教学效果评价的效率和准确度[4,5]。
针对这种情况,本文设计并开发了基于.NET与在线评测的分布式程序设计教学实验平台。该平台首先对程序设计类课程的教学、实验和考试资源进行整合,并利用相关的数据库技术进行分类存储。同时,该平台选用Windows+IIS+Access/SQL Server+.NET CLR的平台架构,解决了目前大多数基于LAMP(Linux+Apache+MySQL+PHP)平台的在线评测系统的安装部署困难,不易使用等问题。同时采用了高效的分布式架构,使得平台伸缩性更好,并可以支持更多的数据库管理系统。
程序设计类课程的教师和学生可以通过该平台实现题目分类上传、用户管理、在线练习(实验)、在线比赛(考试)、在线评测、作弊检测和成绩排名等多种功能。平台可以缩短此类课程教学与实验环节的距离,提高教学成果检验的准度和效度;同时平台的使用增加了程序设计学习过程中的互动性和趣味性,双向调动了教师教和学生学的积极性,取得了良好的应用效果。
在线评测系统[6,7](Online Judge System,简称 OJ)是已经在ACM-ICPC国际大学生程序设计竞赛中得到广泛使用的自动判题和排名系统。用户将代码提交给系统进行编译和执行,系统利用预先设定好的评测数据进行测试,即通过比较提交程序的输出的结果与标准结果,判定提交代码的正确性。用户提交的代码在OJ中执行时还会受到运行时间、内存使用、安全等各方面严格的限制。最后OJ反馈的评测结果包括:通过(Accepted,简称 AC)、错误答案(Wrong Answer,简称WA)、时间超限(Time Limit Exceed,简称 TLE)、输出超限(Output Limit Exceed,简称 OLE)、内存超限(Memory Limit Exceed,简称 MLE)、运行时间错误(Runtime Error,简称RE)等。此外,系统还可以按照通过的题目数量和累计用时等指标来对用户进行排名。当前许多高校都建立起自己的在线评测系统,其中比较有影响了的有北京大学在线评测系统(简称POJ)[8]、杭州电子科技大学在线评测系统(简称HDOJ)[9]、华 中 科 技 大 学 在 线 评 测 系 统 (简 称HUSTOJ)[10]等。
近几年,国内外高校的ACM-ICPC教练和程序类课程教师开始尝试将在线评测系统用于程序设计类课程的教学、实验和考试环节,并取得了较好的效果。其中新加坡国立大学2000年时就开始在数据结构与算法课的教学评价环节中使用在线评测系统[11]。北京大学在 POJ的基础上开发了“百练”系统[12,13],主要服务于ACM-ICPC竞赛队员的日常训练和程序类课程的在线考试。此外,基于HUSTOJ开发的九度 Online Judge[14]主要针对计算机专业考研和求职的学生,汇总了国内重点院校计算机专业研究生复试阶段的上机题和包括谷歌、微软等知名软件企业的面试阶段上机题。基于“编译原理”课程的教学实践,尤枫等[15]开发了编译程序在线评测系统,对该课程的教学改革起到了积极的推动作用。华南师范大学的 Zhu等[16]将ACM-ICPC的训练和比赛模式引入了软件工程的学习过程,提供了一种将编程实践和理论学习结合的新途径。中山大学广泛开展ACM-ICPC课外活动,实现了计算机本科生能力的培养和素质的提高[17,18]。以上系统在使用过程中也出现了一定的问题,如有的支持的程序语言种类较少,有的只是针对某一门固定课程等。
本教学实验平台主要由以下几部分组成,如图1所示:
图1 系统体系结构
(1)客户端应用程序与应用程序服务器。用来与用户交互及处理用户交互的部分,包括题目的查看、程序的提交以及后台管理等。该部分常见的有B/S架构和C/S架构,由于C/S架构需要用户安装特定的应用程序才能使用系统;而对于B/S架构,由于目前几乎所有操作系统都自带浏览器,用户仅需要打开浏览器即可以使用,大大降低了用户的使用和学习成本,所以该部分通常使用B/S架构构建。
当前在线评测系统普遍使用LAMP平台来开发该部分,由于国内大部分高校通常使用Windows作为服务器以及日常使用的系统,所以对于Linux而言学习和部署成本都较高,所以在这里使用Windows+IIS+Access/SQL Server+.NET CLR的平台。
(2)评测服务模块。用来评测用户提交的代码,包括将用户提交的程序代码进行编译,并根据预先设定好的题目数据和限制条件对程序进行评测。评测服务模块与应用程序服务器常见的通信方式有Web Service或者Socket通信等,由于Socket通信需要评测服务器开放特定端口,而Web Service不但不需要开放端口,可移植性也更好,所以通信方式选择 Web Service。
在线评测系统通常使用C++来开发评测服务模块,并将其运行在Linux的环境中。但是由于C++不具有跨平台性,所以在Linux下编译的C++程序往往无法直接在Windows下编译使用,为了统一平台,在这里同样使用.NET平台开发评测服务模块。
(2)数据库系统。用来存储在线评测系统所有的数据,包括题目数据、用户数据以及管理数据等。对于未接触过在线评测系统的学校而言,配置和维护数据库比较麻烦。由于使用.NET开发整套系统并且数据库只通过应用程序服务器访问,所以比较容易能支持多数据库。在这里应用程序服务器的数据库连接模块通过使用微软企业库(Microsoft Enterprise Library)连接数据库,数据库连接模块处理不同数据库之间的SQL语句差异来实现对不同数据库的无缝支持。
当前很多个人电脑以及学校的服务器都未安装SQL Server等数据库系统,如果只支持单一大型数据库,则个人测试或部署小型在线评测系统变得非常复杂。由于 Windows操作系统自带了 JET Database Engine,在32位系统下甚至无需任何配置就直接可以访问Access数据库,同时由于Access的易维护性,所以支持Access使得上述操作变得容易,而同时支持SQL Server数据库也为日后提升系统性能以及平台迁移留下了空间。
对于本系统,当请求较少时,可以将应用程序服务器、评测服务模块、数据库系统三者放置于同一台服务器中,用户通过访问应用程序服务器来访问系统,应用程序服务器则与本机的数据库文件或数据库系统进行数据的交换,评测服务模块则通过应用程序服务器获取待评测列表,并将用户程序编译为可执行文件并通过执行程序进行测试以及将最终结果返回给应用程序服务器。
由于单台服务器的处理能力是有限的,所以当请求过多时,需要将不同的服务拆分到不同的服务器中,甚至当流量更大时,还应当增添更多的服务器并使用负载平衡。
2.2.1 分布式评测服务模块
当用户同时提交的程序过多时,评测服务模块最先无法处理过多的请求,即发生延时评测的情况。由于评测服务模块通过Web Service请求应用程序服务器,所以评测服务模块只要能够通过局域网或互联网访问应用程序服务器即可。而如果单独使用一台评测服务器也无法满足用户提交的程序时,还可以按照同样方法添置更多台评测服务器,由于评测服务模块都是采取主动请求的方式,所以添加评测服务器的过程都是动态的。
由于多台评测服务器可能同时请求应用程序服务器,所以还在应用程序服务器中设置了唯一锁,使评测服务器的并发请求变为了队列请求,使得同时只能有一台评测服务器获取待评测列表及提交评测信息。
2.2.2 分布式应用程序服务器
当同时访问的用户过多时,应用程序服务器可能无法同时处理如此多的请求,同时由于评测服务模块也需要请求应用程序服务器,为了保证所有请求快速响应,应当设置多台应用程序服务器。由于应用程序服务器的数据均来自数据库系统,所以只需要将应用程序服务器拆分为多个请求统一数据库系统的应用程序服务器即可,例如评测服务模块访问应用程序服务器#0,其他用户访问另一个应用程序服务器#1,甚至于当请求更多时可以设置负载平衡服务器,而负载平衡服务器之下再设置多个应用程序服务器,见图2。
由于不同服务器可能会存储不同的用户状态,所以这里使用ASP.NET平台中的Forms认证,其原理是当服务器端第一次认证完用户后由ASP.NET服务器将用户身份凭证根据服务器的Machine Key加密存储在Cookies中。用户每次执行请求时将加密后的身份凭证一并附带,服务器使用自身的Machine Key将加密后的用户身份凭证解密,然后验证是否是合法用户。由于Machine Key默认是服务器端根据服务器信息自动生成的,所以在配置多台应用程序服务器时,只需要将每台的Machine Key配置为相同的即可使用户在各台服务器上都能通过身份验证。同时,由于系统中的内容大量使用了缓存,并且由于部分缓存仅当时间超时后才重新获取,所以当配置多台服务器后,必须同步各台服务器中的缓存,这里由于使用了微软企业库的缓存模块,仅需要配置缓存的后端存储为数据库即可,如果系统存储内容的数据库负载过高,则可以另外启用独立的缓存数据库服务器。
图2 分布式平台架构
此外,为了加快评测服务模块的请求速度,使用JSON(JavaScript Object Notation)作为传输信息的媒介,并将题目数据包打包为Zip压缩文件,以减少传输的数据量。同时,将评测服务模块与应用程序服务器的通信方法简化为登陆、获取题目数据、获取待评测列表以及更新评测状态等4种,并且在获取待评测列表时允许单次获取多条评测数据,来尽可能减少服务器间通讯的次数,以减少应用程序服务器的负担。
作为一个程序设计教学实验平台,最重要的是在教学、实验和考试等环节中应用。所以除了实现在线评测系统的基本功能,本平台还支持可扩展的题库管理模块,任课教师或管理员可以方便的增添题目并对题目进行分类。此外,平台还提供了在线竞赛、排名、讨论、课程作业、在线考试以及互动交流等功能模块。山东师范大学程序设计课程教学与实验平台[19]的主界面如图2所示:
其中平台的主要功能模块包括在线评测、在线练习、在线比赛(考试)、以及用户面板四个主要模块。通过这些模块,教师就可以将教学与实验相关题目布置在平台上,也可以直接在在线考试模块组织进行随堂测试或学业考试,无需准备任何纸质资料。而学生只需要一台能够连接Internet的个人计算机,就可以不受任何时间地点限制的使用平台提供的所有资源。
图2 平台主界面
图3 显示的是平台的系统管理员界面。在这个界面中,系统管理员可以进行常规管理、题目管理、竞赛(考试)管理、用户管理、论坛管理和评测管理等操作。同时图中的题目分类管理功能可以将不同课程或主题的题目分类存放管理,比如建立“数据结构”和“C++程序设计”两个不同的课程分类,这样任课教师就可以对自己负责课程的题目进行管理,不同科目的学生也可以进入各自的课程模块进行练习。
图3 系统管理员界面
山东师范大学程序设计教学实验平台(在线评测系统)自2010年6月部署以来,已有大约2000余名学生通过该平台进行程序学习、提交和竞赛等活动,并为5门程序设计相关课程提供了实验和考试环境。通过课题组针对“Java程序设计”课程中该平台的使用效果进行的问卷调查,有92%的同学认为该平台可以有效的帮助自己学习程序设计相关课程。在2010年至2013年的山东省ACM-ICPC程序设计竞赛中,我校参赛同学获得金奖1项、银奖2项、铜奖4项,并且在2012年10月的ACM-ICPC亚洲区域赛(长春赛区)获得铜奖1项。在今后的工作中,我们将在非程序代码评测、代码查重、云IDE和即时交流功能的实现等方面进行进一步的研究和改进,使该平台能够更好的为高校程序设计类课程的实践教学服务。
[1] 赖晓晨.程序设计课程创新教学模式探索[J].中国大学教学,2008(7):42-44.
[2] 万 臣,谢 芳,胡 泉.计算机专业程序设计课程群的建设与研究[J].合肥工业大学学报(社会科学版),2009,23(1):33-36.
[3] 耿国华.程序设计能力培养模式的探索与实践[J].中国大学教学,2009(3):30-32.
[4] 何钦铭,颜 晖,苏小红,等.“程序设计基础”课程教学实施方案[J].中国大学教学,2010(5):62-65.
[5] 杨春明,杜 炯,王 磊.分布式程序设计实验平台的设计与应用[J].实验室研究与探索,2012,31(8):54-58.
[6] Kurnia A,Lim A,Cheang B.Online judge[J].Computers&Education,2001,36(4):299-315.
[7] Skiena S S,Revilla M A,Revila M A.Programming challenges:The programming contest training manual[M]. Heidelberg:Springer,2003.2-8.
[8] Peking University Judge Online.POJ[EB/OL].[2013-5-16].http://poj.org/.
[9] Hangzhou Dianzi University Online Judge.HDUOJ[EB/OL].[2013-5-16].http://acm.hdu.edu.cn/.
[10] Huazhong University of Science & Technology Online Judge.HUSTOJ[EB/OL].[2013-5-16].http://code.google.com/p/hustoj/.
[11] 李军强.源代码评估系统的研究与开发[D].北京:北京化工大学,2008.
[12] 北京大学.百练[EB/OL].[2013-5-16].http://poj.grids.cn/.
[13] 谢 迪,李文新,郭 炜.“百练”一个程序设计技能训练与水平测试平台[J].合肥工业大学学报(社会科学版),2008,22(4):172-176.
[14] 华中科技大学.九度 Online Judge[EB/OL].[2013-5-16].http://ac.jobdu.com/.
[15] 尤 枫,史晟辉,赵瑞莲.编译程序在线评测系统的实现[J].实验室研究与探索,2010,29(12):69-72.
[16] Jie-ao Z,Mian S,Xue L,et al.Learning Software Engineering through Experience of ACM-ICPC Training and Practicing Exercises[C]//Frontiers in Computer Education.Springer Berlin Heidelberg,2012:51-56.
[17] 郭嵩山,王 磊,张子臻.ACM/ICPC与创新型IT人才的培养[J].实验室研究与探索,2007,26(12):182-185.
[18] 王 磊.ACM-ICPC竞赛中的团队合作[J].计算机教育,2006(3):73:
[19] 山东师范大学.SDNUOJ[EB/OL].[2013-6-24].http://www.acmicpc.sdnu.edu.cn/.