中小学编程教学与Python编程语言教学:理念、原则与策略

    编者按:近年来,在信息技术课程变革和国家一系列政策的助推下,中小学编程教学受到了各方的普遍关注,成为了新的教育热点。不久前,教育部在答复政协提案《关于稳步推动编程教育纳入我国基础教学体系,着力培养数字化人才的提案》时,明确表示将编程教育纳入中小学相关课程。

    本期对话,首都师范大学樊磊教授与北京市东城区教育研修学院研修员魏宁,将围绕中小学编程教学以及Python编程语言展开深入探讨,以期为从事编程教学的一线教师提供参考。

    魏 ?宁

    北京市东城区教育研修学院研修员,教育硕士,高级教师。北京市教育学会教育评价专业委员会理事。主持北京市教育学会“十三五”教育科研课题1项。特约撰稿人/专栏作者,发表文章300余篇。

    樊 ?磊

    首都师范大学教授。中国教育学会中小学信息技术教育分委会理事,教育部高中、义教信息技术课程标准专家组成员。人民教育出版社-中国地图出版社高中信息技术教材联合总主编。

    编程教学篇

    魏宁:首先,非常感谢樊磊教授参与此次对话,樊教授是教育部高中及义务教育课程标准信息技术学科核心专家组成员,多个版本的信息技术、人工智能教材主编,也是教育部刚公布的技术(信息技术、通用技术)教学指导专委会委员,多年来一直倡导编程教学并做了大量工作,今天的话题我们就从编程教学开始吧。

    关于编程教学,我想,如果从计算机科学的角度看,算法以及基于算法的问题求解,既是计算机科学中最重要的组成部分,也可以说是编程教学中最基本、最核心的内容。我们看到,在高校的计算机以及相关专业中,算法已经形成了一个完备的知识体系,成为计算机科学里非常重要的一个分支学科,但在中小学的编程教学里,算法教学显然还没有形成一个体系。

    既然中小学编程教学里的算法教学如此重要,我们该如何借鉴高校的成熟经验呢?中小学编程教学里的算法教学又该遵循怎样的指导原则呢?

    樊磊:我认为,首先,不应把中小学编程教学里的算法教学简单地看作高校相关课程的预备或简化版本,中小学阶段的算法教学是为编程教学服务的,所以必须服从于编程教学的总目标。而且,限于中小学生的认知水平和知识深度,算法教学在内容、案例选择上无论广度还是深度都是有限的,当然,这种选择对算法教学也是十分关键的。

    至于中小学编程教学里的算法教学应遵循的指导原则,我认为有以下几点:

    第一,算法应该源自学生熟悉的應用情境,教师要为学生搭建起从最简单的情境到算法的一般性描述之间的抽象台阶,也就是我们通常说的教学的支架、脚手架。

    第二,在算法的选择上,要把握好高阶算法和低阶算法之间的平衡。所谓高阶算法就是能直接解决某类问题的算法,低阶算法是指能高效完成特定任务的底层算法。例如,我们可以考虑在小学、初中阶段以高阶算法的案例为主,到了高中阶段,适当加入少量的低阶算法。

    第三,算法的目标、直观思想以及逐步导致形式化描述的演化过程是高中(包括小学、初中)算法教学的重要部分,教学中应避免直接提出一般化、形式化的算法描述。

    第四,算法中所涉及的核心思想、形式化或半形式化表示、算法推导的数学及背景知识应在学生的知识范围内,或略微超过学生的知识范围。

    魏宁:对于算法而言,算法策略是一种更高站位上的视角。因为算法策略是在算法设计中所使用的问题求解的策略,也是计算思维最直接、最具体的体现形式。相对具体的案例,教师该如何在自己的教学中选择算法策略呢?

    樊磊:在中小学编程教育中的算法教学里,常见的算法策略和它们用于处理的任务主要有:迭代(也称为循环)——用于处理重复性的任务;递归——用于完成迭代的一种高效方法;蛮力法——在没有更好的办法,而且计算资源(时间和空间)允许的前提下,可以尝试采用的求解问题的方法;回溯——用于测试不可行的选择,目的在于尽可能排除这类选择。

    此外,启发式方法使用所有可用的背景信息,以期合理地缩短求解时间;分治法是求解困难问题时“化难为简、化大为小”的基本策略;动态规划策略用于尝试识别并记忆求解过程中的重复性步骤,从而避免无用的重复计算或浪费资源;定界的目的则是尽量确定解的边界,以缩小求解范围。

    魏宁:刚才我们谈到了计算思维,自从2007年美国卡内基梅隆大学计算机系主任周以真教授提出计算思维的概念以来,计算思维受到了各国教育界的普遍重视,在我国新修订的《普通高中信息技术课程标准》中,计算思维也被列为学科核心素养之一。

    在计算思维的培养中,编程普遍被认为是一种有效的途径。但目前计算思维的研究仍处在起步阶段,特别是对中小学编程教学如何促进学生计算思维的形成,我们似乎还缺乏有说服力的指导理论。

    樊磊:是的,我们可以这样理解编程教学与算法思维的关系,就是把计算思维理解为求解信息处理问题时的一种思维方式,把编程语言理解为描述信息处理过程的形式语言,而编程则是基于信息的推理活动(计算也是一种推理)。编程语言/编程在表示/求解信息处理问题中的作用类似于抽象/逻辑在求解数学问题时的表示和推理。

    著名数学家G.Polya在他的专著《怎样解题》中提出过一个数学问题求解的模型,就是著名的Polya模型。它把解题的过程分为四个步骤:理解问题、设计求解方案、实施求解方案和核查评估。在Polya模型的基础上,我们可以设计一个基于计算思维的问题求解模型。具体地说,在基于计算思维的问题求解模型中,理解问题包括了要能正确地提出问题、表示问题,设计求解方案的重点在于要能设计出可以编程实现的算法,在实施求解方案中包括了用语言工具实施算法以及调试验证算法,核查评估环节重在评估求解方案的效率、代价和精度等。

    这些重要的特点,显然有着方法论的特征,既体现了与一般的问题求解过程的不同,也说明了计算思维的培养是一个逐渐积累和不断优化的迭代过程。只有将问题理解(叙述、表示)和求解(算法设计、实现、评估、优化)看成一个整体,才能体现出计算思维的真正价值,较好地解决编程教学中的碎片化问题。

    魏宁:对于中小学编程教学中的程序语言选择,我们看到,从20世纪90年代开始,至今已经历了Pascal、Fortran、C、VB、Java等语言的变迁。目前,仍有Pascal、VB、Scratch等多种编程语言在中小学编程教学中使用,以至于不少教师戏言,在信息技术课程中,“工具是最新的,语言是最老的”。但这是不是一种编程语言发展的常态呢?

    樊磊:编程语言的迭代是技术发展的正常趋势,在教育领域,同样也要遵从这种趋势,我理解这是一种正常的现象。

    相对于编程语言多样化的现实,更需要我们思考的是,编程语言的选择应从哪些原则出发考虑。我想,我们既要站在国家层面上看计算机发展和人才培养的需要,又要站在教师角度充分考虑一线教师的实际状况,同时也要符合学生的长远发展。在编程教学语言的选择上,要广泛征求各方面的意见和建议,采取科学合理的方案,多级联动。面对汹涌而来的科技大潮和技术快速迭代的现实,我们更需要理性审视,不盲从、不武断,这才是自信和定力的体现。

    魏宁:我们再谈一个学校教育之外的话题,随着国家一系列政策的出台,近年来,编程培训产业链条快速发展,少儿“编程热”也迅速升温。据测算,2020年国内少儿编程市场将接近260亿元的规模,少儿编程继英语、奥数之后,成为新的培训热门,甚至有人说:“不懂编程等于半个文盲。”对于编程这种社会现象,我注意到您一直持理性态度。前一段时间您在一次接受记者采访时针对社会“编程热”就说,“并非每个小孩都需要学编程,在学有余力且感兴趣的情况下可以学”,您还提醒记者要冷静看待编程学习,这被认为是给编程热泼了一盆冷水。您是怎么看的?

    樊磊:是的,我认为,从国家和社会层面看,需要对计算机技术、信息技术感兴趣且有潜力的学生,也希望发现这样一批苗子。但我们的校内的编程教学还不能完全满足家长的需求,这就造成了一个明显的缺口,编程培训市场就迎合了这样一个需求。如果我们过于拔高编程对学生的作用,甚至从未来升学的功利性去考虑,那么,我确实建议“并非每个小孩都需要学编程,在学有余力且感兴趣的情况下可以学”。

    对大多数学生来说,从个人发展来看,编程就像语言一样,是一个主要用来沟通、表达创意和思想、解决问题的工具。不同的是,编程主要是和计算机或互联网的“沟通”。所以,学习编程语言,就是让我们可以解决新问题、使用新技术,更好地表达自己。

    从长远看,市场化的编程培训还是应该纳入信息素养教育的大框架下,让其成为信息素养教育落地的一个载体,这样才会更有持续性。

    总之,在“编程热”这个问题上,学校、家长不要“走偏”,要牢记编程是一个工具,是要为学生学习、发展和思维培养服务的。

    Python篇

    魏宁:在中小学信息技术课程中,对于编程教学,目前的新教材普遍采用了Python作为核心编程语言。我知道,前一段时间,您也专门编写了《面向中小学教师的Python编程入门》一书。作为国内Python编程语言方面的专家,您是怎样看待Python语言的呢?对于中小学的编程教学,Python语言的优势体现在哪里呢?

    樊磊:Python是现代编程思想的产物,它具有语法简单、开源、跨平台、扩展性强等诸多特点,且拥有众多功能强大的应用扩展库,是众多领域的主流应用(如可视化、生物信息学、大数据分析等)开发的首选语言。

    对于基础教育而言,它的优势主要体现在以下几个方面:

    第一,从计算机科学的观点看,Python是一种比较中性的语言,既吸纳了近二十年来编程语言领域中的重要研究成果和新概念(如Lambda机制),同时在语言的最基本内核层面上又极少采用不成熟的或未经考验的新编程机制。

    第二,从运行机制方面看,Python同时具备解释型、编译型和脚本型语言的共同特点。

    第三,从开发环境看,Python的开发环境支持包括Windows、OS X、Linux在内的所有主流操作系统和平台。

    第四,从扩展硬件方面看,Python的开源硬件接口库种类繁多、功能完善,基本覆盖了当前基础教育领域中用到的扩展硬件。

    第五,从语言支持服务方面看,Python是典型的开源平台,与C/C++、JavaScript等重要编程语言有很好的应用库共享机制。

    第六,从应用层面看,Python有大量各种各样的库/框架,使得开发者仅需要编写相对较少的代码就可以完成令人印象深刻的准专业级应用。

    第七,从教学实施情况看,Python特别适合做数据处理(数据管理、数据可视化、大数据分析等)相关的应用,与新课标的理念非常吻合。

    魏宁:对于Python,我也听到了一些不同的声音,如有些一线教师反对Python进入中学课堂。他们的理由是C语言或Java语言相对于Python更加成熟、稳定,并且在大学教育中都有很好的教学基础,这也就意味着学生在中学阶段学习C或者Java后,在后续的大学阶段会有比较好的衔接。事实真是这样的吗?

    樊磊:我认为对编程基础几乎为零的中学生而言,首先应该让他们在编程的学习中体会到编程的乐趣,尽快获得成就感,并爱上编程,而不是把编程看作高深莫测、枯燥乏味的事情,甚至对学习编程“自带恐惧”。从当下的中学编程教学来看,不喜欢编程教学的学生不在少數,这是应该引起我们反思的现象。从这个角度考虑,选择Python作为编程语言还是有优势的,因为它的语法简洁易懂,对语法格式的要求非常低,可以说是最接近自然语言的程序语言,非常适合没有编程基础的学生。对教师而言,Python代码在设计上强制要求缩进,方便了学习和维护,教师不需要花费大量的时间去处理代码的格式错误。

    至于说和大学的衔接,我首先要严肃地说明,Python绝不是一种“玩具(Toy)语言”,而是货真价实的“工作(Working)语言”,是主流编程语言,更是数据分析领域的首选语言。假如学生能在中学阶段接触并且系统地学习Python语言,完全能够打下良好的基础,并在进入大学后直接深入研究,更快地参与到实际项目的开发中,乃至为今后的就业增加有分量的筹码。

    而且,说C或Java比Python在大学有更好的教学基础并不准确。从国外的趋势看,Python正在被更多的大学所青睐。有数据显示,美国综合排名前100名的大学超过70%都开设了Python编程语言类课程,卡内基梅隆大学从2010年开始就用Python取代了Java,作为计算机专业的第一门编程语言。斯坦福大学在2015年的时候,就已经开发了22门与Python相关的课程,并且逐渐将部分的C和Java语言淘汰。

    国内的高校虽然步子比国外的高校慢一些,但也开始越来越重视Python了。北京理工大学是国内较早引入Python语言的高校,他们的公选课得到了学生们的高度认可,哈尔滨工业大学等也陆续开设了Python课程,《上海市高等学校计算机等级考试大纲(2016年修订)》中也新增了Python程序设计模块。我们有理由相信,在不久的将来,Python语言教学将会在国内迎来井喷期。

    因此,通过中学阶段对Python的学习,无论对今后的大学专业学习,还是自主创业,都是有益处的。

    魏宁:刚才我们说到了Python语言的很多优点,但对中小学编程教学而言,Python语言毕竟是个新事物。而且,在现阶段,它在编程教学中似乎也存在着一些问题。

    樊磊:是的,不可否认,现阶段,无论是小学、初中,还是高中,Python在编程和算法教学中都存在着很多问题。其中比较突出的有:第一,由于课时和年龄的限制,现有教材中涉及的算法内容无论在深度上还是广度上普遍呈现“高不成、低不就”的窘态;第二,由于Python语言封装了很多基础算法的实现,而且涉及交错复杂的概念(如数据类型、抽象数据类型等),再加上算法与数学、数据结构、编程语言特性都是密切关联的,单纯讲算法本身也很难实施,所以,究竟是讲算法的底层方法还是讲高阶应用,目前难以取舍;第三,算法教学对课程的核心——运用计算思维解决问题无论是在求解流程还是在问题深度上,都具有很强的示范性,如果实施不当,很容易将计算思维培养带入误区,这也是实践中较易出现问题的地方。

    魏宁:前面您曾提到了算法教学应遵循的几个基本原则,那么,对具体的Python语言,它的算法教学是不是也應该遵循这些原则?

    樊磊:关于Python语言算法教学的指导原则,我想应该有以下三点:第一,在算法的编程实现上,原则上不涉及较复杂或有较高技巧的编程,较复杂的编程实现只作为Python-like伪代码实现,但算法作为教学案例,必须首先讲清楚其背后的关键思想;第二,高阶算法所解决的问题应具有典型性、时代性、选择性、普适性和适用性,并且对学生的后续学习或其他学科的学习有启示作用;第三,在时间和条件都允许的情况下,应针对解决同一类问题的、基于不同策略所实现的算法之间做性能对比,并挑选出较优算法。

    魏宁:您能否用一个具体的案例来说明,在编程教学中,如何贯彻这些原则?

    樊磊:好,我就用一个具体的案例来说明Python编程及算法教学中的一些特点,这个案例的场景来自高中新课标教材,就是著名的斐波那契数列的求解。

    首先,斐波那契数列是最简单的递归定义的函数,也就是函数体的内部包含了对函数自身的调用,而Python是支持函数的递归定义的,这也是函数式编程语言的特征之一。我们要注意到计算最后一个值的时候是需要一点时间的,因为在递归调用中,很多中间值要重复计算。而为了优化斐波那契数列的递归实现,一个最简单的方法就是在每次计算中,将前面已经计算过的值“记”下来,不再重复计算。这种在计算过程中使用记忆的机制可以有效避免重复及浪费资源,是所谓“动态规划”方法的一个最简单的例子,也就是资源的动态再分配。

    在此,我们就可以使用Python的迭代器、装饰器等功能,从而让斐波那契数列的函数更加简化。教师们不妨尝试一下斐波那契数列的Python编程。

    魏宁:其实,对大多数教师,包括相当一部分信息技术教师而言,Python语言都是一种比较“奇怪”的语言,当他们在教学中面对Python语言的时候,多少都会有一种“心里没底”的感觉。对于现阶段在中小学采用Python作为编程语言的教师来说,在教学中,他们应该注意什么呢?您会给他们提出哪些建议呢?

    樊磊:对采用Python作为编程语言的教师,在教学中,我有以下几条具体建议:第一,要始终贯彻“需求导向,在做中学”的定位,千万不要陷入“程序员模式”的编程教学中;第二,牢记在Python中,学会使用函数比掌握编程技巧更重要;第三,要掌握输入/输出函数,能够灵活运用非数值数据类型,包括字符串、列表和字典;第四,要了解Python语言异常灵活的循环及控制结构;第五,鼓励教师将Python当作现实版的“伪代码”来使用,即使确实需要用伪代码,也建议使用Python-like风格;第六,如果要使用Python的高级特性,编程案例应尽量依托Python语言特点,并以算法实现的需求适当渐次地引入,但建议教师们,除非绝对必要,尽量不使用Python的高级特性。

    魏宁:我们知道,由于Python具有语法简单、开源、跨平台、扩展性强等鲜明特点,所以被认为是典型的“胶水语言”。因此,在支持创客教育、steam教育方面Python语言有着天然的优势。

    樊磊:是这样的,眼下,创客教育、STEAM教育可以说开展得如火如荼。创客的本质是“造物”,因此,有很多与硬件编程相关,如Arduino、树莓派等。但是,如果每使用一种硬件产品就要学习该产品的编程语言,这会让创客的学习增加大量的成本,在一定程度上是阻碍创客教育发展的。这时,Python语言作为胶水语言的优势就显现出来了,正因为Python具有很强的扩展性,有很多与硬件相配套的库,如Python能方便地与Arduino、Minecraft、树莓派建立关联,更是树莓派的官方编程语言,所以,使用Python语言,教师可以在课堂教学中列举更多的案例,从而拓展教学范畴,学生也可以直接把它运用到创客造物中去,这既为教师、学生省去了额外的学习成本,也为创客教育的发展提供了良好的教与学环境。

    魏宁:非常感谢樊磊教授和我们一起分享有关编程教学的理念和实践策略,以及关于Python编程语言的方方面面,我想这对一线教师从事编程教学或者具体的Python语言教学都会很有帮助。

    樊磊:也谢谢你们提供这样一个交流的窗口,祝编程教学和Python语言教学在教师们的共同努力下,取得更辉煌的成绩。

    本期对话在成文过程中,参考了樊磊教授的两篇文章《高中信息技术课程中编程语言的地位、选择及实施方法》《在高中信息技术课中培养学生计算思维的有效方法探讨》,特此向两篇文章的合作作者倪俊杰、林伟致谢!