上周三下午最后一节,教室后排那个四年级男孩盯着屏幕,光标闪得很有节奏。
他的程序卡在第三个测试用例。我站在两米外,没动。
他忽然小声说了句:“它又生气了。”
然后自己把红字往下滚了一行,念出声:“第 7 行,index out of range。”改了个数字,重跑。过了。
回办公室我在本子上写了一句话:编程教育里最难教的东西,从来不是语法。
红字不是判决书
同一个班,另一个孩子看到红字的第一反应是——关窗口。
或者举手:“老师,它坏了。”
我问他跑了几次。他说一次。
这两个孩子的差别不在聪明程度,也不在提前学没学过。差在一种很朴素的经验:报错信息是句子,不是判决。
可我们大人常常亲手把这句话堵死。孩子写错一行,我们脱口而出“这么简单都错”。三次之后,红字在他眼里就不再是提示,而是宣判。他会开始躲。
你去看那些编程课上最安静的孩子,很多不是不会,是怕。

有个现象我盯了很久:孩子遇到 bug,最容易做出的动作是随机改数字。3 改成 5,5 改成 2,一遍遍跑,直到碰对。
我说这叫“许愿式调试”。
他其实不知道自己在干什么,只是不肯停下来看那一行字。因为看那一行字,等于承认“我错了”。这个成本,对十岁的孩子来说,有时候比改十遍数字还高。
我后来用一个笨办法:让他先说出来。
“你想让它做什么?”
“它现在做了什么?”
就这两句。不许多说。说出来之后,一大半的 bug 自己就露头了。
搭积木和拆积木,是两件事
再说图形化编程。我不反对它,低龄阶段它确实降了门槛——不用背 `for` 怎么写,不用纠结分号。孩子十分钟就能让小猫走迷宫。家长在旁边拍照,很满意。
但有个坑,我踩过很多年才发现。
拖拽式的积木块,本质是填空:形状对上了,程序就对了。它教的是“找到正确的那块”。
而真正的编程是建构:没有正确的那块,你得自己想出它长什么样。
这两件事,长得像,内核差得很远。
我见过上完一整年图形化课的孩子,第一次打开文本编辑器时的表情。那种茫然不是“难”,是“这里的边界呢?谁告诉我该把哪块放哪?”
不是说图形化不好。是说如果一整年只在搭,孩子学到的其实是操作软件的手速,不是把问题拆开的那股劲。
所以我现在会做一件很小的事:每节课留十分钟,不给积木。只给一张纸,让他画步骤。画完再对着纸去拼。
先想,再动手。顺序反了,练的就是另一块肌肉。

家长问我的问题,多半跟编程无关

上个月,一位妈妈在走廊上堵住我。她儿子学编程两年了。
“老师,为什么他数学还是不行?”
我反问她:他上课的时候,是自己想步骤,还是照着老师屏幕上的一行行敲?
她想了想,说,好像是照着敲。
那就对了。
编程和数学之间不是一根自动输送的管道。它们共用一些东西——拆解、抽象、找不变量、把一个大问题切成能下嘴的小块。可这些能力不会因为手指在键盘上动过就自动长出来。
如果课程是“看老师做一遍,你复制一遍”,那它连思维训练都算不上。它只是一门手工课。
但反过来我也见过。一个五年级女孩,用十几行代码写了个自动批口算的小脚本。从那以后她对“验证”这件事上了瘾——不是因为我算得对不对,是因为我要能证明我算得对。
这句话她说出来的时候,我愣了一下。
你看,关键从来不在“学不学编程”,在课上到底发生了什么。同样一门课,可以是复印机,也可以是磨刀石。
有些时候,最好先别教

说了这么多好的,我得说点不好听的。
不是每个九岁小孩都需要学循环。
下棋、做饭、拆一辆旧自行车、跟着大人去菜市场算账——都在训练同一套东西:把大问题切成小问题,试错,忍受一段没有答案的时间。
编程只是其中一条路,而且是一条对抽象能力要求偏高的路。有的孩子八岁上手如鱼得水,有的孩子十二岁才开窍。这中间没有谁输在起跑线。
真正让我担心的,是那种情形:孩子的日程表已经排满,编程课只是又一个需要打卡的格子。他坐在那里,手在动,脑子在等下课。这种课,上不如不上。
还有一种,是孩子本身不敢错。这类孩子其实最适合编程——代码是少数几个犯错零代价的地方。写崩了,改一行,再来。可前提是,老师不因为红字给他脸色。
如果一堂编程课的分数是按“有没有报错”来打的,那它教的就是相反的品格。
我见过太多孩子,花了很久才敢按下那个运行键。
留个小办法

下次他卡住,别问“哪里错了”。
问那两句:你希望它做什么,它现在做了什么。
问题从“我笨”挪到“它和我想的不一样”。这中间隔着的,是一个孩子愿不愿意再试一次。
顺便说,这法子对我自己也管用。
最后我想问一句,你上一次当着孩子的面,把自己的错误大声说出来——是什么时候?
作者|教育
排版|教育
审核|柚子
大讲堂