余新樹
教育部公布的《普通高中信息技術課程標準(2017年版)》明確了信息技術學科核心素養,界定計算思維是“運用計算機科學領域的思想方法在形成問題解決方案的過程中產生的一系列思維活動”。很多教師投入很大的熱情學習Python語言,以為將程序設計語言由VB或C等換成Python語言,就可以實現計算思維的培養,但如果程序設計語言的教學未關注解決問題的思維,只是程序語言的調整,那只會是“穿新鞋”走“老路”,又回到教編程語言的語法、語句上來。
筆者多年來嘗試用作品案例教學法來培養學生的計算思維,將程序設計語言教材涉及的基本結構、語句、方法和思想等按從易到難分解重構,編成一個個有知識和能力水平梯度的程序作品案例。學生在作品案例提供的情境中學習用計算機可以處理的方式發現問題,界定問題,抽象建模,分解問題,設計算法形成解決方案,進行半成品加工,總結方法,提升能力。實踐出真知,編程課程運用作品案例教學法,學生不僅學會了程序語言設計的語句,更學會了用計算機編程解決問題的計算思維,學生既見“樹木”(程序語句),又見“森林”(算法思維),計算思維得到有效培養。案例教學法的一般教學流程為:案例體驗—抽象建?!纸鈫栴}—設計算法—半成品加工—總結遷移。
學生運行程序,顯示本機IP地址,網絡雙方均輸入對方IP地址,即可通過單擊表示錘子、剪刀、布的相應按鈕體驗網絡版猜拳游戲的樂趣,如下圖所示。以往猜拳教學,為了降低程序難度迎合學生的學情,往往設計的是單機版猜拳游戲,但單機版猜拳游戲相當于是自己的左手與右手猜拳,游戲的可玩性不高,現在改為網絡猜拳游戲后,增加了游戲的互動性,學生玩得興致勃勃,創設了很好的生活情境。
抽象的目的是去除細節,提取關鍵信息,將現實生活中的信息轉變為用計算機可以表示的信息,實現現實世界問題向計算機可以解決問題轉化的重要一步。生活中的猜拳游戲是用手的不同形狀來分別表示錘子、剪刀和布,但在VB程序界面中既可以用顯示文字的按鈕(commandButton控件)來表示錘子、剪刀和布,也可以用不同形狀的圖像(Image控件)來表示錘子、剪刀和布。作品案例既創設了生活情境,也在情境中蘊含了學生需要解決的問題和學習的知識,而發現問題是學生思維培養的開始。學生在體驗了游戲后,很自然地發現問題:單擊表示錘子、剪刀、布的按鈕,計算機如何顯示相應的圖像?教師啟發學生觀察猜拳作品的界面組成,思考兩個問題并填寫下表:①按鈕控件和圖片控件是如何表示錘子、剪刀、布三種信息的?②按下按鈕如何顯示相應的圖片?
學生通過分析上表,結合前面學過的控件數組知識,很快理解了“拳”圖像控件數組名稱為quan,index的值1代表錘子,2代表剪刀,3代表布,這樣就可用圖像控件數組元素quan(1).picture、quan(2).picture、quan(3).picture來表示錘子、剪刀、布。“猜拳”按鈕控件數組名稱為caiquan,index的值1代表出錘子,2代表出剪刀,3代表出布,當按下相應按鈕時,根據返回的index的值,quan(index).picture就可以表示所出拳的圖像。通過抽象建模,把現實猜拳問題轉化為計算機控制數組來表示,就可以用數學的問題來解決。
分解是計算思維的一種重要的解決問題的方法,通過分解把復雜問題分解成簡單問題,把整體問題分解成局部問題,再從解決簡單問題或局部問題入手找到解決問題的突破口?;谧髌钒咐姆纸馐菫榱俗寣W生對案例作品設計有整體了解,關注的是整體設計能力。根據前面體驗游戲時的經驗,學生把猜拳游戲分解為三個問題——本方如何出拳、網友如何出拳、如何判定勝負,再自頂向下逐步細化三個問題。
1.本方出拳(單擊按鈕事件):①單擊錘子、剪刀、布任一按鈕,同時按鈕失效不能再按直到本局結束為止;②本機顯示相應出拳的圖像;③將本機出拳對應的數字信息發給網友。
2.網友出拳(接收數據事件):①接收并保存網友發送來表示出拳的數字信息;②顯示網友出拳的圖片。
3.判定勝負(計時器觸發事件):①判斷如果雙方都已出拳,如本機勝則本機勝數加1;②判斷如果雙方都已出拳,如網友勝則網友勝數加1。

