将“错”就“错”,以“错”促思
——面向计算思维的初中Python教学策略探索
2022-11-19刘梦恒江苏省无锡市江南中学
刘梦恒 江苏省无锡市江南中学
笔者在开展Python教学时发现,大部分学生对新知识中的关键点掌握得还不够,当遇到代码错误时,往往会感到茫然无措。而每当学生找到自己的错误所在时,就会加深对知识的印象,在下次检错时,则会重点查看这些错误。笔者设想,如果在学习新知识时,就将错误融入课程案例中,带领学生一起探究如何解决编程中的问题,那么学生解决类似编程问题就会更加游刃有余。因此,笔者依托icode编程平台,以游戏化的形式,让学生通过Python语言控制机器人Dev、飞船、飞盘等角色的移动方向与步数,获取路径中所有的能量瓶,从而达成通关目的。每一关卡对所有角色的行走步数、完成程序的代码行数都有所限制。如果学生能够按照要求顺利通关,即说明其已经找到了最优解。
● 无错加错,巩固学生认知
学生在初次接触Python语言时,先从模仿教师的案例开始,再逐步迁移应用。在模仿的过程中学生会因不注重细节而产生各种各样的问题,因此,笔者将学生常犯的错误进行归纳,并将其融入课程案例中。例如,在设计课程案例时,改变原有条件,将机器人Dev出发时的状态从面向X轴正方向改为面向Y轴负方向(如下页图1);故意漏写循环次数,使得程序运行出现问题。通过人为制造错误,带领学生了解在编程书写时经常会遇到的问题以及如何解决这些问题。
在运行案例后,学生因游戏无法通关而产生认知冲突,会自觉地回到代码区域寻找错误。通过多次练习,学生对常见代码问题的敏锐度有所提升,在操作时,对常见问题也会多加注意。与此同时,在解决错误的过程中,笔者引导学生思考产生错误的原因,从而抽象出本节课所学习的重点知识。例如,在for循环案例中,为什么改变出发方向,程序就会出现错误?这其中包含了一个关键知识点,即每一次循环的结束相当于下一次循环的开始,这是理解for循环的关键逻辑。因此,在结束此次循环时,需要让机器人的方向恢复至循环开始时的方向。在此基础上,可以调试已经改变条件的程序,直至成功运行。
● 将错就错,实现迁移应用
在解决问题的过程中,如果学生常用惯性思维进行思考,往往会有挫败感。而如果能够利用惯性思维,引导学生探索更多的解决方法,那么惯性思维就可以转化为开拓思路的“敲门砖。”
笔者在教学中发现,学生被关卡困住有两个原因:①陷入自己的思维惯性中;②被题目给出的条件迷惑,无法跳出框架思考问题。
1.陷入自有的思维惯性
如图2所示关卡中的循环体选择问题。学生会顺着路线方向找规律,将机器人转向、飞船前进、机器人前进、机器人后退依次写在循环体中。在执行代码时会发现因每次循环时机器人都要转向,导致方向与初始方向不同,机器人无法继续执行程序内容。若要解决该问题,首先要引导学生明确错误出在哪里,并通过重新运行错误程序,让学生清晰地看到是机器人的方向出现了错误。
学生经过讨论后,找到了两种解决方法:①在循环体最后加一个右转动作,使Dev的状态恢复到循环开始时的方向;②将循环体中Dev左转的动作提前到循环之前,以更加精简的代码完成能量瓶的收集。学生对比两种方法后筛选出最优化的方案。
2.被预设的错误答案带偏方向
提升关卡预设了错误的答案,让学生找出其中的错误,并将其改正,以此通关。但由于学生应用编程的灵活性不高,在看到预设的答案后,思路常会被带偏,被困在关卡中。
如图3所示,大多数学生在看到平台预设的错误后,会尝试在前进5步的动作后增加右转动作,结果发现并不能使程序顺利运行。在借助已有思维惯性展开教学时,笔者首先带领学生分析:每一个拐点处的方向以及下一步的动作是什么?如果当前代码不变,是否还可以使用循环语句?循环体的内容应该是什么?循环次数是否需要发生变化?通过分析,引导学生将错就错,找到正确的解决方法,并分析关卡还能有哪些解决方案。学生经过讨论,发现了另外两种解决方案:①顺着起始方向前进;②将左转的动作放在循环体外,相当于转换起始的前进方向。
● 逆向找错,应用计算思维
从代码中寻找错误能够帮助学生更加牢固地掌握知识点,从执行动作中逆向分析错误能够帮助学生更加直观地理解各知识点在其中起到的关键作用。因此,笔者借助软件更改了原有题目的形式,将错误的执行动作录制下来,引导学生共同分析并解决问题。
在学习变量时,笔者将变量的应用总结为三个部分,即赋初始值、引用变量、变量增加/减少。在实际操作时学生只能简单模仿,对变量的理解并不深入。因此,笔者采取反向设计题目的方法,选取变量关卡中较为简单的内容,设计了学生经常混淆的三个错误点,并将其录制下来制作成课件。下页图4(1)为机器人还未出发时程序报错,图4(2)为机器人在第二次循环时,步数并未发生改变。笔者引导学生使用计算思维解决问题:若机器人还未出发便发生报错,要关注报错类型(报错类型显示还未定义,说明变量还没有进行赋值);若机器人能顺利出发,但是在路途中出现错误,就要关注错误出现的循环次数、错误的状态(方向、步数)。
学生首先讨论分析了图4黑色区域中代码的错误点,并将错误代码归类,明确代码错误类型,同时将其与左侧视频中的出错原因进行匹配,由此解决该问题。通过更改原有的题目形式,让学生灵活应用计算思维,更加直观地感受关键代码的作用,在一定程度上也能够帮助学生提升检错、改错的能力。
● 以“错”促评,以“错”促学
平台中每个关卡在运行后,都会自动跳出反馈评价。学生在自我练习时,能够通过反馈发现自己的错误。在调整时,笔者引导学生首先分析错误的原因,逐渐缩小定位,明确错误点,再进行修改,直至程序顺利运行。在不断调试代码的过程中,学生对知识点的理解也会逐渐加深。
此外,笔者在课堂上也会组织学生在教师机上进行代码展示,由其他学生共同分析、判断该学生的代码是否正确,如不正确则给出解决方法。
● 总结与反思
在初次展开编程教学时,笔者将错误作为教学的重点之一,让学生意识到学习过程中遇到错误是很正常的,将错误常态化,同时,不断收集学生生成的错误,将其转化为教学资源,应用于课堂。但在实践中也发现了一些问题:①学生水平差异过大,有些学生看到错误案例能第一时间找出相应的错误,有时会干扰其他学生的思路。②本课程较依赖平台内容,学生缺乏在Python编译器中手动编辑代码的经验。③学习的内容有趣味但与真实生活联系不够紧密。