决定了:计划带着小孩学编程 | 文末福利
在这个特别兴趣组中,学生用书是通用的奥数教材,不过教师用书可不太普通—我们用的是G. Polya写的《怎样解题—数学思维的新方法》(How To Solve it)和陶哲轩写的《陶哲轩教你学数学》。换句话说,我们践行的是Polya的数学教育观—重在倾听孩子们的理解和猜想,重在引导孩子们观察、尝试、联想、归纳、做“合情推理”,总之是一种“慢数学”的风格,有时候我们甚至2个小时只讲一道题。
一开始的确看不出成效,但等到三年下来,才慢慢发现孩子们有了一些进步—当然,这些进步不是指孩子们参加某个杯赛拿了个奖,而是指孩子们掌握了一些基本的数学思维,体现在自己能够提出和证明一些猜想,比如包若宁、卜文远、魏文珊小朋友提出了三阶幻方的“包卜魏猜想”,傅鼎荃小朋友在学习“鸡兔同笼”问题时,完全自主地想出了“二分法”。在思维火花迸发的尤里卡时刻,孩子们兴奋得又喊又跳;躬逢其时,我们也非常欣慰—这是对教师最大的肯定和褒奖。
等到了2020年春节,因为出现疫情,孩子们都憋在家里,很是无聊,就嚷嚷着让我们教他们编程。教一门编程语言容易,但是关键不在这里,而在于教“计算思维”,这给我们出了一个不小的难题。
事实上,包云岗、兰艳艳和我都在中国科学院大学教计算机科学与技术:包老师讲授“操作系统”,负责“一生一芯”实践计划,讲解如何设计CPU和计算机系统;兰老师讲授“机器学习和人工智能”,训练计算机怎样学习;我讲授“计算机算法设计”,包括怎样观察问题和求解问题。简而言之,我们教的都是“计算思维”。
不过我们面向的都是本科生和研究生,能否教小学生计算思维?教什么?怎么教?这对我们来说是全新的挑战。这可不像教数学,还有Polya和陶哲轩写的书能够当作教材,给我们一些指导。
我们在开课前思考了很久,教的时候又边教边琢磨,把教授本科生、研究生的计算思维进行裁剪和修改,形成了一个初步的“小学生版”计算思维。
所谓计算思维,其核心是碰到问题时如何观察、如何尝试,然后如何根据观察到的规律设计计算机程序来求解问题。下面这几条或许是最基本的计算思维:
(1)先正向尝试理解题意,再反向求解问题
碰到一个问题如何下手?孩子们往往会对着问题发呆,感觉束手无策。这不怪孩子们,求解问题是“反向思维”,有时候的确不太容易一下子就想出来。
在这种情况下,“先正向尝试理解题意,再反向求解问题”是走出困境的一个好办法。以“鸡兔同笼”问题为例,可以先尝试一下“鸡有0只”,即使这个尝试非常粗糙也没关系,然后验证这个尝试对不对,不对再修改尝试,比如接着尝试“有1只鸡对不对”,如果不对再增加鸡的数目。
先尝试猜测一个解(或许这个解很粗糙,这不要紧),再验证这个猜测是否满足要求,不满足要求就修改;这种“尝试-验证-改进”策略是“试错法”,也是“逐步改进法”。正向尝试有助于理解题意,或许应该成为孩子们碰到问题时的“第一反应”。
这种策略看起来很笨,不过却有三个好处:一是能够使孩子们动起手来,避免发呆;二是能够启发我们写一个求解的程序;第三点更重要,孩子们尝试不了几次,可能就会自己发现规律,想出更好的求解方法—这不是想象或夸张,SIGMA的孩子们就是这样想出求解方法的。
说得更远一点儿,计算机科学与技术里普遍采用这种“用正向尝试来反向解题”的策略。一个典型的方法就是神经网络的训练过程—尝试设置网络参数,做正向的网络传播,验证传播的结果,如果不好就修正网络参数,最终反向求解出网络参数。
(2)从最简单的做起
碰到一个复杂的问题怎么办?比如“四个和尚分馍馍”问题,唐僧师徒4人化缘化到了10个馍馍,问共有几种分法?孩子们没学过组合数学,看到这么多和尚和这么多馍馍,一下就傻眼了。
直接求解这个问题是很难的,我们就启发孩子们从最简单的做起:4个和尚、10个馍馍的问题不会解,那就先考虑2个和尚、1个馍馍的问题。反过来,如果最简单的情形都无法解决,那就说明这个问题太难了,要么放弃,要么琢磨最简单的情形与原始问题之间的差异。当知道怎样求解2个和尚、1个馍馍的问题之后,我们再增加难度,考虑2个和尚、2个馍馍的问题,以及3个和尚、3个馍馍的问题。
找出问题的最简单情形,从最简单的情形入手,可以有效避免孩子们面对复杂问题时束手无策。所谓下手,所谓破题,所谓“把手弄脏”,就是第二个有效方式。
(3)要学会把复杂问题分解成简单问题
这和上一点是一脉相承的。当面对复杂问题时,首先要思考什么是最简单情况,最简单情况下的问题会不会解。假如最简单的情况会解了,下面的思考方向就是如何把复杂问题分解成简单问题。
还是拿“4个和尚分10个馍馍”做例子,假设知道唐僧吃了1个馍馍,剩下的问题就简化成“3个和尚分9个馍馍”了。把复杂问题分解成简单的、同类型的问题,就朝着最终解决问题前进了一大步。
当然,这种“假设法”只是一种问题分解手段,除此之外,还有“二分法”等。我们设计了几个题目,比如“求2的平方根”,目的就是引导孩子们领会“二分法”。
(4)枚举容易做,关键是剪枝
如果说计算思维和数学思维有什么不同,我想最大的不同或许在于“枚举法”。其中的道理很简单:人力有限,惧怕枚举;计算机不怕累,不怕枚举,反而有时候喜欢枚举—枚举程序多容易写啊。
碰到哪种问题可以尝试“枚举法”呢?如果一个问题的解是多个变量的组合,我们可以尝试一下“枚举法”。以“数字谜”问题为例,解是多个变量的组合,我们只需要枚举变量的所有组合就可以了。孩子们在数学课上常会碰到这种题目,当时很畏难—不是不会做,而是所有的组合太多了,一想到枚举就发怵。不过到了编程课上就简单了,只需要写一个“嵌套循环”,让计算机拼命算就行了。
当然了,要是组合数量实在太多的话,计算机也枚举不完。这时候的关键是找“最受限制”的变量,用这个变量对枚举树进行“剪枝”。我们在讲“数字谜”时,让孩子们尝试最笨的枚举,然后和带剪枝的枚举进行对比,从而体会剪枝的重要性。
孩子们将来会发现很多问题和“数字谜”问题类似,解是由多个变量组成的。对这种问题,“枚举+剪枝”是行之有效的解题思路。
(5)随机是个利器
孩子们还是小学生,接触的“确定性”方法多,“随机性”算法少。我们设计了“布丰投针估计π”“打圆形靶子估计π”“布朗运动和醉汉的脚步”实验,意在引导孩子们从随机算法的角度思考问题。
“布朗运动和醉汉的脚步”实验,意在告诉孩子们很多天然现象的本质就是随机;而“布丰投针估计π”和“打圆形靶子估计π”实验,是想让孩子们体会到即使是确定性的问题,也可以用随机方法解决。随机采样可以大大减少计算量,不需要特别多的采样,也能得到很好的结果。
(6)仿真物理世界
在学习计算思维的过程中,一个需要防止的倾向是把计算机世界和真实的物理世界割裂开来。
为了防止这种倾向,我们引导孩子们在写程序之前,尽可能先做一些物理实验。比如在写“打圆形靶子估计π”程序之前,先用圆珠笔作飞镖、向靶子上投掷;在写“花粉的布朗运动”仿真程序之前,先用激光笔照射淀粉悬浮液,体会真实的布朗运动;在写“牛顿的大炮”程序之前,先用三根弹簧秤探索拉力分解的奥秘。有了真实的体会再写程序,和没有体会直接写,感觉是大不相同的。
此外,我们在设计题目时非常强调“数学建模”,即怎样把物理世界中的实际问题表示成计算机问题或数学问题。比如我们设计了“森林里有几只老鼠几只猫头鹰”这一讲,意图引导孩子们体会如何仿真“猎物-捕食者”动力学系统;设计了“牛顿的大炮”这一讲,意图引导孩子们体会如何把物理世界“装”到计算机里去。
值得指出的是,“森林里有几只老鼠几只猫头鹰”背后有高深的数学思想;C. Lay写的《线性代数及其应用》中讲到矩阵特征值时,开篇用的就是这个例子。等到孩子们长大了,学习大学数学时,相信会有似曾相识的感觉。
总结一下:从粗糙的解开始大胆尝试,不断改进;从最简单的情形做起,把复杂问题分解成简单问题;枚举所有的解,设计“剪枝”技术加快枚举过程;随机采样少量的样本,以减少计算量,这大概就是最基本的计算思维了。我们给本科生、研究生讲的无非也是这几条,只不过是更深、更广一些罢了。
德国数学家、数学教育家F. Klein写了一本书,书名叫作《高观点下的初等数学》,其核心观点之一是“有些基础数学,从高观点下才能看得更加明白”。我们把讲授给本科生、研究生的计算思维做了筛选,然后讲授给孩子们;不揣浅陋,这或许可以称作“高观点下的少儿计算思维”吧。
为了便于孩子们理解和掌握计算思维,我们还设计了一些游戏,比如“找钻石”游戏是为了体会“二分法”,“走迷宫”游戏是为了体会陶哲轩提出的解题大法—解题无非是尝试寻找一条从已知到结论的路径。我们几位老师平时研究的就是算法和系统,所以给孩子们讲授的计算思维自然而然地带有浓厚的“数学思维”和“系统思维”色彩。
大概花了4个月的时间,我们就教完孩子们编程了,包括编程基础知识和计算思维。那孩子们学得到底怎么样呢?
事情很是凑巧,2021年5月22日计算所举办“公众科学日”活动,其中一个节目是我带着小SIGMA们做一期“知乎课堂”,讲的题目是“如何用Scratch编程实现一只阿尔法小狗”。台下有300名现场观众注视,线上还有30万观众观看,孩子们顶住压力,现场编程,出了bug现场解决,成功实现了会下tic-tac-toe棋的阿尔法小狗;然后给观众讲解背后的原理和编程步骤,邀请观众进行“人狗大战”;最后又分成两个战队进行“狗狗大战”,看哪一队设计的阿尔法小狗更厉害。
现场完成编程和讲解,说明孩子们掌握了基本的计算思维和程序设计技能。此外,张秦汉小朋友参加“核桃杯”编程大赛,获得了北京市金奖,也是一个小小的证明,值得鼓励。
我们在讲课时就要求孩子们做笔记,记录自己的理解、实验设计思路和实验结果。孩子们轮流来,每一讲都推选一位小朋友负责整理笔记:写程序、分析实验结果、上网查资料,这通常需要花费一周的时间。孩子们写完之后,由我们修改、校补和点评,最终汇集成了这本小书。我们所做的大修改都以“教师点评”的形式明确标识,尽量把修改最小化,以保持孩子们写作的原汁原味—童言童语,自当胜过老生常谈。
这本书是孩子和家长共同劳动的成果:部分插图是孩子们手绘的;封面是刘卫玲设计的;全书由包云岗、张春明、谭光明、兰艳艳、何海芸校对。每一位家长都没有缺席。
在我的心目中,小SIGMA数学特别兴趣组不是一个课外补习班,而是我们这些做父母的和孩子们做的一场亲子游戏,是把我们的思考和领悟教给孩子们的一次传承,是共同领略数学思维和计算思维的一次探秘之旅。
我们这些家长们会永远记得这段时光。我想我们的孩子们将来上了大学,学到高等数学、概率论、计算机算法、人工智能时,应该时不时会感觉似曾相识,大道至简,当会心一笑罢。
是为记。
中国科学院计算技术研究所 卜东波
福利时间 送该书给 5 位粉丝。 赠送规则:老规矩,留言聊聊你会让小孩学编程吗?(留言太随意,中奖概率会降低),
根据点赞数取前 10 位,同时结合过往对本公众号的支持(留言、转发、点赞、
在看等),从中选出 5 位送出。
开奖时间:2022年5月30日09点。