儿童从零学编程,及2款APP & Scratch

有人说,未来的世界每个人都要会编程,就像每个现代人都会写字说话一样。也有人说,大众是愚昧的,会编程的人群不可能有很大比例。我也不知道未来什么样,但是我知道另外两件事情。一是,程序设计的逻辑与日常和工作中的推理没有区别,遵循和表达流程,在程序设计和现实世界中也是一样的。会编程序的人,更容易相信逻辑,而不是单纯的愿望。二是,曾经,人们认为普罗大众都能说会写--估且不论说写的水平如何--是不可能的。中国扫除文盲也并没有多久,只是大家沉浸在现代化里面一二十年就忘记了原本的样子。多数人不识字因而不能读写家信,集市有专门的人才负责这项工作,这也不过是一百年前的事。如果你认为一百年很久远,那么,我的小学语文老师就讲过,为自己的姨辈扫盲,在锅台、墙壁、门窗上都贴上字,什么东西上就贴什么字,她因此得了标兵。这应该是发生在建国以后的事情。如今,几乎没有人不识字,尽管传闻汉语有多么难学。

刘慈欣先生说,未来的时候,不是挠手机就能活下来的时代。邓小平同志说,计算机要从娃娃抓起。我觉得都挺有道理。

0. 我的入门

我学习编程入门是在高中的时候,1992年左右,使用的机是苹果II、长城6502,单色显示器,一个或两个软驱,高密的是好的,一般是低密的。

教材是 苹果-Ⅱ BASIC程序设计 / 张世英编,北京 : 北京师范大学出版社, 1985,500多页的小册子。

当时最喜欢的有两项。一个是玩现成的游戏,插进软件,似乎要怎么怎么运行,然后有一堆绿色的方块在屏幕上扭来动去,有时嘟一声。同学中的前辈告诉我,那是两个武士在持剑格斗。我完全看不出来,而且确实比魂斗罗之类的效果要差很多。另一个更喜欢一些,就是把书上的BASIC代码录入进去,然后修改,画出不同的图形,计算不同的结果。因为能看到更多可控的因素,所以编程比看不懂的游戏更有意思吧。

1. 失败的尝试

二猫同学在大约五六岁的时候,我尝试了两次教她编程,不怎么成功。

第一次的教材是《与孩子一起学编程》,作者[美] 桑德Warren Sande / Carter Sande,人民邮电出版社, 2010-11。

从第一章或第三章开始。最初的实验是编个程序,能算出 1+2 这样。为避免你误会我的意思,以为是自动生成考卷之类的,具体地说,代码就是 print 1+2这么一行。如果想算 3+5,那就手动再改一下代码。

对于二猫来讲,体验是神奇的。因为除了她,居然还有这么个东西也能算加法,而且计算结果和她的一样。所以,她一直希望,"再算一个几加几"。

然后我尝试教她循环,这就是失败的开始。在循环中,需要要循环变量,需要有对求和连加的抽象表达。我忘记了,连 print 这样一个单词她以前都没有见过。这些全都是新的信息,风暴一样灌进来。她甚至还没有学过连加和乘法。

后来我们说,今天就到这里吧。印象里,她没有特别强烈地要求继续,相信已经有些挫败感了。虽然说,挫败感是只有一定程度投入才能产生的反应,但是我不敢继续尝试了。

另一次编程学习的尝试,是在 ipad mini 里装了个 logo。logo又称海龟做图,基于极坐标或平面直角坐标系,移动海龟光标,指挥它画图。我用 logo 给二猫画了个直线,画了个三角形,画了个多边形,逼近了圈,她试了试改其中的几行,觉得不错,挺神奇。正准备用极坐标画个万花规图形,发现二猫开始礼貌地表达兴趣。

