第三章 从小学编程,培养孩子的思考能力
在美国,编程是中小学教育中非常重要的内容,而且编程教学也有逐渐低龄化的趋势,甚至有很多相关书籍面对2岁左右的孩子。让孩子从小就学编程,其目的也是训练孩子的思维能力。在美国,编程是中小学教育中非常重要的内容,而且编程教学也有逐渐低龄化的趋势,甚至有很多相关书籍面对2岁左右的孩子。让孩子从小就学编程,其目的也是训练孩子的思维能力。
2岁学编程,从培养孩子结构化程序设计的思维开始
自从美国前总统奥巴马要把编程纳入中小学的教学体系后,美国编程教学低龄化的趋势非常明显,现在有越来越多关于编程的书籍、玩具、APP都开始面向2岁左右的儿童。我看了很多美国主流的儿童编程启蒙图书后发现,一般来说,如果你想让孩子学编程,首先就要从培养孩子结构化程序设计的思维开始。
结构化程序设计
编程看起来很高深,实际上却没那么复杂,说白了,就是你用程序设计语言写一段话,指挥计算机去做一件事情。你说话总得有前后之分吧,编程语言也一样,比如你对计算机说:“你好。”“我是一位妈妈。”“请你放一段音乐。”
这3句话其实就是你对计算机下的一系列指令,通过这些指令,计算机知道:
“你在跟我打招呼。”
“你是一位母亲。”
“你需要我放音乐。”
然后计算机就会按照你的指示,放一段音乐。
你对计算机说的那段话,就是结构化程序,它是按顺序依次执行的,只不过计算机所理解的语言不是我们平时说话的语言罢了。而计算机能够理解的语言,我们称之为编程语言。所以,教孩子学编程,我们就要学两点:一是结构化程序设计,二是编程语言。
编程语言有很多种,比如Scratch、Python、Java、C/C++等都是很主流的编程语言,而且儿童都可以学习。每种语言都有自己的格式和语法,学起来并不难。难就难在编程思维,也就是结构化程序设计思维上。
打个简单的比方,比如说话,说中文也好,英语也罢,都没关系,最关键的是你知道说什么。而结构化程序设计思维就是你想要表达的东西。
结构化程序设计思维怎么训练
现在主流的编程启蒙教育,训练的就是儿童结构化程序设计思维的能力。这种思维在孩子2岁的时候就可以教,借用卡通、桌游、机器人等方式,教孩子一步步学会给计算机下指令。我们看一个例子,这个例子是借用“我的世界”(Minecraft)这个游戏来学编程的。
主人公是图中(见下图)左边的小人儿,他需要到达目的地。

下面这个界面就是给小人儿下达指令的地方,总共有3个指令可以选,分别是:向前走一格(Move Forward),左拐(Turn Left),右拐(Turn Right)。

我们所需要做的,就是在这个界面里给小人儿定义好行进的步骤,最后点一下“运行”(RUN),小人儿就能按照我们给他指定的步骤行走,如果走到目的地就表示成功,如果没有走到就表示失败。
如果我们给小人儿下的指令是往前面走3格,因此一共是3个“向前走一格”的指令,最后运行的时候,小人儿就按照我们给他设置好的指令往前走了。
看起来很简单对不对?实际问题会比这个复杂很多,有时候我们需要用到条件语句,比如走到某个位置要做某个动作;有时候还会用到循环语句,就是说重复某个动作多少遍;还有时候我们会用到函数,把一组动作包含在一个固有的函数里。
关于编程书籍,有一套Code Babies专门是给儿童编程启蒙的,我已经将这套书引进到国内,并担任了本书的翻译,中译名为《宝宝的编程》(中国科学技术大学出版社)。这套幼儿编程书籍对开启孩子编程思维很有帮助。
关于编程机器人,有几款都不错。比如Dash Robot,这款是学习编程的,有专门的APP来提供编程界面。还有费雪的Code-A-Pillar,这款是通过给毛毛虫身体安装不同的行动模块,以下达行动指令,以及Learning Resource的Robot Mouse。
其实,编程并不难,只要父母适当引导,相信每个孩子都会爱上编程。
用编程“乌龟”和孩子玩编程
美国人的桌游有一个特性,就是具有开放性,只要你愿意,就能想出各种各样有创意的玩法。我曾和憨憨在一起玩过很多训练编程的小游戏,如这款 Robot Turtles(编程“乌龟”)。
用编程“乌龟”训练孩子的编程思维
很多人会觉得好奇,编程不都是用电脑实践的吗?和桌游有什么关系?我给大家看一个美国小学通行的编程训练的例子,这个训练是通过游戏“我的世界”来进行的。游戏的目的就是把游戏中的小人儿移到绵羊那个格子里(见69页图)。孩子需要利用编程来实现,程序设计框(见下图)里有3个指令,分别是前进、左拐和右拐。
孩子在下图的程序设计框中将指令设置好后,电脑就会自动按照你设定的程序来移动小人儿。

这个练习就是训练孩子的编程思维。明白了这一点,那么编程“乌龟”这款桌游你就能理解了。编程“乌龟”就是教孩子设置行动指令,让“乌龟”找到珠宝,而且不需要用电脑。
编程“乌龟”的标准型玩法
这种玩法是说明书中提到的,将珠宝卡放在中心位置(见下图),将冰城堡、木城堡、木箱子随意放置于地图上,孩子的工作就是根据“乌龟”所在的位置,每次出一张行动指令卡,比如前进、左拐或者右拐。如果“乌龟”面临冰城堡挡住去路时,可以出一张激光卡,将冰城堡融化。最后移到珠宝处获胜。
编程“乌龟”的竞争型玩法
除了说明书中介绍的基本玩法,我们还可以延伸一下。我跟憨憨玩的时候,会跟他一起设置关卡,比如我分给每个孩子1个冰城堡、1个木箱子、1个木城堡,然后让每个小朋友给对方设计地图,人为设置路障。

