原文地址:Don't learn to code. Learn to think.
似乎每个人都正在尝试学编程:code.org有像比尔盖茨、扎克伯格和克里斯·波什这样的名流告诉你们任何人都能编程;像CoderDojo这样的网站如雨后春笋般在各地出现;英国已经使它成为所有年级学生的正式课程。
我认为这有点误导。不要误会我,我确实认为每个人都了解一些编程知识会让世界更美好,但是编程本身不应该是目标。计算机和编程都只是工具。它们是达到目标的手段。
真正的目标应该是教会人们用新的方式去思考。换句话说,我们应该教授计算机科学而不只是编程。在这篇博客中,我将解释这两者的区别,以及为什么聚焦于那个对于成功的行动是关键的。
如果你更喜欢视频讲解,我强烈推荐Simon Peyton Jones的很棒的TED演讲 Teaching Creative Computer Science,这也是我这篇博客的灵感来源。
仍然在这准备看文字版?很棒。让我们以一个关键的问题开始:为什么你应该关心编程或者计算机科学’?
为了回答这个问题,我们先去散散步。
欢迎来到真实世界
有可能正在chrome或firefox浏览器上读这篇博客,它们运行在windows或OSX上,在笔记本电脑或台式机上。我猜测今天你也会花费一些时间读邮件、查看你朋友们的脸书状态、或者在YouTube上看视频。现在你生活的很多部分是在电脑上:你的病历在数据库里;你的简历在领英上;你用谷歌和脸书去推销你的产品;用亚马逊买东西;在线申请你的税费;在网站上管理你的银行账户;可能你甚至涉足了数字货币。
现在,从你的电脑脱身:在你的口袋、皮包、或者附近的一个桌子上,可能有一个智能手机。它带有GPS、相机、可触摸屏和很多应用。如果你正在客厅,你可能也有一台连接数字电缆的LCD屏电视,一个录像机、DVD播放器、苹果电视、XBox或者PlayStation。你在这些设备上看的电影、听的音乐、玩的游戏都充满了计算机图形和数字音频处理。
让我们去外面。你路过你的车了吗?现代汽车被用计算机设计,在充满机器人和计算机的工厂里生产。如果你开车,你可能用谷歌地图去找到你的方向,找到地方吃饭,或者用TripAdvisor找到地方停留。现在,向上看:你上面的地方,自动驾驶的飞机将会通过,它有空中WiFi和娱乐系统,并且不间断地和其它飞机、交通控制器、它的生产商保持联系。在这上面的某处,人造卫星和空间站正绕着地球旋转、拍照、测量天气,和为电话提供路由。
软件正在占领世界。但这仅仅是个开始。很快,你将穿着技术‘,用计算机锁门,用机器人运送物品和清理房屋,建立你自己的电子’,运行你的建造厂,生活在虚拟现实中,开自动驾驶汽车旅行和飞向太空。
矩阵无所不在
我刚才描述的所有技术几乎都由软件驱动。在你生活的每个方面, 你被代码包围了。未来代码的数量只会增加。
现在,仅仅因为一项技术是无所不在的并不意味着必须在学校里学习它。例如,我们都坐飞机,但是得到飞行员执照并不是12年基础教育的一部分。
然而,去明白“怎样去思考关于飞行”你所需要的工具是基础教育的一部分’:
1.物理和数学帮助你理解重力、作用力、压力、速度、摩擦力和升力。
2.生物教给你在高空、稀薄的氧气和极度寒冷之中人的身体会发生什么。
3.历史解释了飞机是如何被发明,怎样演变,以及它在旅行、商业和战争中的角色。
到你高中毕业的时候,你会有一个概念,关于飞机是什么,怎样工作,怎样安全地使用它。像物理、数学、生物和历史这样的通用类课程教会你怎样去思考各种主题,包括飞机;这是和教你怎样使用一个工具的课程相反的,例如怎样驾驶一种特定类型的飞机。
对于相同的原因,我们应该聚焦于教授计算机科学而不只是编程:前者是一种通用的思维方式,而后者是一个特定的工具。让我们更近距离地观察计算机科学以便更好地理解它们的差异。
什么是计算机科学
计算机科学是关于计算的研究:即怎样处理和呈现信息。这有一些你可以研究的概念:
1.问题解决:你将学习算法 - 一般的策略,像是分治法,递归,试探法,贪心法和随机算法 - 帮助你建模,分解和解决各种问题。
2.逻辑:你将开始使用精确和正式的思维方法,包括抽象、布尔逻辑、数论和集合论,所以你能够用封闭的方式解决问题‘。
3.数据:你将接触信息论并且开始问一些问题,比如什么是信息?怎样呈现信息?如何模拟真实世界?
4.系统:你怎样设计和建造满足一系列需求和限制的复杂系统?系统工程学是几乎所有业务中的重要课题。
5.思考:理解人类心智最好的方式之一就是去复制它。像是人工智能、机器学习、计算机视觉和自然语言处理这些话题,不仅是计算机科学的前沿,也是生物学、心理学、哲学和数学的前沿。
注意到上面的列表并没有真正提到编程,因为它只是表现计算的工具:它本身并不是计算机科学。
计算机科学不是关于计算机的,天文学不是关于望远镜的,生物学不是关于显微镜的,化学不是关于烧杯和试管的。科学不是关于工具的。
Michael Fellows 和 Ian Parberry
事实证明对于计算我们更加依赖另一件工具:大脑!计算机科学的目标是教给你的大脑新的,通用的并且可广泛应用的方式去思考。随着技术变得越来越普遍,这种新的思维方式将变得和物理、数学、生物、历史一样重要。
说了这么多,独自思考是不够的:我们需要知道怎样去应用它。物理方面,你用天平、棱镜和磁铁做实验;生物方面,你可能用试管、植物和培养皿;计算机科学方面,你学习编程。
什么是编程
编程是你怎样指示计算机去执行一些操作。如果你之前从未写过代码,你可能习惯于在一个存在的应用中通过点击来和计算机交互。在表面之下,这个应用包含了代码告诉计算机怎样呈现应用、去哪存储或检索数据和怎样回应你的点击。
所有的编程都基于我们上面讨论过的计算机科学的原则。值得注意的是,相同的概念 - 逻辑、算法、数据、系统工程 - 可以被应用到构建一切事物,从你正在使用的来读这篇博客的网页浏览器到飞机上的自动驾驶软件。虽然编程涉及了很多数学和结构,这也是极富创造力的练习:把你所想通过一行行代码变为现实。
学习编程作为计算机科学教育的一部分带来很多益处:
1.自己动手:如果你会编程,你可以给你自己写东西‘。先从简单的开始:建一个脚本重命名一堆旅行相片或者一个程式帮助计算你的税费。然后,更有趣点:给你的作品集建一个网站;给你的公司做一个手机应用;做一个游戏和你的朋友一起玩。
2.疑难排解:一旦你自己做过几个应用之后,解决其它应用也更加简单。一旦你不再害怕计算机 - 未知的事物 - 你将变成技术支持的大师。随着技术遍及生活的每个部分,知道怎样定位它将变得和知道怎样阅读一样重要’。
3.学习计算机科学的目标不是变成专业的程序员。我们都在学校学习数学、物理和化学,但是我们不都变成专业的数学家、物理学家和化学家。然而如果你对它有热情,你会发现软件工程是评分最高、收入最高和发展最快的工作之一。
把它们组合在一起
让我们回顾一下:
1.计算机科学是一种新的思维方式。在充满科技的世界中,它其中包含的概念对每个人都是有用的。
2.编程是通过应用新的思维方式学习计算机科学的重要部分。然而,编程本身不是通用的学习‘。
混淆这两个概念正在造成“学习编程运动”这样的问题。Slate发表了一篇名为 《Maybe Not Everybody Should Learn to Code》的文章;大西洋月刊发出《 Should Journalism Schools Require Reporters to ‘Learn Code’? No》;Jeff Atwood写了《 Please Don’t Learn To Code》,其中他问了一个问题总结了混乱的地方:
如果布隆伯格某天早上作为一个优秀的Java程序员醒来,在他领导美国最大的城市的日常工作中怎么可能做得更好?
这当然是错误的问题。它是建议学习编程的公众运动的结果,和学习思考相反,编程就是最终目标。如果经验丰富且受人尊敬的程序员Jeff Atwood都被这种区别愚弄,那一般人更没有机会做出正确的抉择了。我们应该问的问题是:
布隆伯格或者其他任何人,如果他们通过学习新的问题解决策略和发展更好的逻辑理解去改善他们的思维能力,是否会在工作中做得更好?
我认为答案是明显的。随着世界被越来越多的科技占据,答案甚至变得更加明显。这就是为什么我们需要聚焦于教授计算机科学而不只是编程。
怎样开始
好消息是你不需要等待Code.org得到这个消息’ - 现在你就可以开始学习计算机科学!事实上,这是最容易学习的主题之一,你的全部所需是一台计算机和互联网接入,如果你正在读这篇博客,可能你已经都有了。
这有一些很棒的资源让你继续下去:
大学课程
1.Coursera
2.Udacity
3.MIT OpenCourseWare
4.Stanford Engineering Everywhere
5.Academic Earth
在线教程:
1.Khan Academy
2.Treehouse
3.MIT Scratch
4.Codecademy
5.Code School
在线社区:
1.CoderDojo
2.Girls Who Code
3.Girl Develop It
4.Code.org
5.Coding meetup Groups