摘要:編程技能是計算機類專業(yè)學(xué)生的核心能力,在線評測系統(tǒng)是該能力培養(yǎng)的一個重要載體。鑒于目前的大部分在線評測系統(tǒng)主要面向競賽或崗位招聘,文章設(shè)計了一款面向應(yīng)用型本科的在線編程訓(xùn)練系統(tǒng),該系統(tǒng)集在線評測、趣味練習(xí)、智能推薦、數(shù)據(jù)分析等功能于一體,旨在逐步引導(dǎo)、激發(fā)學(xué)生的編程興趣,提高編程參與度與練習(xí)效果。系統(tǒng)采用微服務(wù)架構(gòu),具備高并發(fā)處理能力和直觀的數(shù)據(jù)可視化支持。
關(guān)鍵詞:在線評測;在線編程;挑戰(zhàn)模式;趣味闖關(guān)
中圖分類號:R197.323.1 文獻標識碼:A
文章編號:1009-3044(2024)19-0057-03
編程技能是計算機類專業(yè)學(xué)生的核心能力,直接體現(xiàn)其實踐能力和專業(yè)掌握程度。在線評測(OnlineJudge, OJ) 系統(tǒng)作為評判用戶代碼正確性的重要工具,廣泛應(yīng)用于教學(xué)實驗、程序設(shè)計競賽、企業(yè)軟件類崗位招聘、培訓(xùn)、計算機等級認證等場景中[1]。當前,知名的OJ系統(tǒng)包括北京大學(xué)的POJ、杭州電子科技大學(xué)的HDUOJ、???、頭歌、洛谷、AcWing等國內(nèi)平臺,以及Codeforces、Topcoder、Leetcode 等國際平臺[2-4]。然而,這些平臺在提供服務(wù)時也存在局限性。部分商業(yè)系統(tǒng)功能繁多,對于聚焦編程教學(xué)的用戶并不友好,而其費用也阻礙在學(xué)校課堂的普及。另一部分主要面向程序設(shè)計競賽選手,功能以刷題訓(xùn)練和在線競賽為主,缺乏對基礎(chǔ)薄弱學(xué)生的引導(dǎo)與支持,讓人望而卻步。同時,使用第三方平臺,數(shù)據(jù)管理權(quán)歸運營方所有,對于希望擴大學(xué)生訓(xùn)練規(guī)模,進行精細化、個性化、多元化[5-6]教學(xué)引導(dǎo)的應(yīng)用型本科院校而言,難以獲取特定反饋數(shù)據(jù)以優(yōu)化教學(xué)。
因此作為應(yīng)用型本科院校,有必要自主開發(fā)、部署一個更為靈活、開放、免費、面向不同層次的學(xué)生需求的在線編程訓(xùn)練系統(tǒng)(為了區(qū)別傳統(tǒng)OJ,本系統(tǒng)稱為“在線編程訓(xùn)練系統(tǒng)”) ,通過逐步引導(dǎo),增加趣味性和挑戰(zhàn)性,激發(fā)學(xué)生的編程興趣,提高編程活動參與度與練習(xí)效果。
1 系統(tǒng)功能
本系統(tǒng)以C、C++、Python和Java代碼的在線評測為核心功能,并針對應(yīng)用本科型院校的教學(xué)和學(xué)生自主編程練習(xí)需求進行了功能擴展。該系統(tǒng)整合了五項主要功能,功能結(jié)構(gòu)如圖1所示。
1.1 綜合題庫
本系統(tǒng)支持編程題目由自建題庫和爬蟲題庫兩部分組成。自建題庫,該部分題目由專業(yè)教練出題,涵蓋題干、評測方式、評測樣例、評測數(shù)據(jù)等完整信息,系統(tǒng)根據(jù)出題者的要求設(shè)定評測機制;爬蟲題庫,通過爬蟲技術(shù)從第三方題庫網(wǎng)站收集公開題目,對于無法直接爬取的測XyhQw3TG9Wrc5A/fKg2uNQ==試樣例,系統(tǒng)將采用逆推輸入輸出樣例或人工補全的方式加以完善。此外,該模塊還包含題目知識點圖譜、題目解析以及題目推薦等功能。
1.2 在線練習(xí)
用戶可自由挑選練習(xí)模式和題目進行在線學(xué)習(xí)。提交解答后,系統(tǒng)將迅速反饋評測結(jié)果。完成題目后,系統(tǒng)將更新統(tǒng)計數(shù)據(jù),包括難度系數(shù)和答題評價,以提供個性化學(xué)習(xí)參考。
在線練習(xí)模式包含專題模式、編程闖關(guān)模式與挑戰(zhàn)模式。其中,編程闖關(guān)模式仿照游戲關(guān)卡設(shè)計,由教師依據(jù)學(xué)生能力定制個性化解題路徑,旨在營造具有目標性、競技性和趣味性的學(xué)習(xí)環(huán)境。挑戰(zhàn)模式則基于多個知識點模塊及其內(nèi)在關(guān)聯(lián),允許用戶自主選擇學(xué)習(xí)路徑,通過逐步解鎖并達成條件以訪問后續(xù)模塊,該模式不僅增加了學(xué)習(xí)的探索性,還促進了分層學(xué)習(xí)的遞進實施。此外,系統(tǒng)可根據(jù)用戶畫像推薦優(yōu)秀學(xué)長同期的學(xué)習(xí)路徑和學(xué)習(xí)成效比較,路徑指刷題順序、闖關(guān)主題等。
1.3 在線比賽
在線比賽系統(tǒng)涵蓋多人競賽、在線考試、雙人對抗及實時競賽榜單等功能。多人競賽支持練習(xí)、積分、趣味、自定義等多種模式,每種模式均設(shè)有獨特的計分與獎勵機制。其中,練習(xí)模式適用于課程實驗與日常訓(xùn)練;積分模式作為高級別競賽隊伍選拔依據(jù),促進學(xué)生競爭;趣味模式則提供特色獎品以增加吸引力。同時,該系統(tǒng)支持在線考試模式,允許教師設(shè)定用戶權(quán)限、答題時限及頁面切換限制,便于組織編程類考試等。雙人對抗功能則鼓勵學(xué)生間隨時進行在線對決,提升學(xué)習(xí)互動性與樂趣。
1.4 用戶互動
該社區(qū)集論壇討論、實時聊天室以及積分、達人、答題等多重榜單于一體,為用戶提供了全方位、多層次的交流與學(xué)習(xí)平臺。用戶可以在論壇中深入探討編程話題,借助實時聊天室即時分享心得,通過積分榜等展示個人成就。此外,本系統(tǒng)還引入了基于編程知識庫的智能問答機器人,用戶只需輕點圖標,即可獲得個性化的題目推薦、解析及概念講解,極大提升了學(xué)習(xí)體驗與效率。
1.5 達人養(yǎng)成
達人養(yǎng)成功能指系統(tǒng)通過活動與激勵提升用戶編程技能和知識水平,增強參與度與忠誠度。包括:等級與徽章制度,依據(jù)刷題表現(xiàn)晉升等級,達到特定等級后,將獲得相應(yīng)的徽章并在社區(qū)中展示;積分商城,用戶通過參與活動、比賽和知識分享獲取積分,積分可在商城中兌換學(xué)習(xí)資料、徽章等獎勵;學(xué)習(xí)和成長記錄,指學(xué)習(xí)時長、成績等數(shù)據(jù)和技能雷達圖、刷題日歷圖、成長曲線等可視化圖表;用戶對比功能,支持用戶與達人進行可視化圖表疊加對比。
1.6 其他功能
系統(tǒng)全面記錄用戶答題數(shù)據(jù),便于教師深入分析學(xué)生學(xué)習(xí)狀況,如系統(tǒng)能夠計算用戶群體或特定題目的AC率(即成功解答數(shù)與總提交數(shù)的比率),從而直觀揭示學(xué)生在答題及學(xué)習(xí)過程中所遭遇的問題和挑戰(zhàn)。
2 系統(tǒng)架構(gòu)與技術(shù)路線
系統(tǒng)采用B/S(瀏覽器/服務(wù)器)架構(gòu),系統(tǒng)主要由前端層、代理層、服務(wù)層和數(shù)據(jù)存儲層4個主要部分組成,系統(tǒng)架構(gòu)圖如圖3所示。
2.1 前端層
前端層即用戶接入層,由微信小程序端、學(xué)生Web端門戶和后臺管理Web端組成。微信小程序端面向?qū)W生,依托Uni-app框架,支持學(xué)習(xí)任務(wù)查看和技術(shù)討論。學(xué)生Web端門戶基于Vue.js構(gòu)建,提供任務(wù)查看、代碼提交和成績查看功能。后臺管理Web端同樣基于Vue.js,專注于教學(xué)管理,涵蓋任務(wù)發(fā)布、題目管理、用戶管理以及數(shù)據(jù)統(tǒng)計。此外,闖關(guān)式任務(wù)和知識圖譜的編輯與展示,分別借助jsPlumb和D3.js庫進行研發(fā),提供直觀且富有交互性的可視化支持,助力用戶更清晰地洞察數(shù)據(jù)間的關(guān)聯(lián)與脈絡(luò)。
2.2 代理層
代理層即前端代理服務(wù)器,它負責(zé)處理進出系統(tǒng)的網(wǎng)絡(luò)請求和響應(yīng)。使用Nginx實現(xiàn)了負載均衡、數(shù)據(jù)攔截、反向代理等功能。
2.3 服務(wù)層
服務(wù)層構(gòu)建于微服務(wù)架構(gòu)之上,實現(xiàn)了面向業(yè)務(wù)和基礎(chǔ)支撐微服務(wù)單元的劃分。這些服務(wù)單元擁有獨立部署與監(jiān)控的能力,支持故障平穩(wěn)退化容錯、橫向擴展,且技術(shù)棧靈活多變。業(yè)務(wù)微服務(wù)包括在線評測、題目管理、題目爬取、在線練習(xí)、在線比賽、積分商城、用戶管理以及論壇管理等。其中基礎(chǔ)微服務(wù)主要包括:
網(wǎng)絡(luò)爬蟲服務(wù):基于Scrapy框架開發(fā),針對每個第三方評測平臺開發(fā)特定的爬蟲機器人。支持業(yè)務(wù)層配置多個并發(fā)執(zhí)行的爬蟲實例,實現(xiàn)高效執(zhí)行題目爬取、提交第三方評測(即遠程評測服務(wù),指將代碼提交到對應(yīng)題目源網(wǎng)站的評測系統(tǒng),由其進行黑盒評測,本端則不關(guān)心評測過程,只需要獲取到評測結(jié)果,最后更新數(shù)據(jù)庫中的相關(guān)評測記錄的方式)等任務(wù)。
本地評測服務(wù):為了應(yīng)對傳統(tǒng)評測機在并發(fā)處理與任務(wù)穩(wěn)定性方面的不足,引入一種基于沙箱技術(shù)的分布式評測方案。首先,每個評測機作為獨立的Linux進程,全權(quán)處理用戶代碼文件的輸入、編譯、運行、時空越界判定、答案比較及評測結(jié)果輸出。其次,評測機通過Docker容器化部署在服務(wù)器上并利用ku?bernetes的CoreDN算法協(xié)調(diào)用戶任務(wù)以實現(xiàn)負載均衡和增強容錯性。第三,采用RabbitMQ中間件,在評測業(yè)務(wù)層服務(wù)與評測機之間構(gòu)建了二層任務(wù)隊列,有效實現(xiàn)任務(wù)的削峰填谷。這一方案顯著提升了在線評測并發(fā)量,為業(yè)務(wù)提供穩(wěn)定支持。此外,此評測機實現(xiàn)了3種結(jié)果判定方式,即基于結(jié)果的完全匹配方法、基于不確定性結(jié)果的特判方法以及基于得分點的判定方法,支持對完整編程題型、函數(shù)式編程題型、交互式編程題型的評測。
全文檢索服務(wù):依托Elasticsearch開源搜索引擎,構(gòu)建了涵蓋編程題目、論壇消息等內(nèi)容的倒排索引。該服務(wù)支持模糊查詢、范圍查詢,并配備豐富的搜索結(jié)果展示功能,為用戶提供便捷的搜索體驗。同時,通過其內(nèi)容標識生成和文本相似度計算技術(shù),為題目爬取服務(wù)提供了高效的題目查重能力,提升了題庫的質(zhì)量和準確性。
內(nèi)容推薦服務(wù):通過分析用戶的學(xué)習(xí)歷史、題目完成情況、搜索記錄及評論數(shù)據(jù),精準捕捉用戶的學(xué)習(xí)偏好與能力水平。為每個用戶量身打造詳盡的用戶畫像,涵蓋興趣點、學(xué)習(xí)風(fēng)格及技能雷達(即知識點掌握情況)。利用協(xié)同過濾算法,結(jié)合用戶畫像與題目特征(難度、知識點、歷史點擊率等),可智能推薦與用戶高度匹配的題目、話題和訓(xùn)練任務(wù)。
此外,還集成了第三方在線評測平臺和短信平臺等第三方服務(wù)。
2.4 微服務(wù)框架層
微服務(wù)框架層即微服務(wù)架構(gòu)工具層,基于SpringCloud系列工具包構(gòu)建,為服務(wù)層微服務(wù)架構(gòu)提供管理和協(xié)調(diào)支撐。其中,Zuul是開源網(wǎng)關(guān)服務(wù)器,Kafka 是消息總線,Eureka是服務(wù)注冊與發(fā)現(xiàn)組件,Ribbon 客戶端負載均衡器,Hystrix 是延遲和容錯庫,Pro?metheus和Micrometer用于收集和分析性能指標數(shù)據(jù),Zipkin用于跟蹤微服務(wù)之間的調(diào)用關(guān)系。容器編排工具使用Kubernetes(即k8s)。
2.5 存儲層
存儲層包括內(nèi)存數(shù)據(jù)庫、關(guān)系數(shù)據(jù)庫、文檔數(shù)據(jù)庫、索引數(shù)據(jù)庫、日志數(shù)據(jù)庫等。本系統(tǒng)架構(gòu)支持不同業(yè)務(wù)采用異構(gòu)數(shù)據(jù)庫。其中主要業(yè)務(wù)數(shù)據(jù)存儲于關(guān)系型數(shù)據(jù)庫MySql,共52個表、7個視圖。數(shù)據(jù)緩存采用了Redis內(nèi)存數(shù)據(jù)庫,主要保存用戶登錄狀態(tài)to?ken以及計算耗時較長的每日排行榜數(shù)據(jù)等。題目索引數(shù)據(jù)、系統(tǒng)日志數(shù)據(jù)等存儲在Elasticsearch中。
3 總結(jié)
本文介紹了面向應(yīng)用型本科生的在線編程訓(xùn)練系統(tǒng),該系統(tǒng)集成了多源題庫、趣味練習(xí)、在線競賽、用戶互動及達人養(yǎng)成等功能,設(shè)計了富有趣味性和競技性的訓(xùn)練模式,有效提升了學(xué)生的編程參與度和練習(xí)效果。系統(tǒng)基于微服務(wù)架構(gòu),采用協(xié)同過濾推薦、可伸縮評測機及數(shù)據(jù)可視化等技術(shù),提供了一個靈活、開放、免費的編程學(xué)習(xí)和教學(xué)環(huán)境。
參考文獻:
[1] 李菊,傅向華,馬軍超.基于代碼編程規(guī)范的在線評測系統(tǒng)研究與實現(xiàn)[J].計算機時代,2023(1):62-65.
[2] 徐燕萍.基于OJ的程序設(shè)計類課程實驗混合教學(xué)模式研究[J].軟件導(dǎo)刊,2022,21(2):231-234.
[3] 金天成,竇亮,肖春蕓,等.記憶與認知融合的個性化OJ習(xí)題推薦方法[J].計算機學(xué)報,2023,46(1):103-124.
[4] 嚴小雨,王明軍,卓堯,等.基于開源技術(shù)的高校OJ系統(tǒng)部署運維與應(yīng)用[J].現(xiàn)代信息科技,2024,8(3):89-93,98.
[5] 賈曉強,劉軍.地方高校面向新工科的計算機系統(tǒng)能力培養(yǎng)實踐與思考[J].微型電腦應(yīng)用,2021,37(4):7-10.
[6] 馮偉,劉亞雙,田樹華.地方應(yīng)用型本科院校計算機類一流本科專業(yè)實踐教學(xué)模式研究[J].山西青年,2023(23):97-99.
[7] 鐘明輝,李志軍.應(yīng)用型本科計算機類專業(yè)“一核兩翼三融合” 人才培養(yǎng)模式的實踐探索[J].大學(xué)教育,2024,13(3):115-118.
[8] 金天成,竇亮,張偉,等.基于深度強化學(xué)習(xí)與程序分析的OJ習(xí)題推薦模型[J].計算機科學(xué),2023,50(8):58-67.
[9] 林世明,宋長軍,李芳,等.賽教融合背景下基于OJ平臺的高級程序設(shè)計課程教學(xué)改革:以昌吉學(xué)院信息工程學(xué)院為例[J].創(chuàng)新創(chuàng)業(yè)理論研究與實踐,2024,7(10):42-46.
[10] 王金水,薛醒思,翁偉.基于句法分析的代碼摘要技術(shù)[J].計算機應(yīng)用,2015,35(7):1999-2003.
【通聯(lián)編輯:李雅琪】