这里就有很多技巧,举个例子,如果“乌龟”到珠宝所在地的直线路程中没有任何障碍,那么它到珠宝所在地的路程肯定最短,用时也最少。但是,如果你在“乌龟”到珠宝所在地的直线路程上设置一个冰城堡,那么孩子就需要用一张激光卡将其融化,然后才能行走,步骤就会多一步。而如果你在“乌龟”到珠宝所在地的直线路程上设置一个木城堡,那么孩子就需要绕路行走,就多了好几步。最后,取得珠宝用的步骤最少者为胜。
这个玩法其实考验了孩子两个方面的技巧:一是给对方设置障碍的技巧,二是破解别人设置的障碍的技巧。
这个过程不仅学习了编程的技巧,还需要计算最优路径,这就比第一种玩法难了不少。
编程“乌龟”的过关型玩法
这个玩法是我和憨憨设计的,就是将珠宝放在任何位置,然后在“乌龟”到珠宝的直线路程中间设置很多障碍,让孩子试着用通过卡牌的指令到达珠宝所在地。
在这一过程中,到达珠宝所在地有很多路径,我们需要孩子找出最短路径出来,也就是说所用的指令要最少。
这就像我们设计程序的时候都需要最优的算法。程序写得越少,那么这个程序执行的速度就越快。玩编程“乌龟”就是需要不断训练孩子解决问题,以及优化设计的能力。
用一个户外游戏来进行编程启蒙
公众号的不少读者跟我说,他们是编程“小白”,怎么教孩子编程呢?宝宝才两三岁,也可以开始编程启蒙吗?
编程现在有多热?看看美国就知道了!有一条新政策是编程已被纳入美国的幼儿园到高中(K-12)的教育体系,为此政府特批了40亿美元的基金支持这一计划。
美国一些幼儿园、小学也已经开始有意识地在平日的教学中向孩子传授编程的小常识。编程一般都要用电脑来做,可是对于幼儿来说,长时间使用电脑也不合适,那怎么办呢?于是很多学校就将编程的理念融入平时的户外活动中,而这些活动我们在家也可以陪孩子一起玩。
说到编程,最基本的程序模式有3类: 顺序执行、条件语句、循环语句。
顺序执行就是将命令一条条地依次去做,直到执行完,程序也就结束了,这个很好理解。而很多孩子最迷茫的就是在条件语句上,条件语句的格式是 “if…else…”,计算机入门的时候都会先接触这个。而这个概念也是非常考验孩子逻辑思维能力的,理解了它也就意味着一只脚跨入了编程的大门。
if 判断条件: 结果1 else: 结果2
什么是条件语句呢?举个例子,我们需要计算机放一首歌,如果我在键盘输入的是A,那么放的是黄致列的歌;如果不是A,放的就是李玟的歌。
这段话如果用程序设计来表示,就能写成下面这样:
if 键盘输入A: 放黄致列的歌 else: 放李玟的歌
这个“if…else…”就是编程必用的条件语句,太重要了。话又说回来,这个句子大人一看就明白,可是孩子们怎么理解呢?美国老师还真为此设计出了一个很棒的游戏。
这个游戏平时在家或者一群小朋友玩耍的时候都可以玩。游戏开始的时候,首先要选择一个小朋友(假设名字叫A)作为参照物,别的小朋友就会根据A的指示来做动作。
第一关:复制动作
我们在纸上写下程序。
if A做一个动作:大家都要做同样的动作
也就是说,如果A做什么动作,别的孩子都要跟着做同样的动作,如果谁做错了那就是谁输了。
通过这一步,教会了孩子一个最基本的概念:程序设计中的条件语句——如果发生了什么条件,那么就会产生相应的结果。
第二关:动作相反
程序又改成了这样:
if A做一个动作(蹲下或者跳起):大家要做相反的动作(跳起或者蹲下)
也就是说,如果A蹲下,那么别人就要跳起来;而如果A跳起来,那么别人就要蹲下。检查这一过程看谁犯糊涂了。这一关的难点在于,孩子看到的和需要做的是完全相反的事情。
通过这一步,孩子慢慢理解,在条件语句中条件和结果可以不一样。比如说例子里的条件是A跳起,但结果是别的孩子要蹲下。
第三关:反之情况
继续修改程序,加入了一个else。
if A举右手:大家都要举右手
else:大家都要抬右脚
也就是说,如果A举右手,那么别人都要举右手;而如果A没有举右手(他在做别的动作),那么别人都要抬右脚。这个就有点儿难度了。大家可以一起比赛,做错的人就出局,看看谁是最后的冠军。
通过这一步,孩子理解了整个条件语句的概念,如果出现了某个条件,产生相应的结果;但如果没有发生那个条件,就会产生别的结果。
第四关:开始编程
到了最后一关,可以让孩子开始编程了。我们让孩子自己制定游戏,用“if…else…”的格式把他们想要玩的游戏规则写下来,要求就是给出一个条件和两个结果。如果达到某个条件,就会产生第一个结果;而如果没有达到条件,就会产生另外一个结果。模板如下。
if_: _ else:_
通过这一步,孩子就可以根据自己的想法编写喜欢的程序了。
