梁见斌
蓝调解码
编程教育在中小学信息技术课程中,尤其是在高中新课程中应既展现其语言语法知识的特点又彰显其算法、技能、思维的价值,这是良好编程文化形成的基础。本期解码,让我们走进新课程中的编程语言价值分析与编程教育中的人文内涵契合分析,继续共同探讨如何建设良好的编程文化。
新教材作为新课程的重要内容载体,对编程教学使用何种语言来说往往具有决定性的作用。新教材都把Python列为高中必修的计算机编程语言,对此很多教师表示不解:为什么是Python?论简单它比不过Basic或Pascal,论速度它不如C和C++。特别是长期耕耘在信息奥赛一线的教练们,经常吐槽忍受不了Python程序运行时的“龟速”。这样一门饱受诟病的计算机语言,为什么偏要登上中小学编程教育的大雅之堂?实际上,与其问新教材为什么选择了Python,不如问新教材到底需要什么样的编程语言。高中信息技术学科核心素养由信息意识、计算思维、数字化学习与创新、信息社会责任四个核心要素组成。编程教学是培养学生计算思维的重要形式,我们要充分考虑中小学生的年龄特点、知识结构和个性特征,选择合适的计算机编程语言,引导孩子顺利踏上编程之旅,学会利用计算机解决实际问题,培养数字化时代合格公民。那么,适合高中信息技术课程的编程语言应该具备哪些特点呢?作为一名自学编程近20年的业余爱好者和高中信息技术教师,笔者想从编程实践和课堂教学的角度谈谈自己的看法。
● 新教材需要便于初学者入门的编程语言
我们经常听到人们评论某种编程语言好学或者难学,他们是根据什么标准来判断的呢?是语法规则的简繁性,还是代码实现的难易度呢?例如,很多人认为C语言比较难学,其中一个原因是它的指针概念过于抽象,使用方法又太灵活,容易出错;相比之下,Pascal语言就比较好掌握,容易学。
这些都是表象,初学者不需要开始就掌握所有的语言特性,随着学习的深入,自然会熟悉各种语法规则。真正的难点不是掌握语法规则,而是理解代码的意义。编程是抽象的艺术,初学者很难理解抽象代码的运行过程,通常只能看到一个快速闪现的结果,只有长期训练才能学会跟踪代码,明白各种算法结构的含义。
Python是一门面向初学者的语言,它的语法简洁,贴近自然语言。例如,其中的turtle模块(海龟绘图)源于1966年诞生的Logo语言,是入门Python的有趣工具。turtle模块通过绘图来呈现程序运行过程,实现了代码运行过程的可视化,可以将抽象的代码和形象的动画联系起来,帮助初学者快速理解每一条语句的作用,“亲眼看到”程序运行的过程,大大降低了学习的门槛,成为众多编程入门者的首选。
笔者曾经开设了一门选修课程——《海龟绘图案例分析》,只需要6~8个简单的绘图案例,就能帮助学生掌握数字、字符串、列表、元组和字典等基本数据类型,熟悉顺序、选择和循环结构,并理解自定义函数和模块化编程的特点。整个教学过程由浅入深、层层递进,完全根据项目需求引入相关知识点,而非强行“入戏”。
例如,学生学习了顺序结构以后,能够绘制三角形、四边形等简单图形,此时提出绘制正多边形的任务,学生虽然能够通过复制粘贴代码的方式实现,但同时感受到了重复劳动的枯燥和烦琐,希望能够有更好的方法来替代。此时提出循环的概念(甚至不需要教师提出,部分学习能力强的学生会主动寻找新方法),学生会很容易接受,并主动学习循环结构的不同表示方法。
又如,在完成“满天繁星”项目时,需要绘制不同颜色和尺寸的五角星,虽然学生可以通过复制粘贴代码并做简单修改的方式实现,但肯定对冗长和重复的代码不满意。此时,教师可以引导学生分析经典的circle()和dot()方法,模仿设计自定义函数,体会模块化编程的优越性。
为了降低编程的学习门槛,为初学者提供更友好的编程环境,很多教师建议使用图形化编程语言入门,等学生对编程感兴趣以后再逐步转向代码式编程。笔者对此有不同看法,认为不能简单地把初学者划为一个群体,应该根据其年龄和心智特点做进一步细分。以写作教学为例——编程和写作有很大的相似之处,其学习方法也是相通的。教师在教幼儿园或小学低段的学生写作时,并不要求孩子都用文字来表示,可以部分或者全部都用画画来代替;但随着孩子心智的成熟,要表达的想法越来越抽象和复杂,此时图案就不如文字方便和准确了。编程教学也一样,由于低幼儿童不识字,也缺乏必要的抽象思维能力,使用图形化编程语言可以降低入门门槛,让孩子们体验编程的乐趣,是一种有效的引导手段;但高年级学生或者成年人还是直接从代码式编程入门较好,从实用角度出发,编写具有实用功能的程序,才能真正激发学习的动力和创造力。
Python可以作为面向初学者的语言,还有另一种原因,那就是Python对初学者很友好,但对已有其他编程语言经验的“老手”则不尽然。不少老教师表示很不习惯Python的语法,觉得它太灵活,容易出错,其实这些错误往往是因为教师混用了其他语言的语法,等他们熟悉了Python语法,这些错误自然就会消失。
语法错误容易纠正,思维僵化才是最大的阻碍。Python是一种解释型动态语言,它和C++等編译型静态语言有很大的不同,看上去不够严谨和规范,但这正是它更接近自然语言的地方。我们只有摒弃惯性,开放思维、排除干扰、轻装上阵,才能更好地领会Python优雅高效的特点,编写出Pythonic代码。
● 新教材需要便于诠释算法思想的编程语言
算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发。提升学生计算思维的一个重要途径就是进行算法教学,培养学生分析问题、抽象建模和设计算法的能力。
每种编程语言都有自己的特性。例如,C语言贴近底层,程序执行效率高,代码简洁紧凑、灵活多变,但是C语言的语法限制不太严格,影响程序的安全性,对程序员的要求也很高,需要考虑较多的底层细节,一不小心就会出错;从执行速度来看,Python程序确实不如C语言编写的程序快,这是因为C/C++是编译型语言,直接将代码编译成机器指令,而Python是解释型语言,先逐行将代码转换为字节码,再转换为机器码来执行。
从诠释算法思想的角度来看,Python具有更大的优越性。这是因为,首先Python语法更接近自然语言,表述更直接和简明,其次Python丰富的标准库提供了很多基础功能,程序员可以很方便地实现算法模型,从而把注意力放在整体目标而不是底层细节上。
例如,为了提高查找的效率,我们经常使用哈希表结构。如果使用C语言编程的话,需要自己构造哈希表和设计哈希函数,这需要考虑很多内部细节和编写较长的代码。但使用Python就简单多了,只需设置一个字典类型的变量即可,因为字典本身就是一个哈希表,我们只需了解字典的特征和使用方法,而无需考虑其内部细节,大大提高了编程效率。
现在“力扣”和“阿里云TIANCHI天池”等在线编程网站,都提供了Python程序的评测功能,越来越多的优秀Python题解出来了。通过比较,大家发现用Python语言诠释算法思想确实更简洁和自然;再加上Python动态语言的特性,使用列表或者字典可以很方便地表示复杂的数据结构,有利于快速建模和编写更简明的代码。
目前,Noip等信息竞赛规定使用的编程语言是C和C++,这里有程序执行效率方面的原因,但不是主要原因。信息学竞赛确实追求程序的速度,希望选手通过优化算法来提高程序效率,但算法的优化与编程语言是无关的,不同的编程语言使用不同编译环境,简单地比较其运行时间和所占内存大小是没有意义的;比赛时也会对不同语言编写的程序进行分组,分别比较。相信随着评测技术的进步,会允许更多的语言出现在信息竞赛中,Python也会凭借自己的独特优势占据重要一席。
● 新教材需要便于解决实际问题的编程语言
学生学习编程语言,不仅是为了考试,更是因为它有用(部分学生甚至认为它有趣)。目前,Pascal和C语言教学似乎更多的是为了考试和比赛,而非解决生活中的实际问题,很难提起学生的兴趣。Python则不然,它是一门面向实际应用的语言,学生只需要掌握基本的语法,就可以调用丰富的库函数实现复杂的程序功能,解决生产生活中的实际问题。
例如,在学习了爬虫技术以后,学生可以在网上爬取大量的古诗词资料,加以整理后,就能编写飞花令和诗词接龙等文字游戏,提高了语文学习的兴趣与效率;又如,在学习了数据分析和可视化以后,学生可以编写成绩处理软件,帮助教师对全校甚至全市的成绩进行分析和可视化处理,了解各学科之间的联系和影响学生成绩的深层次原因。
随着信息技术的快速发展,人类社会的数字化程度越来越高,数字化时代对人们的信息素养要求也会越来越高,今后编程将会像阅读和写作一样成为一种基本技能,我们的学生应该从小就学会使用数字化工具来解决实际问题。而Python语言正提供了这样一种可能,它通过引入第三方库,只需要简单的几行代碼就能实现复杂的程序功能,可以方便地帮助孩子实现爬虫、数据分析和可视化、人工智能或游戏编程等多个领域的项目实践,让编程融入孩子们的生活。
当然,Python语言也还存在各种各样的不足,但相信随着技术的进步和版本的更迭,这些问题都将被克服。更重要是,语言只是工具,学习编程并不是学习语言本身,而是掌握使用计算机编程解决实际问题的方法。随着编程技术的提高,我们自然会发现更好的语言工具。综合使用多种工具来解决复杂问题,这才是新课程倡导的学习目标。