黃麗達 陳湘濤
摘要:以湖南大學c++程序設計教學為例,闡述將計算思維融入程序設計課程的具體實施方法:從理論教學到實踐教學,從授課案例到日常評測。全方位引入計算思維的教學方式可以明顯提升教學效果,有利于培養學生探究問題和求解問題能力。
關鍵詞:計算思維;教學實施;程序設計;交叉評閱
0 引言
程序設計類課程,是工科專業的重要基礎課程之一,是本科高年級和碩士階段許多專業核心課的驗證與研究工具,且對學生在計算機科學思維方式的培養,以及對未知問題的分析、對解決方案的探究與比較等多方面能力的訓練都具有良好的促進作用。同時,作為專業基礎課,程序設計課學得好不好、學得是否愉悅,對本科生的后續學習在心理上和學習習慣上均有不容小覷的影響。然而,程序設計課程在國內外的大學教育中均存在不少問題,例如,實踐上機操作和理論授課之問如何相輔相成?如何根據學生特點盡可能地因材施教?如何引導學生合理利用網絡上的學習資源和參考資料?諸如此類的問題絕非某些國家或某些學校在教學中面臨的個別問題。
自2006年計算思維的概念首次明確地由周以真教授提出后,對計算機教育領域產生了重大的影響。像計算機科學家那樣思考,讓計算思維真正融入生活,接受了計算思維的學生可以運用計算機科學的思想和方法求解問題、設計系統和理解人類的行為。計算思維以求解問題的途徑為主要訴求,涵蓋了計算機科學之廣度的一系列思維活動。因此,計算思維的培養在現代大學教育中日益受到認可與重視,以培養計算思維為目的或融合計算思維的各種研究和課程改革在國內外的各階段計算機教學中以多種形式展開。
雖然不能將計算思維狹隘地理解為計算機編程,但是程序設計的思維過程卻與計算科學的思維方式及其吻合:接受問題→分析問題→尋求解決方案→比較解決方案→實現解決方案,只是這里的解決方案是借助高級程序語言來實現的。因此有意識地將“計算思維”融入程序設計課程的教學實施是確實可行的,也是必要的。筆者以湖南大學c++程序設計課程為例,列舉了若干具體教學實施方法,并對相應問題進行了探討。從教學效果看,顯著提升了學生在程序設計方面的學習積極性,計算思維在潛移默化中被學生接受和應用,挖掘了學生的潛能,提高了學生的程序設計能力和分析解決問題的能力。
1 課程如何開始
一門程序設計課程如何開篇?傳統上一般從語法入門開始。雖然語法是程序語言的基礎,但目前國內高中計算機課程普及率較低,多數本科低年級學生難以理解和接受程序為什么要這樣寫?入門困難使得后續教學受到明顯的負面影響。文獻[4]提出“2%障礙”一說,即程序設計類的理論課堂上大略只有2%的學生能和教師的講授內容產生同步共鳴。
C++之父Bjane Stroustrup指出:不需要在知道了C++的所有細節之后才能寫出好的C++程序……請特別關注程序設計技術,而不是各種語言特征。我們選擇在教學實際中學生最困惑而對c++語言而言最基本的概念解讀作為課程開篇內容。
中國古語“人以群分,物以類聚”,按照類和對象的方式認識世界正是我們無意為之的認知方式。我們刻意弱化c++的語法細節,著重引導學生以類的概念認識和描述自己周遭的事物,以開放性的話題——“請描述自己的手機”作為第一節課的內容。以下是一個學生首次描述自己手機的實錄:“我用的手機是一部國產的魅族MX2,購買于2013年初,內存16GB,表面是黑色,觸屏,電容屏,分辨率較高,智能手機,可以打電話、上網、聽歌、拍照、游戲、導航、發短信、鬧鐘……”
這樣的描述在學生最開始的表述中具有代表性:條理比較雜亂,語言組織性欠缺。這正是缺乏計算思維訓練,未知自己認識過程的“原生態”表述。只要做適當的引導,學生就能立即表現得很好。在前述描述的基礎上,要求學生按照手機的外在屬性和功能,以及“看得見的”和“看不見的”的分類重新組織內容,學生的描述演變為:
外在屬性:品牌是魅族;顏色是黑色;外形是直板矩形;屏幕尺寸為4.4英寸,觸屏;分辨率是1280×800像素……
功能:打電話、上網、發短信、鬧鐘、導航、游戲、手寫輸入、記事本……
“看得見的”包括:屏幕、power鍵、音量調節按鈕、耳機孔、話筒孔、攝像頭……
“看不見的”包括:天線、內存、電路、電池、無線傳輸帶寬……
教師可以明顯看到這一次的學生描述,雖然仍不盡完美,但基本上暗合了類與對象的屬性和行為的概念。據此,教師逐步展開講授c++中的屬性和行為概念,漸漸地將對象與類及其類層次等基礎概念進行對應講解。以學生為主體、教師適當引導的反饋遞進式學習過程如圖l所示,其中步驟②可能會反復迭代進行多次。在最初的2-4個學時,讓學生以相對輕松、自然的方式認識C++基礎概念的精髓,讓學生在心理上對這門課程有了一個很好的接受度,為本門課程之后的學習打下較好的基礎,形成良性的心理優勢。
這種課程開篇方式,正是計算思維對學生潤物細無聲的影響。概念化是計算思維的基本特征之一,其側重抽象層次上的思維。抽象層次的認知不可能一蹴而就,課程最開始就引入抽象性的概念,其基礎性正如程序設計的基石。為了讓抽象的概念具體化,讓學生從自己所熟悉的東西開始,契合了計算思維所具有的“是思想而非人造品”的特性,將日常生活的實例映射到c++的基本概念,學生解除了之前“程序設計課程就是學程序語言語法”的誤解,開始思考“這門程序語言能解決我可能會遇到的什么問題呢?”相較于傳統以語法開篇的授課,學生表現更為積極主動,且學生對程序語法的學習也會帶著問題有備而來,后續教學效果提升明顯。
2 從自然語言到程序語言
計算思維作為人類求解問題的途徑之一,絕對不是讓人如計算機那樣思考,而是應用計算機的能力去解決各種需求產生的問題。我們將這個思路持續貫徹到教學的全過程。
在一定規則下使用自然語言描述問題,再引導學生將自然語言“翻譯”成程序語言。例如,在類繼承層次知識點的教學中,讓學生按照某種既定的分類層次,描述一個兩層以上的分類結構。這項半開放性的練習在“繼承”一章的第一節理論授課后作為課堂練習來進行,由于剛剛講授了繼承的基本概念,且是任由學生隨意選擇符合邏輯的類層次例子,學生寫起來駕輕就熟,表現力豐富。例如,圖2所示是某位學生的類層次實例描述實錄。endprint
圖2即為植物學領域的實際分類結構,可見c++的類層次與現實世界中人類認知事物的分類層次的吻合度甚高。學生還需要描述各類的基本屬性和功能。再要求學生將前述自然語言描述的類繼承層次“翻譯”成c++程序語言的表述。
在“翻譯”階段通過教師引導,學生逐步將共有屬性、特有屬性、繼承特性在編程中“將理論映射到實踐”。由于繼承層次實例是自己表述的熟悉或感興趣的內容,所以學生寫起代碼頗有自信,且力圖表現得最好,諸如派生類對繼承類的功能的重定義等后續問題在練習中由學生自己發現并引發討論,從其后續相關章節學習效果和平時小測結果來看,這種學生自擬內容的“翻譯”式實例分析練習要優于傳統的教師擬定典型繼承實例進行講解再由學生驗證演練的方式。
上述啟發式的教學讓學生在不確定的條件下來分析確定問題并尋求解決方案。這種練習只要稍稍進行一點變化,還能進一步豐富其內容,如學生之間交換實現從自然語言實例描述到程序語言的“翻譯”,再由實例描述人來評價程序語言實現者的工作成果,無形中融入了軟件工程的基本思想和過程。整個教與學的過程互動頻繁,學生易于接受,為后續更加抽象的多態內容的教學打下了良好基礎。
3 “非一致”實踐課程安排
程序設計離不開編程實踐,通常除了課后的實踐練習之外,只要有條件,程序設計課程會為學生配備統一的實踐(上機)課程。如何安排實踐(上機)課程才能使學生更自主、獨立、有效的練習一直是程序設計類課程的教學實施所關注的關鍵問題之一。
“面向所有人”的計算思維讓我們關注學生的個性。每個學生都有其個體特點,在學習習慣、學習興趣和學習方式上各不相同,只有適不適合自己而沒有絕對的優劣之分。我們在c++程序設計課程配備的實踐(上機)中,安排內容和要求契合了上述的“非一致性”——每一次實踐都安排不同難度權值的題目:必做題、升級題以及挑戰題。其中必做題是基于理論授課內容的基本考核,是每堂實踐(上機)課學生必須完成的內容;升級題則是在理論授課的基礎內容上增加一定難度或略微超前學習內容;挑戰題則多是趣味性和難度性進一步提高的練習。鑒于學生解決不同難度權值的題目可能付出努力的差異,不同難度權值的題目設定不同的分數權值。不同接受程度的學生可以按照自己的個體需要進行選擇:一方面保證必做題在所有學生中得以完成,使得基本教學內容能最廣泛地為學生所接受并檢驗;另一方面,學生普遍具有的“追求更好”的積極訴求,在這種隱形競爭心理下,推動升級題和挑戰題被盡可能多的學生嘗試完成。
由于要求學生盡量在3學時內完成當次實踐練習,所以每次實踐(上機)的練習題量和綜合難度教師要仔細把握,求質而非求量——因為尚有課后作業可供學生反復練習,但是每次的實踐(上機)題都包含前述3類。綜合兩屆3個專業學生的平均情況,實踐(上機)題目的完成情況統計如圖3所示。
圖3所示二維折線圖中的橫坐標表示實踐次數,縱坐標表示完成題目的學生數量占學生總數的百分比,用以衡量實踐題目的完成度。虛線表示傳統的使用無難度區分的實踐(上機)完成情況,實線、點劃線和虛點線分別表示有階梯式難度差異的“非一致”實踐(上機)安排中必做題、升級題和挑戰題的完成情況。為了對比效果,傳統實踐安排和“非一致”實踐安排在題量上相當。隨著教學內容的深入,題目的難度隨之增加。由圖3可知,基本必做題的完成度穩定在100%,而升級題隨著難度的增加,第二次的完成比例較第一次下滑厲害,但是從整個學期的實踐來看,升級題的完成度除了中間某一次實踐題目內容略超前導致完成度暫時下滑外,基本在后半學期穩定在70%左右,挑戰題完成比例更是接近并穩定在30%上下。盡管平均來看,非一致性實踐題目的完成百分比與傳統的“完全與理論內容并行、驗證式”的實踐完成百分比(約60%)相近。但是從折線圖的走勢來看,由于重復練習和題目數量設計等原因,傳統實踐題完成百分比隨著學習內容的難度增加明顯呈現下行趨勢;而“非一致”實踐(上機)練習的完成百分比卻似乎未受學習難度的影響,呈現明顯的上升趨勢,且學生整體的分析解決問題的能力、自由自主的學習能力和競爭意識的提升得到了巨大的提升,這從實踐課的積極活躍氣氛上看亦是表現無遺。
4 評測中的交叉評閱
課程的教學可能會延續16周,這期間需要檢驗階段性學習效果,才能對后續的教學進行益于學生的調整,并可針對反映出的薄弱環節進行鞏固。日常作業和隨堂小測是檢驗階段性學習效果的基本方法。然而,不論是國內還是國外,程序設計課程練習的一個普遍存在的問題就是原創性不足。有研究指出可能有近50%的學生作業或參考網絡,或參考其他學生的作業。這一方面是由于程序設計練習本身的特點使抄襲非常容易,同時,隨時隨地可接入網絡的便利性以及當今網絡信息的豐富度,使得學生可以比較輕易地從網絡獲取所需答案。
雖然國內外有各種人工或自動的作業檢查/查重系統來控制抄襲情況,但在教學實際中發現讓學生參與到日常評價中來,即學生間進行交叉評閱,可以很好地促進日常練習的原創完成。交叉評閱的具體實施方法為:以自然班為單位,班級問進行作業(或小測)的交叉評閱。例如,若有3個自然班,那么A班學生評閱B班的作業,B班評閱c班的作業,c班評閱A班的作業,所有評閱都是實名制進行,評閱結果最終返回到作業完成人。
能夠堂而皇之地看到別人的作業,還能對其評分,學生都躍躍欲試,90%以上的學生評閱都相當認真,從編碼規范性、交互性、程序設計階段性及最終結果與要求的吻合度等多個方面進行了點評。在交叉評閱過程中,學生不僅能評分,還能對比自己的完成情況,指出所評閱作業的問題,并給出解決意見,或者發現別人優于自己的地方。交叉評閱之后的作業仍需返給教師。教師通過適時講評,總結作業和交叉評閱的問題。
通過交叉評閱,學生能直觀、及時地發現自己的不足,而由同齡人所給出的意見更易被接受,并自然地將學生日常討論的圈子從同寢之間或同班的有限幾個好友之間擴展到同時學習本門課程的同學之間,在2~3次的交叉評閱后即發現跨班、跨專業的討論比比皆是,交流的增加使學生能直面自己的不足與優勢,對增強自信、自我鞭策很有效果。對比未使用交叉評閱和使用交叉評閱的班級整體學習效果,經過交叉評閱的學生其學習積極性、自主『生都有顯著提升。
5 結語
計算思維的明確提出獲得了全球教育界的認可與支持,深刻影響著從小學到大學的各個教育階段[”。我們結合湖南大學c++程序設計課程本身的特點,有意識地將計算思維融入教學實施的全過程。本文選取介紹了其中有代表性的課程開篇、“翻譯”轉化式實例討論與非一致性的實踐題目設計以及以交叉評閱為特點的日常評測機制等具體實施方法,探討了如何將計算思維貫徹到程序設計類課程教學的各個方面。從連續兩屆學生的反映來看,實際教學效果良好,學生接受程度明顯高于之前傳統程序設計教學,這既印證了計算思維對學生求解問題能力的良性影響,同時也說明這樣的教學實施確實是有效、有益的。
信息時代日新月異,每一屆的學生都會有或多或少的變化,根據學生的特點,深化程序設計類課程中對學生計算思維的培養是我們在教學中持續努力的目標。
(見習編輯:劉麗麗;編輯:宋文婷)endprint