国际信奥赛中国队夺冠!我忍不住再来和大家说说编程
说来真是巧啊,上周我在写一篇介绍文章,是关于在咱们平台首发的一款编程桌游,挖到它我还是特有成就感的。正写着写着,手机就蹦出一条和编程密切相关的喜讯,更是让我顿感心潮澎湃!
就在6月28日,刚刚结束的第33届IOI2021(International Olympiad in Informatics)国际信息学奥林匹克竞赛里,中国队四位选手全部获得金牌,并包揽国际选手排名的前四名,团队总成绩稳坐第一!
▲ 图源:NOI
其中排名第一的人大附中选手邓明扬,更是 以满分夺冠!满分! 据说这位学神现在已经手握麻省理工MIT的offer,正在掂量着要不要去了。
真是特别自豪!几位优秀的少年以强大的实力,展示了在这条可能是未来最刚需的赛道上,奔跑的姿势!既为我们国家争得了荣誉,也是这一代孩子的学习榜样!
围观完"别人家的学神"后,我们回过头来看一看,国际信息学奥赛比的啥?跟咱家娃有啥关系?
这几年信息学奥赛越来越热,虽然能站在国际竞技舞台上的毕竟是极少数的佼佼者,但我们依然能从中看到未来需求的方向。
竞赛每道题目都很长,我就不在这里贴了,有兴趣的同学可以在网上查一查。总的来说,它是一场 既考察智力,又考察编程、应用计算机能力的烧脑挑战。 从根本上讲,比拼的就是孩子的 逻辑、数学和编程 功底。
前两者大家都很熟悉,今天我想再来和大家聊聊"编程"。这是我的老本行,我自己本硕都是读的计算机专业,也在这个行业工作了很多年,创建了"东西儿童教育"这个自媒体公号后,我一直觉得自己是有责任和大家多多普及这方面的内容,给大家分享一些方向性的东西的。
编程,我觉得就目前的热度和普及率来看,其实还没到达和它的重要性相匹配的水平。
在咱们读书的年代,编程是个独立的专业,但现在俨然是一个基本技能了。很明显,到了小学高年级或中学,但凡孩子要折腾些什么创新科技小项目,十有八九得用到编程。比如逃逃的科学课作业,就常要用到编程。
▲ 逃逃之前分享的科学作业
它和我们常说的三大主科"语数外"密切相关,却又截然不同。
为什么密切相关?
因为编程本质上就是跟电脑沟通对话。用特定的编程语言,无论是C、C++、C#还是Java、Python...反正就是 把电脑能听得懂的语言元素,有逻辑地组织起来 ,和电脑进行对话,让电脑明白我们的指令。
而语言、逻辑,恰恰也是"语数外"三门主科的根本。从这个角度看,它们的关系是非常密切的。
那又为什么截然不同?
"语数外"是基础学科,孩子平时的学习,多半是一个一个知识点地掌握,一道题目一道题目地练习,重在学理论、学知识。
除了掌握知识点本身,它们培养了孩子一个很重要的能力—— 会学习。
而 编程,则给了孩子另一个层面的关键能力 —— 能做事。
编程往往是通过一个个的小项目,去做出点什么。无论是在屏幕上显示一行"Hello World";编写一个游戏程序;还是像逃逃的科学课作业那种,用编程去控制硬件,它们的最终结果都是——做出一个孩子可触可感、能看到实际效果的产品,解决一个实际问题。
它包含了"做事"的全过程, 从一开始的分析、设计,到实现、测试、不断修改完善、一直到最终的完成。 而整个链条中的每一步,又需要用理性、严谨的逻辑串起来。
这是其他学科很难给到孩子的, 编程思维,其实就是让孩子具备做事的思维和能力。
听起来有些抽象?
下面我用一个大家都很熟悉的小游戏"贪吃蛇"为例子,把编程思维所培养的能力逐个掰一掰。
"贪吃蛇"是我当年学会编程之后所写的第一个完整像样的程序,写完了自己玩得乐此不疲,所以印象特别深刻。
贪吃蛇游戏规则: 用上下左右键控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能碰到自己的身体,等到了一定的分数,就能过关,挑战难度更高的关卡。
拆
分解问题的能力
要写一个"贪吃蛇"游戏,哇,这是一个很大的问题,该怎么入手?如刚才所讲,得想办法让电脑把这件事情搞明白,有哪些步骤,每一步该干什么,哪步在先哪步在后…所以我们首先得把这个大问题给拆了。
拆解
在这个程序里,电脑主要处理两件大事:
1. 处理输入–收集用户操作信息
2. 输出响应–根据不同的输入,做出不同的响应
再拆解
1. 输入-用户的操作可以有按上、下、左、右键四种
2. 输出-相应地,贪吃蛇也要做往上、下、左、右走的动作
我们把第2点再拆解
贪吃蛇每走一步,可能有这几种情况:
1. 吃到苹果
2. 撞到墙
3. 撞到自己
4. 什么都没发生
把第一点"吃到苹果"抽出来,再再拆解
在这步里,电脑可能要这些事情:
1. 蛇张开嘴巴
2. 苹果被咬掉
3. 播发吃苹果的声音
4. 蛇闭上嘴巴
5. 身体长长一截
看起来很简单的程序,拆解后步骤可真多呀,而且这还只是其中的一条分支。 孩子学习编程的过程,就是不断地训练他把复杂、庞大的问题拆解、理顺的过程。
这种思维在学习、工作、生活中处处都用得着。在解决复杂问题时,问题的分解必不可少,因为只有分解成每一个可以操作、可处理的小问题时,才算是把"大问题"落了地,一个一个小问题搞定了,大问题也就解决了。
具备这种能力的人做事情是耐心的、有条不紊的。 比如同样面对一道有挑战的数学题,分解能力好的孩子会列出清晰的解题步骤,搞定一步是一步,即使最后不一定能完全解答出来,也能清清楚楚地知道自己的进展;而有些孩子则不是,没有分解的耐心和能力,遇到难题时脑子一团乱麻。
整
发现并且整合"重复规律"的能力
先告诉大家一个秘密,程序员圈子普遍比较清高,常常为了表现自己与众不同,会用些听起来很高大上、但让外行很费解的术语,比如接下来我说的发现"重复规律",99%的程序员GG会告诉你的是"要模块化",摇头听不懂的话,他再假装体贴地解释,哎呀,就是善用"函数",封装方法啦~
都是些什么鬼?
其实说白了,就是幼儿园孩子都能搞得懂的"找规律",观察和找到那些重复发生的规律。比如"贪吃蛇吃苹果"所发生的一系列动作,是程序中多次会发生的,无论苹果在左上方还是右上方,无论蛇是从上面吃还是从下面吃,都是同样的一组动作,那么我们就可以把这组动作打包,给它取一个名字叫"吃苹果"。每次蛇遇到苹果时,就可以直接把"吃苹果"拿出来用,而不用重新把它所包含的一系列动作再想一遍,搞不好的话还会有错漏。
在编程的过程中,孩子得一直做这样的训练,发现一些可以重复的单元,把它整合起来,让计算机去重复它。
这种能力可以大大提高我们做事的效率。举个数学上最简单的例子,比如计算32×(37+4)+47×(37+4)+21×(37+4),它就相当于(32+47+21)×(37+4),其中的(37+4)就是一个重复的单元,可以整合。
观察那些做事麻利,效率特别高的人,就是具备了这个能力。 很多孩子解题快,就是他善于发现和总结"重复规律",脑袋里自备了一个装有很多类似于"吃苹果"那样的方法库,遇到时直接调用,不用再从头到尾想一遍,也不会错漏。
有段时间美国沃尔玛超市发现尿不湿和啤酒这两样商品经常会被一起销售,背后的原因是妈妈得在家里照看孩子,买尿不湿的通常是下班后的爸爸,这时爸爸很喜欢顺便再买几瓶啤酒犒劳自己。发现这个规律后沃尔玛就把这两样东西放在一起,结果不仅提高了尿不湿和啤酒的销量,还大大提高了整个超市的客流量,因为爸爸们发现逛沃尔玛比其他超市更方便。
创新不一定指做出个前所未有的新产品,对现有的运行方式进行优化改进,就是一种创新。 而发现并整合"重复规律"的能力让我们更容易找到创新的机会。
析
逻辑思维的能力
这大概是程序员最引以为豪的一种能力了。先看个笑话:
娃妈给程序员娃爸打电话:"下班顺路买10个包子带回来,如果看到卖西瓜的,就买一个。"
结果娃爸手捧一个包子进了门。
娃妈怒道:"你怎么就只买了一个包子?!"
娃爸答曰:"因为看到了卖西瓜的。"
类似这种"黑" 程序员的段子有很多。不过我得再悄悄告诉你一个秘密,这些段子的创造者不是别人,正是程序员圈子本身,嘿嘿,他们只是换着法子来得瑟自己的思维有多么严谨。
前面说到,编程就是和理性严谨的电脑对话,所以编程者也必须较真起来。
逻辑思维中有个非常重要的原则叫做MECE(Mutually Exclusive and Collectively Exhaustive),意思就是"相互排斥且整体完备",也就是"不重复,不遗漏"。比如下面右图是遵循了MECE原则的,左图就没有。
在编程过程中,处处要考虑和遵循MECE原则。比如在贪吃蛇的程序里,蛇每往前走一步,可能会出现4种情况:
a. 吃到了苹果
b. 撞到墙
c. 撞到自己
d. 什么都没发生
这4种情况是互斥的,比方说吃到苹果的时候就不可能撞到墙,那么程序中就不能让苹果出现在墙上;而且,这4种情况覆盖了所有可能性,在写程序时如果只考虑了其中的2种或3种,就不"完备"了。
此外,编程过程中还会涉及到很多处理"与"、"或"、"非"等布尔逻辑操作。比方说"蛇没有吃到苹果"与"蛇没有撞到墙"(!a && !b ),就等价于,"蛇撞到自己"或"什么都没发生"(c || d)。
这些思考对孩子来说都是非常好的逻辑训练。
改
调试纠错能力
最重要的事情最后讲。
当我把编程能带给孩子几项能力一一列出来的时候,发现这点是最重要,也是孩子最需要的。
任何事情都很难一次就完成得尽善尽美,程序运行起来发现不对有问题,这时就需要孩子去寻找出错的地方,并将它一点一点去改正。
程序的世界很单纯,只有0和1,对和错,没有模糊值。这跟写文章、画画什么的不一样,当读者、观众感觉一般时,可能是见仁见智,并不一定证明你的作品不好或者哪里有错,你也根本不知道该怎么改进。
但程序不一样,只要运行结果和期望不符合,就证明中间肯定有哪儿出错了,不过同时也意味着只要足够努力,就肯定能把这个错揪出来。就像你告诉一只猫,小黑屋里肯定有老鼠,它负责把老鼠抓出来,比它不知道小黑屋里究竟有没老鼠听起来要容易和有信心得多。
然而,实际上程序中很多bug都不是一下就能找到的,常常需要从头到尾把程序的运行顺序一步一步地跟走一遍,观察每一步的运行结果(专业术语叫"单步调试")。 这需要很多的耐心、观察力和专注力,对孩子的抗挫折能力也是一种磨练。
当调试经验丰富之后,孩子在写程序时还会懂得给那些"有可能会出错"的地方先做个记号,方便回头来检查纠错。他更关注于提高自己纠错的技能,而不是害怕、回避或者掩盖错误。孩子会越来越懂得,有错很正常,只要能把它揪出来,改正就好。
有些人总是在进步,因为他随时懂得回溯、调试、纠错,进而提升自己。
EASTWEST
看到这里,你可以会发现,咦,以上提到的一些能力,其实在其他学科中也是可以培养的啊。是的,细掰下来,它们每一个都不是编程特有,但它们却是在编程这件事情上集体出现的。
所以我一开头就说,编程,能让孩子学会"做事"。 这是一种综合能力,需要把很多的理论和方法,严谨地组织起来,有始有终地去解决实际问题。
这也是大多数孩子暂时还比较欠缺的。这一代孩子不缺知识面、也不缺知识深度,可以明显感觉到,因为教育强度的增大,他们比我们同龄年代懂的多得多,思维也灵活多了。如果能把这些积累优势转化为解决实际问题的能力,那必将是一股很强的科技力量。
这一两年教育新政频出,以至于有些家长感到措手不及,轰轰烈烈的"鸡娃"活动还需要进行到底吗?是该鸡数学、鸡语文还是KET/PET了?......最近就有不少读者在后台给我们留言,今年暑假该给娃报什么班该学点啥呢?如果你感觉迷茫,真可以留意一下编程这条"新"赛道。
实际上现在的趋势也在往这方面走,国家正在大力鼓励青少年信息学探索、科技创新,几位优秀的少年,也已经用实力告诉全世界: 我们在这个领域起步得不算早,但正在腾飞,而且一飞冲天!
▲ 图源:NOI
好样儿的,为他们点赞!