指向计算思维培养的任务驱动式Python 编程教学实践
2022-06-14倪迪
倪 迪
上海市实验学校南校
一、 计算思维与编程教学研究现状
“计算思维”的概念最早是由曾任美国卡内基梅隆大学(CMU)计算机科学系主任的周以真(Jeannette M.Wing)在2006 年首次提出,即运用计算机科学的基础概念进行问题求解、系统设计,以及人类行为理解的涵盖计算机科学之广度的一系列思维活动。2013 年,南安普敦大学的辛西娅·塞尔比(Cynthia Selby)和约翰·伍拉德(John Woollard)对已有的计算思维提出了更加具体的五方面的要素[1],即算法思维、评估、分解、抽象和概括。
2018 年1 月16 日,教育部发布了《普通高中信息技术课程标准(2017 年版)》[2](以下简称“新课标”)。在该课标中,计算思维作为四大核心素养之一,首次被列入信息技术学科教学范畴,这标志着计算思维的培养将在中小学教学活动中占据重要地位。新课标旨在全面提升全体高中学生的信息素养,使得未来的青年人能够负责、有效地参与到社会共同体中,成为数字化时代的合格中国公民[3]。
根据新课标的定义,计算思维是指个体运用计算机科学领域的思想方法,在形成问题解决方案的过程中产生的一系列思维活动。具备计算思维的学生在信息活动中能够采用计算机可以处理的方式界定问题,抽象特征,建立结构模型,合理组织数据;通过判断、分析与综合各种信息资源,运用合理的算法形成解决问题的方案;总结利用计算机解决问题的过程与方法,并迁移到与之相关的其他问题中。
新课标对于计算思维的各项要求已经与国际标准[4-5]接轨,但因为国内起步较晚等原因,目前初中、小学阶段还没有很成熟的经验与教学项目来对接培养要求,大部分工作还处于教学策略的探索阶段[6-7]。
美国计算机科学教师协会(CSTA)提出了计算思维在教学时会自然产生的一系列问题[4,6],同时牟琴等人[6]指出现今计算思维教学工作的不足——计算思维能力的培养未成体系。本文的教学方案遵循主体性原则[6],以解决上述问题为导向并将其纳入教学框架中,提出了任务驱动型的教学流程设计。在课余时间,虽然会有中小学生通过学习Scratch 来初步接触一些编程语言和概念,但是因为其以图形界面为主,不能满足更加深入、更加多样化的任务需求,所以需要一种适合中小学生的、问题导向的高级编程语言来进行教学活动,Python 就是很好的待选入门编程语言之一。
二、 指向计算思维培养的任务驱动式教学流程设计
在实际的教学活动中,教师采取 “任务驱动”的教学模式,即创设情境、确定问题、自主和协助学习以及效果评价。这四个环节不仅是中学乃至高等教育编程教学常用的教学思路,还与计算思维的五个维度具有很强的关联性。下面从“任务驱动”四个环节的角度来阐述基于计算思维的教学思路,同时具体阐明作为教学工作导向及线索的出现在计算思维中的各种问题[6]。
一是创设情境。在该环节,教师需要结合实际,让学生理解抽象概念的具体实例或者表现形式,来为下一步的理解乃至解决问题提供基础。计算思维中的抽象思维训练就是从这一环节开始。例如,挑选一名学生进行一问一答的交流,让学生理解交互式编程的含义及意义。
二是确定问题。这一环节,教师不仅提出具体问题,还要“确定”问题。这一部分涉及以下问题[6]:人与计算机的能力与局限性、问题的复杂度、问题解决的判定条件、问题解决所要应用的相关技术。基于计算思维的任务驱动教学所提出的问题一般都会带有限制条件,而且这里的限制条件往往需要将问题的解决和实现途径限制在计算机实现,即计算思维上面。例如,在绘制对称图案的时候,通过对对称性的严格要求,将绘图操作限制在计算机上来完成。这一环节涉及计算思维的抽象、分解和概括三个维度,在得到最后可编程实现的算法之前,问题的确定因而一直处于“进行时”。
三是自主与协助学习。在这一环节,进一步对第二个环节中的问题进行讨论。教师以一个引导者和解疑者的身份参与这一环节的教学活动,学生此时是教学活动的主体。除非确有必要,教师不再给出具体的解决方案。教师根据学生作出的反应,给出相应的反馈。例如,在绘制图案时,学生可能会选择使用画图软件的对称工具完成任务。教师首先可以给予肯定,而后再给出进一步要求,比如对图案的角度要求,这可以引导学生使用特定的工具(对于本文而言,就是编程工具PyCharm)来完成任务。在这一环节,教师还需要鼓励学生相互协助,让使用不同方式、不同思路,乃至不同进度的学生相互交流,提高学生的学习主动性。该环节综合了计算思维的抽象、分解、概括乃至算法思维四个维度。学生在自主学习中,经过对问题的抽象、分解与概括,一步一步地探索出问题的本质,得到解决问题涉及到的数据类型和算法。通过这样多次的训练,形成一个思维的模式,这就是算法思维。
四是效果评价。这一环节,教师需要对学生的学习情况进行评估,要解决的问题[6]包括技术的选择、技术的优化等。综合计算思维和编程自身的特点,教师需要评估的指标有知识点的掌握情况、任务的完成情况、算法实现的多样性、算法实现的数据类型是否合适、算法的空间复杂度等,更进一步的是,可以对算法的时间复杂度进行评估。不过,在实际教学活动中,时间复杂度往往会与数学挂钩,因此不作过多要求。
以上四个环节在实际教学活动中可以相互嵌套,相互促进,不需要拘泥于固定的流程。但是,基于任务驱动的教学模式必然要求以学生为教学活动的主体,即坚持主体性原则[6],这一点需要得到重视,否则就会变成传统的教学活动。比如,教师在学生自主学习之前就给出算法实现思路,一方面,会使得学生自主学习的热情降低,自身学习效果会降低;另一方面,也是更重要的一点,失去探索这一环节,算法思维就无法得到训练,而这是计算思维中不可缺少的一个维度。算法思维作为一种思维模式,依赖自主学习与探索来进行训练,天然符合任务驱动的教学模式,这也是教师选择任务驱动式教学的最根本的原因。图1 为基于计算思维的任务驱动式教学流程图,图中上半部分是计算思维和编程教学相结合的流程图,下半部分是任务驱动式教学的四个环节。
图1 基于计算思维的任务驱动式教学流程图
三、 任务驱动式Python 编程教学设计
这一部分,会举出几个Python 教学中的实例来进行分析。实例所涉及的知识点与编程难度主要参考《K-12 CSTA 计算机科学教育标准》和《普通高中信息技术课程标准(2017年版)》,默认中小学生是初次接触编程。这一部分分析的主要维度是南安普敦大学的辛西娅·塞尔比和约翰·伍拉德在2013 年对计算思维所定义的五个要素[1],分别为抽象、分解、概括、算法思维和评估。Python 版本为Python3,集成开发环境为PyCharm,循环结构为while,举下题为例。
使用while 循环来计算任意正整数输入n的阶乘结果。
该题主要体现了计算思维的抽象、分解、概括、算法思维和评估。
在进行实际的编程活动之前,教师先讲解阶乘的概念,并给出实例让学生理解。比如2!=2,3!=6。在学生理解了阶乘概念之后,教师提出问题,比如4 的阶乘是多少,让学生回答并让其给出计算过程,即4!=4×3×2×1。教师提问类似的阶乘问题,重复多次并允许学生使用任何工具、任何方式来进行计算。随着阶乘数目越来越大,经过多次阶乘计算之后,学生自己就意识到了手动计算阶乘的不便,这自然而然引出了编程解决阶乘算法的动机,此时问题也初步确定下来了,即限定在计算机编程的情况下解决阶乘问题。
问题初步确定以后,接下来就是自主与协助学习环节。这一步需要对原问题进行进一步的抽象、分解、概括,包括确定编程的数据类型和算法。教师先让学生在PyCharm 上面尝试计算2!、3!、4!,当然,由于没有引入循环结构,此时学生还是会将上述的题目展开为几个独立的连乘式子进行计算,但这一步完成后,教师要让学生自己寻找阶乘的规律。然后,教师提问学生有没有发现规律,如果有学生已经有了自己的想法,这时候就可以进入协助学习的环节。此时的交流既可以让学生完善自己的想法,又避免了大家在还没有形成想法的时候在交流中影响各自原有的思路。在协助学习环节,教师可以参与讨论,给予学生一定的提示。
在经过这一环节的学习之后,教师让学生说出在讨论中发现的规律。在实际教学活动中,学生到这一步已经能够发现4 的阶乘就是4 乘以3 的阶乘这个规律,实际上这就是算法基本的出发点。此时,教师就可以引入while 循环结构。在这一步,教师需要给出一个while 循环的实例,让学生知道其结构和语法规则。教师所选择的例子是打印1 到5 这五个数字。
这一步不仅仅是给出while 的结构和语法规则,还要让学生明白while 的作用和意义。因此,教师选择不用循环结构,手动打了五行print 函数来进行输出,在这之后再演示while结构的实现。教师演示结束之后,要先问学生while 结构的意义体现在哪里。在实际教学活动中,学生会从代码行数来回答,比如说从五行代码缩减到了两行。尽管学生没有回答出问题的本质,但是教师此时作为一名引导者,需要继续提问,比如问被缩减的代码有没有什么共同的特点,由此一步步深入到问题的核心。经过教师一步步的引导,最后学生会得出结论,那就是被代替的代码是高度重复的,而while 结构就是完成这些重复代码的工作。
至此,学生通过自主学习与协助学习,已经确定了具体问题的规律,即阶乘的规律以及while 结构的作用,这时候可以开始将while 结构应用到问题的解决上面。教师可以选择继续提问,比如问阶乘重复的可以被替代的地方,也可以直接指出阶乘重复的点,让学生直接动手编程。教师先给学生15—20 分钟,让学生独立进行编程,跟进每个学生的编程进度。如果学生遇到的是初级的与主题无关的问题,比如输入法之类的问题,就让周围的同学提供帮助;如果学生是在本题的逻辑上出现了问题,比如不知道while 该替换哪一块重复部分,教师就需要提供帮助。在这一实践环节中,需要让学生尽量独立完成任务,至少要有一名学生独立或者在教师帮助下完成任务。
在有学生完成任务之后,让他给其余学生讲解自己的代码,这也是教学效果评估的环节,考查学生对知识点的理解程度。在讲解结束后,让学生继续编程,教师继续跟进进度,同时允许学生之间相互交流协助,直到大部分学生完成任务。
最后进入评估环节,主要是总结问题。该问题从一步阶乘运算展开到n步的简单乘法运算,在找到n!=n×(n-1)!这个重复规律的同时,找到问题的边界,即n>0。先将结果变量初始化为n(初始化为1 也可以,终止条件需要相应地变为n),然后进行两两相乘的循环,每一步的乘数都与上一步的结果相乘,直到乘数变为1 退出循环。这里有学生会遇到循环终止条件出错的问题。比如,终止条件设置为n=1,然而,循环体内会运算到n-1,即乘数等于0 的情况,这会导致阶乘结果一直为0。此时,可以回到协助交流环节,让学生彼此交流比较代码的区别来找到问题的核心,也可以由教师指出出错的地方,即终止条件,然后再让学生修改,直到问题解决。
四、 任务驱动式Python 编程教学效果分析
为了更科学客观地对教学效果进行评价,在学习中期,通过问卷与试题相结合的调研结果来量化评价教学效果。该调研的第一部分为问卷,是从学生角度来考查其对于本学期课程教学和自身学习情况的一个较为主观的评价。第二部分为试题,题目由易到难。为了更好地量化学习情况,每一道试题分为三个子问题:(1)是否理解题目;(2)是否能够指出用到的函数或者结构,即对最基本的问题确定能力的考查;(3)写出解决该问题的代码。
三个子问题分别考查了学生以下的计算思维能力:
第一,确定问题,理解题意是前提。
第二,抽象能力,具体是对问题进行抽象的能力。只有对原问题进行正确的抽象,才能给出正确的解决方案。
第三,综合能力,包括抽象、分解和概括的能力。不仅要读懂问题,还要对问题有深入的理解,才能用通用的算法解决。这就需要对原问题进行分解和概括。
图2 是学习情况和学习兴趣的学生主观自我评价调研结果,横轴表示自我打分,分数越高越积极,纵轴表示自评打相应分数的人数。由图2 可见,没有学生给自己打最消极的1 分,大部分学生对于Python 编程课程是抱有积极态度的。此外,学习兴趣与学习情况大体上是一致的,可以推测有着较高学习兴趣的学生往往也会有不错的学习情况。这与教师发挥学生主体性,培养学生学习兴趣的初衷一致。
图2 主观自我评价调研结果
学习情况评价部分虽然是学生主观的评价,但也符合客观的正态分布规律,即不管整体水平如何,中游水平的学生人数居多。打5分的人数与客观分布有出入,可能是由于样本数不大的原因,也可以将此情况视作学生对自身倾向于给予积极的评价,说明该教学策略并不会引起学生对于陌生知识的畏难情绪。
学习兴趣评价则是完全主观的指标,该部分有接近一半的学生选择给自己打5 分,绝大多数学生的打分大于或等于3 分,可见本文提供的教学策略并不会引起学生对于学习的排斥和反感情绪,反而有接近一半的学生对Python 编程产生了兴趣。
图3 显示的是客观题的完成情况,横轴表示题目编号,纵轴表示完成对应题目要求的人数。客观题是根据难度递增的规律设置的,图3 的客观数据也反映了这一点。第一题是接收输入并输出,学生能够做到全部完成。第二题是对分支结构的考查,所有学生都能准确给出用到的分支语句“if ... else ... ”,只有三名学生没能给出正确的代码,而且其中两名学生是输出时未给输出字符添加引号,理解上并无大错。第三题是对循环结构及分支结构的综合考查,要求给出一个数字n,从0 到n地累加和并输出。大部分学生都能给出用到的结构,即while 或者for,其中while 如果结合break一起使用,那一定要用到分支结构if,而其中一名学生就犯了只写了break 而未写if 的错误。由于难度稍有增加,该部分正确完成手写代码的学生已经降到了12 人,总体也处于预期范围内。
图3 客观题完成情况
总体来看,在客观题的答题中,部分学生的表现符合预期;而在主观的问卷中,部分学生的评价超过了预期。可知教学策略对学生的学习起到了正面作用。结合课堂活动的实际情况,对此进行如下分析。
在进行计算思维的编程教学中,教师采取了基于任务驱动的教学策略,坚持了学生在课堂活动中的主体地位。教学的目的在于让学生的计算思维得到训练,因此,计算思维的训练必须贯穿教学活动的始终。事实上,图1 也体现了计算思维与教学活动的不同环节之间的紧密联系。从创设情境开始,计算思维的训练一直持续到教学活动结束。同时,基于任务驱动的教学策略还能够培养学生学习的主动性,让学生能够主动学、主动问和主动交流。主动性来自于学生在计算思维教学活动中是主体,全程带着任务,而且以目标为指向来学习,这消除了传统教学单方面灌输知识点而让学生感觉枯燥的弊端。同时,增加了交流合作环节,一定程度上让学生的综合素质得到了提高。
任务驱动的教学策略在实际教学活动中正面效果明显。每节课上,教师提出具体问题之后,学生总会积极地给出反馈。虽然有些回答稍显稚嫩或者偏离主题,但是教师作为引导者,只要给出指引,学生就会怀着热情往预定的方向去积极思考。同时,允许学生在考虑问题时相互交流,在相互肯定和相互学习的氛围中,学生的学习兴趣也能得到提高。具体体现在:学生会主动寻找一个问题的多解,会主动利用已经学到的知识点解决新的问题,甚至课后会主动提出新的问题。比如,在解决阶乘问题时,有学生给出了另一种循环方式,将起始条件设置为1,同时将终止条件设置为n-1,这样也同样解决了问题。在解决分支问题时,有学生理解得更快,主动选择了更难的四分支问题——计算器问题来实现。此外,在课后也有学生主动发邮件至教师的邮箱,询问与代码相关的问题,这体现了学生浓厚的学习兴趣。
此外,在经过几节课的教学之后,学生已经能够对教师提出的问题作出合理的反馈。从初期会有工具选择错误的问题到现在已经能够避免低级错误,甚至能给出正确思路,这反映了一种很明显的计算思维的成长和进步。比如,学生起初会先选择画图、计算器等软件解决问题,现在则会主动尝试用编程来解决问题。
学生的编程能力得到了提高,到了后期几乎不会再出现数据类型选择错误之类的问题。学生学会了看代码编辑的提示,比如代码缩进的问题就减少了很多,也具备了一定的调试(debug)能力。教学重心一定程度上就可以偏向任务本身,而不是代码实现。
学生在多次教学活动中都有超出任务本身要求的表现。比如,学生根据已学的知识点,自己提出问题并解决,或是从另一个角度和思路解决同样的问题。以上种种一定程度上都体现了学生计算思维的提高和成长。
五、 结语
教师从计算思维的训练出发,选择了高级语言Python 作为学生实现算法和训练计算思维的具体工具,选择了任务驱动作为教师的教学策略,并通过把相关问题纳入教学策略中,弥补了先前教学工作没有体系的缺陷。本文先对Python 语言特性进行了分析,给出了选择Python 作为教学工具的原因。本文也对任务驱动式的教学策略与计算思维结合进行了分析,给出了理论上的可行性和适用性。然后,通过列举具体的Python 教学实例,阐述了计算思维的不同维度在任务中的具体体现。最后,通过对教学活动成果的分析,阐述了教学活动取得的良好效果。基于计算思维的任务驱动式教学的成功实践,一定程度上也说明对于学生计算思维的培养,教师不能拘泥于传统教学中知识点的重复和机械应用,因为自主学习是计算思维必不可少的一环,否则学生就只会“计算”而没有“思维”。
同时,该策略也并不是完美、刻板的。比如,相比于传统教学,该教学策略下有学生会在讨论期间出现话题偏离课堂的情况,本文采取了在特定时间开放讨论的措施,可并没有完全解决该问题,一些教学过程的细节还有待继续完善。但总而言之,通过计算思维能力的提升,帮助学生解决问题,树立探究创新意识,具有非常重要的意义[8]。中学信息科技教师应该充分认识到在当前的教育课程标准下,培养学生的计算思维能力并不能一蹴而就,而是一个系统的过程,需要广大教师的不断探索。