初中Python编程教学的困难与解决
张渤 田容光
目前,初中编程教学仍然面临不少困难,有的是对教材教学内容陌生造成的,有的是对教学起点定位不同造成的。对于编程和算法部分的教学内容,我们首先应该明确这部分教学内容的设计意图和培养目标,然后考虑根据学情如何具体实施。编程教学的核心是培养学生的学科核心素养——计算思维,那就要明确什么是计算思维,以何内容和方式培养计算思维。
● 明确计算思维的范畴
综合欧美国家计算科学课程和我国信息技术专家的观点来看,都提到计算思维是一种跨越数学、工程、计算机等多学科领域的思维方式,所以不能把计算思维的计算简单理解为“计算机”或者“数据计算”。计算思维的实质是把一个看起来困难的问题重新阐释成一个我们知道如何解决的问题。由此可以看出,计算思维首先是思维培养,其次才是计算机语言编程问题。
由此可见,教材或教学设计不能抛出具体问题(或项目要求)就提供程序,而是要循序渐进地从提出问题、分析问题、抽象建立模型开始,通过一个一个活动,带领学生梳理完成项目的具体思路,优化方案,最终实现运用计算机解决实际问题或者设计开发作品。
计算机解决问题的思路完全来自于“人”,所以我们关注的首先是解决问题的思路和方法,不是具体的编程语句或代码。学生只有有了“想法”,才能告诉计算机怎么做,将来才有可能写出属于自己的程序。正因为有了想法,学生才可能读懂教材上代码的内涵,而不是单纯地记忆程序语句。学生思维水平提升了,才有可能达到知识创新,学会选择合适的方式分析、解决现实世界的复杂问题,从而真正理解计算机在现实世界中的优势和局限,才能促进信息技术的发展。
从另外一个角度来看,如果教学时一上来就拿出代码给学生,反而会限制学生的思维水平和关注点。因为作为初学者,学生不可能用程序代码这种自己不熟悉的方式来表述自己的解决思路,过早地看到代码可能会导致其思考焦点转移到陌生的程序语法学习中去。
● 学习内容的界定
基于项目的学习,是因“需”定“学”的学习方式。完成项目需要用到什么,教材(或教学设计)就提供相应的内容。所以,基于项目的学习,看上去不会像“编程语言教学”一样,系统地从基础知识、基本数据类型、基本结构等内容讲起。
初中Python教学的定位是体验和简单应用,不是系统开发。而且,我们的课程既要早发现、早培养有志于IT行业的从业者,也要考虑到大众化的群體将来就业需要的基本知识和素养,系统的语言学习不应是中学教学的本意,而且在初中阶段有限的时间内也不可能将它完成。所以,我们可以根据学情在教材的基础上做适当调整,但不宜拓展太多,因为对于普通水平的学生来讲,不适合难度过高的程序代码设计。在教学设计(教材)中能用简单代码解决的,力求不用函数或第三方库等方式,这一方面是避免知识面过大,另一方面是考虑到简单内容的灵活运用有助于学生思维的培养。
为了面向更多的学生,在进行教学设计时,可以参照教材中基本项目和科学探究、技术探索等不同梯度的内容,根据本地学生的实际情况和评价要求灵活进行选择,一般情况下基本项目是必学内容,科学探究、技术探索等可以根据学情做一定程度的取舍。考虑到Python的特性,部分内容可以适当增加不同的表述方式,如Python中两个变量的值交换这种颠覆传统的方式。但是,这些内容也只是为了引导学生了解Python的设计是灵活的,不能理解为扩大知识面。其实Python有很多更灵活的内容,但是对初中学生来说不易推广。Python的学习要考虑延续性,初中学生无法做到对Python进行全面系统学习。
对于学习内容的设置,我们不妨看一下这样一个事例:我们从小学一年级开始学习汉字,但是在不同学段,对识字难度、数量、应用熟练度乃至学习方式等要求都是不同的。学习编程也是如此,不能有一步到位的想法。任何时候,都要清晰地认识到,我们是成年人,学生是未成年人,要考虑他们的思维水平和学习接受能力。正如我们都学习过数学,但是我们没有都成为数学家一样,我们不可能通过初中教学让所有人都成为IT工程师,培养他们具备信息时代数字公民的基本素养才是我们最重要的任务。所以,体验和简单应用,是相对符合初中教学要求的。
● 教材应用的灵活性
为了便于初中学生特别是初一年级学生的学习,编程教学的设计需要做很多折中,如缩短变量名,以降低输入错误导致的时间浪费;选择掷硬币等简单生动又具备思维深度的活动,以吸引学生;选择经典的算法案例,以拓展学生思维等。
当然,大家完全可以根据自己学生的情况进行调整和拓展。任何人都无法做到对同一问题穷尽其解决方案,我们只需要关注教学的核心是培养学生思维即可。所以,通常情况下解决方案只是列举一例,给学生留下更大的自由空间发挥自己的聪明才智。
还需要注意的是,为了培养学生建立抽象模型的能力,要重点引导学生如何把具体问题抽象成数学问题乃至计算机问题,这是计算思维的根本所在。
● 善用编程语言的灵活性
Python是一门灵活性很强的编程语言,并且随着人工智能的发展,其发展势头极其迅猛。但是,功能强大不等于说它所有的特点都适合教学。例如,使用列表的sort方法可以实现快速排序,但是学生无从知晓排序的原理是什么,对其思维的提升并无益处,所以选择经典的冒泡排序等算法作为案例进行示范更有价值。通过学习、讨论,引导学生了解计算机排序的方法,观察其优缺点,并提出改进建议。这样,学生将经历一个从无到有、从有到优的思维过程,有助于提升其思维水平。类似的案例还有很多,不逐一列举,提出这个问题的目的不是反对Python的灵活性,而是要说明强大的功能应该在学生掌握基本思维和方法之后给出才是合适的。所以类似的内容,适合在科学探究或技术探索等提升内容中来设计,提供给学有余力的学生。同时,因为不用拓展太多内容,学生就能够将精力集中于某些基础内容的学习,可以加深理解并提高学习效果。
教学案例的选择需要考虑生活化、趣味性、应用价值以及效果反差等多个因素,需要激发学生的求知欲。如采用37%法则了解算法,可能有的教师会很意外,但这样是为了提醒学生,看似无解的问题不见得就无法优化,只要潜心研究、认真思考,再学习掌握必要的知识,很多问题是可以解决或者优化的。桶排序、素数等内容看起来是比较无聊低效的劳动,但其实都有其存在的价值,并且现在仍然在用,如搜索引擎的关键字搜索、大型图书馆的图书检索,仍然是桶排序与其他快速排序等方法结合使用,超大素数目前仍在金融行业的加密传输中发挥作用。我们的教学要引导学生认识到,算法都有价值,也各有优缺点,通过学习不仅能掌握其特点从而在面对现实问题时,可以做出合理选择,而且在这个学习过程中可以使自身的计算思维素养得到发展。
总之,我们应该灵活使用教材、设计开展教学,在低年级要重视思维发展,避免只关注语言知识的夯实,掌握多少语法、多少编程技巧都不是重点,让算法学习生动有趣起来、让学生思维得到提升才是我们更应该关注的。
苍山点题
把代码编程引入初中教材,这是信息技术课程发展的一件大事。其现实意义是,高中已经开始以Python编程为基础进行各模块的学习,无论是数据与计算、信息系统与社会,还是数据结构、算法与程序设计、人工智能等,都与编程非常贴近。再者,高中还是摆脱不了高考的限制,及早地从初中甚至小学了解编程、体验算法是一种积极的课程发展策略。
第一篇文章,针对山东省的初中两册教材(各一个单元的算法与程序设计)的编程教学内容进行了教学组织与实践总结。为什么要进行Python教学其实毋庸置疑,关键是如何进行教材处理,如何针对实际进行学时安排,如何对教学内容进行轻重规划,这些是需要在实践中不断尝试、调整与创新的。本文给我们最大的启发是,把教材当资源,而不是当教案,教学需要根据实际来组织实施。
第二篇文章,探讨了编程教学的几个核心问题,如计算思维与编程代码并非是相等的,学习内容不宜系统化进行计算机语言学习,教材设计是提供一种教学的模型并非是穷尽的方案,Python的特色学习要适当,不能过于超出基础的算法规范等。本文给我们的启示是,使用教材进行教学设计需要首先明确教材的意图,与适当的教育观念、方法相结合,而不是孤立地看教材、盲目地用教材。
编程教育还有很多期待解决的理论问题与实践问题,如语言代码学习与程序算法学习的关系如何协调,知识学习与技能培养的轻重如何分配,计算思維如何落地等,希望读者们也能够多实践、多交流,一起让编程教育更有效益。