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