作者的信 如何学习编程和应对信息学奥赛
各位家长:
我是这本少年编程入门书的作者——小周老师,职业程序员,职业奥赛教练,写过120万行程序,掌握17种编程语言,算上法语、英语和古汉语,一共精通20门“语言”。其实,数自己会多少门语言意义不大,这些语言都是触类旁通的,只要精通一门,其他学起来都很容易。在这本书中,我们传授的是C++语言编程,但这里面的编程技巧可以用在很多语言中。这本书能够教9岁到14岁的青少年学会C++语言编程这项技能,也能帮他们在信息学奥林匹克竞赛中取得好成绩。但这些都不是最终目的,只是过程中的一些小目标。我真正希望教给孩子们的,是语言的特征,是编程的思维,是软件的逻辑。
首先要说明,这是一本给信息学奥赛生(小学和初中)的辅导书,只有带着使用工具书的心情来看这本书,才会有最好的效果。其次,它是一部科幻小说,当然,如果仅仅是想要开始上手编程,它也会是相当合适的入门教材。
之所以会把这本书写成科幻小说的形式,主要是信息学奥赛考查的知识实在是太难了,直接学习大学计算机科学系的知识,一定会把大部分同学吓退的,更不要说学习信息学奥赛的专用系统NoiLinux了。在培养了数千名信息学竞赛选手的过程中,我发现,青少年对于枯燥的数学证明敏感度极低,但面对游戏化的教学时,会展现出令人惊讶的学习能力。这正是著名社会学家约翰·赫伊津哈在他的巨著《游戏的人》中,对于人类和游戏关系的精准定义:游戏,是人类的天性。正如很多职业程序员对二进制的理解,都是来自小时候使用修改器去篡改游戏数据时,被迫学习的16进制一样。我坚信,只要能激发起学生的兴趣,再难的东西,也有可能学会。
除了激发兴趣之外,很重要的,就是练习。
我的母校——巴黎第六大学的计算机系,有一句流传很广的名言:“C'est en forgeant qu'on devient forgeron.”
翻译成文言文,应该是:“锻者,自锥也。”
大概说的是,只有不断练习,才有可能掌握一门技巧,尤其是在信息学的学习上。
在中国的高中新课程标准中,人工智能和信息学已经成为正式的一个部分。如何让广大高中生学会信息学,到了大学阶段能快速进入人工智能的研究领域,这是个亟待解决的课题。但我相信,不管如何去科普人工智能,这门学科的基础都不会变。《左传》中说,“犹衣服之有冠冕,木水之有本原”,也就是说,任何事情都要有基础。
巴黎第六大学的几位人工智能研究者和计算机系教授,都认同我的观点:如果想要研究人工智能,首先要学习编程。因为编程能力是根本。我相信,我在巴黎第六大学的学长、“人工智能深度学习之父”、2019年图灵奖获得者LeCun教授,也会认同:人工智能的基础,一定是数学和编程能力。
青少年学习编程的需求并不是从这个人工智能时代才出现的。早在1984年,邓小平同志就在视察上海十年成果展的时候说出了非常有名的鼓励之言:“计算机的普及要从娃娃做起。”从1984年到今天,35年过去了,不管是在计算机科学的发源地——美国,还是在科技界的后起之秀——中国,K-12阶段能编程的学生数量,相比学生总数来说,都非常之少。
原因简单而直白:少年编程到目前都没有被摸索出一种有效的、可以复制的普及教育解决方案。请注意,我在这里所说的“少年编程”,是真正的编码编程,而不是在商业上被炒作得如火如荼的图像化编程。诚然,图像化编程的语言或工具,例如来自美国麻省理工的Scratch,确实能够培养孩子们的编程思维。只是,有了编程思维之后,距离拥有编程能力的路程,大概还有十万八千里。
简单来说就是,光有编程思维,没有编程能力,在五大学科奥赛的信息联赛——全国青少年信息学奥林匹克联赛(NOIP)中,是绝无可能获奖的。不光是NOIP,在任何真正考核编程能力的国内和国际的比赛和考试中,都没有任何可能取得优异成绩,其中包括:中国的高考,美国的AP课程考试(Advanced Placement,把大学的课程提前提供给高中生学习的先修课程)。
核心问题在于,编程思维这个物件,在编码编程之外,是很难被检验的。只有在学会了编码编程之后,编程思维才能够发挥出作用。这就造成了全国乃至全世界的图像化编程的普及和推广,表面上看起来非常火热、此起彼伏、风生水起,但最终真正造就出来的编程人才,少之又少。
Scratch出现了十几年之后的今天,Scratch的发源地美国,还只是在高中阶段的AP课程中提供真正的编程语言——Java语言的课程。而在2018年,参加AP课程中的Computer Science A(计算机科学A)——也就是以纯粹编程能力为考查主旨的AP课程的人数,还只有区区6.8万。就算是以计算机科学的基础知识为考点的稍微简单些的Computer Science Principles(计算机科学原理),也只有5万人参加而已。根据美国国家教育数据中心(NCES)的统计,美国在2017—2018年间的高中毕业生人数是360万。粗略一算,掌握编程能力的学生,只占美国毕业生的1.8%。AP课程中的英文语言写作和微积分,分别是考生最多的两门文理科代表,考生人数分别是57.9万和31.6万,相对于只有6.8万考生的计算机科学,我们就能够知道,编程教育在美国中学也远远未达到普及的程度。
但自2017年国务院要求普及编程教育之后,我国的高中课程标准开始发生变化。数据与计算(算法与程序设计)、数据与数据结构、人工智能初步,都已成为必修或选择性必修课。在考试层面,浙江省已经率先将信息学纳入高考。不仅如此,在2018年的数学高考试题中,多个省份都出现了类编程的题目。可以预见,全国高考中出现真正的编码编程的试题,就在不远的未来。
针对日益增长的学习编码编程的需求,这本书诞生了。请注意,这不是一本简化版的成人学习C++的教材,而是旨在构筑真正符合青少年学习能力和思考特征的编程教学体系的一次实践。
作为一名信息学教练,我很高兴这本书能够出版,因为这本书能够帮助9~14岁的孩子们理解什么是编程,学会编程,进而能够进入信息学奥赛等级的题目练习中。对于希望进入信息学奥赛领域的年轻老师和未来的教练来说,这是一本深入浅出的编程教科书,大部分全国奥赛NOIP普及组中需要的C++知识在书中都覆盖了,而且在书中使用的,全部都是NOIP考试系统NoiLinux。所见即所得的实用特征是这本书的重要特点。
作为一名信息学教育的普及者,我很期待这本书的面世。因为在信息学,或者简单的只是编程教育这个层面,在我国,都存在巨大的教育资源缺口。我所说的,不光是就教育水平稍显落后的省份而言;即便是在北京、上海、浙江、湖南、广东、安徽、福建和江苏这些信息学发达的地区,直到今天,我们也都很难在著名中学之外找到优秀的编程教育的资源。这本书可以让教育资源不够丰富的地区的孩子们通过书籍自学,按照书中的要求自行训练学会编程。它存在的作用和意义,就是在全国范围内普及编码型的编程教育,让看起来枯燥的C++编程能被小学高年级学生和初中生以自学为主学会。
作为一个父亲,我更是盼望这本书的出现。因为我时常审视:“到底什么样的书籍、什么样的文字形式,才能够让只有八九岁的孩子们在编程的学习上专注下来,不管有没有老师的陪伴?”我相信,这本书能够平复家长们的焦虑,让大家从“找不到一本真正适合小学高年级学生和中学生的C++编程书”的困惑中摆脱出来。
不管从什么角度来说,我都相信,在家长们还没有拿起这本书的时候,心中已经有了一个或者坚定、或者模糊的概念,那就是:我的孩子,应该学编程。
只是,该如何让孩子们学会真正的编码编程?该如何真正得到在中国的高中课程标准中要求的编程能力?得到这种在高考中已经涉及、未来一定会考、现在已经在美国AP课程中浓墨重彩予以考核的能力?
这,是个问题。
这本书,就是答案。