學生體驗游戲后能分解出這些動作,從形象思維過渡到抽象思維,能力有一定的發展,但問題還未理清。教師提出問題:“先出拳的一方,如果出拳圖形立即在對方顯示,而對方還未出拳,那先出拳的就吃虧了,什么時候顯示網友出拳的圖像才合適?”學生很容易想到:應該是雙方都出拳后再顯示對方出拳圖像最公平,只要本方未出拳,另一方即使先出拳并發送了出拳信息,也不應該顯示。
因此,上述第2、3個問題調整為:
2.網友出拳(接收數據事件):接收并保存網友發送來表示出拳的數字信息。
3.判定勝負(計時器觸發事件):①判斷如果雙方都已出拳,則顯示網友出拳的圖像;②判斷如果雙方都已出拳,如本機勝則本機勝數加1;③判斷如果雙方都已出拳,如網友勝則網友勝數加1。
雖然事先采取自頂向下逐步細化設計各模塊功能,但在實際編程過程中仍會出現一些新問題,問題分解會在編程的整個過程中多次發生,直到問題被解決,而問題分解難度取決于作品案例的復雜度,這是常規解題式教學無法比擬的。因此基于作品案例的教學,讓學生在發現問題、分解問題的過程中逐步形成解決問題方案,培養了計算思維。
問題分解關注的是從全局角度自頂向下逐步細化的設計能力,而算法設計關注的是從局部角度應用所學知識解決具體問題。算法是解決問題的明確步驟,是具體的操作過程。在理清了本方出拳、網友出拳、判定勝負三個問題后,算法設計聚焦于用所學的IF語句來解決“判定勝負”問題。借助流程圖,學生進一步理清思路和步驟,為后繼進行半成品程序加工掃清障礙。對于“判定勝負”問題,確定IF語句中“勝利的條件”是本問題的難點。教師以“本機勝利”條件為例讓學生小組合作,討論歸納本機勝利的條件。各小組通過列表法,列出雙方所有出拳情況及對應的數值,分析表示網友出拳的netnum變量值、本機出拳的localnum值和本機勝負情況,根據本機勝的情況總結出本機勝利的條件:(netnum=1 and localnum=3) or (netnum=2 and localnum=1) or (netnum=3 and localnum=2)。有的小組比較三種勝利情況后還進一步簡化出本機勝利的另一種條件表示:(netnum-localnum=1) or (netnum-localnum=-2)。隨后學生根據此種列表法舉一反三推導出“網友勝利”的條件。通過流程圖描述算法和列表總結法推理出勝利條件,學生的計算思維得到了培養。
半成品加工是指根據教學目標的需要,保留作品整體的真實性、情境性和完整性,將作品的某些關鍵局部“留白”,讓學生應用課堂所學知識將留白部分補充完善成為成品。本成品加工是培養學生知識遷移能力和解決問題能力的一種很重要的方法,這種方法既保留了程序作品整體設計代碼供學生學習借鑒,又讓學生在短時間內學習編程語句等知識,應用程序語句實踐練習和深化基本結構、語句命令等概念理解,達到知識與技能、方法和能力雙培養的目標。

由于上節課學生已經學習了局域網QQ程序案例,懂得了使用VB中winsoca控件進行網絡信息的收發原理,作品案例建立兩個窗體,一個窗體(form1)模擬本機,端口綁定1001,另一個窗體(form2)模擬網友,端口綁定1002,這樣學生運行程序時就可以模擬本機和網友猜拳,方便學生調試程序代碼。程序調試正確后刪除模擬網友的form2窗體,就可與網友進行網絡游戲。教師首先指導學生閱讀“本機出拳”“網友出拳”“判定勝負”三個問題程序代碼,引導學生讀懂三個事件中語句或語句組的功能,而不必太關注語句語法,閱讀程序的過程,也是思維活動的過程。由于本節課重點是用IF語句來解決如何“判定勝負”問題,將“雙方都已出拳條件”“本機勝條件”和“網友勝條件”留白,學生根據前面環節所設計的算法和總結的條件,用IF語句不斷調試直至實現程序功能后,雙方輸入對方網址,就可以進行網絡版猜拳游戲,在游戲中感受到成功的喜悅和自豪。通過半成品作品加工,學生既學會案例程序的整體解決方案,又應用所學概念、知識解決了特定情境的問題,計算思維得到了培養。
歸納總結是從具體化情境中提煉出一般性知識和方法的過程,通過總結,學生不僅深刻領會了所學知識內涵,還懂得了應用知識在情境化場景中解決問題的方法,形成了解決問題的思維。本節作品案例教學通過列表法、問題分解法、流程圖描述法逐步形成問題解決方案,通過半成品加工策略實現算法,學生的思維由抽象到具體,計算思維能力培養落到實處。
教學有法,教無定法。教師只有深刻領會計算思維概念的內涵和外延,才能在生活中發現計算思維的用武之地,在教學中創設有趣的案例作品,融入計算思維,讓學生在問題化情境中發現問題,自主、協作探究,形成問題解決方案,學會編程思想和方法,促進計算思維的發展。