徐 偉,陳凱明,馬建輝,趙家興
(中國科學技術大學計算機科學與技術學院,安徽合肥 230027)
程序設計課程是計算機學科教育的基礎,是計算機學科的入門課程[1-3]。通過這門課學習,使學生在掌握相關編程語言的同時熟練運用編程解決實際問題。一般認為以某種程序設計語言為載體掌握數據結構及算法就是編程能力的內涵[4-5]。文獻[6]認為編程能力不僅包含算法和數據結構,也包括“代碼風格”“代碼文件組織與管理”“結構化與模塊化程序設計”等工程能力方面內容。這要求教師在講解程序設計課程時,不能只講解算法和數據結構,相關工程方面的內容也要一一介紹;文獻[7]提出一種教賽融合的課程教學方法,該方法以OJ 系統為核心,通過競賽機制引入改革實驗教學,重點對OJ 系統上機作業安排、課程實驗環節分數計算、學生代碼查重進行詳細論述,但關于OJ 系統如何防止抄襲還缺乏詳細考慮。類似采用OJ 系統進行實驗評測的還有文獻[8-10];文獻[11]通過精選教學案例、強化實踐編程、建立教學跟蹤多維反饋體系提高教學質量,但在在線教育特點方面考慮不足。
自2012 年以來,在線教育在教育領域受到熱捧,越來越多的課程被搬到了網上,教學思維方式得到變革[12-15]。文獻[16]采用基于慕課的翻轉課堂教學方法提高學生學習積極性,改變了以往傳統的被動學習模式,充分利用學生課外碎片化時間提高學習效率,有效地培養學生的創新能力;文獻[17]討論了優化程序設計課程分數統計方式,鼓勵學生更好完成實驗課程;文獻[18]提出混合線上和線下學習資源、多樣化教學、變換教學內容等方式,提高程序設計課程教學水平,文獻[19]進行了類似的教學案例討論。
中國科學技術大學計算機專業程序設計課程一般分為大一上學期的程序設計Ⅰ和大一下學期的程序設計Ⅱ。均為80 課時,分為40 理論課時和40 實驗課時,每門課3 個學分,主要以C 語言為例進行講解,附帶簡要介紹Java 和Python 語言。2020 年由于受新冠疫情影響,學校采用了在線教育形式進行授課,對程序設計這種實踐性很強的課程教學提出了諸多挑戰。為了更好地完成教學任務,授課教師與課程助教經過多次研究,對現有在線教學形式進行教學改革。
本文主要介紹中國科學技術大學2020 年春季程序設計Ⅱ課程在線教學方式、教學改革創新點、目前取得的進展與后續工作方向。與現有研究相比,在線課程教學基于OJ 系統的使用完成在線實驗,強調了程序代碼風格和調試工具使用的重要性,對代碼風格的具體要求及評分標準進行了系統介紹,優化了最終成績的統計方式,最后對抄襲的認定過程進行了詳細描述,具有較強的可操作性。
中國科學技術大學2020 年春季程序設計Ⅱ課程在線教學采用以下教學方式:
(1)在線教學系統分別試用騰訊課堂和學校配套的Classin 等直播平臺。
(2)在線實驗系統采用學校的在線評測平臺(Online Judge,OJ,https://oj.ustc.edu.cn/)檢測學生提交的程序源代碼正確性。
(3)課程PPT 講義存放在課程QQ 群文件和學校內部的blackboard 系統中,供學生下載和復習使用。
(4)平時課程溝通采用課程QQ 群方式。主要在QQ 群進行日常事務提醒、課程內容討論和對特定問題的投票,了解學生動態。如圖1 所示,授課前對學生遞歸函數掌握情況進行投票,班級163 位學生有135 人完成投票。通過這種專題的投票調研,可讓教師了解學生某個知識點的掌握情況,更有效地進行課程安排。
目前程序設計的教學平臺、數據平臺分別使用不同廠家產品,學生要從數個來源獲取學習材料。教研組初期希望統一到學校的在線教學平臺,經過試用,學生更愿意使用騰訊課堂學習,使用QQ 群進行教材文件共享,而不是學校提供的在線教育平臺。學校在不影響教學質量前提下同意教師自行選擇教學平臺。
最終選擇騰訊課堂作為在線教學平臺、選擇QQ 群作為線上聯系討論方式、選擇學校OJ 系統作為在線評測系統。

圖1 學生投票調查實例
學生提交的程序編譯執行結果被OJ 系統記錄并保存,然后轉交給一個裁判程序。裁判程序首先讀入測試用例和對應的標準輸出,再比較學生程序的輸出數據和標準輸出樣例的差異性。最終OJ 系統返回給學生運行結果,包括通過、答案錯誤、超時、超內存、運行時錯誤或是無法編譯等,并返回程序使用的內存、運行時間等信息。實驗結束后,OJ 系統可對學生本次提交并通過的成績進行列表顯示,方便教師和助教統計實驗成績。
為提高學生編程的規范程度,提高代碼的可維護性,安排相關助教對代碼風格進行專題介紹。由于學校程序設計課程主要針對C 語言編程,所以描述的代碼風格要求僅對C 語言編程有效。代碼風格有5 個大項要求:
(1)縮進、括號、分行與空格。主要包括縮進規則(以4個空格或tab 鍵進行縮進)、大括號的風格統一(大括號允許單獨分行或緊跟代碼之后,二者擇一使用,不要混用)、分行(對于較長的行、表達式等,應以分行方式書寫)、空格(在算符、逗號等,應使用一個空格分開,保證顯示工整與美觀)。
(2)函數頭與結構體注釋。主要包括函數頭注釋(函數的目的、描述函數的作用、效果)、結構體注釋(注釋結構體用途、成員意義,必要時說明成員取值范圍)。
(3)函數、變量、常量與結構體及其成員命名。主要包括命名規則,如進行大/小駝峰命名,匈牙利命名法等,任何變量、常量、函數、結構體名稱都應直接或比較明確地反映其用途、含義、不允許命名的方式,如拼音命名等。
(4)代碼模塊化與邏輯注釋。主要包括代碼塊邏輯(如對于較長的代碼/函數塊,應用多行注釋描述過程)、循環和分支邏輯(如對于進入和退出時變量的變換邏輯進行說明)、變量使用邏輯(如對結構體成員、布爾標志變量說明以什么含義進行使用,何種情況值會變化等)。
(5)變量、常數與函數使用。主要包括不允許的寫法(如禁止使用未初始化的指針等)、需要限制的寫法(如濫用全局變量在函數間交換信息等)、需要注意的寫法(如有符號整數的負值與無符號數進行運算等)。
過去的程序設計課程成績統計方式為考試分(50%)+實驗分(50%)。為引導學生重視代碼風格,程序設計Ⅱ課程采用考試分(50%)、實驗分(45%)和代碼風格分(5%)三項分數的加權值進行認定。
其中代碼風格評分細則如下:按風格要求的5 個大項,每項1 分,每項只有0 和1 兩個分值,總分5 分。給分的基本原則是:凡是出現“不允許”的代碼寫法,不論數目均扣分;凡是出現“可限制”寫法較多的才考慮扣分;沒有上述情況可以給分。對代碼風格的評價以題目為單位。最終的代碼風格分為所有實驗有效代碼風格分的均值。只要順利提交作業均進行考核,對于單個實驗多次提交代碼的,選擇代碼風格最好的一個作為實驗的風格得分。每次實驗結束后,由助教對學生代碼逐個進行檢查,將檢查扣分的原因記錄在代碼風格扣分說明文件中。評分結束后,將代碼風格扣分說明文件共享在QQ 群空間,讓學生了解如何改進代碼風格。
對中國科學技術大學2019 年秋季程序設計Ⅰ某班級學生進行學情調查發現,學生在編程過程中較少使用IDE環境自帶的調試工具,有的學生僅采用printf 方式查看變量值。這種debug 方式無疑是低效的,為此特意安排一節課由助教專題講解vs2017、gdb 等工具的調試方法,并將調試步驟詳細寫成文檔放在QQ 群文件中,供學生隨時參考。
由于程序設計課程學生人數較多,完全依靠教師或者助教人工讀代碼進行抄襲認定工作量巨大,所以采用Stanford Moss 系統進行抄襲判定。抄襲認定以題目為單位,并以助教和教師的認定作為最終結果。代碼查重前先以某種方式將學生所有“正確”(通過了所有測試用例)的代碼收集起來,使用Moss 系統進行查重服務。Stanford Moss 系統是一個“在線”的代碼查重系統,使用此服務的用戶在本地機器上運行一個類似shell 的程序,并提供代碼語言、待判定文件所在位置等各種參數,將本地代碼上傳到Moss 在線系統。當在線系統完成抄襲判定后會返回一個URL,在這個網址可以以列表形式查看判重結論,如圖2 所示。圖2依次展示被比較的兩個文件、其重復比例以及重復行數目,且該頁面文件按照“最可能是抄襲的在前”順序排列。最后由助教點擊Moss 結果的某一行生成代碼查重詳情頁,助教根據Moss 詳情頁結果進行人工閱覽,認定是否抄襲,如圖3 所示。

圖2 Moss 系統查重結果(已隱去部分學號)

圖3 Moss 查重詳情頁(已隱去部分學號)
采用Moss 系統后對于抄襲有一定的震懾作用,但目前網上已有不少針對Moss 系統的逃避方法,如何高效地預防抄襲仍是研究重點。認定發生抄襲后,對于涉嫌抄襲者要視情節輕重,分為“警告”“扣分”兩種處理。被警告時其對應題目分數不變,對應代碼風格分數不變,但如下次再判定為“警告”則升格為“扣分”。扣分時,該題目分數記為0分,代碼風格分記為“空”(不會計入總平均代碼風格分)。扣分后在補交平臺上補交本題,或其它未通過的題目通過OJ 及進一步查重,按原分值的60%計,仍有抄襲的按0 分計。
(1)學生代碼風格水平有了較大程度提高。學生大多可以按照規范的風格編寫代碼,圖4 為2020 年春季程序設計Ⅱ某班級163 位學生的5 次實驗代碼風格平均分柱狀圖,可以看到73.6%的學生代碼風格在4 分以上(滿分5分),基本符合代碼風格要求。
(2)從OJ 系統通過情況看,學生對課程學習達到基本掌握程度。圖5 為2020 年春季程序設計Ⅱ某班級163 位學生的5 次實驗編程總分數柱狀圖,可以發現81.6%的學生編程分數在40 分以上(滿分60 分),顯示學生對相關課程實驗掌握情況良好。
(1)網絡教學應進一步加強師生互動。師生互動是教學關鍵環節。采用面對面方式教學,教師可快速了解到學生的理解程度,針對學生不明白知識點進行再次講解。當轉為線上教學時,師生關系無法有效建立,雖然通過相關的直播軟件可以有效了解學生的出勤率,但是很難監控學生是否真在學習,或是僅僅開著直播在做其它事情,相比之下線上教學效果更加依賴教師的授課水平。授課教師需要更加鉆研授課內容,提高授課質量,提高學生的學習興趣,增加師生互動環節,需持續改進以提高教學有效性。

圖4 代碼風格分數分布

圖5 編程分數分布
(2)解決學生在線debug 調試困難。程序設計課程是一門實踐性很強的課程,就像學騎自行車,聽別人多次講解自行車如何騎行,自己獨立騎行可能還是存在很大問題。以2020 年春季程序設計Ⅱ某班級163 名學生為例,初期招聘6 名高年級學生助教,如果在校學習輔導人數是夠的,但由于網絡交流效率遠低于當面交流,助教聽懂學生編寫一個復雜些的邏輯流程需要耗費更多的時間和精力,因此在線debug 存在許多不便和不暢之處,這是在線教育需要考慮的問題之一。
(3)減少和避免抄襲現象。以2020 年春季程序設計Ⅱ某班級的前5 次實驗為例,仍有個別學生存在抄襲現象。數據反映出抄襲人數與實驗題目難度成正比。因為現有數據量較少,所以正比關系是否成立還要進一步收集數據并分析。如何有效減少和避免抄襲現象是教師努力的方向。
程序設計課程作為計算機專業核心課程,地位不容質疑。通過OJ 系統和防作弊系統,簡化了在線教學中實驗判定過程;通過強調代碼風格,提高了代碼作業的工整程度。這些新的教學改革舉措對本課程在線教學幫助很大,但是對于在線教育中師生交流不便、代碼輔導調試困難等問題尚未很好地解決。后續需研究更有效的教學方法,努力提高在線教學質量。