謝春麗,高宇翔,吳昊聰,趙向軍
(江蘇師范大學 計算機科學與技術學院,江蘇 徐州 221116)
程序設計課程不僅是計算機類各專業的重要基礎課程,同時也是理工類各專業大學生的核心素養課程,在學科課程體系中具有奠基作用,會直接影響后續課程的學習和掌握,但計算機程序語法規則嚴格、語句邏輯嚴密、代碼高度程式化,與人類固有思維模式差異明顯。面對復雜問題既需要有靈活應變、不拘常規地解決問題的創新思路和高屋建瓴的宏觀思維,又需要具備庖丁解牛般、以無縫入有間的精細技巧,還需要將匠心機巧的問題解決方法轉換為依序執行、細致入微、近乎僵化的機械步驟。掌握這些差異性極大的思維模式對大部分學生來說是個嚴峻挑戰。因此,該課程學習起步困難、提升緩慢,常常成為計算機類大學生入學以來經受的最為嚴峻的考驗。
計算思維與程序設計是軟件能力的關鍵核心,它與宏觀大軟件的分析結構相結合,衍生出軟件架構設計能力,這些能力與工程化軟件開發能力一起,從屬計算機軟件開發能力的主要構成。在寬進嚴出的學業管理機制未能完全形成的情況下,很多學生在程序設計課程學習中出現了嚴重不適應,并且這種不適應貫穿整個大學生涯。這些問題嚴重影響了大學畢業生的質量,也制約了國家信息產業的發展。
綜上所述可知,一方面國家信息化發展戰略在向縱深推進,互聯網與各行各業的深度融合催生了對信息技術人才的巨大需求;另一方面,計算思維和程序設計的欠缺導致繁榮專業發展的背后,是人才的嚴重不足。在師資儲備不夠充足、學生主動性不夠強的情況下,謀求程序設計課程教學模式之變迫在眉睫。
CDIO工程教育模式以項目驅動為教學方法[1],對學生的學習進行興趣引領,借助簡單易用的圖形化實訓教學平臺進行輔助建構,并對課程知識點進行精細管理,同時根據學生的學習記錄推薦學習資源,如圖1所示。這5個方面的緊密結合不僅能促進學生學習知識,同時也能引導學生將知識轉變為應用,拉近教育教學和社會需求的間隙,這對改善課程教學質量、提高應用型創新人才培養質量具有重要意義。

