关于孩子学编程作为家长要知道的事情
随着计算机就业市场持续火爆,和STEAM相关的教育产品越发炙手可热,我经常遇到朋友询问孩子该学什么编程语言,并让推荐靠谱编程兴趣班。
我计算机科班出身,97年毕业后在IT行业里打拼,2004年起一直在加拿大高中教计算机编程和机器人设计,教过成百上千计的学生,所以也勉强算得上是行内人士。我不反对孩子从小学编程,只是对孩子从小学编程的效果持保留看法。
本文从一线编程老师的视角,基于儿童认知发展心理学理论,结合教学实践中的观察和思考,陈述了一些关于孩子学编程的客观事实,希望能对想让孩子学编程的家长有所启示。
1. 从小学过编程的孩子,长大系统学编程时,跟同龄人比,没有明显优势
在从小学编程的孩子中有两类,一类是强烈的兴趣驱使,自发的深入钻研下去;还有一类是受父母影响,从小开始在兴趣班学习编程。
比尔盖茨和伊隆马斯克属于前者, 两人都是不可世出的天才,普通人不具有可比性。
我所接触的从小学编程的孩子,大都属于后者。 在教学实践中,我发现这些孩子因为学过所以一开始入门要比其他孩子快,但是随着内容深入,尤其当学到条件循环,一维数组,他们的表现和其他第一次接触编程的孩子基本没有区分度。 而且这类孩子当中,有些还会存在这样一个问题:先入为主靠机械模仿形成的思维定势,很难纠正。
比如说,教过一个从三年级开始就用乐高编程的孩子,写条件循环的时候总是不假思索的上来就先写一个无限循环 while(1==1),然后在循环体里再用if语句判断循环终止条件,通过break终止循环执行。而对于课堂上反复强调的通过设置变量初始条件,然后合理选择条件来控制循环的模式,置若罔闻。
超前学习的孩子,如果学的时候深入钻研,彻底学透的话倒还好;最怕的当时学的一知半解,似懂非懂。而当按照正常进度在学校系统学习同样的知识的时候,很难沉下心再去学,总是觉得自己已经会了,直接去做题。而做练习的时候,因为当初并没有完全理解,不可避免的出现用编程定势去生搬硬套的现象。
年复一年,这样的现象每年都在教室里重演。
万物生长皆有时,人的认知也是一个循序渐进的过程,不遵守自然规律的拔苗助长,非但培养不出孩子在学科(比如数学,编程)上的优势,还扼杀了孩子自发的探索未知的兴趣和好奇心。
2. 编程不是童子功,并非越早学越好
有些技能比如乐器,靠的是肌肉记忆和听觉记忆,从小开始学比长大之后再学能培养出更好的手指运动机能、手指独立性、柔韧性以及控制能力;同时听力音感也是需要从小训练,大了之后,很多音耳朵就再也区别不出来了。
但是编程不是,表面上看,编程是学习一门编程语言,内里培养的是其实是孩子认识问题和解决问题的思维方式,而这种思维方式可以跨界应用到其他领域的学习和实践中, 这种思维方式即为编程思维。
编程思维简单来说,就是能够把现实生活中的复杂问题,逐步拆分成可理解的小问题,(Decomposition拆分),接着根据已有的知识和经验,找出新问题和以前解决过的问题的相似性,举一反三琢磨出规律(Pattern Recognition模式识别),然后将问题里涉及的数据抽象(Abstraction)到数据结构(变量,数组,链表等等),把数据处理过程可重复执行部分抽象(Abstraction)成函数模块,通过循环执行,最后根据前三步的分析成果,设计步骤,写出算法(Algorithms),从而解决问题。(如果有兴趣了解编程思维,可以参考我去年写过一篇关于编程思维的文章)
由此不难看出,培养编程思维的前提条件是有扎实的数学知识,尤其是代数基础和抽象思维能力。根据儿童认知心理学鼻祖Jean Piaget的理论,孩子的抽象思维能力的形成是在11岁到16岁之间,而代数学习按正常的教学进度也是在初中以后。所以如果孩子数学基础没打牢,抽象思维还没有建立起来,谈编程思维无疑是空中楼阁。
在安大略省正式编程课到10年级才开设,即便对于15,6岁的孩子来说,编程这门课学的也绝不轻松。
而在大学录取这块儿,包括滑铁卢在内的计算机专业都不要求学生在高中任何编程经验。我曾经专门跟滑铁卢大学计算机系本科教学老师Sandy Graham专门请教过,Sandy在多年教学实践也发现,在滑铁卢本科生中,中学上过编程课和以前从没有接触过编程的孩子相比,并没有明显优势。相形之下,倒是数学好的孩子后劲更足。
Geoffrey Hinton,当今机器学习领域当之无愧的教父级人物,也是持同样的观点。十年前,人工智能远没有今天的热度,Hinton因为女儿在我班上,他主动联系过来给学生们讲讲机器学习研究和进展,希望能够激励更多孩子投身于机器学习领域。感谢他热心之余,我连忙跟他确认来参加讲座的学生是否需要有计算机方面的背景知识,是不是该至少学过AP计算机。得到的回复是:不需要,只需要数学,最好能了解微积分就可以了。
综上所述,编程不是童子功,什么时候学都可以。如果想将来在计算机领域有长足发展,学好数学是王道。