房曉南, 徐功文,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/.