徐 偉,陳凱明,馬建輝,趙家興
(中國科學(xué)技術(shù)大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院,安徽合肥 230027)
程序設(shè)計課程是計算機(jī)學(xué)科教育的基礎(chǔ),是計算機(jī)學(xué)科的入門課程[1-3]。通過這門課學(xué)習(xí),使學(xué)生在掌握相關(guān)編程語言的同時熟練運用編程解決實際問題。一般認(rèn)為以某種程序設(shè)計語言為載體掌握數(shù)據(jù)結(jié)構(gòu)及算法就是編程能力的內(nèi)涵[4-5]。文獻(xiàn)[6]認(rèn)為編程能力不僅包含算法和數(shù)據(jù)結(jié)構(gòu),也包括“代碼風(fēng)格”“代碼文件組織與管理”“結(jié)構(gòu)化與模塊化程序設(shè)計”等工程能力方面內(nèi)容。這要求教師在講解程序設(shè)計課程時,不能只講解算法和數(shù)據(jù)結(jié)構(gòu),相關(guān)工程方面的內(nèi)容也要一一介紹;文獻(xiàn)[7]提出一種教賽融合的課程教學(xué)方法,該方法以O(shè)J 系統(tǒng)為核心,通過競賽機(jī)制引入改革實驗教學(xué),重點對OJ 系統(tǒng)上機(jī)作業(yè)安排、課程實驗環(huán)節(jié)分?jǐn)?shù)計算、學(xué)生代碼查重進(jìn)行詳細(xì)論述,但關(guān)于OJ 系統(tǒng)如何防止抄襲還缺乏詳細(xì)考慮。類似采用OJ 系統(tǒng)進(jìn)行實驗評測的還有文獻(xiàn)[8-10];文獻(xiàn)[11]通過精選教學(xué)案例、強(qiáng)化實踐編程、建立教學(xué)跟蹤多維反饋體系提高教學(xué)質(zhì)量,但在在線教育特點方面考慮不足。
自2012 年以來,在線教育在教育領(lǐng)域受到熱捧,越來越多的課程被搬到了網(wǎng)上,教學(xué)思維方式得到變革[12-15]。文獻(xiàn)[16]采用基于慕課的翻轉(zhuǎn)課堂教學(xué)方法提高學(xué)生學(xué)習(xí)積極性,改變了以往傳統(tǒng)的被動學(xué)習(xí)模式,充分利用學(xué)生課外碎片化時間提高學(xué)習(xí)效率,有效地培養(yǎng)學(xué)生的創(chuàng)新能力;文獻(xiàn)[17]討論了優(yōu)化程序設(shè)計課程分?jǐn)?shù)統(tǒng)計方式,鼓勵學(xué)生更好完成實驗課程;文獻(xiàn)[18]提出混合線上和線下學(xué)習(xí)資源、多樣化教學(xué)、變換教學(xué)內(nèi)容等方式,提高程序設(shè)計課程教學(xué)水平,文獻(xiàn)[19]進(jìn)行了類似的教學(xué)案例討論。
中國科學(xué)技術(shù)大學(xué)計算機(jī)專業(yè)程序設(shè)計課程一般分為大一上學(xué)期的程序設(shè)計Ⅰ和大一下學(xué)期的程序設(shè)計Ⅱ。均為80 課時,分為40 理論課時和40 實驗課時,每門課3 個學(xué)分,主要以C 語言為例進(jìn)行講解,附帶簡要介紹Java 和Python 語言。2020 年由于受新冠疫情影響,學(xué)校采用了在線教育形式進(jìn)行授課,對程序設(shè)計這種實踐性很強(qiáng)的課程教學(xué)提出了諸多挑戰(zhàn)。為了更好地完成教學(xué)任務(wù),授課教師與課程助教經(jīng)過多次研究,對現(xiàn)有在線教學(xué)形式進(jìn)行教學(xué)改革。
本文主要介紹中國科學(xué)技術(shù)大學(xué)2020 年春季程序設(shè)計Ⅱ課程在線教學(xué)方式、教學(xué)改革創(chuàng)新點、目前取得的進(jìn)展與后續(xù)工作方向。與現(xiàn)有研究相比,在線課程教學(xué)基于OJ 系統(tǒng)的使用完成在線實驗,強(qiáng)調(diào)了程序代碼風(fēng)格和調(diào)試工具使用的重要性,對代碼風(fēng)格的具體要求及評分標(biāo)準(zhǔn)進(jìn)行了系統(tǒng)介紹,優(yōu)化了最終成績的統(tǒng)計方式,最后對抄襲的認(rèn)定過程進(jìn)行了詳細(xì)描述,具有較強(qiáng)的可操作性。
中國科學(xué)技術(shù)大學(xué)2020 年春季程序設(shè)計Ⅱ課程在線教學(xué)采用以下教學(xué)方式:
(1)在線教學(xué)系統(tǒng)分別試用騰訊課堂和學(xué)校配套的Classin 等直播平臺。
(2)在線實驗系統(tǒng)采用學(xué)校的在線評測平臺(Online Judge,OJ,https://oj.ustc.edu.cn/)檢測學(xué)生提交的程序源代碼正確性。
(3)課程PPT 講義存放在課程QQ 群文件和學(xué)校內(nèi)部的blackboard 系統(tǒng)中,供學(xué)生下載和復(fù)習(xí)使用。
(4)平時課程溝通采用課程QQ 群方式。主要在QQ 群進(jìn)行日常事務(wù)提醒、課程內(nèi)容討論和對特定問題的投票,了解學(xué)生動態(tài)。如圖1 所示,授課前對學(xué)生遞歸函數(shù)掌握情況進(jìn)行投票,班級163 位學(xué)生有135 人完成投票。通過這種專題的投票調(diào)研,可讓教師了解學(xué)生某個知識點的掌握情況,更有效地進(jìn)行課程安排。
目前程序設(shè)計的教學(xué)平臺、數(shù)據(jù)平臺分別使用不同廠家產(chǎn)品,學(xué)生要從數(shù)個來源獲取學(xué)習(xí)材料。教研組初期希望統(tǒng)一到學(xué)校的在線教學(xué)平臺,經(jīng)過試用,學(xué)生更愿意使用騰訊課堂學(xué)習(xí),使用QQ 群進(jìn)行教材文件共享,而不是學(xué)校提供的在線教育平臺。學(xué)校在不影響教學(xué)質(zhì)量前提下同意教師自行選擇教學(xué)平臺。
最終選擇騰訊課堂作為在線教學(xué)平臺、選擇QQ 群作為線上聯(lián)系討論方式、選擇學(xué)校OJ 系統(tǒng)作為在線評測系統(tǒng)。
圖1 學(xué)生投票調(diào)查實例
學(xué)生提交的程序編譯執(zhí)行結(jié)果被OJ 系統(tǒng)記錄并保存,然后轉(zhuǎn)交給一個裁判程序。裁判程序首先讀入測試用例和對應(yīng)的標(biāo)準(zhǔn)輸出,再比較學(xué)生程序的輸出數(shù)據(jù)和標(biāo)準(zhǔn)輸出樣例的差異性。最終OJ 系統(tǒng)返回給學(xué)生運行結(jié)果,包括通過、答案錯誤、超時、超內(nèi)存、運行時錯誤或是無法編譯等,并返回程序使用的內(nèi)存、運行時間等信息。實驗結(jié)束后,OJ 系統(tǒng)可對學(xué)生本次提交并通過的成績進(jìn)行列表顯示,方便教師和助教統(tǒng)計實驗成績。
為提高學(xué)生編程的規(guī)范程度,提高代碼的可維護(hù)性,安排相關(guān)助教對代碼風(fēng)格進(jìn)行專題介紹。由于學(xué)校程序設(shè)計課程主要針對C 語言編程,所以描述的代碼風(fēng)格要求僅對C 語言編程有效。代碼風(fēng)格有5 個大項要求:
(1)縮進(jìn)、括號、分行與空格。主要包括縮進(jìn)規(guī)則(以4個空格或tab 鍵進(jìn)行縮進(jìn))、大括號的風(fēng)格統(tǒng)一(大括號允許單獨分行或緊跟代碼之后,二者擇一使用,不要混用)、分行(對于較長的行、表達(dá)式等,應(yīng)以分行方式書寫)、空格(在算符、逗號等,應(yīng)使用一個空格分開,保證顯示工整與美觀)。
(2)函數(shù)頭與結(jié)構(gòu)體注釋。主要包括函數(shù)頭注釋(函數(shù)的目的、描述函數(shù)的作用、效果)、結(jié)構(gòu)體注釋(注釋結(jié)構(gòu)體用途、成員意義,必要時說明成員取值范圍)。
(3)函數(shù)、變量、常量與結(jié)構(gòu)體及其成員命名。主要包括命名規(guī)則,如進(jìn)行大/小駝峰命名,匈牙利命名法等,任何變量、常量、函數(shù)、結(jié)構(gòu)體名稱都應(yīng)直接或比較明確地反映其用途、含義、不允許命名的方式,如拼音命名等。
(4)代碼模塊化與邏輯注釋。主要包括代碼塊邏輯(如對于較長的代碼/函數(shù)塊,應(yīng)用多行注釋描述過程)、循環(huán)和分支邏輯(如對于進(jìn)入和退出時變量的變換邏輯進(jìn)行說明)、變量使用邏輯(如對結(jié)構(gòu)體成員、布爾標(biāo)志變量說明以什么含義進(jìn)行使用,何種情況值會變化等)。
(5)變量、常數(shù)與函數(shù)使用。主要包括不允許的寫法(如禁止使用未初始化的指針等)、需要限制的寫法(如濫用全局變量在函數(shù)間交換信息等)、需要注意的寫法(如有符號整數(shù)的負(fù)值與無符號數(shù)進(jìn)行運算等)。
過去的程序設(shè)計課程成績統(tǒng)計方式為考試分(50%)+實驗分(50%)。為引導(dǎo)學(xué)生重視代碼風(fēng)格,程序設(shè)計Ⅱ課程采用考試分(50%)、實驗分(45%)和代碼風(fēng)格分(5%)三項分?jǐn)?shù)的加權(quán)值進(jìn)行認(rèn)定。
其中代碼風(fēng)格評分細(xì)則如下:按風(fēng)格要求的5 個大項,每項1 分,每項只有0 和1 兩個分值,總分5 分。給分的基本原則是:凡是出現(xiàn)“不允許”的代碼寫法,不論數(shù)目均扣分;凡是出現(xiàn)“可限制”寫法較多的才考慮扣分;沒有上述情況可以給分。對代碼風(fēng)格的評價以題目為單位。最終的代碼風(fēng)格分為所有實驗有效代碼風(fēng)格分的均值。只要順利提交作業(yè)均進(jìn)行考核,對于單個實驗多次提交代碼的,選擇代碼風(fēng)格最好的一個作為實驗的風(fēng)格得分。每次實驗結(jié)束后,由助教對學(xué)生代碼逐個進(jìn)行檢查,將檢查扣分的原因記錄在代碼風(fēng)格扣分說明文件中。評分結(jié)束后,將代碼風(fēng)格扣分說明文件共享在QQ 群空間,讓學(xué)生了解如何改進(jìn)代碼風(fēng)格。
對中國科學(xué)技術(shù)大學(xué)2019 年秋季程序設(shè)計Ⅰ某班級學(xué)生進(jìn)行學(xué)情調(diào)查發(fā)現(xiàn),學(xué)生在編程過程中較少使用IDE環(huán)境自帶的調(diào)試工具,有的學(xué)生僅采用printf 方式查看變量值。這種debug 方式無疑是低效的,為此特意安排一節(jié)課由助教專題講解vs2017、gdb 等工具的調(diào)試方法,并將調(diào)試步驟詳細(xì)寫成文檔放在QQ 群文件中,供學(xué)生隨時參考。
由于程序設(shè)計課程學(xué)生人數(shù)較多,完全依靠教師或者助教人工讀代碼進(jìn)行抄襲認(rèn)定工作量巨大,所以采用Stanford Moss 系統(tǒng)進(jìn)行抄襲判定。抄襲認(rèn)定以題目為單位,并以助教和教師的認(rèn)定作為最終結(jié)果。代碼查重前先以某種方式將學(xué)生所有“正確”(通過了所有測試用例)的代碼收集起來,使用Moss 系統(tǒng)進(jìn)行查重服務(wù)。Stanford Moss 系統(tǒng)是一個“在線”的代碼查重系統(tǒng),使用此服務(wù)的用戶在本地機(jī)器上運行一個類似shell 的程序,并提供代碼語言、待判定文件所在位置等各種參數(shù),將本地代碼上傳到Moss 在線系統(tǒng)。當(dāng)在線系統(tǒng)完成抄襲判定后會返回一個URL,在這個網(wǎng)址可以以列表形式查看判重結(jié)論,如圖2 所示。圖2依次展示被比較的兩個文件、其重復(fù)比例以及重復(fù)行數(shù)目,且該頁面文件按照“最可能是抄襲的在前”順序排列。最后由助教點擊Moss 結(jié)果的某一行生成代碼查重詳情頁,助教根據(jù)Moss 詳情頁結(jié)果進(jìn)行人工閱覽,認(rèn)定是否抄襲,如圖3 所示。
圖2 Moss 系統(tǒng)查重結(jié)果(已隱去部分學(xué)號)
圖3 Moss 查重詳情頁(已隱去部分學(xué)號)
采用Moss 系統(tǒng)后對于抄襲有一定的震懾作用,但目前網(wǎng)上已有不少針對Moss 系統(tǒng)的逃避方法,如何高效地預(yù)防抄襲仍是研究重點。認(rèn)定發(fā)生抄襲后,對于涉嫌抄襲者要視情節(jié)輕重,分為“警告”“扣分”兩種處理。被警告時其對應(yīng)題目分?jǐn)?shù)不變,對應(yīng)代碼風(fēng)格分?jǐn)?shù)不變,但如下次再判定為“警告”則升格為“扣分”??鄯謺r,該題目分?jǐn)?shù)記為0分,代碼風(fēng)格分記為“空”(不會計入總平均代碼風(fēng)格分)??鄯趾笤谘a交平臺上補交本題,或其它未通過的題目通過OJ 及進(jìn)一步查重,按原分值的60%計,仍有抄襲的按0 分計。
(1)學(xué)生代碼風(fēng)格水平有了較大程度提高。學(xué)生大多可以按照規(guī)范的風(fēng)格編寫代碼,圖4 為2020 年春季程序設(shè)計Ⅱ某班級163 位學(xué)生的5 次實驗代碼風(fēng)格平均分柱狀圖,可以看到73.6%的學(xué)生代碼風(fēng)格在4 分以上(滿分5分),基本符合代碼風(fēng)格要求。
(2)從OJ 系統(tǒng)通過情況看,學(xué)生對課程學(xué)習(xí)達(dá)到基本掌握程度。圖5 為2020 年春季程序設(shè)計Ⅱ某班級163 位學(xué)生的5 次實驗編程總分?jǐn)?shù)柱狀圖,可以發(fā)現(xiàn)81.6%的學(xué)生編程分?jǐn)?shù)在40 分以上(滿分60 分),顯示學(xué)生對相關(guān)課程實驗掌握情況良好。
(1)網(wǎng)絡(luò)教學(xué)應(yīng)進(jìn)一步加強(qiáng)師生互動。師生互動是教學(xué)關(guān)鍵環(huán)節(jié)。采用面對面方式教學(xué),教師可快速了解到學(xué)生的理解程度,針對學(xué)生不明白知識點進(jìn)行再次講解。當(dāng)轉(zhuǎn)為線上教學(xué)時,師生關(guān)系無法有效建立,雖然通過相關(guān)的直播軟件可以有效了解學(xué)生的出勤率,但是很難監(jiān)控學(xué)生是否真在學(xué)習(xí),或是僅僅開著直播在做其它事情,相比之下線上教學(xué)效果更加依賴教師的授課水平。授課教師需要更加鉆研授課內(nèi)容,提高授課質(zhì)量,提高學(xué)生的學(xué)習(xí)興趣,增加師生互動環(huán)節(jié),需持續(xù)改進(jìn)以提高教學(xué)有效性。
圖4 代碼風(fēng)格分?jǐn)?shù)分布
圖5 編程分?jǐn)?shù)分布
(2)解決學(xué)生在線debug 調(diào)試?yán)щy。程序設(shè)計課程是一門實踐性很強(qiáng)的課程,就像學(xué)騎自行車,聽別人多次講解自行車如何騎行,自己獨立騎行可能還是存在很大問題。以2020 年春季程序設(shè)計Ⅱ某班級163 名學(xué)生為例,初期招聘6 名高年級學(xué)生助教,如果在校學(xué)習(xí)輔導(dǎo)人數(shù)是夠的,但由于網(wǎng)絡(luò)交流效率遠(yuǎn)低于當(dāng)面交流,助教聽懂學(xué)生編寫一個復(fù)雜些的邏輯流程需要耗費更多的時間和精力,因此在線debug 存在許多不便和不暢之處,這是在線教育需要考慮的問題之一。
(3)減少和避免抄襲現(xiàn)象。以2020 年春季程序設(shè)計Ⅱ某班級的前5 次實驗為例,仍有個別學(xué)生存在抄襲現(xiàn)象。數(shù)據(jù)反映出抄襲人數(shù)與實驗題目難度成正比。因為現(xiàn)有數(shù)據(jù)量較少,所以正比關(guān)系是否成立還要進(jìn)一步收集數(shù)據(jù)并分析。如何有效減少和避免抄襲現(xiàn)象是教師努力的方向。
程序設(shè)計課程作為計算機(jī)專業(yè)核心課程,地位不容質(zhì)疑。通過OJ 系統(tǒng)和防作弊系統(tǒng),簡化了在線教學(xué)中實驗判定過程;通過強(qiáng)調(diào)代碼風(fēng)格,提高了代碼作業(yè)的工整程度。這些新的教學(xué)改革舉措對本課程在線教學(xué)幫助很大,但是對于在線教育中師生交流不便、代碼輔導(dǎo)調(diào)試?yán)щy等問題尚未很好地解決。后續(xù)需研究更有效的教學(xué)方法,努力提高在線教學(xué)質(zhì)量。