万花规作图,需要极坐标方程,需要一堆代码。更重要的,二猫告诉我,其实从画三角形开始,一圈是360度,每个角应该多少度,甚至走多少步在平面直角坐标系上的含义,这些都是全新的知识。直角坐标系的概念,直到最近2017年初她读可怕的数学系列,才学到了,自觉用在了 scratch 中,极坐标可能仍然没有概念呢。

后来二猫几次主动提出希望再玩 python,我没有想好怎么教学,还是没带她玩。

如果没有学过加减法,如果没有学过角度,那么 python 和 logo 就没法开始。那么,是不是没有这些基础,就任何程序也不能编呢?到底具备什么样的基础才能开始学习编程和逻辑。

约十年前,李记者、典同学、我曾经讨论过很多轮,需要具备什么样基础或者特性的人,才能成长为优秀的程序员。其中,我提到过一个游戏《不可思议的机器》,设计路线让小老鼠躲开猫的追击。有针、弹簧垫、气球这样的道具,它们在一定程序仿真的物理引擎上交互。由玩家触发开始以后,道具一顿乱跳,最后猫失败老鼠跑掉。这个游戏有编程的基本思想,计划、条件、隐含的循环。但是,这个游戏并不需要任何数学基础。所以,不需要数学基础的编程,应该是可能的。

《不可思议的机器》并不适合儿童编程教学。一方面是因为难度偏好,另一方面离程序设计最终功利的目的太过遥远,从游戏里不太容易直接看出与编程思想的对应,我担心这样的技能向真实编程移植可能相当困难。

