馮 筠,吳 桐,盧 鑫,馮宏偉,孫 霞
(西北大學 信息科學與技術學院,陜西 西安 710127)
程序設計基礎是計算機科學類專業最重要的平臺課程之一,主要面向基本沒有編程經驗的大一新生,旨在引入計算思維、培養程序設計思想和編程技能[1]。然而,對大部分學生來說,在短短一個學期內熟練掌握編程技能有一定的挑戰性。慣于接受應試教育的學生會發現將知識和技術應用到實際問題的解決中不太容易,尤其是用計算思維來思考解決問題難以適應[2]。同時,程序設計基礎也是能力需求密集型課程,部分學生可能會在學習中感到挫敗;或者是能聽懂和理解課程,但卻在實際編程時無法完成任務[3]。
眾所周知,工科課程以理論知識講授和實際應用能力培養為主,具有很強的實用性和綜合性。因此教師在教授這類課程時不但要構建合理的知識結構,還需設計階段化的能力目標,培養學生在未來的學習和工作中都能良久受益的可持續競爭力。知識通常是顯性的、容易傳授的,學生對知識的掌握程度容易通過填空題、選擇題等概念性評測表現出來;而能力往往是隱含的,需要更加綜合的題型來嘗試評估。在程序設計基礎課程中,常用編程題、程序填空題等間接測試。由于知識和能力的綜合性,學生的學習程度往往參差不齊,照本宣科、千人一面的教學方案顯然是不可取的。然而,如何將培養能力融入知識化的大學課程中至今還是一個開放問題。
傳統的教學方法類似軟件開發中的“瀑布模型”,一般需要經過立項、設計、建設、實施、調優等幾個階段,是按照教師事先設計好的教案按部就班的教學過程,很少考慮學生的個體性和差異性[4]。敏捷教學強調以學生為中心,注重學生的個人志趣與學校培養目標相結合,定制適應個體的培養方案;是理論、知識、能力和素質多方位融合的教學體系,是激發學生潛能、培養學生可持續競爭力的教學過程[5]。敏捷理念最早源于制造領域,從20世紀90年代開始受到軟件開發領域的關注。21世紀初期,敏捷理念拓展到項目管理領域,并逐步擴大到教育領域[6]。因為敏捷教學過程較為快速、輕量化,而且學習任務安排合理、可交付,這使得那些渴望成功但缺乏基礎和經驗的學生能夠得到教師的及時指導,一步一步實現能力達成的終極目標。
顯而易見,教學效果的迅速反饋是敏捷教學的基礎[7]。與傳統教學方法相比,在敏捷教學過程中需要輔以更多的測試和評估,使教師迅速了解學生學習狀況,對下一輪迭代教學過程做出及時調整;同時,也使學生可以快速了解知識漏洞、自我反思、積極調整學習態度和方法。此外,敏捷教學注重培養學生與教師之間的溝通和互動,鼓勵學生積極地參與學習過程,充分發揮主觀能動性。對于工科課程,教師在教學的前期階段突出“教練”的角色;在后期隨著學生自信心和自學能力增強,教師從“教練”退出為“觀察者”,讓學生自己學習、互相學習、從經驗和失敗中學習,切實提高未來的“可持續競爭力”。
以“拼題”為代表的程序設計在線測試平臺目前國內已有不少,并在程序設計基礎的敏捷教學中扮演了重要角色;缺點是只有二級知識點,評估結果反饋不夠全面,只有知識點掌握情況分析,沒有能力達成分析。筆者團隊在編程教育相關領域進行了多年的研究,利用層次化的知識點樹研究開發了個性化習題推薦系統[8],該系統重點分析了學生在編程課程中對知識點掌握情況,從而進一步推薦適合學生的習題來提高學習成績。也有學者研究基于評估結果的學生分組[9],但是目前還沒有發現能夠滿足敏捷教學各項需求的完善在線評估平臺。
敏捷教學中的授課元素和評估過程可抽象如圖1所示。
(1)知識:主要是概念性的,可采用學生自學、MOOC微視頻、教師講授等方法進行學習,通過選擇、填空、判斷等題型進行測試。
(2)能力:只能通過培養和練習達成,教師可通過實例、實訓、示范等方法進行傳授,通過編程、函數編寫、程序填空等題型進行測試。
教師通過多種教學手段進行知識傳授和能力培養,通過在線評估系統迅速得到教學效果反饋,實時修正教學內容和策略。
根據課程的目標,教師首先把需要達成的能力描述為多個等級。表1列出了程序設計基礎的能力層級和先序關系描述。