圖1 課程教學整體設計
項目驅動化課程教學以完整的項目為教學案例,選擇合適的項目組織相關教學內容[2-3]。和傳統的課程教學相比有明顯的優勢。首先,項目任務明確,在項目構思和設計過程中,需要用專業理論知識去指導項目、解決問題,學生可以在完成項目的過程中,深入學習并掌握具體理論知識,將理論和實踐緊密結合,從而完善所學專業知識,提高解決實際問題的應用能力。其次,CDIO工程教育模式強調學生的主體地位,教師引導學生進行自主探究、合作學習,形成正確的情感、態度與價值觀[4]。該理念所倡導的教學更注重培養學生在教學活動中掌握提出問題、分析問題和解決問題的能力。而將學科知識融合到游戲中,為學生提供問題化學習情境平臺的游戲化學習模式正好適應CDIO的教學理念。它作為一種新型的學習方式已經得到了廣大教育工作者的認可和支持,滿足了個體獨特的學習興趣和需求,讓學生在不同的復雜程度下學習,將知識轉化為解決現實問題的技術和能力,把書本學習的經驗用于實踐活動中,使學生學有所成,學有所用。最后,項目完成需要學生之間相互合作,既能取優補短,又能相互學習,既鍛煉了個人能力,也提高了成員的團隊意識和溝通能力。
大量研究表明,興趣是推動人們求知的一種內在力量[5]。烏申斯基曾指出:“沒有絲毫興趣的強制性學習,將會扼殺學生探求真理的欲望。”據此,“游戲化教學”強調將教學目標隱藏于課堂游戲環節中,通過豐富多樣的游戲活動激發學生的學習興趣,調動自主學習的積極性。面對程序設計里嚴格的語法規范,枯燥的算法邏輯,保持高度的興趣才有可能繼續深度挖掘知識。如果只是一味嚴謹、枯燥地進行語法教學和程序講解,學生很難長期保持高度的興趣。根據布盧姆的教育目標分類,情感領域的教學目標、認知領域的教學目標和技能領域的教學目標并列為高校三大教學目標[6]。隨著程序設計的難度增加,為避免學生對枯燥的程序設計產生厭倦情緒,教學過程必須采用獨特的教學方案,融入良好的情感教育,吸引學生的注意力,使學生對所學知識產生濃厚的興趣,并帶動學生參加游戲類項目,對所學的知識具有事實性了解,通過有趣的游戲化項目開發提高學生的技術水平,調動學生的積極性,開發學生的想象力。
程序設計類課程不僅是學生后續專業學習的引領,同時也是激發學習興趣的關鍵,而低年級學生需要快速對本專業的應用場景、市場前景有直觀、具體的認識。在不借助任何教學平臺的條件下,C、C++課程教學一直以來都很難突破界面設計,學生只能開發一些小型的控制臺應用程序,例如工資管理系統、學生管理系統,這種類似MS-DOS的命令型操作界面很難讓學生有成就感和專業認知感。為了激發學生的學習興趣,程序設計教學融入游戲化元素,以輕松、直觀、富有樂趣的方式激勵學生將理論知識應用到項目開發過程中,做到“玩中學”,以玩的動力驅動知識學習。目前市場存在的程序設計教學軟件和實訓平臺,例如Scratch、Unity3D、Funcode等,崇尚以游戲化的方式進行實驗教學。他們將任務處理流程和圖形化界面設計的Windows API函數進行封裝,提供了一個開發Windows應用程序的整體邏輯框架。學生無需進行繁瑣、復雜的底層細節設計,只需要關注功能設計,大大簡化了應用程序的開發,尤其對低年級的學生更加適用,擺脫了以往“黑底白字”的運行界面,在生動有趣的游戲設計中學習程序設計知識,將枯燥繁瑣的程序代碼和生動的程序運行效果結合起來,激發學生為了得到更好的效果進而精益求精,研究代碼、改進代碼的目的。
按照系統論的觀點,對課程教學全面采用精細化管理,對課程內容設計和訓練實施全過程、無縫隙的管理,形成一環扣一環的知識點劃分,項目的選擇要對知識點全面覆蓋。針對CDIO不同能力培養的要求,我們將課程內容進行精細化設計和提取,按照由淺入深、由簡單到復雜細分為一系列知識點,根據類型、難度,把課程教學分成三個階段,包括基礎知識、綜合程序實踐和實訓項目實踐,旨在從基礎知識的掌握、個人能力的培養、團隊能力的建設和工程應用能力的強化4方面逐步將CDIO 的教育理念貫穿至整個教學過程,見表1。對基礎知識主要以簡單有趣的實驗為主,如電燈開關游戲,紙牌排序游戲,重在激發學習興趣;綜合性項目旨在培養學生的團隊協作能力、系統實現和維護能力,例如海底世界、貪吃魚、黃金礦工等項目;實訓項目重在培養學生從系統構思到系統運行維護的能力。綜合項目和實訓項目需要多人合作,在項目開發過程中同時培養了學生的溝通能力,自我管理能力等基本素養。

