不要只学习编程,更应该学习如何思考


好像每个人都会去学习写代码,比尔盖茨,马克扎克伯格,克里斯·波什告诉你每个人都能编程,CoderDojo(一个免费的编程俱乐部)正在全美国各地蓬勃发展,而英国也将编程定为所有小学的官方课程。我认为这有些偏颇,别误会,我的确认为如果每个人都对编程有了解的话那么这个世界一定会更加美好。但是编程本身并不是目的,计算机和编程语言仅仅只是工具而已,他们只是达到目的的手段。

真正的目的是应该教会每个人一种新的思考的方式,换句话说,我们应该尝试着去学习计算机科学,而不仅仅是编程。在这篇文章中,我将解释这两者之间到底有什么不同,并且告诉你为什么选择正确的那个是走向成功非常关键的一步。

       如果你更喜欢视频表达的方式,那我非常推荐Simon Peyton Jones这个非常精彩的TED演讲https://www.youtube.com/watch?v=Ia55clAtdMs传授创造性的计算机科学,同时它也是这篇文章的灵感来源。

       如果你比较喜欢文字性的描述,那我们开始进入正题吧。提一个问题:为什么你应该关心编程或者说计算机科学呢?

       为了回答这个问题,我们来好好思考一下。

欢迎来到真实的世界


    你现在可能是在Chrome或者Firefox浏览器上阅读这篇文章,这个浏览器运行在Windows或者OS X操作系统上。可能是笔记本也可能是台式机,我猜你每天会花一点时间处理邮件,查看你的朋友的Facebook状态,或者在Youtube上面看一些视频,如今你生活的大部分都在计算机里面,你的医疗记录在某个数据库里面,你的简历在领英上,你用Google或者Facebook来推广你的产品,你用Amazon购买你需要的东西,你在网上交税,你在网上管理你的银行账户,甚至有可能你还涉足数字货币。

       现在抬头看看你的电脑,你的口袋,钱包,或者桌子上,你可能有一个智能手机,它上面装载了GPS,摄像头,触摸屏,很多的APP。如果你现在是在客厅,你可能还会有装了数字电缆的LCD电视,一个摄像机,一个DVD,Apple TV,XBox,或者PSP,你在这些电子产品上面看的电影,听的音乐,玩的游戏都包含了大量的计算机图形和数字音频处理。

       现在让我们走出去,你经过了你的汽车吗?现在汽车都是使用软件进行设计,在全是机器人的工厂里面生产,并且也到处都是计算机。如果你驾驶你的汽车,你可能会使用谷歌地图导航,找到一个吃饭的地方,或者使用猫途鹰找一个地方待一段时间。现在抬头看你的头上,一架使用自动导航控制的飞机可能刚好经过,并且还装备有WIFI和娱乐系统,并且还在实时和其他的飞机,空中交通管制,飞机生产商进行通信。在飞机的上面的某些地方,卫星,太空站,在围绕地球旋转。拍照,观察天气,进行移动通讯。

       软件正在吞下这个世界,但是这仅仅只是开始,在你知道之前,你的身上可能会穿上各种技术,你家的门使用计算机来控制锁。你使用机器人来递送包裹和打扫屋子,创建你自己的电子设备,运行你自己的生产设施,生活在虚拟现实里面。驾驶自动驾驶汽车去旅行,或者说太空旅行。

矩阵无处不在


       我刚才谈到的所有技术都是通过软件运行控制的,在你的生活的方方面面,你正在被代码所包围,并且这个代码的数量还在不断上升。

       当然不能仅仅因为一个技术无处不在就意味在你必须在学校里面学习这门技术,例如我们乘坐飞机出行,但是K-12教育体系的课程并没有要求你一定要获取一个飞机驾驶执照

 但是,但是去学习那些能够帮助你如何思考这些飞机是怎么飞行的工具却是这个教育体系当中要求的:

1.    物理和数学帮助你明白重力,力,压力,电压,摩擦力,浮力。

2.    生物让你了解如果人类的身体在有限的氧气和极寒高空中会发生什么。

3.    历史解释给你飞机是如何发展的,它的进化以及它在交通,

商业,战争中所扮演的角色。

  现在你从高中毕业了,你对飞机是什么,它如何工作,怎么安全的使用有了一定的认识。像物理,数学,生物,历史的目标是教会你去思考那些包括飞机这种非常广泛的问题。这种与如何教你去使用一种工具是刚好相反的,例如如何驾驶一种具体型号的飞机。

       和上面一样,我们应该将注意力放在教授计算机科学而不仅仅只是编程:前者的目标是教你一种通用的方式去思考,然而后者则是一种具体的工具,让我们深入计算机科学明白这两者之间的区别。

 什么是计算机科学


计算机科学是计算的学习过程:也就是如何呈现和处理信息,下面是几个简单的理念你可能会学习的:

1.    问题解决:你会学习算法,算法是通用的策略,例如:分治算法,递归,启发算法,贪婪搜索和随机算法。这些算法帮你建模,拆解并且解决任何问题。

