面向应用型本科的在线编程训练系统的设计
2024-09-03陈义唐郑熠刘剑涛
摘要:编程技能是计算机类专业学生的核心能力,在线评测系统是该能力培养的一个重要载体。鉴于目前的大部分在线评测系统主要面向竞赛或岗位招聘,文章设计了一款面向应用型本科的在线编程训练系统,该系统集在线评测、趣味练习、智能推荐、数据分析等功能于一体,旨在逐步引导、激发学生的编程兴趣,提高编程参与度与练习效果。系统采用微服务架构,具备高并发处理能力和直观的数据可视化支持。
关键词:在线评测;在线编程;挑战模式;趣味闯关
中图分类号:R197.323.1 文献标识码:A
文章编号:1009-3044(2024)19-0057-03
编程技能是计算机类专业学生的核心能力,直接体现其实践能力和专业掌握程度。在线评测(OnlineJudge, OJ) 系统作为评判用户代码正确性的重要工具,广泛应用于教学实验、程序设计竞赛、企业软件类岗位招聘、培训、计算机等级认证等场景中[1]。当前,知名的OJ系统包括北京大学的POJ、杭州电子科技大学的HDUOJ、牛客、头歌、洛谷、AcWing等国内平台,以及Codeforces、Topcoder、Leetcode 等国际平台[2-4]。然而,这些平台在提供服务时也存在局限性。部分商业系统功能繁多,对于聚焦编程教学的用户并不友好,而其费用也阻碍在学校课堂的普及。另一部分主要面向程序设计竞赛选手,功能以刷题训练和在线竞赛为主,缺乏对基础薄弱学生的引导与支持,让人望而却步。同时,使用第三方平台,数据管理权归运营方所有,对于希望扩大学生训练规模,进行精细化、个性化、多元化[5-6]教学引导的应用型本科院校而言,难以获取特定反馈数据以优化教学。
因此作为应用型本科院校,有必要自主开发、部署一个更为灵活、开放、免费、面向不同层次的学生需求的在线编程训练系统(为了区别传统OJ,本系统称为“在线编程训练系统”) ,通过逐步引导,增加趣味性和挑战性,激发学生的编程兴趣,提高编程活动参与度与练习效果。
1 系统功能
本系统以C、C++、Python和Java代码的在线评测为核心功能,并针对应用本科型院校的教学和学生自主编程练习需求进行了功能扩展。该系统整合了五项主要功能,功能结构如图1所示。
1.1 综合题库
本系统支持编程题目由自建题库和爬虫题库两部分组成。自建题库,该部分题目由专业教练出题,涵盖题干、评测方式、评测样例、评测数据等完整信息,系统根据出题者的要求设定评测机制;爬虫题库,通过爬虫技术从第三方题库网站收集公开题目,对于无法直接爬取的测XyhQw3TG9Wrc5A/fKg2uNQ==试样例,系统将采用逆推输入输出样例或人工补全的方式加以完善。此外,该模块还包含题目知识点图谱、题目解析以及题目推荐等功能。
1.2 在线练习
用户可自由挑选练习模式和题目进行在线学习。提交解答后,系统将迅速反馈评测结果。完成题目后,系统将更新统计数据,包括难度系数和答题评价,以提供个性化学习参考。
在线练习模式包含专题模式、编程闯关模式与挑战模式。其中,编程闯关模式仿照游戏关卡设计,由教师依据学生能力定制个性化解题路径,旨在营造具有目标性、竞技性和趣味性的学习环境。挑战模式则基于多个知识点模块及其内在关联,允许用户自主选择学习路径,通过逐步解锁并达成条件以访问后续模块,该模式不仅增加了学习的探索性,还促进了分层学习的递进实施。此外,系统可根据用户画像推荐优秀学长同期的学习路径和学习成效比较,路径指刷题顺序、闯关主题等。
1.3 在线比赛
在线比赛系统涵盖多人竞赛、在线考试、双人对抗及实时竞赛榜单等功能。多人竞赛支持练习、积分、趣味、自定义等多种模式,每种模式均设有独特的计分与奖励机制。其中,练习模式适用于课程实验与日常训练;积分模式作为高级别竞赛队伍选拔依据,促进学生竞争;趣味模式则提供特色奖品以增加吸引力。同时,该系统支持在线考试模式,允许教师设定用户权限、答题时限及页面切换限制,便于组织编程类考试等。双人对抗功能则鼓励学生间随时进行在线对决,提升学习互动性与乐趣。
1.4 用户互动
该社区集论坛讨论、实时聊天室以及积分、达人、答题等多重榜单于一体,为用户提供了全方位、多层次的交流与学习平台。用户可以在论坛中深入探讨编程话题,借助实时聊天室即时分享心得,通过积分榜等展示个人成就。此外,本系统还引入了基于编程知识库的智能问答机器人,用户只需轻点图标,即可获得个性化的题目推荐、解析及概念讲解,极大提升了学习体验与效率。
1.5 达人养成
达人养成功能指系统通过活动与激励提升用户编程技能和知识水平,增强参与度与忠诚度。包括:等级与徽章制度,依据刷题表现晋升等级,达到特定等级后,将获得相应的徽章并在社区中展示;积分商城,用户通过参与活动、比赛和知识分享获取积分,积分可在商城中兑换学习资料、徽章等奖励;学习和成长记录,指学习时长、成绩等数据和技能雷达图、刷题日历图、成长曲线等可视化图表;用户对比功能,支持用户与达人进行可视化图表叠加对比。
1.6 其他功能
系统全面记录用户答题数据,便于教师深入分析学生学习状况,如系统能够计算用户群体或特定题目的AC率(即成功解答数与总提交数的比率),从而直观揭示学生在答题及学习过程中所遭遇的问题和挑战。
2 系统架构与技术路线
系统采用B/S(浏览器/服务器)架构,系统主要由前端层、代理层、服务层和数据存储层4个主要部分组成,系统架构图如图3所示。
2.1 前端层
前端层即用户接入层,由微信小程序端、学生Web端门户和后台管理Web端组成。微信小程序端面向学生,依托Uni-app框架,支持学习任务查看和技术讨论。学生Web端门户基于Vue.js构建,提供任务查看、代码提交和成绩查看功能。后台管理Web端同样基于Vue.js,专注于教学管理,涵盖任务发布、题目管理、用户管理以及数据统计。此外,闯关式任务和知识图谱的编辑与展示,分别借助jsPlumb和D3.js库进行研发,提供直观且富有交互性的可视化支持,助力用户更清晰地洞察数据间的关联与脉络。
2.2 代理层
代理层即前端代理服务器,它负责处理进出系统的网络请求和响应。使用Nginx实现了负载均衡、数据拦截、反向代理等功能。
2.3 服务层
服务层构建于微服务架构之上,实现了面向业务和基础支撑微服务单元的划分。这些服务单元拥有独立部署与监控的能力,支持故障平稳退化容错、横向扩展,且技术栈灵活多变。业务微服务包括在线评测、题目管理、题目爬取、在线练习、在线比赛、积分商城、用户管理以及论坛管理等。其中基础微服务主要包括:
网络爬虫服务:基于Scrapy框架开发,针对每个第三方评测平台开发特定的爬虫机器人。支持业务层配置多个并发执行的爬虫实例,实现高效执行题目爬取、提交第三方评测(即远程评测服务,指将代码提交到对应题目源网站的评测系统,由其进行黑盒评测,本端则不关心评测过程,只需要获取到评测结果,最后更新数据库中的相关评测记录的方式)等任务。
本地评测服务:为了应对传统评测机在并发处理与任务稳定性方面的不足,引入一种基于沙箱技术的分布式评测方案。首先,每个评测机作为独立的Linux进程,全权处理用户代码文件的输入、编译、运行、时空越界判定、答案比较及评测结果输出。其次,评测机通过Docker容器化部署在服务器上并利用ku⁃bernetes的CoreDN算法协调用户任务以实现负载均衡和增强容错性。第三,采用RabbitMQ中间件,在评测业务层服务与评测机之间构建了二层任务队列,有效实现任务的削峰填谷。这一方案显著提升了在线评测并发量,为业务提供稳定支持。此外,此评测机实现了3种结果判定方式,即基于结果的完全匹配方法、基于不确定性结果的特判方法以及基于得分点的判定方法,支持对完整编程题型、函数式编程题型、交互式编程题型的评测。
全文检索服务:依托Elasticsearch开源搜索引擎,构建了涵盖编程题目、论坛消息等内容的倒排索引。该服务支持模糊查询、范围查询,并配备丰富的搜索结果展示功能,为用户提供便捷的搜索体验。同时,通过其内容标识生成和文本相似度计算技术,为题目爬取服务提供了高效的题目查重能力,提升了题库的质量和准确性。
内容推荐服务:通过分析用户的学习历史、题目完成情况、搜索记录及评论数据,精准捕捉用户的学习偏好与能力水平。为每个用户量身打造详尽的用户画像,涵盖兴趣点、学习风格及技能雷达(即知识点掌握情况)。利用协同过滤算法,结合用户画像与题目特征(难度、知识点、历史点击率等),可智能推荐与用户高度匹配的题目、话题和训练任务。
此外,还集成了第三方在线评测平台和短信平台等第三方服务。
2.4 微服务框架层
微服务框架层即微服务架构工具层,基于SpringCloud系列工具包构建,为服务层微服务架构提供管理和协调支撑。其中,Zuul是开源网关服务器,Kafka 是消息总线,Eureka是服务注册与发现组件,Ribbon 客户端负载均衡器,Hystrix 是延迟和容错库,Pro⁃metheus和Micrometer用于收集和分析性能指标数据,Zipkin用于跟踪微服务之间的调用关系。容器编排工具使用Kubernetes(即k8s)。
2.5 存储层
存储层包括内存数据库、关系数据库、文档数据库、索引数据库、日志数据库等。本系统架构支持不同业务采用异构数据库。其中主要业务数据存储于关系型数据库MySql,共52个表、7个视图。数据缓存采用了Redis内存数据库,主要保存用户登录状态to⁃ken以及计算耗时较长的每日排行榜数据等。题目索引数据、系统日志数据等存储在Elasticsearch中。
3 总结
本文介绍了面向应用型本科生的在线编程训练系统,该系统集成了多源题库、趣味练习、在线竞赛、用户互动及达人养成等功能,设计了富有趣味性和竞技性的训练模式,有效提升了学生的编程参与度和练习效果。系统基于微服务架构,采用协同过滤推荐、可伸缩评测机及数据可视化等技术,提供了一个灵活、开放、免费的编程学习和教学环境。
参考文献:
[1] 李菊,傅向华,马军超.基于代码编程规范的在线评测系统研究与实现[J].计算机时代,2023(1):62-65.
[2] 徐燕萍.基于OJ的程序设计类课程实验混合教学模式研究[J].软件导刊,2022,21(2):231-234.
[3] 金天成,窦亮,肖春芸,等.记忆与认知融合的个性化OJ习题推荐方法[J].计算机学报,2023,46(1):103-124.
[4] 严小雨,王明军,卓尧,等.基于开源技术的高校OJ系统部署运维与应用[J].现代信息科技,2024,8(3):89-93,98.
[5] 贾晓强,刘军.地方高校面向新工科的计算机系统能力培养实践与思考[J].微型电脑应用,2021,37(4):7-10.
[6] 冯伟,刘亚双,田树华.地方应用型本科院校计算机类一流本科专业实践教学模式研究[J].山西青年,2023(23):97-99.
[7] 钟明辉,李志军.应用型本科计算机类专业“一核两翼三融合” 人才培养模式的实践探索[J].大学教育,2024,13(3):115-118.
[8] 金天成,窦亮,张伟,等.基于深度强化学习与程序分析的OJ习题推荐模型[J].计算机科学,2023,50(8):58-67.
[9] 林世明,宋长军,李芳,等.赛教融合背景下基于OJ平台的高级程序设计课程教学改革:以昌吉学院信息工程学院为例[J].创新创业理论研究与实践,2024,7(10):42-46.
[10] 王金水,薛醒思,翁伟.基于句法分析的代码摘要技术[J].计算机应用,2015,35(7):1999-2003.
【通联编辑:李雅琪】