2. 点灯机器人 (Lightbot Hour'14, Lightbot Hour)

最初我在网上某篇文章里看到 lightbot 介绍,讨论的就是儿童编程。这篇文章一时没有找到,类似于[http://www.chuapp.com/2015/11/25/217238.html]。

lightbot看名字的暗示,程序员应该1小时左右通关吧。实际上,我的体会,比那还要难一些。

我和二猫是在 ipad mini 上玩的这个游戏,刚刚注意到,还有 flash 版本可以在PC机上玩,在 bing 上搜索 点灯机器人,有不少。

玩家为一个机器人制定行动计划,操作它在方块场地行走,目的是把所有的灯都点亮。我玩的两个版本都是8+6+6关。

lightbot

2.1 其中第一部分8关,只使用基本操作,包括 左转、右转、前进、跳、点灯/灭灯。其中点灯和灭灯是同一个动作,如果把灯的状态由灭/亮改为亮/灭。这符合演绎思想的基本路线,由几个基本元素,经过几个基本规则的组合,构造出更复杂的行动--行动的结果,正是意图的目标。这是分解,考察如何把意图分解为若干步骤。python 和 logo 的问题在于,涉及过多的基础知识,因此入门所需要的元素也就很多。lightbot限制动作只有上述5个,是这个游戏定义的,所以不需要基础知识。从现实来的隐喻--机器人会走、会点灯,单纯所以容易掌握。就转向而言,只提供左转、右转,限制了机器人转向的可能只有2种,而不会是360种,所以不需要使用 转向(左|右) 这样带参函数或动宾 (动补?) 的复杂结构,可以枚举为 左转、右转。

在这一部分中,玩家能够掌握 1.顺序执行的概念,2.在每个步骤中可以选用若干语句 (向前、左转、右转、跳、点灯/灭灯) ,3.这些语句只有在特定的上下文中才具有意义,比如在不是台阶的地方不能跳,台阶处不能向前,灯是开关量。

这些都是某些人在学习程序设计中遇到的障碍,并不是像某些一学就会的程序员认为的那样是显而易见的。由原本生活所带来的各种刻板印象支配我们对新学习的知识的猜测路线,信息和手册往往又并不充分,所以猜错几次非常正常。由于程序设计与现实的差异,不容商议地必须完全正确,不少人错到不知道如何继续,挫败感很强。所以,设计 少量元素+简单规则,推演出更丰富的结果,很适合用于了解熟悉构造性的思路。而且,又刚好不是像某些人认为的平面几何那么难 (初中却学得不错?),所以更佳。虽然我猜,lightbot 就等价于弱的平面几何,在抽象代数的意义上上。这是良药何需苦口的典型范例。

2.2 第二部分6关,需要使用子程序 (或称过程?)。逼近或诱导玩家使用子程序的原因是,原来的主程序中,能够放置行动卡片的槽位有限。如果用"笨"办法,那么步骤数量多于槽位,游戏不能成功。比如向前走4步点4盏灯,按基本操作,就是 走1步、点灯、走1步、点灯、走1步、点灯、走1步、点灯,需要8个槽位;按子程序的办法,可以是 主程序中为 P1、P1、P1、P1,4个槽位,P1中是走1步、点灯,2个槽位。游戏在这一关里设定为,主程序只有4个槽位,按基本操作的8个步骤就过不了关。

在第二部分的开头,有图示和文字指导,表示P1可以像基本操作一样作为卡片放在主程序中,并把P1展开表示是步骤的一部分。

在 lightbot 中,P1子程序入口和出口都不带参数。我认为这是对一般编程的合理简化,利于掌握。

2.3 第三部分6关,涉及递归,P1可以调用P1。在 lightbot,很令我意外的,没有循环,只能使用递归完成迭代。典同学会说,这才是合理的思维方式吧。同样由于槽位的限制,如果不使用递归,就不可能完成任务,所以诱导玩家掌握递归思想。

没有递归跳出条件,当所有灯都点亮以后,游戏就通过此关。由于不需要递归的跳出条件,也就没有变量和循环变量存在的必要。

游戏通关以后可以申请电子证书,看起来花样繁复,很值得一显摆的样子。可以指定把你的名字印在上面,不过似乎不支持汉字。

3. Robot School

单位党支部组织生活,会后的路上同事们和蹭车的我学术交流。朱老师告诉我还有个游戏也很好,Robot School,也是在 ipad mini 上玩的。

乐高风格,科幻风格的流程图 (或文字) 展示代码。机器人在玩家的计划下,穿过场地去找电池充电的故事。场景三维的,有透视效果,转起来的时候我有点晕,但是没吐。一共9页,共45关,我玩了大半宿,可能4个小时左右,挺有意思的。

school_flow

游戏有这么几个特色,因此适合初学者上手学习编程。

3.1 受机器人能量 (步数)限制,类似于 lightbot 的槽位,逼迫或诱导你不得不选择新学的手段完成任务。

在软件工程科目中,同学们通常都会有疑问,我用更基本的方法明明能做的题目,为什么非得逼我用你的某种方法。教师强迫使用,会让同学们形成对威权的服从和避免思考带来的伤害,也不会信服新方法就多么好,尤其在问题规模并不大的时候。所以,适合的限制,使得使用旧方法一定不成,就不是人为的,而是来自自然力的限制,让人舒服多了。

游戏里通常有这样的设计,比如《帝国时代》的任务里,明明你的那个兵种这么这么就能赢,但是他刚好那天把刀放在了家里,只能徒手格斗。这种限制,如果你能接受作为游戏一部分,而不是故意难为你,那么还是挺有意思的。如果你不按受,那么感觉就类似于足球场上22个人抢那么唯一的一个球,多发几个不就行了嘛。

school_code_view
3.2 循序渐近地引入知识。Robot School 比 lightbot 的关数更多,涉及的技术手段也更丰富。在这种情况下,逐步而不是一次性引入所有操作,就非常必要。

基本动作涉及:行走 (距离),转弯 (方向),开门,开盒子。这些动作帮助掌握顺序执行和多种语句 (服从目的或遵循上下文环境)的选择。

逻辑控制包括:循环 (次数),在循环中行走、转弯、开门,多重循环 (在循环中循环)。在循环中插入动作,不像 lightbot 中那样槽位明显,而是可以扩张的隐含的语句块。

循环的引入也是个特色,通过 碰撞检测道具 (每步检测),机器人捡起那个道具以后,肩膀后面会多个像火箭炮一样的装备。到最后可以装上3门之多,各有用途。每步检测,表达的是循环,检测磁撞,相当于 if,连接在一起就是 while (cond) { do something; }. 这让学习者对于 while...do 中到底发生了什么,有了可视的认识,更容易想像。

大炮筒一样的道具,除了碰撞检测,还有颜色检测。最初只是根据颜色作判断 (引入判断分支,然后引入判断嵌套),后来颜色可以临时存储在变量中,等到以后再提取出来使用。

大炮筒道具,还有障碍距离检测,检测的结果也可以存入变量中。这样,又引入了多个变量以及变量命名的必要性 (不涉及变量命名的易读易记 convention,仅用于区别三两个变量)。

进一步,变量需要做简单的算术运算 ( des1 -3 这样的),从而引入了表达式,然后把表达式置入检测条件。

最后阶段,引入了一个障碍物,可以搬起来、带着移动、放下。这个障碍物的引用,看起来是前面所有知道的综合应用。在多个障碍物的关卡中,受能量的限制,玩家需要把 (1) 多次搬移砖块, (2) 用相同而有略有差异的语句表达, (3) 然后放入循环中,把差异作为循环中的变量。这要求在流程中发现模式,并用抽象 (abstract/common) 的方式表达出来。

school_code_view_large
最后一关,看起来阴森恐怖,是个迷宫。迷宫并不会变,但是能量不足以供你根据迷宫的样子写出计划,所以,需要写出能走出迷宫的算法。二猫说,这个我从一本书上看到过,如果走不出去了,就沿着一侧的墙走。我听说这叫做走迷宫左手或右手法则,用 Robot School 流程图的面板写出来不短,所以完成以后颇有成就感。

4. Scratch (不是移动端APP)

以上这些游戏,二猫有的在我帮助三两次后完成,有的还在进行中,兴致盎然。Scratch现在自学加我的帮助,玩得也很高兴,并且是这里面最喜欢的。

有不止一位同事朋友向我推荐过Scratch,大名鼎鼎。最初我自己尝试的时候体验并不好,因为网速。后来下载了PC版本,用起来倒是流畅了,如果不分享作品到官方站点,可以容忍。提醒你时不时更新一下。我曾经遇到过一个非常费解的变量和循环的问题,感觉应该可以那么用,虽然教程和手册都没有提到。请教了三两位同事朋友,等答复期间发现,是我的 Scratch PC版版本低,升级了以后毛病全无。

有些同事朋友的孩子直接使用了英文版,或者英语才是他们的母语,教程和工具都用英文,更方便一些。就二猫而言,做了几个实验以后,仍然更喜欢中文版,虽然她也认同中文版的翻译错误,比如 "mouse down" 翻译为鼠标下移,而其含义是鼠标左键单击。

二猫第一次接触Scratch时小学一二年级,做的是小猫跳舞。没有看教程或视频,带着她做了一遍,过程中讲解需要的几个部件,然后她自己修改和重做。作品是一个角色换几个动作 (循环10次) ,换动作的时候放一小段声音,看起来像跳舞的样子。二猫认为角色动作生硬,更像是体操,但是觉得挺好玩。

最近让她读了一本中文教材,然后她自己照做和修改了一些实验。教材是 Scratch儿童编程乐园,凌秋虹 编著,江苏科学技术出版社。连同网上还有些中文的手册和教程,我自己都没有读过,没法推荐。英文的,据说 youtube 上视频教很多,官方站点上也有,但是,都是看不到的。英文手册可能也不错,不过,如果你是程序员打算教孩子的话,我猜不用太看。容易学会,困难的是教会孩子。

二猫看了教材以后,自己选择了实验的路线。我认为设计合理,略难,但是可以承受,没有干预。每个实验她要求我帮助一至两次,然后自己就能完成。

(1) 小猫和小猴踢球,重复几次,每次说一句话 (文字+气泡) ,最后一下球踢飞了。我刚开始看踢来踢去,心想,这什么破玩意,也礼貌地表示挺好。最后球踢飞那下,我哈哈大笑。不错。

不得不说,经常有些实验设计得都太无聊,指向性太明确,大大地降低了学习者的兴趣。有点起承转合,明显感觉好多了。

ball

(2) 打地鼠。场景上挖几个洞,地鼠一会儿出来一会消失。你操作一个大红槌子,砸,砸到就加分,还"吱"一声。

mouse

这个实验作为第2个,对于二猫来讲,我觉得有些难。实验操作并不像有些人想的,照抄一遍就一定能成功。整个实验如果有20个元素参与,加上这些元素间的顺序和关系,一处错误,程序就跑不起来。找起bug来,对能力的要求远不是抄实验能解决的,而是必须理解实验中的每个步骤应有什么效果。对照教材仔细核对这种事,是不行的。

不过,这个实验的难度仍在可承受范围内。我简单提示两次,二猫迅速找到bug,解决了。实验完成后,她要求玩一会儿。这是合理的诉求,我经常做完程序玩上几遍,再玩上几遍。既找bug,也满足成就感。好像实体的玩具,做好以后,一定要多把玩几次,才过了瘾,虽说做的过程比玩要有意思得多。

(3) F1赛车,车自动向前走,键盘控制方向,躲避障碍物。有了打地鼠作为基础,这个实验照书独立完成,毫无难度,不需要我。

f1
(4) 飞机躲陨石,声音控制,声音大就向上,声音小就向下。二猫解读代码 (而不是根据实验效果) 指出,因为有"-3",所以如果没有声音,飞机也会往下掉。

声音控制很难,二猫又把代码改为用键盘控制,还发现了书中代码的冗余部分,删除了。

plane
(5) 画笔,如图所示,二猫的程序,二猫用程序画的。

painter
(6) 迷宫,正在做,玩家操作角色走迷宫,共10关。二猫设计了10个按钮,不用的时候隐藏起来,我启发后准备修订为用变量,表示第几关、过关颜色、死亡颜色、场景,每过一关,表示第几关那个变量+1。

maze
Scratch除了两个机器人APP以外的特色以外,可以支持功能更强更复杂的定制脚本 (比如10关迷宫) ,也可以完成非常简单而有趣游戏 (小猫跳舞)。所以适合零基础入门并可以学习到相当难度。

Scratch使用角色 (及角色的动作、背景) 表征变量的状态,支持循环 (和条件侦测) 、判断、变量、链表、表达式等。二猫问我,"能用Scratch做个Scratch么?"我猜能,是通用图灵机吧。

5. 其他

小车循迹、走迷宫比赛、机器人灭火 (蜡烛)等也有不少,我接触不多,只听说过有 飞思卡尔、CoSpace、乐高、Scratch、FIRST、FRC。还看到过小学门口有玩魔方的"星门"。

6. 基础理论

cat
春节期间,应二猫要求,给她讲过二进制入门。就是那个著名的游戏和变形,15
个姓氏写在4个卡片上,卡片的权重分别是8、4、2、1。玩家说出姓氏在哪几个
卡片中出现,但不说具体姓氏是什么,game master累加卡片权重可得数字1~15,
查表就知道是哪个姓氏。

下图是我给二猫讲的图示。

name1

name2

下图是二猫自己发挥的新创游戏。

cube

这也许应该算是数学吧,跟上述编程的逻辑和推演,还有很远的距离。

下图是洋葱表皮细胞,钢笔水染色,放大500倍 (带USB的显微镜) ,可以看到细
胞核。与题目无关,就是好玩,供你参考。

onion
————————————————————

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[https://younggift.net/]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com]