2.    逻辑:你将要学习具体和形式化的思考方式,包括抽象,布尔逻辑,数理和集合理论,这样你就能够轻松地解决问题

3.    数据:你会接触信息理论,并且开始好奇一些问题,比如说什么是信息?如何展示一个信息,如何给真实世界建模。

4.    系统:你如何设计并且创建一个满足多样化需求和有诸多限制的复杂系统?对于很多领域来说系统工程是一个非常基本的话题。

5.    思考:明白人类思维最好的方式之一就是复制这个思维。像关于人工智能,机器学习,计算机视觉和自然语言处理这类话题不仅仅只是计算机科学的前沿,同时也是生物,物理,哲学,数学的前沿。

注意:上面的列表当中并没有提到编程或者写代码,因为他们仅仅只是能够执行计算的工具,他们本身并不是计算机科学。

      计算机科学并不仅仅只是关于计算机,就好像天文学不仅仅只是关于望远镜,生物不仅仅是关于显微镜,化学不仅仅只是关于烧杯和试管一样。科学和工具无关。

--Michael Fellows and IanParberry

事实证明我们还一来依赖另外一个工具来计算:大脑。计算机科学的目标是教你用新的,通用的,广泛适用的方式去思考。随着科技越来越随处可见,这一种新的思考的方式将会变得和物理,数学,生物,历史一样重要。大家都说,单单思考是不够的:我们需要思考如何去应用它,在物理里面:你会用尺子,棱镜,磁铁做实验。在生物里面:你会使用试管,植物,培养皿;在计算机科学里面,你会学习编程。

 什么是编程


编程或者说写代码,是指你指导电脑去执行一些操作的过程。如果你之前从来没有写过代码,但是你可能曾经通过点击过某个APP的某些地方与计算机进行过交互。在APP底层,包含了告诉计算机如何展现这个APP,哪里去存储或者获得数据,如何与你的点击进行交互的代码。

       所有的编程都是基于上面我们讨论过的计算机科学的原则运行的。像是逻辑,算法,数据,系统工程这些东西可以用来创建从你阅读这篇博客的浏览器到飞机上的自动导航系统,这些都是显而易见的。尽管编程包含了大量的数据和结构,这也是一项非常具有创造性的运动,随着代码一行一行地增加,你会认为产品也在慢慢地成型。

 把学习编程作为计算机科学教育的一部分可以带来诸多好处:

1.    DIY:如果你会写代码,你可以创建一些属于你自己的东西,你可以从简单的开始,比如说创建一个修改旅游照片名字的脚本或者说一个可以帮你计算税收的Excel公式 。然后更进一步:创建一个展现你作品集的网站;为你的公司创建一个移动APP,开发一个和朋友一起玩的游戏。

2.    问题解决:一旦你自己创建过一些APP,发现开发APP是容易的。一旦你不再害怕不了解的计算机,你会成为一个技术的高手,随着技术开始接触你生活的每一部分,知道如何控制它将变得和学会如何阅读一样重要。

3.    职业生涯:学习计算机科学的目标不是成为一个职业的程序员,我们在学校里面学习数学,物理,化学,但是我们并没有都成为专业的数学家,物理学家,化学家。

然而,如果你对此有热情,你会发现软件工程这个职位前景是非常不错的,有着可观的薪水,排行靠前,增长迅速。

 将所有综合起来


让我们来总结一下:

1.计算机科学是一种新的思考方式,它里面的很多理念对每一个身处于如今充满科技的世界是有很大用处的。

2.编程是应用计算机科学这种思考方式的基础的一部分,然而,对于计算机科学来说,编程并不是它本来的目的。

对于这两个概念的困惑导致了学习编程的一些问题,Slate杂志发表了一篇文章名叫“也许不是每个人都需要学习编程”;Atlantic 也发表了一篇文章“新闻学院的记者应该学习编程吗?不,不应该”,Jeff Atwood也写了一篇文章说“请不要学习编程”,他问了一个问题,这个问题简洁的总结了这个困惑。

如果某天Michael Bloomberg(纽约市市长)某天早晨醒过来变成了一个Java程序员,那他怎么能够更好的领导这个美国最大城市的日常工作呢?

当然这是一个错误的问题,因为很多人们都在建议大家去学习编程而导致了这个结果。而没有将学会去如何思考作为最终的目标。即使是Jeff Atwood作为一个经验丰富且受人尊敬的程序员,也被这两者之间的区别误导了,然后一般人变很难再得到正确的结论了,实际上我们应该问的问题是:

如果纽约市长或者其他任何人学会了这种新的问题的解决方式,更好的掌握了逻辑思考,那么他们在处理自己的日常工作时会变得更加出色吗?

我认为这个问题的答案是很明显的。随着这个世界充满着越来越多的科技,这个回答也变得愈加明显。这就是为什么我应该注重于教授计算机科学而不是编程。

 注:由于这篇作者是美国人,所以可能提到的很多人名或者其他一些名字都对于大家来说不太熟悉,但是这没有关系,不妨碍大家理解这篇文章的主要思想。

原文链接:原文