聊聊少儿编程——在家教,行不行?

少儿编程如何启蒙?会编程的父母可以做些什么,不会编程的父母又能做些什么?

从一场比赛说起

皮皮上小学三年级,学校已开设信息课。3月中旬,皮皮的信息课老师发来的消息,问我们有没有兴趣让皮皮参加 NOC 比赛。

我们是头一次听说 NOC 这个名字,它具体会比什么、怎么比,心里没数。不过既然老师主动推荐皮皮,那必定是对他的一种认可,我们作为家长肯定乐意,而皮皮则激动万分。

老实说,我对皮皮参赛并没太多信心。我的确教过他一些编程知识,不过我俩一直闹着玩儿的心态来快乐教学的。他到底学会多少东西、是否有能力去应试或比赛,我并不清楚。学校刚刚举行了编程校队选拨考试,考试中皮皮并不擅长回答计算机界的最高奖是什么奖这类问题。皮皮的信息课老师提到 “他好像学过 Python”,其实3月份的皮皮刚学会在最简单的 Python 程序使用 input()print() 函数,以及做一些简单的数学运算。他倒是玩 Scratch 有一段时间,了解基本的编程概念。

4月20号完成初赛,我们并无太多期待,所以慢慢也就忘记这事了。5月7号信息课老师提醒我们说初赛结果出来,需要自己去 NOC 网站查成绩。好消息是,皮皮居然成功晋级。

学校三年级全部所有选手仅有两人成功晋级。再考虑到一起参赛的队友们有不少上过少儿编程培训班,皮皮算是业余选手,所以这个小小的成功对他来说并不容易。

所以我有些感慨:或许我这种用玩的心态来对少儿进行编程启蒙教育的方式,看似业余,实则有效。本篇分享一下我关于少儿编程启蒙的一些思考和经验。关于如何准备 NOC 比赛,我会放在下一篇。

整体思路

皮皮一直以为我俩比较业余。其实他不知道关于编程本身,他爸比一般的少儿编程老师专业得多。实际上我认为有实际编程经验的程序员父母,并不需要是技术牛人,只要愿意花时间和心思给孩子把复杂的概念讲得不那人令人恐惧,把简单的东西讲得更生动透彻,也很可能成为孩子最好的编程老师。

相比之下,不会编程的父母在直接给予孩子帮助上会有劣势,所以往往会求助于少儿编程机构。这当然没错。不过,这并意味着不会编程父母就无法助力孩子的编程教育。只要有心,能做的事情仍然很多。

大的方面来讲,少儿编程启蒙可以分三步走:

  • 第一步是引导小孩子直观地认识电脑程序,并尽可能引起兴趣
  • 第二步是让小孩子了解基本的编程概念和思维,最好是以直观和形象的方式进行
  • 第三步才是动手实践,在实践中加深对概念的理解

后两步并不能一步到位,而是一个相辅相成的过程。动手实践确实可以加深对概念的理解,但实践过程中也可能遇到各种各样意想不到的障碍。其中一种障碍便是编程知识不足,需要回到第二步去了解更多的概念。

认识程序

我们几乎没法三言两语跟小孩讲明白什么是编程,因为其中涉及太多抽象的东西。小孩不擅长认识抽象的事物,抽象的事物也很难吸引小孩子的注意。好在大大小小的电脑在生活当中无处不在,比如我们的手机、手表、平板、电视机、智能音箱甚至汽车,所以电脑程序有很多具象的存在。

我4岁女儿喜欢玩的一个游戏就是假装她手上戴着一个手表,手表上有一个可以导航地图。她仅仅只是看过我开车时用手机地图软件导航,便自行产生了这样的概念。所以其实我们不难在日常生活中通过潜移默化的方式引导小孩对程序有粗浅但正确且正向的直观认识。比如,很多小孩都有电话手表,手表上有各种各样有趣或稀奇的程序,可以碰一碰加好友、可以跟朋友聊天,甚至还可以被爸爸妈妈定位到位置。用心观察,你一定能在生活中找到一个吸引小孩子的程序,不妨跟他们聊聊这个有趣的程序。

程序很好玩

小孩子都喜欢游戏,无论真人游戏还是电子游戏,皮皮也不例外。小区的小学生在楼下打王者荣耀时,皮皮是个热心又认真的围观者。2020年之前,我偶尔打打王者荣耀,虽然打得烂,但丝毫不影响皮皮在一旁津津有味地看。王者荣耀不适合小孩玩,皮皮玩的是 Switch 上的马里奥兄弟和马里奥赛车,他总是玩得很投入。

这么好玩的游戏是怎么做出来的呢?这是一个引导小孩子思考的好问题。我没有给皮皮解释太多,但给他指出了很重要的两点:

  • 好玩的王者荣耀和马里奥其实是复杂的电脑程序
  • 很多时候,做游戏其实比玩游戏更有意思

