余宙华
我曾经在饭桌上和一个朋友发生了争执,起因是一篇报道,它说农村居民有一个习惯,他们会不停地生孩子,一直要到生出儿子才算完!
我觉得这样偏向男孩儿的生育习惯一定会导致人口失衡。我的这位朋友则认为生男生女的概率始终是50%,所以不管怎么安排生育,最后都是男女各一半。
我们使用各种图形、文字、公式推演分析,总是不能说服对方。
怎么办呢?我们决定用程序来模拟一下!
三下五除二,我们编写了一段程序。结果显示:如果对大样本进行重复计算,那么人口分布中男女概率是相等的,也就是男女比例会保持不变。
但是,这样的“偏心”策略难道不会有任何影响吗?有的!因为我们如果改变程序逻辑,让人口系统向前演化,就会发现系统出现不稳定的情况。如果样本量比较小,甚至会出现人口系统瞬间崩溃的情况,比如所有家庭突然第一胎都是男孩,然后他们不再生育,于是因为无法婚配直接后代断绝了。
如果我们不懂编程语言,我们不会想到用程序来交流思想。
人类的思想表达必须借助工具,也就是语言。这些符号体系极为重要,因为人类的智力成果是通过它们来表达的。符号是外在经验的心理内化产物,借助含义丰富的符号,人类可以凭借智力就进行复杂的沙盘演绎,相当有效地掌控外部现实。
人类迄今为止发明了三种标志性的语言,分别是自然语言、数学语言、程序语言。它们对应了人类的三个文明时代,农业与手工业时代、工业时代、信息时代。
语言的学习是孩子们基础教育阶段的核心。中国历来重视文化教育,汉语教育更是博大精深。但是,我们的现代数学教育却出现得很晚,到民国才有。没有尽早引入现代数学符号,使得中国文化落后于世界一个时代,未能进入工业时代。众所周知,现代的电磁学、热力学知识都需要使用现代数学符号进行表达。
在1859年出版的由李善兰和伟列亚力合译的《代数学》 开始尝试介绍西方的数学符号,其中伟列亚力评论道:“微分积分为中土算书所未有,然观当代天算家所著各书,其理有甚近微分者,因不用代数式,故或言之甚繁推之甚难……”意思就是说,中国的数学研究已经显露出微积分的思想,但是因为用中文表达极度烦琐,所以无法取得有效的发展进步,始终处于原始萌芽状态。
每一种符号体系的建立都是人类智慧跨越式的发展,是上了一个大台阶。借助简洁、清晰的数学符号,小学生学习乘除法也没有困难,而这些算术以前被认为是非常艰深困难的。
我们曾经错过了现代数学发展的关键年代,今天我们不能再错过编程语言迅猛前进的大潮流。正如海德格尔所说:“语言并非仅仅是一种用以交流思想的工具,而且是存在的住所。”让我们带领孩子们进入这个程序语言创造的住所吧!
建立起编程语言课程体系
在孩子们很小的时候引入编程语言,是否符合孩子的心智发育阶段呢?对于这个问题有很多争论。在20世纪70年代,美国把Basic语言推广到中小学,期望编程课能够为基础教育带来革命性的变化。但是,结果却是不成功的。根本原因在于语法的烦琐、程序调试困难、编程内容乏味。
直到近几年图形化编程工具出现,少儿编程教育才真正迎来春天。孩子不再纠结于应该输入一个“;”还是“,”了。编程教育直接进入真正的核心,那就是时间与空间的操作。时间是操作顺序、流程;空间是存放信息的结构。
图形化编程工具把动画指令结合进来,使得创作内容能迅速切入孩子的兴趣。同时也更加易于把其他的学科涵盖其中,更是增添了编程的魅力。
我在几年的编程教育中体会到,少儿编程课的体系应该把程序设计、数据结构与算法、工程系统规划、创意培养、多学科融合作为每一个阶段的目标。在课程递进过程中,整体呈现螺旋上升的格局。
比如,每一个阶段都有程序设计的观念引入,在最基础的部分只需要掌握“顺序执行”“重复执行”“条件分支”的分解动作就够了,再往后慢慢引入几种控制结构的嵌套组合,直至循环变量间有复杂耦合关系的情况。
另外一个极其重要的方面,就是编程内容要有“意义”。这可以说是少儿编程教育的全新课题,以前也没有类似的教育学成果可以借鉴。之前的计算机课程都是面向成年人的,课程通常只是讲授原理、方法,至于具体应用,那就是看个人的兴趣、悟性了。
但是,孩子的编程教育不能这样做,必须在课程设计时把丰富的意义填充进去。教师要为学生设计很多有趣的“应用题”,这些应用题将延伸到生活的每个方面,激发起孩子们的严肃思考,比如人类的经济生活、伦理关系。
当然,编程语言的核心知识体系也要巧妙地编织进去。以多学科知识为纬线,以程序设计语言为经线,构造一个趣味性、知识性兼具的课程体系。这样的课程一定能够让孩子们乐此不疲,持续前行。
说起来容易,做起来难。创新的少儿编程教育方法的探索,课程研究的积累,绝非数年之功可以达成。
我创办阿儿法营这几年,一直在努力研究课程建设。我愿意在这里分享阿儿法营的部分教学记录,希望能起到抛砖引玉的作用。
教学实例:编程与伦理学(中级课程)
深秋的下午,北风透出阵阵寒意,树枝上已经没有几片叶子了。
洋爸在阿儿法营教室里看冯友兰的《中国哲学史》。桌上的龙井茶飘散着怡人的清香,外面不时传来隔壁幼儿园的欢笑声。
咚咚咚,一阵敲门声。
洋爸打开门:嘿,罗西,快进来!怎么了?今儿情绪不高啊!
罗西是阿儿法营高级班的学员,是一个性格腼腆的小学六年级男生。
罗西低声打招呼:老师好!
洋爸注意到孩子脸上青色的瘀伤,拍了拍他的肩膀:和同学打架了?
罗西有点委屈地说:打篮球的时候和胖熊撞了一下,被胖熊打了好几拳,我没还手……还没等我回答,Tony冲了进来,他也注意到罗西的伤:啊,被人打了?又是胖熊?狠狠揍他呀!
罗西:我妈说不能和人动手打架。
Tony:那你白白被人打啊,真傻!我老爸说在外面就要厉害点儿,不能被人欺负!
罗西:做好人真倒霉,还不如做个坏人,想打谁就打谁。老师您说呢?
洋爸心想这真是一个很难回答的问题,厚厚一本《中国哲学史》,翻来覆去地就在讨论善与恶的问题。此时给孩子一个固定而僵硬的答案有什么意义呢?应该启发孩子去思考这些人生大问题。
洋爸沉吟半晌道:我也不知道应该做一个善良的好人还是做一个凶恶的坏人。
罗西:啊!老师你也不知道?
洋爸:嗯,这个问题不像你们想象得那么简单。我们一起来研究一下吧。
罗西、Tony:怎么研究?
两个小男孩儿眼睛突然发亮,让洋爸感到孩子的求知欲如此可贵!
洋爸:当然用我们强大的计算机啊!借助程序来帮助我们思考。让我们想象一下,在一个游戏世界里面有三个种族:第一种是善良的老好人;第二种是凶恶的大坏蛋;第三种是普通的正直人。用程序可以模拟这个世界的演化,看看每个种族会有什么结果。
Tony:真有趣,怎么做呢?
洋爸:先要思考一下,想明白就好做了。
两个人表示同意:嗯,对对,先设计一下!
洋爸描述道:程序开始的时候,这三个种族都会有很多人,比如50个人,每个人都有自己的生命值。
Tony喜欢插话:就是血,对吧?
洋爸:对,程序开始的时候,所有人的生命值都是100。
Tony:建一个变量来存储这个数字。
洋爸:对!接下来我们要想一想,这三个种族会发生什么事情。
我们用程序控制这些人在舞台上随机乱走,当两个人碰到一起就发生一次“事件”。
事件有三种情况:
第一种是好人和恶人相遇了,那么好人就会被坏人欺负。结果就是好人的生命值减少了一些,坏人的生命值增加了一些。我们说发生了一次“盗窃”。
Tony:哈哈,罗西碰到胖熊,就会减血了。
罗西:去去去!
洋爸接着说:第二种情况是两个好人相遇了,那么他们会友好地合作,双方的血都增加。你们觉得合理吗?
罗西:挺合理的,我猜要是俩恶人相遇就是打架斗殴了。
洋爸:说得没错。第三种情况是两个恶人相遇,恶斗一场,双方减血。这叫“战争”。
罗西:那么,遇到普通正直人会怎样呢?
洋爸:正直人是这样一种生物,当别人对他好,他也对别人好,那么就会合作,双方增血;当别人对他恶,他也对别人恶,那么就会战争,双方减血。
Tony:以牙还牙,以眼还眼!
洋爸:呵呵,就是这种样子。
现在,总结一下我们的设计:三个种族,好人、恶人、正直人。程序开始的时候,每种人都有50个,所有人的血都是100。所有人都在舞台上随机移动,当两个人相遇,会发生三种事件中的一种:战争、合作、盗窃。根据相遇的情况,程序会自动修改双方的生命值。OK, 设计完成,开始编写程序。
经过洋爸指导,一个小时后,两个人都完成了程序。
洋爸:还等什么,立刻让程序运行起来吧!
开始的时候,坏人似乎占了上风,他们的人数增加很快。老好人慢慢在减少,5分钟后,老好人快灭绝了。
两个孩子都有些遗憾。接下来,坏人也碰到了麻烦,人数开始慢慢减少,3分钟后也消失了。
咦?他们有些惊奇。
最后,正直的人群持续不断地慢慢增长……
洋爸:罗西你能解释一下原因吗?
罗西:老好人很早就灭绝,是因为他们的血都被恶人偷走了!
Tony:对,老好人就是恶人的食物。
洋爸:那后来为什么恶人跟着灭绝了?
Tony大嗓门地喊:恶人互相战争,而且正直人也和他们战争,恶人把血都用完了。
洋爸:有理,恶人没了食物,又到处战争,注定灭亡。最后,为什么正直人种族可以生存下去呢?
因为他们能互相合作,所以会增加生命值,Tony和罗西两个人抢着说。
洋爸总结道:按照我们的研究,简简单单做一个老好人,或者做一个见人就欺负的恶人,都不是正确的做人方法。我们应该做一个普通的正直人。
但是,要做一个普通的正直人并不容易,因为你必须能分辨哪些是善,哪些是恶。如果你分不清楚,对好人使用凶恶的态度,你自己其实已经变成了大恶人。
你们要多读书、多思考,在慢慢长大的过程里,逐渐学会分清黑白,明辨善恶。
两个孩子都若有所思……
程序语言是表征这个世界的抽象思维符号系统
农业与手工业时代,人类对上帝的隐喻就是一个农夫;工业时代,上帝被假想为一个伟大的机械工程师;而今天,最精妙的隐喻就是——上帝是一个程序员。当你观察DNA上基因的序列时,你一定觉得那是伟大程序员的作品。
即使对于一个立志于在文科方面有所专长的少年,也必须知道0、1是如何构造出整个“第二现实”世界的。用0和1来表达数字、英文、汉字,如果这还不稀奇,我们还可以用0和1来表达声音、图像、视频,最终我们将用0和1来构造整个世界。
在人工智能领域的发展中,我们甚至用0和1创造了人类无法企及的思维模式,比如,深度学习的神经网络。我们创作了一个“人化”的世界。我们无需掌握每一个细节,但是我们要能理解它。
也许你不懂高等数学,但是如果你连初等数学都一无所知,那只能说你真的不属于这个时代。同样,若干年后,你可以不懂卷积神经网络,但是你连变量、循环、条件判断之类都无感,那么你真的是被时代抛弃了。
行文至此,我非常感慨,从事少儿编程教育多年,太多的人把编程当成一种吃饭的手艺,联想到的常常是码农“蓬头垢面”的形象。他们不曾明白,在今天,对程序语言的理解、掌握已经成为一种重要的人文素质,而且在未来会更加重要!
另外,有的教师也习惯于把编程教育和STEM教育混同起来,或者说编程是STEM的一部分。我认为这样的理解是错误的。STEM教育是一种外延广泛的活动,从各种涉及电子设备的小发明、小创造,到比较复杂大型设备(大型航模之类)都可以涵盖其中。每一位教师和学生都可以因地制宜地开展具备个人特色的STEM教育,STEM教育不是一种学科边界清晰的课程。
程序语言则是一种简洁的、高纯度的、形式化的知识系统。编程教育不仅仅是一种有教育意义的活动,这一点和STEM教育迥然不同。
程序语言既然是一种“语言”,就意味着它是表征这个世界的抽象思维符号系统。它的关键作用是塑造一种全新的世界观、思维方式、解决问题的手段,掌握它的人可以发掘出这个世界更深、更广的可能性。
程序语言的类比对象是自然语言、数学语言,是一种思维工具。鉴于它对于思维方式的基础作用、清晰的学科内涵,编程教育进入中小学教育大纲已经刻不容缓。
英国、韩国已经完成了这一步,但愿中国不会等得太久。
让我们畅想一下,在不远的将来,所有的中国学生能够在课堂上学习编程,从认识顺序执行开始,认识一个变量开始,最终进入层次复杂的数据结构、循环往复的算法流程,明亮的双眼仿佛看穿了宇宙的脉动。
这个世界的本质既不是“物质”,也不再是“能量”,而是“信息”!