https://mp.weixin.qq.com/s/kx4_3T7Ir5xgBY4KMJQbxQ转眼间就有三个月没有更新文章了,收到不少催更和关心,担心我的号是不是被双减了。其实不更新的原因,是最近没有什么可以写的。零零刚刚入门了围棋的深坑,于是大部分业余时间都被占据,也就没有了再给他定制设计游戏的需要了。
除了催更之外,近来聊到比较多的话题,是关于信息学及编程的入门路线。自从双减之后奥数成为众矢之的,而编程培训这种非学科是条漏网之鱼,再加上各种少儿编程机构大量投放广告,和信息学各种挂钩,因此也引发了更多的关注。我也收到不少朋友的各种问题,比如:
编程入门Python和C++哪个好?
一/二/三年级怎么开始学信息学?
学Scratch有用吗?
如何尽早规划信息学竞赛培养路线?
信息学的入门教材有什么推荐的?
少儿编程选什么机构?
对于这些问题,我作为一个远古时期的信息学竞赛选手/教练,带过两年国家队,一直在互联网公司工作,又有个处于所谓编程启蒙年龄段的孩子,算是行内且利益相关人士,借着自己的公众号,来讲一讲我对信息学竞赛本身,以及少儿编程学习的一家之言。
先来回答一个问题:如何尽早规划信息学竞赛培养路线?
任何一门学科竞赛,不限于信息学,都无法仅仅靠家长规划出来。很多家长都误以为靠竞赛的保送或者强基是一条值得一试的升学捷径。其实不然。如果说高考是千军万马挤独木桥的难度,那么靠打竞赛升学恐怕就是一支特种部队去抢着走钢丝,其成功率远远小于高考。除了必要的高智商打底,想要尝试竞赛路线,至少还需要具备爱和勇气,也就是对这门学科的强烈兴趣产生的自驱力,以及敢于投入高强度竞争而不退缩的拼搏精神。如果家长不确定自己的孩子是否三者同时具备,那就一定不适合竞赛路线。越早开始,浪费的宝贵时间也就越多。
很多家长对信息学竞赛并不了解,只是觉得孩子数学竞赛可能不太行,到不了第一集团,但是他喜欢电脑呀(谁不喜欢呢),学过Scratch/机器人编程,还很有兴趣呀,那岂不是特别适合信息学竞赛?说不定能弯道超车呢?
唯一可能的结果就是弯道翻车。
这里先澄清一个被无数人误解的事实,重要的事情说三遍:
信息学竞赛的核心,不是编程,是数学。
信息学竞赛的核心,不是编程,是数学。
信息学竞赛的核心,不是编程,是数学。
虽然说信息学竞赛看上去比的是编程,但是其本质是借助计算机来解决数学问题,最终比拼的,还是数学能力。
在学信息学竞赛的过程中,起步和冲刺阶段,需要学的都是数学,只有在中间某一个阶段,需要学会一门编程语言,通过写程序将自己的解题思路变成最终解题结果。觉得小学奥数里那些组合和数论题太烧脑的的孩子,可以直接放弃信息学,因为这些算是信息学最最基础的内容。
简单举个例子来证明一下:各个头部互联网公司令程序员们闻之色变的算法面试,好多其实就是入门难度的信息学竞赛题,大量尝试跳槽的一线程序员,最终都倒在了这些入门难度的题目上。
所以,数学不够好的,就不用规划信息学路线了。数学竞赛和信息学竞赛是对擅长不同领域数学学习的尖子们提供的两个不同选项。相比于数学竞赛,信息学竞赛对离散数学的要求更高,对几何几乎没有要求。当然,有实力的也可以既要又要。我国时隔近20年出现的仅有的两位双科国家队队员都出在数学+信息学,外加不少信息学和数学双集训队的选手,也可以一定程度上佐证了这两门学科竞赛的巨大相关性吧。
回到最初的问题,如果认为孩子已经具备前文所说的条件,规划从小开始信息学竞赛的学习路线,那么可以先从市面上找一本信息学竞赛教材看看,大概了解一下都需要学些什么数学内容。至少在学到一知半解且还看得津津有味之前,不需要碰电脑不需要写一行程序。然后就可以在学习编程的同时开始看一些成体系的教材,比如《组合数学》、《算法导论》、《数据结构》。如果你真的去搜这几个书名想下单,一定会发现有不少版本,都是各个大学计算机本科甚至研究生的教材。不用奇怪,就是它们,随便挑个看着顺眼的版本就行。各种信息学的教材,基本就是把这些书里的基础内容揉碎了重组一下,用来入个门可以,要认真学,还是推荐照体系走正道。
我一直觉得信息学竞赛无需从小就学。除了需要一些阶段性成绩来做小升初点招敲门砖(将来只会越来越少趋近于零)之外,到了小学高年级甚至初中,有足够的数学基础和自学能力来学会上面那些教材的时候,再扎实起步也绰绰有余。从小靠提前抢跑刷编程能力建立起来的一点领先优势,到了真正高水平比拼的时候,在绝对智商优势加扎实数学基础的对手面前完全不值一提。此时后悔前期太多精力打了水漂就太晚了。
以上,是本文的前半部分,被帮我审稿的信息学竞赛圈内人士评价为“大型劝退现场”。文章的后一半留给少儿编程,一家之言,容易带来争论并引起不适,继续阅读需谨慎。
既然理清了信息学和编程的关系,很多事情就显而易见了。从小去机构学编程,大了专攻信息学,然后保送进清北这条道路是不存在的,完完全全就是少儿编程机构构建的一套吸金话语术。以信息学竞赛为目标的,从小该学好的,前三位是数学,数学,数学。
那么孩子需要学编程吗?
抛开升学功利性,纯就实用性角度而言,在现今的信息社会里,了解一下程序开发,接触一些编程需要的逻辑思维方式,必然是有用的。但这并不是说学得早就有多大优势,更不是说需要把连加减乘除都弄不清楚的幼儿园小朋友送去学编程。
就拿在机构中大热的Scratch为例,也许通过长时间的学习能了解编程的概念的入门,多少有些用处,但是从性价比而论,就极其不划算。尤其是现在学Scratch的大部分是学前或者小学低年级的学生,还没有最起码的数学基础,连学到皮毛的能力都不具备。在这个年龄段,这些被少儿编程课程浪费掉的时间完全可以用来投入到更多更有意义的地方去。Scratch既不是进一步学习编程的必经之路,在实际生活或者将来的学习中也没有用处,因此我看不到任何必要性。就算是不报课,仅仅自己当作有兴趣的玩中学,从用眼角度来说,所需要的大量屏幕时间也使其得不偿失。如果是着眼于“理解编程”或是“培养兴趣”的这么一点微小作用,可以考虑通过不插电的桌游来学习编程的基础概念,比如Thinkfun的 //CODE 系列,至少省了眼睛省了钱。
排除Scratch之后,该学什么语言和多大学起呢?最佳入门语言,无论年龄,我的推荐都是Python。至于多大开始学则是小马过河,不同的孩子区别太大,简单看数学基础和学习能力并综合考虑学习效率的话,三四年级的课内优等生可以成为一个下限标杆。
Python属于门槛极低,天花板极高的编程语言。从初学者用来解决小问题的几行程序,到几亿人使用的大型互联网服务,Python已经无处不在。虽然很多传统的C++/Java程序员依然瞧不起Python这样的脚本语言,认为是玩具。然而现实是业内越来越多的开发项目已经完全拥抱Python,包括Instagram,Dropbox这样的巨头都是纯Python开发而成的。Python的便利性和简洁性非常适合对编程有兴趣的小学生学习。我们这代人小学时的编程入门语言大多都是BASIC,门槛低,天花板也低。Python上手起来一点都不比BASIC难,而其功能上限则远远超过了当年的BASIC。
除了Python之外,另一个可能的选择是C++,仅适用于看完本文前半部分依旧决定挑战信息学竞赛的孩子。毕竟C++目前是竞赛唯一指定语言,绕不开。竞赛用到的C++语法只是C++的很小的一个子集,和通常工程上用的C++完全不是一个概念,学起来并不难,但是除了做题之外用处不大。如果本着竞赛优先效率最高原则,那么竞赛选手不用学Python,学好数学之后直接从C++起步开始编程。非信息学竞赛选手则完全不推荐在小学甚至中学阶段学习C++。
如果对拿Python入门有一点抵触性,更喜欢Scratch这样适合孩子的图形化游戏化教学方式,那么我推荐使用Swift Playgrounds。苹果出品,限于Mac和iPad使用,提供全套图形化游戏化编程教学,从入门到精通各个级别都有。Swift还是个正经的现代化开发语言,学出来可以直接用来做个苹果全平台产品。所以,Swift Playgrounds绝对是Scratch的完美替代方案,适合自学,全免费!
市场上还有一些百花齐放的儿童机器人编程培训和证书考级。要问学了它们有什么用的话,我只能说我不懂所以捂紧钱包敬而远之,但非要一试的话,就图个乐呵吧。
--
修改:ZhangJuZheng FROM 112.17.238.*
FROM 112.17.238.*