圖1 程序設計基礎敏捷教學過程

表1 程序設計基礎能力層級描述
為了涵蓋所有的概念性內容,將課程大綱細化為4層知識粒度,稱為不同層次的知識點。通過梳理知識點之間的關系,最終組織成為知識圖譜。知識點的上層和下層之間是包含關系,同級別知識點之間可能是遞進、并列關系。程序設計基礎的課程包括237個知識點、231個包含關系、125個遞進關系。知識圖譜的構建為將來的知識追蹤做好了鋪墊,為學生動態分組和知識漏洞的最終溯源提供了基礎。表2列出了程序設計基礎的部分知識點定義。
為保證在線測試的評價準確,約定概念性的知識通過選擇題、判斷題和填空題測試。為這些習題標注已有知識圖譜的1~3個知識點(見表3)。
能力性的測試則通過程序填空題、函數題和編程題完成。這些題型由于涉及知識點比較多,需顯示學生的綜合能力,因此標注能力層級即可。注意能力層級和第一層知識點之間并非唯一的對應關系。表4顯示了編程題的能力層級標注示例。

表2 程序設計基礎知識點定義列表(部分)

表3 選擇題、判斷題、填空題的知識點標注

表4 程序填空題、函數題、編程題的能力層級標注
為了達到敏捷教學的目標,通過評估迅速了解學生的學習狀況至關重要。通過教學實踐,面向敏捷教學的在線評測系統需具有如下功能。
2016年4月,“華山-五院(上海市第五人民醫院,以下簡稱“五院”)-閔行(閔行社區)”醫聯體簽約建設。在此框架下,華山醫院在醫療服務、學科建設、教學科研等方面與五院逐步深入融合。從2016年初,華山醫院、五院和相關企業開展了醫聯體及腦卒中單病種業務合作,努力在篩查預警、卒中急救、遠程卒中、卒中商保、診斷治療、隨訪評估、康復干預等方面創新探索。
(1)測試部署。教師能夠利用標注好的習題庫,方便地組織和部署考試;系統最好能夠自動檢測測試內容的完備性,并對測試難度給出估計。
(2)在線答題。評估學習效果的基本方法有課堂提問、注意觀察學生課堂反應等,但這些方式都不夠全面,難以量化。我們認為最有效的方法是全體學生周期性在教學時間軸的關鍵點進行在線測試。因此,方便的在線答題功能至關重要。對于程序設計基礎課程來說,主要用到的題型有:用于知識概念測試的選擇、判斷、填空題,用于能力水平檢測的程序填空、函數和編程題。此外,由于教師時間有限,測試結果的自動評判非常重要。程序設計基礎課程用到的所有題型目前各大平臺均能自動評判,問答題在該次課程教改中暫時沒有涉及。
(3)評估結果反饋。基于大數據量答題記錄的各類統計、可視化模塊可使教師迅速及時了解整體學生對知識掌握情況和能力的達成情況,對敏捷教學的下一個周期迭代非常關鍵。
(4)教學及學習策略建議。根據學生的評估情況,建議教師進行動態學生分組,對學生進行知識漏洞提醒、掉隊學生預警等,促使教學過程的閉環盡快形成。
圖2展示了面向敏捷教學的在線評測系統的用例圖,并描述了系統的主要功能模塊。
下面簡述在敏捷教學過程中的一些關鍵內容。
(1)測試部署的時間節點規范化、周期化。在能力層級提升的每個關鍵時間點,必須進行在線測試,以即時獲得學生的學習狀態反饋。圖3顯示了本文描述的敏捷教學改革學期進行的15次測試和能力層級之間的關系。
(3)評估結果的可視化。如果班級人數多,大量測試結果和表格式的答題記錄很難讓教師迅速了解學生掌握情況。系統需要有多種分析和可視化的能力,可將答題記錄呈現在教師面前,一目了然。評估結果主要包括3個類別:班級整體情況、學生個體情況及教學策略建議。

圖2 面向敏捷教學的在線評測系統用例圖

