上周末,静寂了很久的大学同学群突然热闹起来。原因是好几位同学的孩子正在参加软件编程能力CSP考试,接下来不久还有一轮NOIP信奥赛,据说很多都是学校给直接报名了。计算机编程正是我们当年一起学习的专业,所以越聊越火热,很多平时难得发言,很nerdy的男同学也纷纷冒泡儿~其实可以明显感觉到,就像当年非典推动了电子商务的高速发展一样,今年的新冠,正在全世界范围内悄悄地为人工智能、机器人等高新技术按下了快进键。比如美国这边的快递机器人,之前都是小范围试用,今年受形势所迫,迅速投入量产,现在常在我们家附近穿街过巷: 除此之外,辅助诊疗、智能消毒、体温检测、防控播报等等的各种机器人技术也在全世界迅速发展。另外,大家肯定也感觉到了,国际关系的紧张,也让我们加速了科技研发的进程,就像硬核的华为任总所说,有足够的人才储备,有强大的技术,才是真的强大!那么话说回来,应对这个趋势变化,孩子现在该做些什么?该学些什么?今天的文章标题已经告诉你了编程是个必备技能。因为无论是要实现、还是使用这些技术,都离不开编程。这也是今年编程类竞赛特别火热的原因,我也一直被大家催着给推荐编程类的课程。先交个底啊,我和团队伙伴花了近半年时间,对市面上最热的几个编程课做了深度的体验和评测,下周就来交作业!在交作业前,我想把以前写过的一篇文章再次翻出来分享给大家。我的观点是,无论孩子学什么,家长不求全懂,但一些本质的东西是要先了解清楚的,学习目的是什么?它培养了孩子什么能力?编程思维究竟是一种什么思维?对孩子有什么帮助?把这些搞清楚,你才能为孩子选择合适的学习资源,也容易在过程中判断孩子的学习效果。不过现在少儿编程的广告特别多,有些搞得花里胡哨,吹得言过其实,反而会让一些对这个专业不太熟悉的家长更加迷糊。所以下面我会先抛开信奥赛、抛开升学加分、抛开未来刚需这些,就纯粹地从编程的本质,编程思维对孩子的帮助上,和大家好好掰一掰。别的不敢说,作为一位本硕七年计算机专业,世界五百强公司里写过代码,带过软件团队,教育公号里最会写程序,IT行业里最会写教育文章的麻麻,我想这个话题我还是能从专业的角度给出一些见解的。 首先我得说明一点,学编程不等于一定要当码农。我大学同学毕业后头5年大多都还在IT行业,在写程序,不过10年后都七七八八地跨界去了,我就是其中之一。编程中积累的经验和能力让我们在其他行业也游走得尚好,因为它不光是一项技能,更是培养一种思维,一种思考问题的角度。一位搞艺术的朋友曾跟我说过,学了画画之后看待世界的视角和之前是不一样的,往往会更注意一个东西的细节、质感,喜欢变换看事物的角度,试图去寻找它透视在不同平面上的样子。每一个新领域都能给我们带来新的知识,装载着这些新知识的我们自然也会获得新的思维,新的能力,新的看待世界的角度。学编程也如此。编程的本质是什么?用一句话来解释,编程就是和电脑对话,用电脑听得懂的语言,告诉它我想让它做的事。这跟和人说话有什么不同呢?比方说我想喝水,可以跟逃逃说Hey逃逃,帮我倒杯水!同样的一句话如果要让电脑明白该怎么讲?我得先告诉它什么是杯子、什么是水、什么是倒,然后再告诉它怎么去倒,比如先左转75度,往前走两米,左臂下放50度OMG,很刻板很麻烦很不舒服对不对?是的,咱们人类的天性里充满了感性、随意、散漫、喜欢八卦、爱听故事。但电脑不是,作为新时代的高科技产品,它理性、严谨、不讲故事讲数据,它要么听不懂我们的指令,一旦听懂了就会执行,而且每次都会执行。可不像逃逃那样,明明听懂了,但帮不帮我倒水主要看心情。所以,要跟电脑沟通对话,我们也必须让自己变得理性、严谨起来,从电脑的角度去思考问题,这就是所谓的编程思维。这种思维能带给孩子什么好处?下面我用一个大家都很熟悉的小游戏贪吃蛇作例子,把编程思维所培养的能力逐个掰一掰。贪吃蛇是我当年学会编程之后所写的第一个完整像样的程序,写完了自己玩得乐此不疲,所以印象特别深刻。 贪吃蛇游戏规则:用上下左右键控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能碰到自己的身体,等到了一定的分数,就能过关,挑战难度更高的关卡。 拆分解问题的能力 要写一个贪吃蛇游戏,哇,这是一个很大的问题,该怎么入手?如刚才所讲,得想办法让电脑把这件事情搞明白,有哪些步骤,每一步该干什么,哪步在先哪步在后所以我们首先得把这个大问题给拆了。 拆解 在这个程序里,电脑主要处理两件大事:1。处理输入收集用户操作信息2。输出响应根据不同的输入,做出不同的响应 再拆解 1。输入用户的操作可以有按上、下、左、右键四种2。输出相应地,贪吃蛇也要做往上、下、左、右走的动作 我们把第2点再拆解 贪吃蛇每走一步,可能有这几种情况:1。吃到苹果2。撞到墙3。撞到自己4。什么都没发生 我们把第一点吃到苹果抽出来,再再拆解 在这步里,电脑可能要这些事情: 蛇张开嘴巴苹果被咬掉播发吃苹果的声音蛇闭上嘴巴身体长长一截 看起来很简单的程序,拆解后步骤可真多呀,而且这还只是其中的一条分支。孩子学习编程的过程,就是不断地训练他把复杂、庞大的问题拆解、理顺的过程。这种思维在学习、工作、生活中处处都用得着。在解决复杂问题时,问题的分解必不可少,因为只有分解成每一个可以操作、可处理的小问题时,才算是把大问题落了地,一个一个小问题搞定了,大问题也就解决了。具备这种能力的人做事情是耐心的、有条不紊的。比如同样面对一道有挑战的数学题,分解能力好的孩子会列出清晰的解题步骤,搞定一步是一步,即使最后不一定能完全解答出来,也能清清楚楚地知道自己的进展;而有些孩子则不是,没有分解的耐心和能力,遇到难题时脑子一团乱麻。 整发现并且整合重复规律的能力 先告诉大家一个秘密,程序员圈子普遍比较清高,常常为了表现自己与众不同,会用些听起来很高大上、但让外行很费解的术语,比如接下来我说的发现重复规律,99的程序员GG会告诉你的是要模块化,摇头听不懂的话,他再假装体贴地解释,哎呀,就是善用函数,封装方法啦~都是些什么鬼?其实说白了,就是幼儿园孩子都能搞得懂的找规律,观察和找到那些重复发生的规律。比如贪吃蛇吃苹果所发生的一系列动作,是程序中多次会发生的,无论苹果在左上方还是右上方,无论蛇是从上面吃还是从下面吃,都是同样的一组动作,那么我们就可以把这组动作打包,给它取一个名字叫吃苹果。每次蛇遇到苹果时,就可以直接把吃苹果拿出来用,而不用重新把它所包含的一系列动作再想一遍,搞不好的话还会有错漏。在编程的过程中,孩子得一直做这样的训练,发现一些可以重复的单元,把它整合起来,让计算机去重复它。这种能力可以大大提高我们做事的效率。举个数学上最简单的例子,比如计算32(374)47(374)21(374),它就相当于(324721)(374),其中的(374)就是一个重复的单元,可以整合。观察那些做事麻利,效率特别高的人,就是具备了这个能力。很多孩子解题快,就是他善于发现和总结重复规律,脑袋里自备了一个装有很多类似于吃苹果那样的方法库,遇到时直接调用,不用再从头到尾想一遍,也不会错漏。有段时间美国沃尔玛超市发现尿不湿和啤酒这两样商品经常会被一起销售,背后的原因是妈妈得在家里照看孩子,买尿不湿的通常是下班后的爸爸,这时爸爸很喜欢顺便再买几瓶啤酒犒劳自己。发现这个规律后沃尔玛就把这两样东西放在一起,结果不仅提高了尿不湿和啤酒的销量,还大大提高了整个超市的客流量,因为爸爸们发现逛沃尔玛比其他超市更方便。创新不一定指做出个前所未有的新产品,对现有的运行方式进行优化改进,就是一种创新。而发现并整合重复规律的能力让我们更容易找到创新的机会。 析逻辑思维能力 这大概是程序员最引以为豪的一种能力了。先看个笑话, 娃妈给程序员娃爸打电话:下班顺路买10个包子带回来,如果看到卖西瓜的,就买一个。结果娃爸手捧一个包子进了门。娃妈怒道:你怎么就只买了一个包子?!娃爸答曰:因为看到了卖西瓜的。 类似这种黑程序员的段子有很多。不过我得再悄悄告诉你一个秘密,这些段子的创造者不是别人,正是程序员圈子本身,嘿嘿,他们只是换着法子来得瑟自己的思维有多么严谨。前面说到,编程就是和理性严谨的电脑对话,所以编程者也必须较真起来。逻辑思维中有个非常重要的原则叫做MECE(MutuallyExclusiveandCollectivelyExhaustive),意思就是相互排斥且整体完备,也就是不重复,不遗漏。比如下面右图是遵循了MECE原则的,左图就没有。 在编程过程中,处处要考虑和遵循MECE原则。比如在贪吃蛇的程序里,蛇每往前走一步,可能会出现4种情况,a。吃到了苹果b。撞到墙c。撞到自己d。什么都没发生这4种情况是互斥的,比方说吃到苹果的时候就不可能撞到墙,那么程序中就不能让苹果出现在墙上;而且,这4种情况覆盖了所有可能性,在写程序时如果只考虑了其中的2种或3种,就不完备了。此外,编程过程中还会涉及到很多处理与、或、非等布尔逻辑操作。比方说蛇没有吃到苹果与蛇没有撞到墙(!a!b),就等价于,蛇撞到自己或什么都没发生(cd)。这些思考对孩子来说都是非常好的逻辑训练。 改调试纠错能力 最重要的事情最后讲。当我把编程能带给孩子几项能力一一列出来的时候,发现这点是最重要,也是孩子最需要的。任何事情都很难一次就完成得尽善尽美,程序运行起来发现不对有问题,这时就需要孩子去寻找出错的地方,并将它一点一点去改正。程序的世界很单纯,只有0和1,对和错,没有模糊值。这跟写文章、画画什么的不一样,当读者、观众感觉一般时,可能是见仁见智,并不一定证明你的作品不好或者哪里有错,你也根本不知道该怎么改进。但程序不一样,只要运行结果和期望不符合,就证明中间肯定有哪儿出错了,不过同时也意味着只要足够努力,就肯定能把这个错揪出来。就像你告诉一只猫,小黑屋里肯定有老鼠,它负责把老鼠抓出来,比它不知道小黑屋里究竟有没老鼠听起来要容易和有信心得多。然而,实际上程序中很多bug都不是一下就能找到的,常常需要从头到尾把程序的运行顺序一步一步地跟走一遍,观察每一步的运行结果(专业术语叫单步调试)。这需要很多的耐心、观察力和专注力,对孩子的抗挫折能力也是一种磨练。当调试经验丰富之后,孩子在写程序时还会懂得给那些有可能会出错的地方先做个记号,方便回头来检查纠错。他更关注于提高自己纠错的技能,而不是害怕、回避或者掩盖错误。孩子会越来越懂得,有错很正常,只要能把它揪出来,改正就好。有些人总是在进步,因为他随时懂得回溯、调试、纠错,进而提升自己。 EASTWEST 以上这些能力,其实并不是编程特有的,但它们却是在编程这件事情上集体出现的。所以要是你问我,孩子有没必要学编程,我会很肯定地回答,有必要,因为它的确培养孩子的思维综合能力。那究竟几岁学、怎么学?市面上关于编程的产品、课程很多该怎么选?这里面也是大有学问的。就拿上面那个贪吃蛇这样的简单小游戏来说,注意,那可是我读大学,已经上了一段时间的计算机专业课程之后,编写出来的第一个程序。也就是说,如果让孩子完全从零开始写这样的程序,其实是很有难度的。那为什么很多机构的编程课,号称几天就能让孩子写出一个像样的小游戏呢?如果你把前面的内容都认真读了,应该就大概能get到,因为课程本身已经封装好很多现成的功能,孩子可以直接调用,难度就大大降低了。那这样是不是不好,孩子知其然不知其所以然?也不一定。对低龄的孩子,比如56岁左右的小朋友来说,降低难度让TA能迅速获得编程成果的快感,感受一下编程的全过程,培养兴趣,让TA有动力去深入学习,也是很好的。但到了一定年龄,比如8、9岁之后,想正儿八经地开始学习,尤其是数学、逻辑思维都不错,将来还想往信奥赛等竞赛方向发展的孩子,那就得选择课程体系更强,更重视基本功的编程课了。别急,各位先消化消化,关于选课,我下周接着来和大家聊。