游戏很好玩,游戏是程序,所以程序应该也很玩。这是皮皮对程序的第一印象。没有小孩子能抗拒好玩的东西。皮皮说他希望有一天可做些好玩的游戏给朋友们玩。

程序很强大

有些家长喜欢拿这个题目考低年级的孩子,以提早确认家中是不是生了个高斯:

1 + 2 + 3 + ... + 99 + 100

我们也不能免俗,试过一回。当然,测试过之后确认皮皮不是高斯。容易理解,小孩子通常很难在短时间内独立地找到 (1+100) * 100 / 2 这种算法。他们往往一番尝试之后发现根本不能用蛮力计算出结果。不过,经过家长引导之后不少小孩都能成功地找到聪明的算法。

这个题目说明了几个道理:

  1. 数学有些难
  2. 高斯很聪明
  3. 我们大部人没有高斯那么聪明

我用一行 Python 代码就得到了 5050 这个计算结果时,皮皮既惊奇又觉得程序有趣。

1
2
3
4
5
6
7
# 一种常规的方式
s = 0
for i in range(1, 101): s += i
print(s) # 输出 5050

# 或者,另一种更简单的方式
print(sum(range(1,101))) # 输出 5050

他肯定意识不到高斯有多聪明,但是他肯定能意识到另外两个道理:

  1. 程序不太复杂
  2. 简单的程序也很强大

了解概念

带小孩子直观地认识程序并不难,但让小孩子了解基本的编程概念有些难。这甚至是三步当中最难的一步。

好在人们使用编程语言对电脑编程以利用其强大的计算能力来解决的那些问题,很多其实来自于生活中的实际问题。所以我们很容易在生活中找到编程基本概念的影子。将这些概念具象化、生活化之后,其理解难度通常会降低很多。当然,有时要找到最恰当的例子来说明一个概念并不容易,但编程基本概念并不多。

理解编程,最重要的是理解变量、条件语句和循环以及简单的数据结构。

变量

皮皮可以这样介绍自己:我2015年出生(year_of_birth),小名叫皮皮(pet_name)。今年我9岁(age),身高138厘米(height),来自三6班(grade)。

可以看到,皮皮的出生年份 year_of_birth 和小名 pet_name 是不会变的,而他明年的年龄 age、身高 height 和班级 grade 则不同于今年的,甚至严格来说他明天的年龄和身高也会在今天的基础上有所变化。所以 ageheight 是变量,而 year_of_birthpet_name 不是。

我们还可以看到变量的类型有所不同。年龄 age 和身高height 是数字,而年级 grade 则不是数字。不同人的年龄和身高可以相互比较,比如皮皮9岁,皮皮的妹妹5岁,那么皮皮的年龄比妹妹的年龄大4岁。不同人的班级则不能简单地比大小,比如皮皮在三6班,皮皮的朋友在三7班,我们不能说皮皮的朋友比皮皮大1班。

实际上,小孩子在算1加到100时,无意当中已经使用了一个变量来存放中间结果,只是他们不知道而已。如果把这个变量写出来,就是下面代码中的 s

1
2
3
4
5
# 一种常规的方式
s = 0
for i in range(1, 101):
s += i
print(s) # 输出 5050

条件和循环

怎样用最简单的办法给小孩讲条件语句呢?其实父母不用给孩子讲,可以反过来让孩子给父母讲。

我问皮皮,这个星期六你准备干嘛?他想了想说还不知道呢,要看天气,如果星期六没下雨,就出门玩;如果下雨了,就在家玩。

1
2
3
4
if 没下雨:
皮皮出门玩
else:
皮皮在家玩

小孩子已经在根据条件来执行不同的动作!

还是用天气的例子来说明循环。假设永远是晴天,那每天太阳都会照常升起。我们也可以说,太阳一周会循环升起7次。

关于”循环”,还可以有更多的说法:

  • 2024年5月太阳会循环升起31次
  • 2024年一整年太阳会循环升起366次
  • 如果太阳和地球都不会毁灭,那么太阳会无限循环地升起

列表

我是用皮皮的课本和文具盒来给他解释列表(list)。我觉得这两个例子还不够生动形象,还可以打磨(如果你找到更好的例子,欢迎告诉我)。不过考虑到”列表”非常容易在图形化或 Python 编程环境下演示,我们可以边讲例子边实践的方式来解释这个概念。

课本是由一页页的纸组成的,纸上有课程内容。一个课本通常会有很多页,每一页有先后顺序。

1
2
book = ['封面', 'page1', 'page2', 
'page3', 'page4']
  • 列表 book 好比是课本,它有很多页
  • 每一页相当于是列表中的一个元素
  • 元素的顺序很重要,我们根据顺序来找到对应的元素

上课时可能有这样一个场景:老师要求翻到课本的第3页开始复习。翻书,小孩子们都会,他们明白如何通过页码找到对应的页。找到 book 列表中第三个元素,其实是同一个道理。

