当孩子学编程时他们在学什么
图片来源:unsplash
关于编程,市面上的各种少儿编程课,总是要先制造焦虑:“AI 即将大范围代替人类工作啦,你要是不懂得和计算机打交道的语言,怎么在未来世界立足呢?”
爸爸妈妈们一听焦虑了,赶紧给孩子报班。各种图形化编程、机器人编程,孩子们玩得很开心,家长看着也挺满意。
但也有善反思的家长会发现:好多编程课,和教孩子画出赏心悦目图画的美术课一个路数,关键是要有漂亮的结果能让家长发朋友圈,孩子到底从中学到了什么却很难说清楚,教育机构鼓吹的“编程思维”又是怎么一回事也很难体会出来。
一方面,我觉得教育机构所谓的“编程思维”没啥稀奇的,甚至根本不需要上编程课,在生活中就可以学到;另一方面,我写了二十多年程序、深感编程对我的思维有很多积极影响,也觉得孩子有机会学编程实在是一件很好的事。所以今天,我想和大家分享下家长在不焦虑不盲从的同时,如何能让孩子从少儿编程中汲取养分和快乐。
今天的分享会分三部分:
首先是我从教女儿,以及女儿学校二十来个孩子 Scratch 编程课的体验中,观察到的:孩子们从编程中学到了什么?
然后是我研究了部分商业机构的课程,对此的思考:糟糕的编程课是什么样的?
最后是我的一些建议:孩子到底要不要学编程、怎么学?
我的观察:孩子可以从编程中学到什么
先来说说孩子们从编程中可以学到什么。多数编程教育机构的宣传,都是说“编程思维”。我猜原因有两个:一是这个词比较容易唬住不懂编程的家长,二是它比较容易教,练几次“如果...那么...否则..."/"重复执行...直到..."等条件控制语句,就可以宣称孩子掌握了编程思维了。
但其实,孩子能从编程中提升的技能,远在编程之外。
一、探索的习惯
首先,是探索的习惯。
可能很多家长提到编程的第一反应是:我不会哎,要不要找老师来教呢?但请看看这些学编程的工具:
这是 code.org 里”我的世界“主题的编程一小时。把中央的代码积木拖动到右边工作区,拼接成完整指令,指挥 Steve 完成一关又一关的任务。
这是 lightbot 游戏。简单的几个指令,指挥灯泡小人行走及点亮灯泡。看着简单,但很多编程概念都包含在内了,甚至连重载(overloading)都有。
这是和 lightbot 同一家公司出品的另一款编程游戏 spritebox (http://spritebox.com/ )内容更复杂一些。但对孩子来说,跟随着一步步引导,从开始最简单的执行一句命令,到后面相当复杂的多层循环和条件判断的嵌套,就像玩游戏一样,一关关闯下来就都会了。
如果下次你再听到有人把“如果...那么..."/"重复执行...直到..."当成编程思维推销课程的时候,请记住:这些内容,靠上面几个游戏,让孩子自己摸索,一定都能学会。
让我们再来看 Scratch。
Scratch 的界面要复杂不少,功能也多得多。其实 Scratch 自带非常好的教程,点击菜单中的“提示”就能看到,就是下图中右侧的内容。很可惜教程是英文版的,所以孩子也许还是需要一点大人的帮助。
我之前给孩子们上 Scratch 课,发现孩子们最喜欢做的事情,就是东改改西换换,换用一些别的代码块或者设置一些超大/超小的数字看效果。
比如我们做一个游戏,其中星星出现的时候要闪烁三下好让玩家留意到,我给出的程序和效果是这样的:
孩子们会做什么呢?他们会把大小变化设成1或1000,会把等待时间设成 100 秒或 0.01 秒,还会把重复执行设置成几十亿次。所以他们会做出这样的代码:
小朋友们觉得这样的极速闪烁非常好玩,一群孩子都笑翻了,纷纷跑到自己的电脑上去尝试。有敏锐的孩子会问为什么能同时看到大小两个星星,知识面广的孩子就回答说是视觉残留。
类似的场景,在课堂上还有很多。往往在孩子的一个“咦,这是什么,我来试试看”的疑问背后,可以引发出一长串的问题:为什么会这样呢?和你的预期一致吗?如果换成那个又会是什么样的效果呢?这个功能可以用来做什么?
Scratch是一个再安全不过的环境,最坏情况无非就是把程序重启重新开始,所以可以放心让孩子大胆尝试。美妙的是,每拼接一块积木,都可以点击运行马上看到效果,这反馈-修正的过程是非常迅速的,所以孩子能很顺畅的自行探索。
所以,我想表达的第一点就是:lightbot 等编程游戏,和 Scratch 图形化编程工具,都是再好不过的让孩子尽情探索的玩具。“我来试试看”的口头禅,是这些玩具能带给孩子的最宝贵的财富。
二、通过切身的体验学数学
计算机界的最高奖项是图灵奖,2003年的图灵奖得主 Alan Kay 有一个非常棒的 TED 演讲 A powerful idea about ideas 。在这个演讲中,你可以看到 9 岁的普通孩子孩子通过玩 OLPC 电脑上的软件,得出了“加速度”的概念。
Scratch 是 MIT 的 Meida Lab 创造的,在 Scratch 之前 Media Lab 还有 Logo 语言。你知道吗, Papert 发明 Logo 语言,其实并不是为了教孩子编程,而是为了给孩子一种适合他们的学习方法,用电脑来帮助孩子更好的学习。
Papert 在他的 Mind-Storms 这本书的序言 The Gears of My Childhood 中写到,他幼年时喜欢玩各种各样的齿轮,后来学数学轻而易举,他才发现玩齿轮的体验帮了他好大的忙,例如他会把二元一次方程想象成玩两个齿轮求齿的数量。他在书中是这么说的:
Logo 和 Scratch,其实是虚拟世界的齿轮,能帮助孩子们建构式的学习很丰富的数学知识。
举几个例子:
指挥小猫向前向后走,把星星变大再变小,这些代码可以教孩子正负数的概念
等待 1/0.5/0.25 秒,从中可以学习时间的概念,分数和小数的概念
Scratch里角色的颜色变化一共分200级,把颜色设为210其实等同于把颜色设为10,类似的还有造型变化、亮度变化等等,不知不觉的,孩子就掌握了整除、余数、取模等等。
我最喜欢带孩子玩的是画图形。下面这张图是我给孩子们的第一堂用代码画画课的练习纸。指挥画笔重复执行往前走、旋转一定角度的命令,画出各种各样的图形。孩子们从中学到了什么?笛卡尔坐标系,角度,旋转一周是360度,3*120=4*90=6*60……才一年级的孩子乘法都没学呢,这些对他们来说却很容易理解他们也很乐意去学。
这就是我想说的第二点:通过编程,孩子们能获得很多关于数学的切身的体验,而这些经验有助于今后他们更轻松的学习数学。关于这一点,Tony Yet 写过一篇阐述 Papert 教育理念的文章蛮值得一读的,推荐给大家。
三、工程化解决问题的能力
孩子们在依葫芦画瓢的开发了几个游戏后,总会想实现自己的创意,创作出自己的游戏。
这时候,你就可以引导他描述问题,把大问题一点点拆解成小任务,设计一条分步骤实现任务的路径,然后一点点的去实现它,不断调试根据结果一点点调整直到最终完成。
编程天然就是 PBL 式学习,在这个过程中,孩子的模块化思考、抽象思考、简化问题、寻找替代方案等等能力,都会得到锻炼。这种方式和别的物理世界的项目例如做木工活儿比起来,成本低廉还极其安全,所以不妨多练练。
不过这些能力对低年级的孩子来说还太难了一些,可以让他们先从看别人的项目、理解别人的代码开始做起。我的公众号里“读码探秘”栏目就是在做这方面的试验。
四、逻辑,算法
最后来讲讲逻辑与算法。编程,把我们很多思考问题、执行任务的过程显性的表示了出来。最基础的,有执行中的顺序、条件、循环,逻辑上的与,或,非。让思维变得可见,本身就已经对思考能力会有促进。
算法中有些非常有趣的东西。举一个最简单的例子:这是我带着三个孩子做平面版的“我的世界”,下面这一排是装备栏,最左边的那格是玩家手里当前的装备,是一把铲子。那一课的任务是要点击装备栏中任意一格,就把当前装备和这一格的内容交换。
一开始孩子们写的代码很简单:把a设成b,再把b设成a,不就行了吗
运行下一看,怎么两个都变成铲子了?冥思苦想想不出来。我用实物演示:左手一把尺子右手一支笔,要交换左右手的内容,手又太小无法同时握住两样,就必须先把一样东西临时放到桌上。这桌子,就是一个临时变量c。
一点点引导,他们终于得出了下面这个正确方式,学会了一个新算法:交换a和b的数值,需要一个临时变量c。把c设成a,再把a设成b,最后把b设成c,这样才行。我深深记得孩子们当时眼睛被点亮的样子。
这还只是最简单的算法。计算机世界有大量极其有趣的内容,都是很值得去了解的。
但为什么我会把逻辑、算法排在最后一位呢?因为去学这些算法、进行这样的思维训练,不一定需要通过编程。我们的生活中处处都有素材。
我女儿丢三落四总是忘了带课本和作业回家,我让她画了一张流程图,用到了顺序执行、if else和 foreach。
我们可以用回溯法来走迷宫,用二分法来查字典,有了决策树连晚上吃什么的争论都会少很多。
有一定的编程训练,有助于养成这样的习惯:对生活中的万事万物都问一句“它背后的算法是什么、有没有更好的实现方法”。
如果有相关计算机知识,也能更好的对生活中常见的事物给出具体的、有意思的解释,例如:商品的条形码是怎么回事?为什么会是三个角是黑块?为什么中间挡住了一块还是能够扫码扫得出来?
但这些能力提升的关键,在于思考,而不在于具体的编程。这个不插电编程的网站上有非常丰富的资源 , 国内有清华大学的终身学习实验室在做类似的尝试,我也正在设计一门三阶段的不插电编程教程,后续会在公众号放出。
小结一下,以上是第一部分,我的观察——孩子们可以从编程中学到什么:
最重要的,养成探索的习惯。
其次,是通过编程可以建构式的学习很多别的领域特别是数学的知识
第三,是培养工程化解决问题的能力
最后,是用编程语言让思维可见,学习逻辑与算法
我的思考:糟糕的编程课是怎样的?
有了上面这些观察,我们就可以推导出一门编程课是好还是坏。我要特别说一说糟糕的编程课是怎样的,期望能给正在为孩子挑选编程课的家长一些帮助。
一、不求理解、不能让孩子做到举一反三的
商业机构的通病:买单的是家长,所以课程首先要让家长看到成果,至于孩子们学到了什么,尤其是那些隐性能力的提升,反而是次要的了。所以市面上太多的课,都是这样的:
跟着我做哦
第一步
第二步
第三步
完成啦, OH Yeah!
孩子只是照着做,一点都没理解。但家长不知道呀,看见孩子做出了漂亮的作品,觉得好厉害好高兴。
有些家长可能会觉得,不光是我,孩子也高兴,那还不够吗?
有时候还真不能光以孩子高不高兴来做判断。我之前教过个孩子,每次一上课就来偷我的答案纸,偷去照着把程序全拼好,YEAH 任务完成啦,他就特有成就感。其实变换下题目问他,一点没理解,还是啥都不会。短期来看这样的成就感是可以提升兴趣的,但长期来说实在没多大好处。
二、花哨,只求酷炫效果,买椟还珠的
类似的,那些很花哨、只求酷炫效果的,也不是好的编程课。很多机器人课程是重灾区。有些机器人课产品,提供了大量复杂组件和预先编好程序的模块,只是为了能够让孩子方便的搭建出某些特定功能的机器人。它至多只涉及到一点点逻辑和算法,相关的原理以及在生活中别的应用场景则完全不涉及。孩子们上完课,也只是会用这一种玩具搭这一种机器人而已。
三、不能让孩子自主探索和创造的
举个国内编程课程的作业的例子:让角色从A走到B,说一句“哎呀”,然后倒下。请完成这一段动画。
作为对比,大家可以看一下scratch 官网提供的教材,第一单元的作业:给定10种积木块,请以任意方式使用它们,并把你的成果展示给大家看。
我们可以到网站欣赏下孩子们的作品,五花八门什么都有:
后者完全开放,前者却是有标准答案的填空题。孰优孰劣相信大家都能判断。
四、不符合孩子发展规律、超出孩子能力范围的
给大家说几个反例:
例子一. 我在最初给孩子们上课时,用了英文版界面,想着孩子们在学编程的同时还能学英语,多好呀。可是孩子需要花很多额外的精力在记忆英语单词上,自主探索的行为也少了很多。换成中文后就顺畅多了。
例子二:我的朋友,试图直接教一年级的女儿 python 和 java script,碰壁,最终还是回到 Scratch。因为孩子打字速度慢,完成代码需要的时间太长了,注意力根本不可能集中那么久。
成人们总急不可待的希望孩子们立马变得很厉害。但是对孩子来说,学习的兴趣远比某一个时刻学到的知识要更有价值。如果超前、用不合适的方法教孩子一些内容,孩子接受不了,反而对学习编程失去了兴趣,那就得不偿失了。这方面我自己的编程课也常犯错,还是需要不断提醒自己。
总结一下第二部分:我的思考——糟糕的编程课是怎样的:
不求理解、不能让孩子做到举一反三的
花哨,只求酷炫效果的
不能让孩子自主探索和创造的
不符合孩子发展规律、超出孩子能力范围的
我的建议:要不要让孩子学编程、怎么学?
最后以几条建议作为本次分享的总结
学编程远不只是学编程思维,编程思维也远不只是从编程中学。孩子们可以通过编程学数学,也可以在日常生活中也可以练编程思维。当我们说编程时,视角可以更广一些。
如果你不介意让孩子玩电子产品,那么ipad上装一个 lightbot 或 spritebox,电脑上装个 scratch,陪孩子熟悉后让孩子自己摸索,就足够好了。
如果孩子实在兴趣浓厚想让你为TA报个班,请仔细考察该机构是否存在我上面说的四个问题。
如果孩子极浓的兴趣有极好的编程天赋,那今天的分享并不适合,另有机会再和大家交流这个话题。