高 蕾,王志英
(國防科技大學 計算機學院,湖南 長沙 410073)
隨著信息化社會逐步向智能時代推進,計算機程序設計能力不再是計算機專業學生的獨門技能,已成為普適于各行業各領域人員的基本素質。隨著近兩年國內掀起的全民編程熱潮,計算機程序設計得到了教育部門和社會民眾的廣泛關注,并呈現出從精英教育逐漸走向普世教育的趨勢。計算機程序設計類課程作為高等學校教育中非常重要的公共基礎課程,很多高校在大學一年級就已開設,為了讓學生短、平、快地學習一門程序設計語言,C++、Python等學習門檻相對較低的程序語言成為最佳選擇。程序設計類課程的特點是概念多、涉及面廣、難度大、抽象性高,同時有很強的實踐性和應用性[1]。該課程的目標是使學生掌握計算機程序設計的相關基礎知識,培養學生的分析問題能力和利用計算機求解問題的能力,不斷提升學生的信息處理素養,使其能跟上時代發展的步伐。
國防科技大學計算機學院開設的計算機程序設計類課程旨在培養學生的動手實踐能力,在課時比例分配、作業提交與批改、考核方式等方面都有所體現。首先是實驗課時的比例逐年增長,課程的課堂講授和實驗的課時比例一般不高于2:1,通過充足的實驗課保障學生有足夠的動手編程時間。其次,所有作業的提交和批改全部在線完成,筆者采用Trustie創新實踐平臺[2]作為課件等資源共享、作業發布和提交、答疑解惑、熱點討論的平臺,所有作業以編程練習的形式發布給學生,學生可以直接在該平臺上編程并提交,由于作業下發前已由教師事先設計好作業驗收的測試案例,學生在線提交后會立刻得到程序是否正確的提示信息,進而可以依據提示信息修改、測試自己的程序,直到程序測試通過。采用這種作業在線測試提交方式,學生對于編程的體驗變得更深刻,同時可以有效提高學生查糾改程序錯誤的能力。第三,課程考核采用上機編程考試,由計算機考試系統統一閱卷。機試考核對學生平時編程練習是一個很好的促進,能夠比較真實地反映學生的實際編程水平,并有效保證考試的客觀公正。
在各種改革措施的牽引下,學生動手編程的能力普遍提升,課程整體教學效果得到明顯改善,但教學過程中仍暴露諸多問題,主要體現在以下幾個方面。
(1)傳統課堂講授和新型教學方式在新生教學方面都存在局限性。雖然各高校的計算機程序設計課大多采用課堂教學與編程實驗相結合的形式組織教學,但是課堂講授仍作為教學中最重要的環節占據大量教學時間,不可避免地存在偏重知識灌輸、學生被動聽、缺乏學習興趣、教與練脫節等一系列問題。實際上這并不是唯一的教學組織方式,MOOC、翻轉課堂、微課等很多新型教學形式已經不斷被引入,為計算機程序設計類課程提供了新的助力,也對學生的自主學習能力提出更高要求。而對于大學新人,中學建立的學習模式無法立即改變、對新知識新思維的接受程度差異大、自我管理能力缺乏、課下時間有限等問題表現得尤為突出,容易造成學生對知識點的理解不深入或產生偏差,知識學習變得零散化,無法系統掌握一門編程語言及編程技術,這些都使新型教學方式無法有效開展并發揮其優勢。
(2)編程練習缺乏跟蹤互動,實際效果比預期差。程序設計編程練習主要安排在實驗課開展,課堂講授中也會根據知識點穿插一些簡單的編程練習。俗話說熟能生巧,很多教師都會用這句話激勵學生多練習,提高編程水平。但實際上,每次實驗的目標、任務以及涉及的編程技巧不同,雖然教師安排的練習內容很充實,但缺乏足夠的反饋,學生往往因為對實驗知識點不熟悉、拿到練習題無從下手、不會查糾程序錯誤等原因,導致實驗課上編程練習的進度減慢,練習效果并不理想,無法達到教師的預期實驗目標。究其根源在于教師并沒有根據學生實際情況組織實驗進度,學生有效的反饋與教師合理設計練習題目同樣至關重要。
(3)編程實踐的內容脫離學生實際。經常有學生抱怨說千辛萬苦學習了一門復雜的編程語言,卻只能用來解決雞兔同籠、楊輝三角之類的“無用問題”,感覺學習很失敗。導致學生產生這種想法的原因在于,教師在設計編程練習時往往只考慮到題目的編程難度、題目與知識點的結合程度等方面,而忽視了這些題目與學生的知識背景嚴重不符,讓學生無法提起編程的興趣。而類似二分算法、背包問題等有一定編程難度的算法類問題更受學生歡迎,讓學生覺得這些題目更具有實際意義、與其他課程內容有聯結,甚至產生自己可以編出程序的自信感和自我認同,容易激發學生編程的主動性和積極性。因此,課程實驗內容設計應從學生已有知識背景出發,真正做到為學而教,讓學生學習有的放矢。
所謂知識遷移就是一種學習對另一種學習的影響,是在一種情景中技能、知識和理解的獲得或者態度形成的影響,以及利用所學的技能、知識等解決問題的過程[3]。大學新生對知識遷移并不陌生,他們以往獲得的知識都是通過對已有知識的遷移整合逐步習得,也就是常說的舉一反三、觸類旁通,這種方式在大多情況下會對學生的學習產生正面積極的刺激效應,能夠將學生快速帶入新知識的學習情境[4]。針對在計算機程序設計類課程教學中發現的問題,筆者開展基于知識遷移的教學實踐探索,將從下面3個方面研究如何組織課堂教學與設計編程實踐內容,實現教、學、練的有機結合,進而培養學生自主學習和發現、研究問題的能力。
知識遷移注重在新舊知識之間架構橋梁,已被學生熟練掌握的中學數理學理論將成為知識遷移的首選。其優勢在于學生充分熟悉,當遷移到新知識學習時難度最小且利于學生產生共鳴及自主思考,有利于開展良性的課堂互動。教學實踐內容的設計可以將學生已儲備的數理學領域理論知識與實例,通過知識遷移引入編程實踐練習,訓練學生通過編寫程序完成相應計算,使學生快速掌握使用計算機進行問題求解的思想和方法,進而逐步培養學生利用計算機解決科學研究和工程實踐問題的能力。經過多年的知識積累與學習歷練,學生一般對數理學領域的知識構建了比較系統的知識體系,形成了一套具有自身特色的知識學習系統。當接收新領域新知識時,特別是具有嚴格語法規則、表達符號化且蘊含一定邏輯思維的程序語言時,學生難免產生挫敗感或排斥性,延長了新知識的學習時間。但如果引入一個學生很熟悉的場景、概念、理論或應用,學習過程中產生的不適感會大大降低。例如,C++語言中二維數組的表示與應用,這一知識點在課堂講授中比較抽象,學生并不容易理解與掌握;如果關聯數學中的矩陣對照學習,并選取矩陣相關練習題目進行編程鞏固,這個知識點的掌握就變得輕松多了。為此,教師可以充分考慮學生已有知識背景,選取具有實際意義的練習題目,編排有利于促進知識遷移的教學實踐內容,引導學生自主學習。利用編程練習激活學生已有知識,當學生將新知識與已有知識聯系起來時,學習將變得更高效,也更有利于學生自身整合新知識。
另一方面,可以利用平行課程的理論知識牽引編程實踐,實現交叉學科知識間的相互促進與共贏。大多數高校在大學一年級都會開設高等數學、物理學、線性代數等公共基礎課程,其特點是難度較大、學習周期長、具有較強理論與實用背景。可以選取這些平行課程中理論知識或實踐應用遷移到程序設計課程的編程練習中,利用學生學習數理知識的先天優勢帶動程序設計學習的積極性,并借助編程解題的快捷性幫助學生鞏固對數理知識的理解和運用。例如,可以利用編程實現高等數學、物理學中復雜公式的快速計算與測試。通過建立不同學科之間知識的內在聯系,學習不再是抽象的行為,實現了知識的學以致用,讓學生真正感受到程序語言學習的實際意義所在。但也應該注意到,學生將數理學知識與編程實踐結合時會存在一個磨合和轉化的過程,這時仍需要教師做適當的引導;同時,教師必須同步跟蹤平行課程的授課內容與進度,并要求對遷移使用的數理學知識必須充分掌握與靈活運用。
利用思維導圖梳理和細化教學內容及教學組織形式,應選擇有內在聯結的數理學知識構建有效的知識遷移場景。傳統課堂講授的優勢在于能夠引導學生注意力、捕獲學生課堂反饋,但需考慮如何避免滿堂灌、互動少、只學不練等問題。之所以會出現上述情況,大多是因為教師對知識點的梳理不夠清晰以及對教學進度把握不準確引起的。一般來說,一堂課的時間里學生接受新知識或新技能的數量不超過3個[5],如何在有限時間內重點講授有價值的知識點,需要教師對知識點進行反復斟酌取舍甚至提前演練,以提高課堂教學效率。課程組在開課前首先會整理歸納教學內容,將每一章的教學目標、涵蓋的知識點、知識點評價方法以及可實施的課堂教學活動利用思維導圖[6]表示出來,其優點是有助于呈現各模塊知識點之間的隸屬或關聯,利于輔助教師將數理學知識遷移到適合的知識講授和實踐活動中,從而促進學生構建完整的知識體系,使課程整體脈絡更清晰,課程內容更系統化[7]。圖1給出一個簡單思維導圖示例。針對程序語言中函數定義這一知識點的講授,使用思維導圖給出了具體教學目標與課堂上可以開展的教學活動,并將學生熟悉的數學函數知識遷移引入程序函數的學習,讓學生對程序函數的寫法和使用有更直觀的印象。在適合的知識遷移場景下,教師可以更有效地開展講授、實驗、研討、對抗賽等形式的教學活動。

