学会思考,而不只是编程
英文原文:Don't learn to code. Learn to think
中国人常说“授之以鱼不如授之以渔”。如果说教授编程是授之以鱼,那么教授计算机科学就是授之以渔。为什么说学习计算机科学比学会编程要重要得多?来听听Yevgeniy Brikman的解释。
现如今,似乎每个人都在学习编程:Bill Gates、Mark Zuckerberg和Chris Bosh这些名人在Code.org网站上告诉人们每个人都拥有编程的能力;CoderDojo项目在世界各地大张旗鼓;英国已经把编程作为小学官方课程。
不过,我认为这样有点误入歧途了。但请不要误会——我也确实认为代码能够让世界变得更美好——但编程本身并不是我们的目的。计算机和程序只是工具,它们是我们通向终点的桥梁。
我们真正的目标应该是教会人们如何思考。换句话说,我们应该教人们计算机科学,而不只是编程。在这篇文章里,我将会解释这两者之间的区别,以及为什么在这两者当中选择正确的一方对于迈向成功来说如此重要。
我们不妨先问自己一个问题:为什么我们要关心编程或计算机科学?
欢迎来到真实的世界
或许你正在使用Chrome或Firefox阅读这篇文章,这些浏览器可能运行在Windows或macOS上,而你可能正在使用笔记本或台式机。你今天可能花了一些时间阅读电子邮件、查看朋友圈的状态,或者在视频网站上看了一些视频。我们的生活在很大程度上依赖了计算机:我们的医疗记录保存在数据库里;我们的简历可能放在了LinkedIn上;我们使用Google或Facebook为产品做宣传;我们在Amazon上购买这些产品;我们直接在网络上进行报税;我们使用网上电子银行;我们甚至开始涉足电子货币。
现在将你的视线从电脑上移开:在你的口袋里或者桌角的某个地方可能放着你的手机,它装有GPS、摄像头、触摸屏和大量的应用程序。在你的客厅,可能有LCD电视机、DVR、DVD播放机、Apple TV、Xbox或PlayStation。这些设备上的视频、音乐和游戏都是由计算机图形和数字音频组成的。
当你经过你的汽车时,你是否想过,现代汽车是使用软件设计并在满布机器人和计算机的工厂里生产出来的?你开着车,使用Google地图导航,在Yelp上查找吃饭的地方或在TripAdvisor上查找休息的地方。在你的头顶上方有自动驾驶的飞机飞过,飞机里有Wifi和娱乐系统,可以与其他飞机、交通指挥中心和飞机厂商联系。再往上,卫星和太空站正围绕着地球绕圈,它们拍照、预报天气、转发电话信号。
软件正在吞噬着这个世界,但这只不过是个开始。在你意识到这一点之前,你可能已经穿上了智能可穿戴设备、使用电脑来锁门、使用机器人来送货或清理房间、开发自己的电子设备、有自己的制造车间、生活在虚拟现实里、乘坐自动驾驶的汽车,甚至飞向太空。
矩阵无处不在
上述的这些科技都是由软件驱动的,我们的生活被代码所包围,而代码的数量在未来只会不断增加。
不过,虽说科技无处不在,但这并不意味着你在学校里就一定要学习这些技术。比方说,我们都需要乘坐飞机,但即使是K12也并没有把获得飞行员驾照当作课程的一部分。
相反,学会使用那些能够帮助你理解飞行原理的工具却是课程的一部分:
- 通过学习物理和数学,你了解了重力、作用力、压力、速度、摩擦力和浮力。
- 通过学习生物,你明白了人体在缺氧和寒冷的高空中会发生什么。
- 通过学习历史,你知道了飞机是怎样被发明和制造出来的,以及飞机在旅行、商务和战争中所扮演的角色。
中学毕业之后,你就知道飞机是什么东西,知道飞机是如何飞行的,以及如何安全地搭乘飞机。一般性的课程,如物理、数学、生物和历史,它们教会你如何思考各个领域的问题,包括飞机在内。相反,有些课程只是教会你如何使用一种工具,比如如何驾驶某种型号的飞机。
类似的,我们应该专注于教授计算机科学,而不仅仅是编程:前者能够教会我们一般性的思考方式,而后者只是一种特定的工具。
什么是计算机科学?
计算机科学就是研究计算:如何表示和处理信息。
- 解决问题:你将学会各种算法策略,比如分而治之法、递归、探索法、贪婪搜索和随机算法,它们可以帮你分解和解决任何一种问题。
- 逻辑:你开始使用更准确和正式的方式进行思考,比如抽象、布尔逻辑、数字理论和集合理论,你因此能够以一种严谨的方式来解决问题。
- 数据:你接触到信息理论,想要了解信息是什么东西,你该如何表示它们,以及如何对这个真实的世界进行建模。
- 系统:你该如何设计和实现复杂的系统来满足一系列的需求?系统工程几乎已经成为各个业务领域的核心议题。
- 思考:了解人类思维的最好途径就是尝试复制它。人工智能、机器学习、计算机视觉和自然语言处理不仅仅是计算机科学的前沿技术,它们也涉及到了生物学、物理学、心理学和数学。
上述的清单并没有提及编程或者程序,因为它们只是计算工具:它们都不是计算机科学。
在计算方面,我们更多地依赖另一个工具:我们的大脑!计算机科学的目的是教会我们的大脑进行创新性、一般性和广泛性的思考。随着科技的日益渗透,新的思考方式变得和物理、数学、生物和历史一样重要。
也就是说,只进行单独的思考是不够的:我们需要知道如何应用我们的思考。在物理学里,我们使用天平、棱镜和磁铁做实验;在生物学里,我们使用试管、植物和有盖培养皿;在计算机科学里,我们学习编程。
什么是编程?
编程,或者说写代码,是指你发出指令让计算机执行一些操作。如果你之前从来没有写过代码,那么你可能习惯了使用已有的应用程序来与计算机发生交互。实际上,这些应用程序是由代码组成的,这些代码告诉计算机如何显示应用、在哪里存储数据、从哪里获取数据,以及如何对用户的鼠标点击做出响应。
编程是基于上述的计算机科学原则进行的。计算机科学的概念——逻辑、算法、数据和系统工程——可以用于构建所有的事物,从Web浏览器到飞机的自动驾驶软件。编程涉及到数学和数据结构,同时也是一项具有创造性的活动:每敲出一行代码,你的想法就又向现实迈近了一步。
将编程作为计算机科学的一部分带来了很多好处。
- DIY:如果你会编程,你就可以自己开发软件。你可以从简单的开始:写一个脚本来重命名照片或写一个Excel公式来计算税金。然后更进一步:搭建一个网站;为你的公司开发一个移动应用;开发一款可以与你的朋友们一起玩的游戏。
- 问题诊断:在开发了几款应用之后,就可以轻松地理解其他的应用。在战胜了对计算机的恐惧之后,你将成为技术大神。技术遍布我们的生活,知道如何操纵它们变得与知道如何使用它们一样重要。
- 职业生涯:学习计算机科学的目的并不是为了成为专业的程序员。我们每个人在学校里都学习数学、物理和化学,但并不是每个人都成为专业的数学家、物理学家或化学家。不过,如果你有这方面的热情,你会发现软件工程是一份高评价、高收入、增长快速的工作。
总结
让我们回顾一下:
- 计算机科学代表了一种新的思考方式。在一个被技术渗透的世界里,计算机科学的概念对于每一个人来说都是非常有用的。
- 编程是学习计算机科学的一种途径,但它本身并不具备一般性目的。
混淆了这两者就会让学习编程偏离正确的方向。Slate写过“或许不是每个人都要学习编程”的文章,Atlantic也写过“新闻学院没必要要求学生记者学会编程”的文章,而Jeff Atwood在他的文章“请不要学习编程”中问了一个问题,这个问题就是混淆概念的例子:
如果有一天,Michael Bloomberg在早上醒来时发现自己变成了一个Java编程高手,对于这个领导着美国最大城市的大人物来说,他的日常工作是否会如虎添翼?
当然,这个问题本身就是有问题的。这要归因于人们将学习编程作为终极目标,而不是学习如何思考。即使是Jeff Atwood这位经验丰富且倍受尊敬的程序员尚且分不清楚其中的区别,就别指望一般人能够搞清楚问题的实质了。我们应该这么问:
如果Bloomberg通过学习新的解决问题策略和掌握更好的逻辑领悟技能来改进他的思考方式,那么他在日常工作中是否会变得更好?
我想答案是显而易见的。随着技术越来越广泛地渗透到我们生活的各个方面,答案会越来越明显。这就是为什么我们要专注于教授计算机科学而不只是教授如何编程的原因。