文具盒这个例子也是类似的。想像一下,你有一个文具盒,里面可以放很多文具。在这个文具盒里,你可以把不同种类的文具放进去,比如铅笔、中性笔、尺子、橡皮等。

  • 列表就好比是这里的文具盒,可以装许多不同种类的文具
  • 每个文具就相当于列表中的一个元素

假设你有一个文具盒 box 里面有这样几个文具:

1
2
box = ["pencil", "gel", 
"ruler", "eraser"]

那么我们可以说,文具盒 box 里有四个文具:铅笔、中性笔、尺子、橡皮。

你还可以根据需要取出其中的文具,比如:

  • 第一个文具是 “pencil”(铅笔)
  • 第二个文具是 “gel”(中性笔)

动手实践

家长们容易误以为动手实践这一步需要手把手地教孩子,会编程的父母尚且可以进行,不会编程的父母只能干瞪眼。不是这样的。

对变量、条件语句和循环以及简单的数据结构有粗浅的理解后,小孩子是有能力自己动手编简单程序的。找到好的资源或工具来让小孩子动手非常重要。好的工具可以让小孩百分百地发挥他们当前的编程能力,每个小进步都是正反馈;而不好的工具则形成重重障碍,让小孩觉得编程难得令人恐惧。

code.org 和 makecode

对初次学习编程的小孩来说,图形化编程是最好的起点。网上大量信息告诉我们 Scratch 是最流行的图形化编程环境,有些父母兴冲冲地帮孩子安装好 Scratch 后,困惑在于:然后呢?更合理的方式不是让孩子们在 Scratch 从0开始动手编代码。漫无目的地编程太难了。我推荐用 code.org 网站。

很容易根据孩子的年龄段在 code.org 网站上找到合适的编程项目。从项目开始的好处是,每一步该做什么是提前被设计好了,所以目标感和目的性都很强。每一步,小孩只需要根据指示来主动思考和动手尝试。这是一种目的更明确和有效的编程学习方式。

以下是 code.org 的几张截图。

小孩子在 code.org 上这种游戏化的环境中练习编程时,很难说他们到底是在学习还是在游戏。我只能说他们既是在学也是在玩,这是学习的最高境界。

微软的 MakeCode 是另一个类似的平台,在这上面也可以找到很多免费又好玩的编程游戏。

在 code.org 和 MakeCode 完成课程后,可以领到这些花花绿绿的证书,可以当作一个努力后的小纪念。

c123

trinket.io

另一个值得推荐的是 trinket.io 网站。图形化编程虽然上手门槛低,有漂亮的界面,但表达能力太弱,有时反而会把简单的概念搞得过于复杂。小孩子玩玩 trinket.io 上的乌龟编程,能很轻松地从图形化编程过渡到 Python 编程,为进一步学习复杂的概念打下基础。

在乌龟编程中,可以通过 Python 代码来控制小乌龟移动并且画出各种图形,不仅有循环、列表、条件这些熟悉的概念,甚至还毫无违和感地引入了函数和对象。

Scratch 和 Kitten

如果一定要使用 Scratch 的话,可以从 scratch tutorials 开始。这里有许多做好的游戏,小孩子可以基于这些游戏来添加自己的创意。不过,考虑到启蒙阶段的小孩子的熟练度有限,即便有创意,也难以自由发挥。所以还不如从图书馆借一些 Scratch 相关的少儿编程书籍,一步一步地照着书上的例子来练习。对,是抄,是模仿。推荐《编程真好玩:6岁开始学 Scratch》这本书,里面有8个有趣的小游戏,非常适合启蒙阶段的小孩自己动手一步步来完成。皮皮抄这本书的例子时,我会提些小问题,以确认他不是无脑地抄而是有去理解其中的概念。

NOC 比赛图形化编程项目使用的是 Kitten 源码编辑器,所以皮皮准备 NOC 比赛期间只在能 Kitten 上做练习。一开始我担心国产平台或许不靠谱,但自己玩了几把之后感觉体验也挺不错,没有任何广告和诱导充值的弹窗,只可惜 Kitten 源码编辑器的入口有些难找,这是地址 Kitten 源码编辑器入口

总结

编程似乎很难,因为大部分人终究学不会。编程似乎又很简单,因为小孩子只是简单地玩玩游戏就能很快掌握基本的编程概念。在孩子的编程启蒙过程中,无论父母是否会编程,只要用心,能做的事情可以有很多。

  • 可以一起研究下他们的电话手表,引导小孩子直观地认识程序
  • 从生活中找到一些恰当的例子,带小孩子了解基本的编程概念和思维 (这一步也可以求助于搜索引擎或 AI)
  • 让小孩子在编程平台中动手实践
    • 在 code.org 和 makecode 上玩游戏,在 trinket.io 上画画
    • 从图书馆里借几本图形化编程书,在 Scratch 和 Kitten 动手抄一遍并确保理解