圖1 函數定義思維導圖示例
可以采用課堂講授與實踐練習緊耦合的教學模式提高知識遷移的教學效果。在教師構建的知識遷移場景下,學生將新舊知識建立聯結關系,為了深化該聯結并快速應用于新知識學習情境,需要結合編程練習來強化新知識的運用。很多教師往往將知識點講授和編程練習這兩個緊密相關的環節安排在課堂和實驗課中獨立開展,舊知識遷移到新環境下未及時融會貫通,同樣會降低學生的實際學習效率,特別是在學生尚未具備使用計算思維分析解決問題能力的情況下,還需要教師的耐心引導。因此,筆者鼓勵教師以邊講邊練的形式組織教學活動,由教師引導學生編程,使學生逐步獲得分析問題、用程序語言表達解題過程的思路與方法。為了提高學生編程實踐的效率,筆者利用網絡上公開使用的實訓平臺[8]輔助學生的編程練習,將知識、方法和技術融入編程實戰訓練。該實訓平臺提供了知識傳授與工程實戰一體化的自主學習模式,教師根據知識點與知識遷移場景設計配套練習題,以實訓的形式提前部署在平臺上,學生以類似游戲闖關的形式在線完成這組編程練習。題目設置上不要求學生寫出完整程序,而是根據任務要求補充程序語句的形式完成闖關任務。任務說明中還會給出此練習涉及的具體知識點與解決該類問題要使用的語句及程序示例,引導學生快速進入闖關實戰狀態。當知識點講授完之后,教師可以立即組織學生在實訓平臺上開展訓練,實踐和鞏固知識遷移后在新環境下的運用,調動學生編程的積極性,而游戲闖關式的編程訓練模式也更容易激發學生自發完成任務關、挑戰更難關的學習欲望。
為了充分重視學生的主體地位,避免只重結果不重過程的被動評價模式,筆者采用過程評價和終結評價兩種方式對學生在知識遷移后的學習情況做評估,實現對學生的學習動機、過程和效果三位一體的綜合評價。
過程評價主要對學生日常學習過程中的表現、反映出的情感與態度等方面的發展情況作出評價[9],這是一個基于對學生學習過程的持續觀察、記錄、反思做出的動態評價過程。當激活的舊知識遷移應用到新知識環境下時,必須對學生的學習效果做出判斷,引導學生完成知識正向遷移與運用。例如,在圖1思維導圖基礎上,筆者增加了數學函數知識遷移到函數定義學習中時所需的過程評價標準,見圖2,用以對學生在知識遷移場景下新知識的學習情況作出評價。過程評價可以通過教師課堂觀察、課堂提問、比賽、游戲等實踐活動的記錄以及問卷調查、教輔分組輔導反饋、學生自評與互評等形式進行評價。譬如,筆者對學生采用小組集中輔導方式,為每5~8人的編程小組里安排一名教輔跟進輔導,教輔主要針對知識遷移運用中存在的疑惑進行解答、督促學生練習進度并給出學習進展評價,結果顯示學生編寫、調試代碼能力得到迅速提升。教師通過各種過程評價獲取的關鍵信息有助于對教學行為與學生學習行為進行分析判斷,為調整教學方案與設置合理知識遷移場景提供參考和依據。終結評價包含階段性測試與期末測試兩部分,主要采用上機考試與量化分數形式進行評價。終結評價仍以知識遷移場景為主題,結合知識點混合應用來設計考試題目,主要對學生通過計算機編程分析解決復雜實際問題的能力進行考核與評價。
計算機程序設計類課程采用基于知識遷移方式開展課堂講授與編程訓練緊密結合的教學實踐活動,有利于學生快速整合已有知識來構建新知識學習情境,促進學生利用計算思維分析問題與解決問題能力的培養,同時也能夠激勵學生主動學習、積極思考與參與教學過程,有效提高教學質量,也讓學生切實感受到程序語言學習的實際意義所在,真正做到學習有的放矢。

圖2 增加過程評價的函數定義思維導圖