薛 景,陳仁祥,張 敏,周 劍
(1. 南京郵電大學(xué) 計(jì)算機(jī)學(xué)院,江蘇 南京 210023;2.南京工業(yè)大學(xué) 交通運(yùn)輸工程學(xué)院,江蘇 南京 210009)
C++、Java、Python等高級語言程序設(shè)計(jì)課程,是普通高校各專業(yè)的計(jì)算機(jī)基礎(chǔ)課程。這類課程的培養(yǎng)目標(biāo)是學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)的思想和方法,掌握程序設(shè)計(jì)的流程和技巧,具備分析問題和利用計(jì)算機(jī)求解問題的能力。對于該類課程,學(xué)生只有通過大量實(shí)踐練習(xí)才能提高編程水平和培養(yǎng)使用計(jì)算機(jī)解決問題的能力。
中國大學(xué)MOOC面向大眾提供種類繁多的優(yōu)質(zhì)教學(xué)資源,其中也包括為數(shù)眾多的程序設(shè)計(jì)類課程。筆者以該網(wǎng)站為例,說明現(xiàn)有的程序設(shè)計(jì)類課程的在線教學(xué)系統(tǒng)存在的問題。
大學(xué)程序設(shè)計(jì)類課程的授課內(nèi)容不僅包含面向過程編程的基本數(shù)據(jù)類型、程序流程控制等知識點(diǎn),還包含類和對象、繼承和多態(tài)、異常處理、用戶圖形界面、多線程編程等眾多面向?qū)ο缶幊痰奶匦?。目前中國大學(xué)MOOC網(wǎng)站的程序評測系統(tǒng)采用的是使用測試用例進(jìn)行程序正確性判定的方法,該方法無法對包含這些面向?qū)ο筇匦缘某绦蜻M(jìn)行有效的判定[1],進(jìn)而影響評測效果。
目前中國大學(xué)MOOC網(wǎng)站教學(xué)管理模塊并未提供“分班”管理功能,所有選擇同一課程的學(xué)生都集中在同一個(gè)班級里,然而現(xiàn)實(shí)中,同一門課程往往由課程組內(nèi)教師分別負(fù)責(zé)不同的班級,這種線上線下的差異就造成任課教師在該網(wǎng)站中管理自己班級的學(xué)生變得十分困難,無法快速方便查看授課班級內(nèi)學(xué)生的相關(guān)信息。
雖然中國大學(xué)MOOC網(wǎng)站中儲存了大量的學(xué)生學(xué)習(xí)數(shù)據(jù),但是并未向教師提供任何數(shù)據(jù)挖掘的功能,如“成績預(yù)警”“抄襲檢測”等。數(shù)據(jù)挖掘技術(shù)可以對學(xué)生的學(xué)習(xí)數(shù)據(jù)進(jìn)行整理分析,教師可以根據(jù)分析結(jié)果進(jìn)行更有針對性的教學(xué)活動(dòng),這將大幅度提高課程的教學(xué)效果,最終提升課程的通過率。
基于HUSTOJ平臺的在線評測教輔系統(tǒng)集程序在線評判、智能問答、成績預(yù)警、抄襲檢測、日常教學(xué)輔助等功能為一體。系統(tǒng)采用MTV(model-template-view)設(shè)計(jì)模型,分為數(shù)據(jù)層、應(yīng)用層和表現(xiàn)層,如圖1所示。
數(shù)據(jù)層是整個(gè)系統(tǒng)的數(shù)據(jù)資源保障,按照應(yīng)用場景不同分為5類:在線評測數(shù)據(jù)、問答數(shù)據(jù)、成績預(yù)測數(shù)據(jù)、作業(yè)代碼數(shù)據(jù)和教輔模塊數(shù)據(jù)。各類數(shù)據(jù)單元既可以獨(dú)立支撐上層應(yīng)用的數(shù)據(jù)需求,又可以相互聯(lián)系在一起構(gòu)成數(shù)據(jù)挖掘的數(shù)據(jù)集。
圖1 基于HUSTOJ平臺的在線評測教輔系統(tǒng)架構(gòu)
應(yīng)用層是系統(tǒng)邏輯功能的實(shí)現(xiàn),根據(jù)不同的需求分為在線評測模塊、智能問答模塊、成績預(yù)警模塊、抄襲檢測模塊和日常教輔模塊,其中在線評測模塊包含在線判題、題庫管理和作業(yè)管理3個(gè)子功能;智能問答模塊包含實(shí)時(shí)問答和異步問答兩個(gè)子功能;成績預(yù)警模塊包含成績預(yù)測和風(fēng)險(xiǎn)提示兩個(gè)子功能;抄襲檢測模塊包含代碼比對和作業(yè)分類兩個(gè)子功能;日常教輔模塊包含隨堂測驗(yàn)和出勤管理兩個(gè)子功能。各個(gè)模塊從功能性上相互獨(dú)立,可單獨(dú)使用,又從邏輯上相互聯(lián)系、相輔相成,貫穿整個(gè)教學(xué)活動(dòng)。
表現(xiàn)層是系統(tǒng)最終呈現(xiàn)的形式,通過Web前端將應(yīng)用功能展現(xiàn)給師生用戶,用戶正常登錄后即可操作不同的模塊,滿足教師或者學(xué)生不同的用戶需求。
針對目前中國大學(xué)MOOC缺乏功能完善的在線評測教輔系統(tǒng)[2]的問題,我們基于HUSTOJ[3]平臺進(jìn)行了二次開發(fā):將在線答題的教學(xué)環(huán)節(jié)分為普通作業(yè)、實(shí)驗(yàn)課和隨堂測驗(yàn)3種不同類型;增加更多的測試題型,包括選擇題、編程題、程序填空、程序改錯(cuò)以及看程序?qū)懡Y(jié)果;豐富判題評分策略,除了傳統(tǒng)OJ編譯運(yùn)行學(xué)生提交的代碼與測試樣例對比的方法外,增加基于代碼相似度的評分方法。
3.1.1 角色設(shè)置
作為完善的在線作業(yè)評測系統(tǒng),傳統(tǒng)OJ簡單的用戶角色劃分已經(jīng)不能滿足實(shí)際教學(xué)的需要,因此,為了更加方便地管理課程中的相關(guān)資源,該模塊中設(shè)置課程負(fù)責(zé)人、任課教師、學(xué)生3種用戶角色,不同角色對應(yīng)著不同的操作權(quán)限和使用功能,如圖2所示。
圖2 基于HUSTOJ平臺的在線評測模塊不同角色功能示意圖
1)課程負(fù)責(zé)人。
指某個(gè)課程的建立者,該角色可以管理課程的各類電子資源(包括在線視頻、電子課件、課后閱讀材料等)、管理課程的知識點(diǎn)劃分、建立公共作業(yè)以及添加任課教師賬號到課程組。系統(tǒng)中,各課程組相互獨(dú)立、互不干擾,即屬于某一課程組的任課教師只能管理、使用和修改本課程組的資源而沒有權(quán)限使用其他課程組的課程資源。
2)任課教師。
任課教師對于學(xué)生的學(xué)習(xí)行為,起著引導(dǎo)和敦促的作用,擁有的權(quán)限包括題庫的管理(僅限于管理自己添加的題目資源)、私有作業(yè)的管理以及普通的教學(xué)過程管理。
(1)題庫管理:提供對各類型題目的增加、修改、刪除、查詢操作。
(2)私有作業(yè)管理:包括組織管理自己建立的私有作業(yè),私有作業(yè)既可以是任課教師自己創(chuàng)建的,又可以從課程負(fù)責(zé)人創(chuàng)建的公共作業(yè)中復(fù)制而來;定時(shí)發(fā)布作業(yè)到自己管理的班級,隨時(shí)查看和分析學(xué)生的作業(yè)數(shù)據(jù)。
(3)教學(xué)過程管理:該功能允許任課教師創(chuàng)建授課班級并批量導(dǎo)入學(xué)生賬號,很好地填補(bǔ)了中國大學(xué)MOOC缺乏班級管理功能的空白,為批量化管理學(xué)生數(shù)據(jù)提供了極大的便利。
3)學(xué)生。
學(xué)生用戶主要使用完成作業(yè)、查看作業(yè)發(fā)布情況和評測結(jié)果、下載教學(xué)資料等功能。3.1.2 編程題判分策略
現(xiàn)有平臺中的編程題判分策略主要是將待測程序的輸出結(jié)果與預(yù)先設(shè)置的測試用例進(jìn)行字符串文本匹配。該策略無法適應(yīng)當(dāng)前主流程序設(shè)計(jì)語言的面向?qū)ο筇匦?,如無法判定帶有圖形用戶界面的程序、包含多線程特性的程序及包含文件讀取特性的程序的正確性。為了解決上述問題,制定本模塊的判分策略如下。
(1)將用戶提交的程序輸入至HUSTOJ的自動(dòng)判分環(huán)境中,等待HUSTOJ使用傳統(tǒng)判分策略對其進(jìn)行判分。
(2)讀取使用HUSTOJ傳統(tǒng)判分后得到的結(jié)果,如果本題被判為滿分,則將提交來的正確程序與數(shù)據(jù)庫中的已有正確版本進(jìn)行相似性比對,保存相似度不足80%的正確程序版本至數(shù)據(jù)庫中,判題結(jié)束。如果本題經(jīng)過傳統(tǒng)判分后未得到滿分,則進(jìn)入第3步。
(3)讀取包含待測程序的作業(yè)信息,如果作業(yè)中不允許使用程序相似度算法進(jìn)行判分,則直接返回使用傳統(tǒng)判分方法得到的判分結(jié)果,判題結(jié)束。如果作業(yè)中允許使用程序相似度算法進(jìn)行判分,則進(jìn)入第4步。
(4)將待測程序與數(shù)據(jù)庫中相同題目的所有正確版本程序進(jìn)行程序相似度計(jì)算(取值范圍為0~1),取相似度最高的結(jié)果為計(jì)算結(jié)果,并將相似度×本題總分的值與使用傳統(tǒng)判分策略得到的判分結(jié)果進(jìn)行對比,取兩者中較高的分值作為該題目的最后得分,保存至作業(yè)數(shù)據(jù)中,判題結(jié)束。
3.2.1 異步問答
異步問答是對在線評測功能的補(bǔ)充,對應(yīng)于實(shí)際教學(xué)過程的答疑環(huán)節(jié)。在學(xué)習(xí)、完成作業(yè)的過程中遇到的問題可直接在該模塊中進(jìn)行提問,任意角色的用戶都可以對相關(guān)問題進(jìn)行回答。論壇式的異步問答模塊[4]39,不僅突破傳統(tǒng)答疑的時(shí)空限制,而且能夠充分調(diào)動(dòng)學(xué)生的學(xué)習(xí)積極性,引導(dǎo)學(xué)生發(fā)現(xiàn)新問題,鼓勵(lì)學(xué)生相互分享知識與經(jīng)驗(yàn)。這種針對特定人群和特定領(lǐng)域的問答模塊,相較于泛領(lǐng)域的問答,可以提供更加專業(yè)、更具針對性、更全面的答案,目的就是更好地幫助學(xué)生解決在學(xué)習(xí)過程中遇到的問題。
異步問答模塊從功能劃分上看可以分為系統(tǒng)功能模塊、用戶功能模塊和管理員功能模塊。系統(tǒng)功能模塊主要包含一般性事務(wù)處理,如消息通知、問題與答案推送等;用戶功能模塊是異步問答的主體,主要滿足用戶實(shí)現(xiàn)問答的基本需求,如提問、回答、評論、點(diǎn)贊、收藏等;管理員功能模塊主要包含對問答模塊中的數(shù)據(jù)進(jìn)行監(jiān)管,如刪除無效的問題、回答等。
3.2.2 問答機(jī)器人
為了解決異步問答的時(shí)效性問題,系統(tǒng)設(shè)計(jì)并實(shí)現(xiàn)了在線問答機(jī)器人[4]32,這種針對程序設(shè)計(jì)類課程的問答機(jī)器人功能可以提供常見問題的精準(zhǔn)答案,不僅可以提高用戶問答的學(xué)習(xí)效率,還可以提高優(yōu)質(zhì)答案的復(fù)用率,節(jié)約教師的工作精力。
問答機(jī)器人具體算法流程如下:①根據(jù)異步問答模塊中的數(shù)據(jù),構(gòu)建包含有效問答對的知識庫;②提取用戶輸入的合法問題;③基于雙數(shù)組Trie樹生成輸入問題的分詞圖[5];④基于動(dòng)態(tài)規(guī)劃法搜索概率最大路徑,提取學(xué)生用戶輸入問題的關(guān)鍵字;⑤從知識庫中搜索與關(guān)鍵字最匹配的答案并展示。若搜索失敗,繼續(xù)第6步;⑥將用戶問題存入異步問答數(shù)據(jù)庫,等待相關(guān)用戶回答。若該問題得到其他用戶的回答,則系統(tǒng)將回答內(nèi)容以郵件和站內(nèi)消息的方式通知提問用戶。
為了解決學(xué)生不能及時(shí)了解自身學(xué)習(xí)狀況的問題,進(jìn)一步挖掘利用學(xué)生在使用系統(tǒng)過程中產(chǎn)生的行為特征數(shù)據(jù),設(shè)計(jì)開發(fā)基于樸素貝葉斯[6]的成績預(yù)警模塊。該模塊利用學(xué)生日常使用系統(tǒng)時(shí)產(chǎn)生的行為特征數(shù)據(jù),最大可能地評估并預(yù)測學(xué)生的學(xué)習(xí)狀況,并及時(shí)向教師匯報(bào)存在不及格風(fēng)險(xiǎn)的學(xué)生信息。這種及時(shí)的成績預(yù)警不僅可以為教師提供教學(xué)參考,制訂具有針對性的教學(xué)計(jì)劃,還能讓教師提醒學(xué)生端正學(xué)習(xí)態(tài)度和幫助學(xué)生優(yōu)化學(xué)習(xí)方法。
該模塊的具體實(shí)現(xiàn)方法如下:①將在線作業(yè)完成次數(shù)、在線作業(yè)分?jǐn)?shù)、在線提問次數(shù)、在線回答次數(shù)、課堂出勤率、隨堂測驗(yàn)分?jǐn)?shù)作為學(xué)生的特征屬性,綜合評價(jià)上述特征屬性將學(xué)生分為不及格、及格、中等、良好、優(yōu)秀5個(gè)級別;②從以往學(xué)生用戶的學(xué)習(xí)數(shù)據(jù)中挑選構(gòu)建訓(xùn)練樣本;③依據(jù)訓(xùn)練樣本訓(xùn)練樸素貝葉斯分類器,訓(xùn)練過程如圖3所示;④應(yīng)用訓(xùn)練好的分類器對正在使用系統(tǒng)的學(xué)生進(jìn)行分類;⑤依據(jù)分類結(jié)果,對分類結(jié)果在不及格中的學(xué)生用戶進(jìn)行風(fēng)險(xiǎn)提示。
圖3 樸素貝葉斯分類原理
在線評測帶來極大便利的同時(shí),也使得作業(yè)抄襲變得比以往更加容易[7]。為了遏制這種現(xiàn)象,保證教學(xué)效果,系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)了代碼抄襲檢測模塊,對同一班級中不同學(xué)生作業(yè)中的程序代碼進(jìn)行相似度檢測,按照相似性將這些作業(yè)進(jìn)行分類,任課教師可以根據(jù)分類結(jié)果警告存在抄襲行為的學(xué)生。
該模塊的具體實(shí)現(xiàn)方法如下:①對作業(yè)程序進(jìn)行標(biāo)準(zhǔn)化處理,包括去除代碼中的注釋、規(guī)整代碼格式、統(tǒng)一函數(shù)名和變量名等;②將標(biāo)準(zhǔn)化程序中每一行代碼的關(guān)鍵語句進(jìn)行拼接,生成該程序的特征值;③將待判定程序的特征值與系統(tǒng)中已提交程序的特征值進(jìn)行相似度比對,依據(jù)比對結(jié)果將代碼相似度較高的作業(yè)進(jìn)行聚類操作,同時(shí)將新提交程序的特征值存入數(shù)據(jù)庫;④將作業(yè)聚類結(jié)果發(fā)送給任課教師,供教師參考。
為了提高教學(xué)工作的效率,系統(tǒng)設(shè)計(jì)開發(fā)了諸如基于地理位置的學(xué)生出勤、隨堂測驗(yàn)等教學(xué)輔助功能模塊,以方便將傳統(tǒng)教學(xué)事務(wù)進(jìn)行數(shù)字化管理。
為了給廣大師生提供高效穩(wěn)定的服務(wù),安全性設(shè)計(jì)尤為重要,一方面為了保護(hù)眾多用戶的個(gè)人信息,另一方面為了保障服務(wù)器資源不被盜用。
服務(wù)器編譯運(yùn)行用戶提交的程序,可能有危害系統(tǒng)安全的行為[2],這些惡意程序可能是編程者不成熟的編程水平造成的,也有可能是人為故意攻擊引起的。目前,在線評測攻擊[8]主要分為兩種方式:編譯時(shí)攻擊和運(yùn)行時(shí)攻擊。
編譯時(shí)攻擊的特點(diǎn)包括:①編譯超時(shí),讓評測進(jìn)程卡死在編譯階段;②輸出巨大文件;③頭文件包含攻擊行為。
運(yùn)行時(shí)攻擊的特點(diǎn)包括:①運(yùn)行系統(tǒng)指令,如執(zhí)行 system(“shut down now”),立刻關(guān)閉服務(wù)器;②無休止fork,耗盡服務(wù)器系統(tǒng)資源;③利用腳本短時(shí)間內(nèi)頻繁提交。
針對以上問題,系統(tǒng)采用的解決方案有設(shè)置編譯時(shí)間限制;設(shè)置可執(zhí)行文件大小限制;設(shè)置文件的讀寫權(quán)限,限制用戶程序讀取系統(tǒng)核心文件;采用沙盒運(yùn)行評測程序,將用戶提交的程序與系統(tǒng)環(huán)境隔離;提交作業(yè)代碼時(shí)引入人機(jī)驗(yàn)證機(jī)制,防止利用機(jī)器人程序高頻率提交代碼。
跨站請求偽造(cross-site request forgery),是一種限制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意操作的攻擊方法。為了避免此類危險(xiǎn),系統(tǒng)采用的解決方案為在首次響應(yīng)某個(gè)客戶端的請求時(shí),在服務(wù)器端生成隨機(jī)Token,將該Token保存在客戶端Cookie中,之后的客戶端POST請求必須帶上這個(gè)Token,服務(wù)器驗(yàn)證Token的合法性再進(jìn)行下一步操作,服務(wù)器將直接拒絕無法通過合法性檢查的請求。
為避免SQL注入攻擊,系統(tǒng)將用戶在網(wǎng)站界面輸入的所有內(nèi)容均視為危險(xiǎn)內(nèi)容,不直接將使用用戶輸入的內(nèi)容嵌入SQL語句中進(jìn)行執(zhí)行。使用Django框架中的Queryset對象可以將SQL語句在內(nèi)部進(jìn)行轉(zhuǎn)義,保證只能由系統(tǒng)內(nèi)合法程序執(zhí)行對數(shù)據(jù)庫的操作。
目前,在線評測教輔系統(tǒng)正在南京郵電大學(xué)全校范圍內(nèi)使用,已經(jīng)使用系統(tǒng)的課程包括Python語言程序設(shè)計(jì)、Java程序語言設(shè)計(jì)、C語言程序設(shè)計(jì)以及C++面向?qū)ο蟪绦蛟O(shè)計(jì)。題庫模塊中包含編程題數(shù)據(jù)200余條、選擇題數(shù)據(jù)400余條,公共作業(yè)模版40余套。校內(nèi)師生用戶已達(dá)8 000余人,自2016年9月上線至今,已記錄43 000余條各類教學(xué)活動(dòng)數(shù)據(jù)。
系統(tǒng)不僅為學(xué)校學(xué)生提供專業(yè)、便捷的計(jì)算機(jī)編程學(xué)習(xí)和交流平臺,還為教師提供便捷的教學(xué)過程管理和教學(xué)資源管理平臺,通過及時(shí)向任課教師發(fā)送教學(xué)效果反饋,有效地提高了程序設(shè)計(jì)類課程中教與學(xué)的效率。
5.2.1 易于部署、維護(hù)、管理
整個(gè)系統(tǒng)建立在通用Web平臺上,可以簡單、快捷地搭建運(yùn)行環(huán)境,編寫自動(dòng)化安裝腳本,實(shí)現(xiàn)通過簡單命令完成環(huán)境搭建。使用后臺管理模塊,可管理各級用戶權(quán)限和監(jiān)管數(shù)據(jù)庫內(nèi)的已有數(shù)據(jù)。系統(tǒng)中的日志記錄模塊,詳細(xì)地記錄系統(tǒng)運(yùn)行的狀態(tài),為排除系統(tǒng)故障提供有力的支持。
5.2.2 節(jié)約人力成本
在線完成各種編程練習(xí),不僅節(jié)約紙張資源和教學(xué)活動(dòng)中消耗的教師人力資源,而且可以全天候?yàn)閷W(xué)生提供必不可少的實(shí)踐練習(xí)機(jī)會。與傳統(tǒng)作業(yè)方式相比,在線學(xué)習(xí)參與者可以隨時(shí)提交并運(yùn)行程序代碼,并立刻得到程序正確性的反饋。通過上述自動(dòng)化的教學(xué)手段,學(xué)生能夠更好地掌握學(xué)習(xí)節(jié)奏,提升學(xué)習(xí)效果。
5.2.3 提高教與學(xué)的效率
通過使用系統(tǒng),教師可便捷地組織作業(yè)、發(fā)布作業(yè)、進(jìn)行課堂點(diǎn)名、隨堂測驗(yàn)以及查看班級內(nèi)學(xué)生的學(xué)習(xí)狀況,及時(shí)提醒存在不及格風(fēng)險(xiǎn)的學(xué)生;學(xué)生也可以方便地在系統(tǒng)中完成作業(yè)并即時(shí)得到作業(yè)結(jié)果,還可以在線上與教師進(jìn)行專業(yè)領(lǐng)域的交流以學(xué)習(xí)更多的擴(kuò)展知識。系統(tǒng)上線的一年多來,任課教師的教學(xué)過程管理效率有了大幅度的提升,學(xué)生的學(xué)習(xí)效率也得到提高。據(jù)任課教師反饋,在程序設(shè)計(jì)類課程的教學(xué)中引入本系統(tǒng)之后,學(xué)生的學(xué)習(xí)成績有了明顯的提高。
程序設(shè)計(jì)類課程的MOOC建設(shè)是高校計(jì)算機(jī)學(xué)科MOOC教學(xué)的重點(diǎn)內(nèi)容,基于HUSTOJ平臺的在線評測教輔系統(tǒng)提供了形式多樣的在線編程實(shí)踐教學(xué)方法、完備便捷的教學(xué)過程管理功能以及實(shí)時(shí)高效的師生交流平臺,實(shí)踐證明其有效提高了傳統(tǒng)教學(xué)和MOOC教學(xué)的教學(xué)活動(dòng)效率。針對現(xiàn)代社會對個(gè)性化教育的強(qiáng)烈需求,系統(tǒng)還有一些可以改進(jìn)的方面,如通過分析學(xué)習(xí)者的在線學(xué)習(xí)數(shù)據(jù),找出學(xué)習(xí)者所掌握知識點(diǎn)的薄弱環(huán)節(jié),推送包含該知識點(diǎn)的相關(guān)學(xué)習(xí)資源供學(xué)習(xí)者進(jìn)行自主學(xué)習(xí)等。