表1 C語言目標實施矩陣
程序設計類課程的知識點異常豐富、程序語法規則嚴格、語句邏輯嚴密,要想真正熟練地掌握程序設計,僅僅依賴項目還是不夠的,同時還需要對基礎知識點的掌握。本項目擬根據每個學生學習的過程數據、考核數據,將未熟練掌握的知識點推薦給每個學生,提高學習者獲得課程教學資源的效率以實現精準化教學。利用詞袋模型對教學資源文檔進行表示,有效利用文本內部的情境信息,構造CNN(卷積神經網絡)的多層卷積操作,抓住文本中詞語之間的相互關聯,幫助學習用戶和資源的隱表示。首先對文檔中的每個詞做嵌入式表示,然后將所有嵌入式向量拼接成一個矩陣,每個資源文檔都可用一個二維矩陣表示,然后在這個二維矩陣上進行卷積、池化以及映射,從而獲取學習資源的隱向量,并根據隱向量進行資源推薦。
按照CDIO工程教育的理念,程序設計教學內容要保證理論知識和實踐應用并駕齊驅,以層層遞進的方式逐步加大、加深知識點的學習。教師作為教學活動的組織者和引領者,全面掌控教學過程。把理論學習融入到實踐教學中,符合學生的認知規律,提高學生學習該課程的興趣[7-8]。教學實施過程如圖2所示。該圖主要包括兩個組成部分:①借助OJ平臺,進行基礎知識的規范化編程;②借助Funcode平臺完成實訓項目的設計與開發。
程序設計的編寫有非常嚴格的語法規范,良好的編程習慣和風格是程序設計的基礎,它的形成不是一朝一夕,而需要長期堅持不懈的練習。Online Judge系統(簡稱OJ)是一個在線的判題系統,可以協助學生程序編寫練習。用戶可以在線提交程序多種程序(如C、C++)源代碼,系統對源代碼進行編譯和執行,并通過預先設計的測試數據來檢驗程序源代碼的正確性。一個用戶提交的程序在Online Judge系統執行時將受到比較嚴格的限制,包括運行時間限制,內存使用限制和安全限制等。用戶程序執行的結果將被Online Judge系統捕捉并保存,然后再轉交給一個裁判程序。該裁判程序或者比較用戶程序的輸出數據和標準輸出樣例的差別,或者檢驗用戶程序的輸出數據是否滿足一定的邏輯條件。教師也可以查看學生提交的代碼以及代碼錯誤記錄。根據錯誤記錄,及時補充、指正學生代碼中出現的問題。
Funcode平臺是一款游戲化的實驗教學平臺,支持C、C++和Java語言的開發和設計,封裝了處理流程和圖形化界面設計的Windows API函數,提供了一個開發Windows應用程序的整體邏輯框架[9-10]。圖3給出了Funcode平臺的框架,基于Funcode開發項目有兩大優勢。

圖2 教學實施過程

圖3 Funcode 實訓平臺框架
(1)界面設計簡單、直觀。Funcode包含界面設計和項目開發兩大模塊。學生在編輯器中通過拖拉資源、設置資源屬性等方式可以輕松設計游戲界面、特效、各種精靈(動態精靈和靜態精靈)。
(2)處理流程清晰。完成界面設計之后,可以用 VC++,CodeBlocks或其他IDE環境編寫代碼,完成各種定制功能。Funcode平臺對涉及處理流程的細節進行了封裝,將游戲運行過程劃分為游戲初始化、游戲運行和游戲結束3個函數。用戶無需了解圖形化窗口操作的具體細節,只要關注項目的具體功能和對應的實現函數,重載并實現Funcode類庫中具有相應功能的接口函數,大大簡化了用戶的使用。
為了讓學生理解分支程序設計,傳統的實驗教學往往用文字敘述任務,用文字輸出結果,用DOS界面輸出電燈開關信息,代碼如下:


借助Funcode平臺就可以設計類似電燈開關的小游戲,Funcode對這個游戲提供了程序框架,學生只需要在Play(int i)函數中填寫代碼。其中,i=0時,表示關閉電燈開關;i=1時,表示打開電燈開關; 然后調用函數TurnOn(),TurnOff()可將電燈點亮和熄滅,程序運行可觀察到電燈點亮和熄滅。
在CDIO工程教育理念的指導下,以項目化的方法、游戲化的界面設計為興趣點,借助輔助平臺的便捷,外加精細化的知識點管理,讓程序設計教學過程變得趣味橫生,學生在游戲中除了掌握知識點之外,對實際環境下的使用多了一份體會和認識。對培養學生的程序設計能力起到巨大的促進作用,是培養學生的工程應用能力的良好開端。