Everybody in this country should learn how to program a computer… because it teaches you how to think.

---Steve Jobs

人都应该学习编程,因为它教人如何思考---乔布斯
deepstudy.net
深学汇
    
    
代码编程是实践计算思维的唯一途径
来源:深学教育 | 作者:深学君 | 发布时间: 2019-11-14 | 1490 次浏览 | 分享到:
CSP-J/S NOIP 信息学奥赛 NOI 信息学编程 信息学竞赛




      2017年,国务院印发了《新一代人工智能发展规划》,提出“实施全民智能教育项目”。这表明国家在战略层面对基础教育阶段的教育提出了面向新时代的新要求。随着信息技术的迅猛发展,未来的社会将发生巨大的变化。大量现有的劳动技能、工作方法、知识、思维方式都将过时,一些已存在多年的职业将被人工智能所取代。国家人才战略的关键就是要培养高素质的面向未来的人才和合格公民。为此教育部制定了信息技术的新课标,从过去以软件工具的操作使用为主转向了以信息素质的培养教育为主,把信息素养提高到与人文素养、科学素养同等重要的地位。其中思想方法和思维模式是信息素养中的重要内容。


      计算思维(Computational Thinking)这一概念自从2006年被明确提出以来,在计算机教育领域引起了广泛的关注和讨论。但时至今日,对于什么是计算思维,仍然是众说纷纭。例如,有人将计算思维与理论思维、实验思维并列为三大科学思维;有人认为计算思维是计算机科学解决问题最本质的方法,涉及制定问题解决方案的思维过程,包括逻辑思维、算法思维、网络思维、系统思维以及数据思维;有人认为计算思维的本质是抽象和自动化;有人认为计算思维是一种递归思维,是一种并行处理;有人认为计算思维是一种多维分析推广的类型检查方法;还有人认为计算思维是一个循环的问题解决过程,认为计算思维就是通过约简、嵌入、转化和仿真等方法,把一个看起来困难的问题重新阐释成已知如何求解的问题,是运用合理算法进行问题求解的过程,是利用计算机科学的思想和方法进行的问题分析、抽象、建模、求解等一系列思维活动。为统一对计算思维的认识,美国国家研究委员会(NRC) 2010年组织了一次“计算思维的范围和性质研讨会”,但与会者对计算思维的范围和性质观点各异,未能对计算思维的基本定义达成共识。尽管对计算思维这一概念在思想方法、思维模式和思维过程方面没有统一和明确的界定,但是有两种认识被普遍接受:(1)计算思维在专业能力和信息素质培养上的重要性是不言而喻的;(2)计算思维是把现实问题变成计算机可计算模型并产生结果的思维过程,是与计算实践密切相关的。至于如何培养计算思维,则更是莫衷一是。其中一个重要的分歧就是培养计算思维,需不需要学习程序设计。


    


      从认识论的角度来说,实践是人类对客观世界的认识和理论的来源。计算思维也不例外,计算思维不是抽象的概念,是关于如何在现代计算技术和计算环境下分析问题和解决问题的思维方法。它既不是什么人脑子里灵光一闪凭空出现的,也不是天才人物头脑里固有的,而是在现代计算技术条件下大量实践经验的积累、总结和升华。因此这一概念不可能在现代计算技术刚出现时就形成,更不可能在1945年第一台现代计算机出现之前就出现。在现代计算机出现60多年之后,经过全世界计算机专业人员广泛而大量的计算实践,各种相关技术和理论日益成熟,人们认识到计算技术和计算理论中所具有的共同特点和思维方式,在此基础上,逐渐形成了计算思维这一概念。




      讨论培养计算思维的途径,离不开培养青少年计算思维的目的。青少年学习计算思维的目的不是为了掌握一些抽象的概念,而是为了培养一种全新的、适用于未来社会发展所面临的计算环境的思维方式,以便具备完整的现代信息意识和信息素养,理解现代计算技术和计算环境与相关科学、技术、医学、人文等其他学科之间的关系,在意识层面、思维层面、创新层面具有利用现代计算技术应对各种社会问题和技术问题,发现问题和解决问题的综合能力。也就是说,是为了培养青少年具有更强的理论联系实际的能力,更强的运用知识解决实际问题的实践能力,更强的面向未来的能力,而不是让他们只知道一些抽象的名词概念,只会夸夸其谈的纸上谈兵。而使青少年建立这样一个与计算实践密切相关的思想方法,必然离不开计算实践。


  毛主席在《实践论》中指出:“认识开始于经验”,“理性认识依赖于感性认识,感性认识有待于发展到理性认识,这就是辩证唯物论的认识论。”没有实践的基础,没有感性经验的积累,很难真正理解相关对象在实际层面相互作用的过程,也很难准确理解在此基础上进行的理论抽象,更不用说灵活地运用这些理论去指导实践、解决实际问题了。对于青少年的学习来说,他们的知识积累和实践经验较少,对于抽象概念和理论的接受能力较弱,针对他们的教育,不应该是抽象理论的教学,而应该是通过大量的实践练习,以养成教育的方式使他们通过自己的实践经验,逐步接受更为抽象的概念、理论和知识。计算思维不是各种概念、规则和知识点的堆砌,而是一种思想方法和思维模式。对于思想方法和思维模式的培养,更不能只通过理论的说教来实现,而是要通过反复的实践,使学生通过感性知识的积累,不断地体会和领悟而逐渐养成。我们可以把计算实践与计算思维的关系与中学几何课程与逻辑思维的培养做一个类比。


  在中学学习几何课程,不仅仅是为了学习具体的几何知识,更重要的是为了培养和训练学生的逻辑思维能力和想象能力。几何课程将逻辑的实质与图形的直观紧密结合,一方面是基于图形的直观想象,另一方面是基于推理规则的严谨逻辑。在几何中,从几条基本的公理出发,借助于逻辑推理规则,就可以构建出一个庞大复杂的数学体系。学生们在学习几何的过程中逐渐建立起了逻辑思维能力和想象能力。这种想象力和逻辑思维能力的培养,不是通过理论的说教和概念的灌输,而是通过大量几何习题的练习完成的。学生在进行定理证明和演算的过程中,逐步体会到逻辑推理方法的精髓,以及运用想象力领悟各种题目条件和几何图形所隐含的意义,在大量反复的练习中,想象力和逻辑思维逐渐形成了一种思维定式。若干年后,学生可能会忘记曾经证明过的几何定理和习题,但是通过几何课程培养出来的想象力和逻辑思维能力却会长久保留下来,相伴终生。我们可以反过来想一想,如果在中学单独开设一门专门培养逻辑思维的课程,给学生抽象地讲述各种逻辑系统和推理规则,会是一种怎样的情景,会取得什么样的效果。




    现代计算机系统可以分为硬件和软件,硬件提供了具有广泛通用性的计算平台,软件描述计算任务的处理对象和处理规则。硬件决定计算机系统的性能,软件决定了计算机系统的功能。计算机的各种软件,包括各种手机APP在内的移动应用,以及最近广受关注的人工智能,其核心的支撑技术都是程序设计技术。如果说硬件是计算机的躯体,那么程序就是计算机的灵魂,程序设计就是塑造计算机灵魂的工作,编程实践就是现代计算技术中规模最大、最为普及的计算实践,也是青少年可以最先、最容易接触到的计算实践。



   计算思维并不等同于编程实践,计算思维是一种来源于计算实践,又高于具体计算实践的思维方式,是可以适用于运用现代计算技术和计算环境分析问题和解决问题的思维工具。但是要掌握计算思维必须通过学习编程,只有通过实际编程的感性经验,才能真正理解与此相关的抽象概念和理论,特别是对于缺乏知识积累和实践经验的青少年。同时,编程实践也是检验学习计算思维、培养信息素养效果的最重要和最有效的手段。一个人是否真正具有计算思维和信息素养,不在于他是否能够背诵一些概念和理论,而在于他是否能够运用这些知识去创造性地解决实际面对的问题。而青少年在学习阶段,难以直接面对实际的社会问题和实际的技术问题,这时,最直接最有效的手段就是通过编程实践的检验。这与通过几何习题的证明检验学生对逻辑推理能力的掌握异曲同工。

 




       邓小平同志当年在谈到部队战斗力的时候曾经说过这样的话:“一个听过枪响的士兵和没有听过枪响的士兵是完全不一样的。”今天,我们也可以说,信息素质的培养上,一个写过程序的学生和没有写过程序的学生是完全不一样的。中国在青少年中开展编程活动已有三十多年的历史了。很多早期参加过编程活动和全国青少年信息学奥林匹克竞赛(NOI)的青少年,已经走入了大学和社会。实践证明,这些写过程序的学生,特别是写过较多程序的学生,不仅在大学的专业学习中,而且在接受新概念和抽象理论时,在灵活运用所学知识时,比没有写过程序的同学有着明显的优势,在非信息类课程的学习中也同样表现出色,充分体现出编程实践对思想方法和思维定式的培养作用。在走入社会后,这些同学也更能够适应当前飞速发展的技术环境,表现出更强的创新能力和创业能力。实际上,很多人已经站在了新技术发展的潮头,成为了引领人工智能产业发展的先锋。


   信息素质的培养并非只是学习编程,编程实践不是信息素养的全部。编程实践也不仅仅是学写代码那么简单,而是计算思维养成教育的基本手段,是为学生的理论学习提供最基本感性知识的基础,是培养计算思维的必由之路,舍此别无他途。因此在国务院的《新一代人工智能发展规划》中,明确提出要“在中小学阶段设置人工智能相关课程,逐步推广编程教育”。这说明,在信息技术教学中,编程实践具有非常重要的位置,是课程中必不可少的内容。


   青少年学习编程的需求并不是从这个人工智能时代才出现的。早在1984年,邓小平同志就在视察上海十年成果展的时候说出了非常有名的鼓励之言:“计算机的普及要从娃娃做起。”从1984年到今天,35年过去了,不管是在计算机科学的发源地—美国,还是在科技界的后起之秀—中国,K-12阶段能编程的学生数量,相比学生总数来说,都非常之少。


   原因简单而直白:中小学生编程到目前都没有被摸索出一种有效的、可以复制的普及教育解决方案。请注意,我在这里所说的“中小学生编程”,是真正的代码编程,而不是在商业上被炒作得如火如荼的“少儿编程”--图像化编程。诚然,图像化编程的语言或工具,例如来自美国麻省理工的Scratch,确实能够培养孩子们的编程思维,孩子们经过学习后很容易编写一些简单的游戏或题目。但是,有了启蒙阶段编程思维,距离拥有代码编程能力的路程,大概还有十万八千里。我们在代码编程实践教学过程中也并没有发现学习过图像化编程的学生比没学过的更具优势,反而是学习过奥数的同学在利用计算机解决数学问题时更具优势。


   简单来说就是,光有编程思维,没有编程能力,在以后大学学习计算机、AI课程或今后从事编程工作,还是得从基础开始学习。更不用说参加五大学科奥赛的信息学软件能力认证CSP-J/S,是绝无可能获奖的。不光是CSP-J/S,在任何真正考核编程能力的国内和国际的比赛和考试中,都没有任何可能取得优异成绩,其中包括:中国的高考,美国的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年的数学高考题中,多个省份都出现了类编程的题目。可以预见,全国高考中出现真正的代码编程的试题,就在不远的未来。





节选:尹宝林《编程实践是培养计算思维的必由之路》

           周   鲁 《栀子猫奇幻编程之旅》