圖3 本學期進行的15次測試和能力層級示意圖
班級整體情況包括能力達成情況、知識點得分率分布情況、知識點掌握情況等,如圖5所示。根據班級整體分析和知識點掌握情況等,教師很容易得出教學內容調整的策略。
學生個體情況分析用于學生對于知識點漏洞的自查,教師對個別學生的跟蹤等,可以展示任意層級知識點的掌握情況表及本人目前的能力層級、在班級的排位(圖6所示)等。
(4)基于數據挖掘的教學策略建議。在大數據支持的基礎上,基于答題記錄分析的教學策略建議,需要用到數據挖掘(無監督)或機器學習技術(監督)。例如基于答題記錄的學生動態分組,可采用知識圖譜的相似度匹配和K近鄰技術完成[9];基于知識追蹤的個性化學習資源推薦可采用協同過濾算法完成[10]等。

圖4 答題記錄表(自動生成)
授課班級為2018級信息學科學生,采用敏捷教學改革的班級稱為教改班級42人,采用傳統方法進行教學的對比班級38人,兩個班級入校高考成績分布基本相同。兩個班級使用相同的教學大綱和教材。2018年秋季學期程序設計基礎課程設定為54理論課時+36上機機時,由于是新生,減去軍訓、國慶假期,期中期末考試周,剩余共計12個教學周。教改班級按照第2節設定的11個能力層級,每周完成一個能力層級,周一開始,周五檢驗,周末留給學生查遺補缺,留一周時間根據學生情況動態調整。

圖5 班級整體情況可視化模塊

圖6 學生個體情況分析模塊
理論教學主要是知識的傳授過程,采用混合式教學模式。已在愛課程上線程序設計基礎實例與案例SPOC課程,只用于預習、復習和查遺補缺,不作為主要的教學手段,也未采用翻轉課堂形式。能力培養采用實例示范+程序訓練模式。針對每個能力層級編制了實驗手冊,引導學生從理論知識點出發,從實例中思考,摸索和擴展。上機時學生跟著實驗手冊邊做邊練,然后布置作業在課后完成。
教學改革中每周實施:2學時在教室理論講授,2學時在機房練習實驗手冊,2學時在機房在線PTA平臺測試。除了統一的課時和機時外,每周留課外上機作業,根據調查學生大約會花每周4~10學時完成作業。整體的教學過程按照能力層級設定逐步展開,大部分學生基本上每周登上一個能力層級。圖7展示了一個周期的教學及自學安排。

圖7 程序設計基礎敏捷教學的一個周期
周五授課結束后,通過平臺進行在線測試,可以得到學生的整體學習情況:包括(1)能力層級達成度分析;(2)知識點掌握情況分析。確定下周課程是否重新強調某些知識點或安排更多實例練習。發現知識有漏洞的學生,進行(1)個性化教學資源推薦,包括教學視頻(SPOC),或推送更多的參考練習題;(2)組成動態討論小組,由助教組織進行再講解和分享。
課程教學一學期結束后閉卷期末考試,傳統班級和教改班級題目相同。傳統班級采用紙質考試(編程題有過程分),教改班級在線考試(編程題沒有過程分,但有多個測試得分點)。兩個班級期末考試分數對比如圖8所示。

圖8 教改班級和傳統班級期末考試成績對比
可以看出,敏捷教學模式大大地提高了學生能力水平及知識點的掌握程度。教改班級期末考試90分以上的學生占45%以上。傳統方式培養的學生分數段集中在60~80分左右。值得注意的是,由于教改班級判分嚴格,不及格人數占比4%,而傳統教學班級紙質考試判分較靈活,無不及格。還有一種可能是強節奏的能力沖擊是使個別學生跟不上,最終掉隊。
圖9顯示了教改班級期末考試知識點掌握情況柱狀圖,大部分學生掌握情況良好。但發現學生對指針、變量作用域等知識點掌握得不盡如人意,分析是因為臨近期末教學比較匆忙,指針內容靈活難以消化;而變量作用域則是因為沒有專門進行測試和布置作業,造成知識消化不夠完全。令人驚奇的是,第一能力層級的輸入輸出語句得分率偏低,查閱下一層知識點掌握情況發現,由于“格式化輸入輸出”記憶性和技巧性較強,并學過的時間較長,很多學生已經忘記或者忽略,提示下一輪教學中,考試前需要給學生強調記憶并加強練習。

圖9 教改班級期末考試知識點掌握情況
我們提出對程序設計基礎課程進行知識圖譜及能力層次構建,利用在線考試平臺的不同平臺進行概念測試和能力評估。進而提出適合程序設計基礎課程的一種混合敏捷教學模式,在教學實踐中取得了較好的效果,有積極的推廣意義,并為其他工科課程改革提供了有益的參考。