劉夢恒 江蘇省無錫市江南中學(xué)
筆者在開展Python教學(xué)時發(fā)現(xiàn),大部分學(xué)生對新知識中的關(guān)鍵點掌握得還不夠,當遇到代碼錯誤時,往往會感到茫然無措。而每當學(xué)生找到自己的錯誤所在時,就會加深對知識的印象,在下次檢錯時,則會重點查看這些錯誤。筆者設(shè)想,如果在學(xué)習(xí)新知識時,就將錯誤融入課程案例中,帶領(lǐng)學(xué)生一起探究如何解決編程中的問題,那么學(xué)生解決類似編程問題就會更加游刃有余。因此,筆者依托icode編程平臺,以游戲化的形式,讓學(xué)生通過Python語言控制機器人Dev、飛船、飛盤等角色的移動方向與步數(shù),獲取路徑中所有的能量瓶,從而達成通關(guān)目的。每一關(guān)卡對所有角色的行走步數(shù)、完成程序的代碼行數(shù)都有所限制。如果學(xué)生能夠按照要求順利通關(guān),即說明其已經(jīng)找到了最優(yōu)解。
學(xué)生在初次接觸Python語言時,先從模仿教師的案例開始,再逐步遷移應(yīng)用。在模仿的過程中學(xué)生會因不注重細節(jié)而產(chǎn)生各種各樣的問題,因此,筆者將學(xué)生常犯的錯誤進行歸納,并將其融入課程案例中。例如,在設(shè)計課程案例時,改變原有條件,將機器人Dev出發(fā)時的狀態(tài)從面向X軸正方向改為面向Y軸負方向(如下頁圖1);故意漏寫循環(huán)次數(shù),使得程序運行出現(xiàn)問題。通過人為制造錯誤,帶領(lǐng)學(xué)生了解在編程書寫時經(jīng)常會遇到的問題以及如何解決這些問題。
在運行案例后,學(xué)生因游戲無法通關(guān)而產(chǎn)生認知沖突,會自覺地回到代碼區(qū)域?qū)ふ义e誤。通過多次練習(xí),學(xué)生對常見代碼問題的敏銳度有所提升,在操作時,對常見問題也會多加注意。與此同時,在解決錯誤的過程中,筆者引導(dǎo)學(xué)生思考產(chǎn)生錯誤的原因,從而抽象出本節(jié)課所學(xué)習(xí)的重點知識。例如,在for循環(huán)案例中,為什么改變出發(fā)方向,程序就會出現(xiàn)錯誤?這其中包含了一個關(guān)鍵知識點,即每一次循環(huán)的結(jié)束相當于下一次循環(huán)的開始,這是理解for循環(huán)的關(guān)鍵邏輯。因此,在結(jié)束此次循環(huán)時,需要讓機器人的方向恢復(fù)至循環(huán)開始時的方向。在此基礎(chǔ)上,可以調(diào)試已經(jīng)改變條件的程序,直至成功運行。
在解決問題的過程中,如果學(xué)生常用慣性思維進行思考,往往會有挫敗感。而如果能夠利用慣性思維,引導(dǎo)學(xué)生探索更多的解決方法,那么慣性思維就可以轉(zhuǎn)化為開拓思路的“敲門磚?!?/p>
筆者在教學(xué)中發(fā)現(xiàn),學(xué)生被關(guān)卡困住有兩個原因:①陷入自己的思維慣性中;②被題目給出的條件迷惑,無法跳出框架思考問題。
如圖2所示關(guān)卡中的循環(huán)體選擇問題。學(xué)生會順著路線方向找規(guī)律,將機器人轉(zhuǎn)向、飛船前進、機器人前進、機器人后退依次寫在循環(huán)體中。在執(zhí)行代碼時會發(fā)現(xiàn)因每次循環(huán)時機器人都要轉(zhuǎn)向,導(dǎo)致方向與初始方向不同,機器人無法繼續(xù)執(zhí)行程序內(nèi)容。若要解決該問題,首先要引導(dǎo)學(xué)生明確錯誤出在哪里,并通過重新運行錯誤程序,讓學(xué)生清晰地看到是機器人的方向出現(xiàn)了錯誤。
學(xué)生經(jīng)過討論后,找到了兩種解決方法:①在循環(huán)體最后加一個右轉(zhuǎn)動作,使Dev的狀態(tài)恢復(fù)到循環(huán)開始時的方向;②將循環(huán)體中Dev左轉(zhuǎn)的動作提前到循環(huán)之前,以更加精簡的代碼完成能量瓶的收集。學(xué)生對比兩種方法后篩選出最優(yōu)化的方案。
提升關(guān)卡預(yù)設(shè)了錯誤的答案,讓學(xué)生找出其中的錯誤,并將其改正,以此通關(guān)。但由于學(xué)生應(yīng)用編程的靈活性不高,在看到預(yù)設(shè)的答案后,思路常會被帶偏,被困在關(guān)卡中。
如圖3所示,大多數(shù)學(xué)生在看到平臺預(yù)設(shè)的錯誤后,會嘗試在前進5步的動作后增加右轉(zhuǎn)動作,結(jié)果發(fā)現(xiàn)并不能使程序順利運行。在借助已有思維慣性展開教學(xué)時,筆者首先帶領(lǐng)學(xué)生分析:每一個拐點處的方向以及下一步的動作是什么?如果當前代碼不變,是否還可以使用循環(huán)語句?循環(huán)體的內(nèi)容應(yīng)該是什么?循環(huán)次數(shù)是否需要發(fā)生變化?通過分析,引導(dǎo)學(xué)生將錯就錯,找到正確的解決方法,并分析關(guān)卡還能有哪些解決方案。學(xué)生經(jīng)過討論,發(fā)現(xiàn)了另外兩種解決方案:①順著起始方向前進;②將左轉(zhuǎn)的動作放在循環(huán)體外,相當于轉(zhuǎn)換起始的前進方向。
從代碼中尋找錯誤能夠幫助學(xué)生更加牢固地掌握知識點,從執(zhí)行動作中逆向分析錯誤能夠幫助學(xué)生更加直觀地理解各知識點在其中起到的關(guān)鍵作用。因此,筆者借助軟件更改了原有題目的形式,將錯誤的執(zhí)行動作錄制下來,引導(dǎo)學(xué)生共同分析并解決問題。
在學(xué)習(xí)變量時,筆者將變量的應(yīng)用總結(jié)為三個部分,即賦初始值、引用變量、變量增加/減少。在實際操作時學(xué)生只能簡單模仿,對變量的理解并不深入。因此,筆者采取反向設(shè)計題目的方法,選取變量關(guān)卡中較為簡單的內(nèi)容,設(shè)計了學(xué)生經(jīng)常混淆的三個錯誤點,并將其錄制下來制作成課件。下頁圖4(1)為機器人還未出發(fā)時程序報錯,圖4(2)為機器人在第二次循環(huán)時,步數(shù)并未發(fā)生改變。筆者引導(dǎo)學(xué)生使用計算思維解決問題:若機器人還未出發(fā)便發(fā)生報錯,要關(guān)注報錯類型(報錯類型顯示還未定義,說明變量還沒有進行賦值);若機器人能順利出發(fā),但是在路途中出現(xiàn)錯誤,就要關(guān)注錯誤出現(xiàn)的循環(huán)次數(shù)、錯誤的狀態(tài)(方向、步數(shù))。
學(xué)生首先討論分析了圖4黑色區(qū)域中代碼的錯誤點,并將錯誤代碼歸類,明確代碼錯誤類型,同時將其與左側(cè)視頻中的出錯原因進行匹配,由此解決該問題。通過更改原有的題目形式,讓學(xué)生靈活應(yīng)用計算思維,更加直觀地感受關(guān)鍵代碼的作用,在一定程度上也能夠幫助學(xué)生提升檢錯、改錯的能力。
平臺中每個關(guān)卡在運行后,都會自動跳出反饋評價。學(xué)生在自我練習(xí)時,能夠通過反饋發(fā)現(xiàn)自己的錯誤。在調(diào)整時,筆者引導(dǎo)學(xué)生首先分析錯誤的原因,逐漸縮小定位,明確錯誤點,再進行修改,直至程序順利運行。在不斷調(diào)試代碼的過程中,學(xué)生對知識點的理解也會逐漸加深。
此外,筆者在課堂上也會組織學(xué)生在教師機上進行代碼展示,由其他學(xué)生共同分析、判斷該學(xué)生的代碼是否正確,如不正確則給出解決方法。
在初次展開編程教學(xué)時,筆者將錯誤作為教學(xué)的重點之一,讓學(xué)生意識到學(xué)習(xí)過程中遇到錯誤是很正常的,將錯誤常態(tài)化,同時,不斷收集學(xué)生生成的錯誤,將其轉(zhuǎn)化為教學(xué)資源,應(yīng)用于課堂。但在實踐中也發(fā)現(xiàn)了一些問題:①學(xué)生水平差異過大,有些學(xué)生看到錯誤案例能第一時間找出相應(yīng)的錯誤,有時會干擾其他學(xué)生的思路。②本課程較依賴平臺內(nèi)容,學(xué)生缺乏在Python編譯器中手動編輯代碼的經(jīng)驗。③學(xué)習(xí)的內(nèi)容有趣味但與真實生活聯(lián)系不夠緊密。