最近,少儿编程好像一夜之间成了一个比较火热的概念,媒体上和朋友圈经常能够看到 “编程将会被引入高考”“孩子再不开始学习就会输在起跑线上”“未来职业需要”之类的报道,以此作为应该让孩子学习编程的理由。作为一个在这个领域摸爬滚打了一段时间的人,我想从另外一个角度谈谈自己对少儿编程的一些认识。
少儿编程的起源
说起少儿编程,就不得不提到一个人,Logo语言之父、构造主义(Constructionism)学习理论的提出者——西蒙·派珀特(Seymour Papert)教授。由于生活经历的因素,派珀特教授对齿轮特别感兴趣。他提到,在自己的学习生涯中,经常能够将一些别人认为非常复杂的概念和“齿轮模型”结合起来,从而对这些知识理解的更加深刻,而且在玩齿轮的过程中,常常能够不经意地学到很多知识。
那么,这和少儿编程有什么关系呢?派珀特教授结合自己的学习经历想到,要是每一个孩子都能找到自己感兴趣的“齿轮模型”,那学习将会变得非常主动而且高效。但是,并不是每个孩子都会喜欢齿轮,那有什么样的一种工具能够满足每个孩子不同的兴趣呢?答案是计算机,通过编程的方式让计算机去构建孩子感兴趣的事情,并在这个过程中不经意地学到知识是很完美的一种方式。
于是派珀特教授很自然的将自己发明的Logo语言应用到了教育领域,让孩子通过编程的方式使数学学习变得看得见、摸得着。后来麻省理工媒体实验室,又在派珀特教授的理论基础上推出了新一代的编程语言——也就是现在非常流行的Scratch编程语言。
所以说,少儿编程其实并不是一个新鲜的事物,它是构造主义学习理论的一种体现,随着技术的发展,这种体现形式会不断的发生变化,比如从Logo发展到了Scratch,以后也许还会发生变化。但是它作为一种让孩子更好学习的工具的本质不会发生变化。
如果对于Scratch背后的学习理论感兴趣,可以去看看派珀特教授的这些著作《Mindstorms: Children, Computers, and Powerful Ideas》、《The Children’s Machine: Rethinking School in the Age of the Computer》、《The Connected Family: Bridging the Digital Generation Gap》。
对于编程学习的观点
基于上面的讨论,编程作为一种工具,是为了让孩子找到一种适合自己的学习方式,最终的目的是让每一个孩子能够更加主动、高效的学习。所以任何脱离了这个目标的编程教学,或多或少都是有一些欠缺的。我觉得对待编程学习,应该有的态度是:
观点1:
编程教学最终的目标应该聚焦在如何通过编程的方式去帮助学生表达创意,而不是聚焦在教会学生编程的基本技巧。当然,掌握这些编程的技巧是孩子在学习过程中不可逾越的一个阶段。
这个观点似乎有点老生常谈,但我认为从心里面真正理解这条教学目标非常重要,因为这条“纲”指引着课程的设计方向。
为了达到这样的教学目标,从教学设计的角度来看,我认为应该分成“学”和“启”两个阶段。
“学”即编程基础知识的学习,这个阶段最终的目标是帮助孩子掌握编程的基本技巧。以Scratch的学习为例,一些小游戏的设计、Makey Makey音乐的创作、Minecraft的结合等等,大多数孩子都很感兴趣,都可以纳入进来。但是比较重要的一点,是让孩子觉得“编程有意义”,所以孩子课本上学到的、生活中见到的现象是比较合适的主题,而且学习这样的主题也更容易引起共鸣。
比如,将小学数学课上学到的加减乘除运算融合到下面的赛跑游戏中,一方面数学知识有了实际的应用场景,另一方面游戏的设计也能激发孩子的创作热情。
再比如,在讲解与坐标相关的指令时,引入笛卡尔发明平面直角坐标系的小故事,让孩子知道创作一个蜘蛛结网的程序是有意义的。
另外,诸如Minecraft等游戏都是孩子比较喜欢的,与其单纯地让他们沉迷于这些游戏中,不如通过编程的方式对这些游戏进行再创作,让孩子觉得学习是与自己的生活息息相关的,从而增强对学习的兴趣。
在完成“学”这个阶段后,孩子已经掌握了基本的编程技巧。还是以Scratch为例,到进入下一个阶段的学习时,根据我的观察,常见的一种做法是给孩子寻找逻辑更加复杂的游戏,以此证明孩子还没有完全掌握编程,或者直接过渡到另外一种编程语言。我的观点是,如果局限在编程逻辑的复杂度上,那这样的学习是没有尽头的,因为Scratch能实现无限复杂的逻辑。而且这样去设计,会给孩子造成学习编程只能编写游戏的错觉,同时也减少了孩子主动应用编程表达想法的机会。
所以,我认为第二个阶段更重要的在于“启”,即以发布小专题或者项目的形式启发学生主动的观察现象、应用编程。这个阶段的学习成果包括其他知识的学习报告、程序的实现、改进的方案等。
比如,“为什么有的玩具小车会自动沿着黑线行驶(循迹)”,针对这样的项目,需要孩子对循迹的原理进行探索,有的孩子就了解到了循迹传感器的原理,原来是与光学上的反射现象有关。然后通过Scratch模拟出一个循迹小车的运行效果。比如,下面的小车就可以沿着赛道自动的行驶,在不同颜色的赛道,小车的速度还不一样。可以看到黑色小车的最前面有红色和绿色的两个小方块,这是孩子了解了循迹的原理后模拟的传感器。
又比如,“Minecraft可以控制生活中的物体吗?”孩子在完成这个项目时,需要思考之前学过编程可以控制Minecraft,之前也学过编程可以控制生活中的物体比如LED灯。那编程是否可以作为一个中介让Minecraft控制LED灯呢?经过尝试以后,他们会发现原来不仅可以用Minecraft去控制LED灯,还可以控制很多其他的物体,而且利用一些传感器还可以反过来控制Minecraft。那么,是否可以做成一个控制Minecraft小玩具呢?于是就有了下面从图纸设计、原型加工、程序设计到实际模型的成果。
“学”和“启”,更重要的在于“启”,正如派珀特教授指出,我们只需要为孩子营造出可以学习的环境,孩子总能在自己动手的过程中,不经意的学到很多知识。
观点2:
课程体系的延伸源于孩子创意表达需求的延伸。
在编程教学过程中,经常有家长问老师“孩子应该从何学起”,得到的回答往往是:应该从图形化编程开始,然后过渡到代码编程,最后学习算法。
我的理解是,既然编程是孩子创意表达的一种工具,那么很显然对于不同年龄又或者是不同兴趣的孩子来说,他们对周围世界的认知是不一样的,需要表达的创意也就不一样。有的孩子对世界的理解可能是天马行空的想象,想到的就是合理的;有的孩子可能对真实世界已有的现象充满了好奇,比如楼道里的灯天黑了为什么会自动亮;还有的孩子可能会想,我能不能让这个世界更加便利。
从这个角度出发,作为老师,选出合适的编程工具以满足孩子上述需求似乎更加合理。而且为了符合孩子的认知能力,这种编程工具应该尽量简单、不需要特别高的门槛,孩子能够通过简单的操作即可将自己的想法具象化。基于此,Scratch、Arduino(S4A等)、APP Inventor等图形化的编程工具都是比较合适的选择。通过Scratch,孩子可以“零风险”的实现天马行空的想法;通过Arduino编程项目,孩子对生活中常见的物理现象会有更加真实的认识;而通过APP Inventor制作手机APP,绝对是孩子开发生活便利方案的好工具。从工具学习难易程度来说,Scratch、Arduino、APP Inventor难度依次递进。孩子选择哪一种编程工具,一方面要根据兴趣,另一方面也要考虑认知能力。不过需要指出的是,不是从一种编程工具过渡到另一种编程工具,孩子的能力就会提升。上面提到的3种图形化编程工具,要达到自如的表达创意都不容易,深入学习都是对计算思维的极大锻炼。
当然,对于一些理解能力强、学习快、对计算机特别感兴趣的孩子来说,在小学阶段尝试代码编程、学习算法、朝计算机专业发展也未尝不可。
观点3:
老师的作用在于启发、引导、鼓励,不在于教。
编程学习是以学生为主导的学习过程,孩子的蜕变在于兴趣驱动下的主动学习,而不是老师教会。在我实际教学的过程中,经常会发现孩子更加享受于自己摸索与创作。那么老师的价值何在?我认为老师的作用恰恰就在于让孩子“有意义的主动学习”。要实现这个目的,需要老师去塑造一种让孩子主动学习的氛围,抛出让孩子感兴趣的、贴近他们生活的话题,激发让孩子利用编程去创作的兴趣。
上述提到的蜘蛛结网、四则运算、控制Minecraft等都是有效的尝试。在此基础上老师还需要帮助学生解决编程过程中的一些程序问题,也就是解惑,同时需要对学生的创作成果进行反馈,鼓励学生分享、进一步的创作。
观点4:
为了更加方便的学习,编程学习社区非常重要。
编程学习不应该孤立的存在,分享与获得反馈是孩子保持学习动力的很重要的因素。从我在学校教学的过程来看,一个基于编程的学习社区是非常重要的,一方面孩子可以非常方便地存储自己的作品,另一方面同伴或者老师也可以利用这个系统及时地给予孩子反馈。事实上,很多情况,孩子的进步来源于同伴之间的交流,而且作为互联网时代的原住民,现在的孩子更习惯于这样的学习方式,国外也有相应的研究证明这一点。这也是Scratch官网社区,看似没有老师教,但学习其实无时无刻不在发生的原因。
观点5:
判断孩子是否学会了编程,唯一标准是其是否愿意并能自如利用编程工具实现自己的想法。
很多情况下,会创作一个游戏,并不能代表孩子“学会”了如何应用编程。也许换一种情形或者场景,孩子就不会应用了。只有在不同的场景下,针对不同的问题,甚至是孩子自己提出问题,都能够自如地应用编程技巧实现想法,才是真正的学会了如何去学习,这也是我所理解的编程学习的目的。而要达到这样的目标离不开合理的学习习惯的培养,老师的作用就在于陪同孩子一起养成这样的习惯。
两天前,牛牛给我发了一个新创作的作品,还特地给我介绍了他创作这个作品的初衷,原来是他上个月参加了一个数学考试,里面有道数学题给了他灵感,于是他将这道数学题做成了一个Scratch小游戏,希望更多的小朋友能够挑战数学。下面是牛牛的作品,不仅为自己的作品设计了Logo,而且还详细说明了游戏的规则。对于一个旁观者来说,作品使用起来好像很简单,但是对于创作者来说,一定是在完全理解了数学知识的基础上,才能将这个小游戏的功能设计出来。更关键的是生活中任意一个小小的发现,都有可能催生出一个创意的作品。
所以,不管牛牛的作品是否完美,能将一个抽象的数学题通过编程转化为一个具象的小游戏作品,就是极大的成功。学习编程,让编程反哺学习(learn to code, code to learn)。
当然,我也很高兴看到一些学生参加编程或者创客类的比赛而得奖,这至少也是对他们学习能力的一种认可与证明。学习编程,但不仅仅局限于编程,它更像是一种思维开拓的训练过程,学习编程,更应该让编程反哺学习。