唐宇鵬,唐亞哲,朱海萍,吳茜媛
(西安交通大學 電子與信息工程學院, 陜西 西安710049)
計算機編程目前已經成為高校理工科專業的必修課,而許多高校編程課程的考核還停留在傳統的筆試方式。編程類課程的教學目的是讓學生具備程序設計、編碼和調試的全流程能力。在紙上書寫編程題不但與編程學習的初衷相悖,也給考生和閱卷教師帶來了很多不便[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],通過建立大容量分難度的題庫,給學生在同一難度上提供多個題目選擇,減少偶然性帶來的評估誤差。
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的基本架構和基本運行流程不變,可稱之為數據驅動的機試系統開發。基于這個機試方案,本文進行了簡單的可行性實驗,實驗結果驗證了該方案的有效性。
系統設計的重要一環就是分析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 考試課程生成模塊
機試系統研發的實現工作包括搭建Moodle系統平臺、建立數據庫、編寫操作數據庫元素的應用程序、程序測試與系統調試、考試現場的環境搭建。對數據庫進行的操作都存放在系統外的PHP文件中,且在Moodle教學網頁中可以通過自定義按鈕直接跳轉到這些PHP文件中,所有修改均沒有大范圍改變Moodle源代碼,而是將自己獨立的代碼通過這樣的“接口”和Moodle系統連接。對數據庫元素進行的核心操作均直接作用在Moodle數據庫的原有表單中,這樣不但可以方便快捷地布置機試系統,還可以最大程度地保證系統的可靠性和穩定性。
系統以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毫秒,完全滿足性能要求。
針對目前存在的程序設計筆試、機試考核方式的缺陷,本文基于Moodle系統,在數據層面上對系統進行改造,實現了機試系統的全部功能。系統易于搭建,功能齊全,運行穩定,相比傳統的筆試形式更為科學、客觀。目前,該系統滿足機試系統的功能和性能要求,并已進行了小規模試用,效果良好,可為促進計算機編程類課程的實驗教學改革起到積極作用,計劃在200~300人規模下進行更多的測試后,開始正式部署應用。