乔布斯:每个人都应该花1年时间学习编程
这个访谈纪录片叫做《乔布斯:遗失的访谈》(Steve Jobs: The Lost Interview),本来是1995年录制的,但是在近几年才公开。在片中,乔布斯谈到他20岁左右学习编程的经历,称“当时编程可以帮助我们完成工作,但没有明确的实用性,重要的是我们把它看作思考的镜子,学习如何思考。“
乔布斯进而也表示,“我觉得每个人都应该学习一门编程语言。学习编程教你如何思考,就像学法律一样。学法律并不一定要为了做律师,但法律教你一种思考方式。学习编程也是一样,我把计算机科学看成是基础教育,每个人都应该花1年时间学习编程。”
大多数人听到编程都觉得很复杂,其实学习编程最主要的并不是学习编程技术,而是培养编程思维,但什么是编程思维?
电脑能帮人类解决问题,但在此之前,人类首先要做的是理解这个要解决的问题,并找到解决问题的路径。换句话说,电脑只能搬砖,但是搬哪块砖、搬到哪去,走哪条路,为什么这么做还是人决定的,机器只是执行的过程。所谓“编程思维(computational thinking)”就是“理解问题——找出路径”的思维过程”,它由四个步骤组成:
1、分解(decomposition)
把一个复杂的大问题,拆解成更可执行、更好理解的小步骤。复杂问题很难一下子破解,但如果把它细分成很多个小问题,逐步解决,就容易多了。
比如,破案。
找出犯罪分子可不是件容易的事。但通常警察都会通过搞懂一系列相关的小问题破案,包括:发生了什么犯罪,什么时间,什么地点,有什么证据,有没有目击者,最近、附近是否有相似案件发生……等等。
通过拆解问题,可以深入了解犯罪的过程、细节,获得大量信息。而理解是解决的第一步。
2、模式识别(pattern recognition)
找出相似模式,高效解决细分问题。这点至关重要。识别模式,意味着新问题变成了老问题,我们在经验库里搜索以往的类似问题及解决方法,套用解决。识别的模式越多,解题的速度就越快。
举个例子:假如你需要画100只猫,你会怎么办?找100只猫来挨个临摹?还是找出猫的“模式”?
如果是后者,你可能要知道猫长毛,有眼睛、尾巴、四条腿。然后,按照这个“模式”,你就可以“批量”画猫了——你不用每次画一个新动物,只需要变换局部特征:黄白条的猫还是黑猫,长尾巴的猫还是短尾猫。
3、抽象(abstraction)
聚焦重要的关键信息,忽视无用细节。这是一个过滤的过程,通过认知问题的核心本质,帮助我们形成解决问题的构想。
接着举刚才画猫的例子,我们了解了猫的特征,就可以根据这些抽象的特点,形成关于猫的整体设想,做出一个模型。
4、算法(algorithms)
设计一步一步的解决路径,解决整个问题。
通过这四个步骤,一个棘手的复杂问题先被拆解成一系列好解决的小问题;每一个小问题被单独检视、思考,搜索解决方案;然后,聚焦几个重要节点,忽视小细节,形成解决思路;最后,设计步骤,执行——问题解决。
所以,所谓“编程思维”并不是编写程序的技巧,而是一种高效解决问题的思维方式,不当程序员也用得上。
电影《教父》中所说:“花半秒钟就能看透事物本质的人,跟花一辈子都看不清事物本质的人,注定有截然不同的命运。”
本质上说,编程是想办法解决问题,实现目标的过程。一个问题常常有多种不同的解法,每个孩子会通过不同的途径去达成同一个目标。当他们在思考和讨论方法背后的逻辑时,当他们在列举实现目标的步骤时,就是在运用编程的算法。是的,这样说来,算法和编程离我们的生活非常近,数学计算是个显而易见的例子,孩子们每天选择上学的路也是算法,甚至做三明治,或是绑鞋带的步骤都可以称之为算法。
而编程的核心是通过分析步骤的角度去解读问题。现代家长们都希望,孩子们能从学习中获取真正的本领,以适应现在和未来社会的发展需求,不希望他们只会考试或者死板的套用公式,缺乏逻辑思考与实践能力。儿童学习编程恰恰是为了提升逻辑思考的能力,养成解决问题的思维习惯,绝不是为了长大做一名程序员或者计算机工程师。
当孩子们掌握编程的要领后,即使面对再复杂的问题都可以简单地剖析成几个重要部分,然后他们就会发现哪些部分是他们已经解决的,哪些部分是关键问题所在,哪些部分之间存在逻辑或者时间关联。
接着就是想办法:怎么安排时间最合理、怎么设计步骤最科学,怎样取舍和选择等等。当总结和推敲出最优方案后,孩子们就如同讲故事一样,会用“先”、“然后”以及“最后”来解释他们的想法,这是非常重要的分析与解决难题的能力,将这套思维逻辑运用于计算机语言进行实践,就是编程。
这个国家的每个人都应该学习编程……因为它能教会你如何思考。
——史蒂夫 · 乔布斯