# 《计算机思维》1：无情的计算

![](https://piccdn3.umiwi.com/img/201905/13/201905130002411141894002.jpg)

今天开始咱们来讲一本今年4月份出版的新书，《计算机思维》（Computational Thinking ），作者是两位计算机科学家，美国的彼得·丹宁（Peter J. Denning）和芬兰的马蒂·泰德（Matti Tedre）。

![](https://piccdn3.umiwi.com/img/201905/12/201905122210235514879427.jpg)

我们要借助这本书系统地、但同时也是快速地了解一下计算机思维 —— 我们要理解计算机是怎么回事儿，计算机能帮我们干什么，以及怎样把计算机思维用于其他领域。

为了让你印象更深，咱们先玩一个小孩爱玩的、小小的数学游戏 ——

而我能猜出来，你最后得到的那个数字是什么。答案在文稿最后的注释里 [1]。

这个游戏也许能让小学生感到惊奇，对大人来说就有点直白了。不过我想让你体会的是这一波操作的过程。

你有什么感受吗？把一个两位数乘以 18 可能让你感到了一点痛苦。你必须兢兢业业准确无误地按我说的步骤操作，才能得到我想要的结果。你没有自我发挥的余地。

在这个过程中，你是一个 computer。

## 1.计算师

Computer 这个词，现在我们都翻译成“计算机”。但是这个词最初的含义，可是指人。早在十七世纪就已经出现了 computer，也许应该叫做“计算者”或者“计算师”。计算师不是数学家也不是工程师，他们是专门做计算的人。

二战期间，计算师甚至还是美军一个专门的编制。当时美军发明了射程能达到好几英里的大炮，而这个大炮怎么瞄准，就涉及到很复杂的计算。要算一个瞄准角度，你至少必须考虑目标到你的距离，目标跟你的高度差，以及当时战场上的风速。

如果你学过物理，你应该知道怎么算。但是，在战场上找个懂物理的人现场拿三角函数解方程可就太慢了。计算跟“会算”是完全不同的要求。美军必须把整个计算给流程化，变成标准操作，而且还得能让好几个计算师一起算。这就要求这个计算方法满足三个条件 —— 

第一，计算过程必须被拆解成很多步骤，每一步干什么必须是简单而明确的。比如这一步就做个加法、下一步就查个三角函数表，在下一步是除法，等等。

第二，所有这些步骤要能拆分开来，分给几个计算师，各自负责其中的一部分。而这就有个交流问题，各个计算师算出来的东西得汇总在一起，形成一个最终的结果。

第三，还得有个纠错机制，让计算师们能觉察到自己哪里算错了。

按今天的概念，这其实就是“分布式并行计算”。这不但是计算机方法，而且还是超级计算机的方法。所以你看，我们可不是先有了计算机之后才有的计算机思维。人们早就有了计算机思维，只不过当时没有机器可用、只能用人。

这一波流程化的操作，叫做“算法”。“算法（algorithm）”这个词，也早在十七世纪就有了。

现在已知最早的一个算法，是欧几里得在公元前300年发明的计算两个整数的“最大公约数”的方法，咱们中国人通常称之为“辗转相除法”。两个数的最大公约数，就是能同时被这两个数整除的最大的数，比如 18 和 48 的最大公约数是 6。你肯定会算最大公约数，但是你的计算方法需要自身的理解和直觉 —— 如果你仔细想想，你也许会发现自己有点说不清是怎么算出来的。

而欧几里得提出了一个得到最大公约数的标准操作。给定任何两个数，它们的最大公约数，和这两个数的差与其中较小的那个数的最大公约数是一样的。使用这个方法，你只做减法就能得到最大公约数！比如我们用 gcd 表示最大公约数，那么 —— 

gcd(48,18) = gcd(30,18) = gcd(18,12) = gcd(12,6) = gcd(6,6) = 6.

欧几里得可能没想到，他发明的这套操作，到现在仍然在被计算机使用。

## 2.算法的妙处

说到这里你应该看出来了，能提出算法，和自己会算，完全是两码事。算法最大的好处就是它是机械化的操作。

有了欧几里得这个算法，操作者根本就不需要知道什么叫最大公约数，他甚至不需要知道我们为什么要做这个计算，他只要会算最基本的加减乘除，能够严格地执行规则就行。这就实现了可推广。

想要现场解决一个数学问题，原本你需要找个专家才行。专家有多年知识储备和技巧训练，他会用到巧妙的构思，很可能还有些说不清道不明的直觉，才能给你解决。可是专家太贵了。而如果我们能把一类通用的问题给算法化，你就不再需要请专家了。你只要雇些计算师就行。

算法化就是标准化和流程化。这其实就是整个机械化大生产的秘密！我们看麦当劳的食物，味道也可以，卫生也放心，价格也便宜 —— 而你去吃的那家麦当劳，可没有著名的厨师。每个麦当劳里的食物都是一样的。任何人经过简单的培训，都能给你操作出麦当劳食品来。麦当劳有自己的研发中心，它始终在测试不同的口味和营养搭配，但是因为它会算法化，它只要定型一个，就可以推广到所有。

麦当劳只恨做饭的不是机器人。人们从十七世纪开始就在琢磨怎么让机器去做计算，而且发明了构思巧妙的计算机，只是因为没有电子管晶体管这些东西，那时候的计算机不能取代计算师。

我忍不住就想，如果人类一直没有发明电子计算机，我们今天就会有一个叫做“计算师”的职业。这很可能是一个白领工作。计算师们很可能会使用中国的算盘做各种计算，还要背诵三角函数表和对数表。他们会被分成从初级到高级的职称，会有自己的职业道德和职业规范。他们可能都穿着统一的职业装，发型一丝不苟……

但是，那将是一个非常低端的工作。做计算师不需要什么聪明才智。

而要想比他们挣得多，要想领导他们，你就得掌握计算机思维。

## 3.计算机思维

古人对计算的钻研可不仅仅是算法，哪怕是没有计算机的时代，那些最聪明的人就已经想得很深了。十七世纪尚未发生工业革命，但是启蒙运动已经开始了，牛顿已经出来了，“理性”已经在知识分子中深入人心。

就在十七世纪，笛卡尔和莱布尼茨就有一个设想，说既然计算可以变成流程化、算法化的操作，那能不能把人的推理，也给机械化呢？

今天我们都爱谈论各种心理学意义上的偏见和谬误。启蒙时代的人就已经知道，让人去推理，是非常靠不住的。人会有各种主观的判断、有很多情绪化的东西。那如果我们能把一切理论的推理都给标准化、流程化、机械化，不管是谁来操作，只要你严格遵守规则，就一定能推出客观的、正确的判断，这岂不就解决了一切争论吗？这不就是通往真理之路吗？

笛卡尔和莱布尼茨想要的，是冷酷无情的计算。

这恰恰就是计算机思维的第一原则：把人的情感和主观判断排除在计算过程之外。

好消息是我们现在已经取得了很多很多进展。后世的学者发明了像“布尔代数”、“谓词逻辑”这些理论准备，信息论祖师爷香农发明了用电路实现通用逻辑运算的方法 [2]，而且我们有了速度无法想象的快的计算机……今天真的有很多理论推导，可以交给计算机去做。计算机甚至能证明数学定理。

但是，坏消息是计算机不能解决所有的问题。现代计算机的祖师爷，图灵，用“图灵停机问题”说明，哪怕在理论上，计算机也无法通过阅读一段算法来判断这个算法到底是能自动执行到停机呢，还是会永远计算下去。我们专栏还讨论过“哥德尔不完备性定理”，我们知道笛卡尔和莱布尼茨的那个梦想哪怕在数学上也是不可能实现的。

但是，我们仍然得到了一个自动化的时代！这个时代的计算机所能做的事情，一定会让十七世纪那些思想家和计算师大开眼界。

*

哲学家的思想总是领先于技术实现，而老百姓的思想则被技术所左右。

每个时代的技术，都会主导这个时代的人的思维。老一辈的人爱说“压力很大”、“动力十足”、“把压力化为动力”，这其实是一种暗喻 —— 是把人给当成了蒸汽时代的机车。而今天的年轻人则善于用计算机做暗喻，会说……“我的大脑死机了”。

计算机思维已经深入到了现代生活的方方面面。这一讲我们理解了“算法”，剩下的咱们后面慢慢说。

![](https://piccdn3.umiwi.com/img/201905/12/201905122216077006168401.jpg)

