儿童如何从零开始学编程
有人说,未来的世界每个人都要会编程,就像每个现代人都会写字说话一样。也有人说,大众是愚昧的,会编程的人群不可能有很大比例。我也不知道未来什么样,但是我知道另外两件事情。一是,程序设计的逻辑与日常和工作中的推理没有区别,遵循和表达流程,在程序设计和现实世界中也是一样的。会编程序的人,更容易相信逻辑,而不是单纯的愿望。二是,曾经,人们认为普罗大众都能说会写--估且不论说写的水平如何--是不可能的。中国扫除文盲也并没有多久,只是大家沉浸在现代化里面一二十年就忘记了原本的样子。多数人不识字因而不能读写家信,集市有专门的人才负责这项工作,这也不过是一百年前的事。如果你认为一百年很久远,那么,我的小学语文老师就讲过,为自己的姨辈扫盲,在锅台、墙壁、门窗上都贴上字,什么东西上就贴什么字,她因此得了标兵。这应该是发生在建国以后的事情。如今,几乎没有人不识字,尽管传闻汉语有多么难学。
刘慈欣先生说,未来的时候,不是挠手机就能活下来的时代。邓小平同志说,计算机要从娃娃抓起。我觉得都挺有道理。
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 介绍,讨论的就是儿童编程。这篇文章一时没有找到,类似于[《编程机器人》:胸中有块垒,大脑涨智慧 - 触乐]。
lightbot看名字的暗示,程序员应该1小时左右通关吧。实际上,我的体会,比那还要难一些。
我和二猫是在 ipad mini 上玩的这个游戏,刚刚注意到,还有 flash 版本可以在PC机上玩,在 bing 上搜索 点灯机器人,有不少。
玩家为一个机器人制定行动计划,操作它在方块场地行走,目的是把所有的灯都点亮。我玩的两个版本都是8+6+6关。
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 上玩的。