掌握算法本质背后的计算思维,尽在吴军博士《计算之魂》这本书中

Posted 人邮异步社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了掌握算法本质背后的计算思维,尽在吴军博士《计算之魂》这本书中相关的知识,希望对你有一定的参考价值。

计算机科学是20 世纪 40 年代以来发展最快、影响力最大的学科之一,也是许多 国家大学生首选的专业。一个计算机专业的学生,从大学生开始,到成为一般的从业 人员,再到专家学者,最后能走多远,在很大程度上取决于他 / 她在计算机科学领域 的素养。这些素养既包括对计算机科学本身的理解,也包括利用计算机软硬件知识来 解决现实世界问题的能力。虽然今天有很多介绍计算机各个领域的优秀图书,但是依 然缺乏一本全面论述计算机科学特色的图书,吴军博士的《计算之魂》一书在一定程度上填补了这个空白。

顾名思义,《计算之魂》讲述各种计算机理论和算法的灵魂,帮助读者全方 位、深刻地了解计算机科学,培养一种善于利用计算机解决问题的新的思维方 式,从而在计算机领域获得更大的成功。作者吴军把这种思维方式概括为计算思维。

作者在书中结合自己对计算机工程师的五级分级标准,详细讲解了每类题目不同层次的解决方法、不同水平的人大约能思考到什么样的深度,深度阐述题目背后的计算机科学精髓。通过对比优化解题思路,读者不仅可以衡量自己的水平,在职业的发展道路上走得更快,更可以深刻理解并掌握计算机科学和计算思维,逐渐把握计算机科学这门艺术,获得重复性成功。

对于所有有志于了解或学习科技,特别是计算机科学的人来讲,本书不仅有助于了解计算机科学,更有助于了解 IT 产业的技术特点、培养一些特殊的思维方式、掌握信息时代特殊的做事方法,通过具体的例子,从“术”的层面获得“道”的层面的提升。

有了对计算机科学本质的认识,一个计算机专业的学生,通过一段时间的刻意练 习和经验积累,就有可能成为计算机领域的专家。而练习则需要讲究方式方法,《计算之魂》就为广大的计算机行业从业者提供了许多提升能力的有效方法。这些方法来 自于作者在计算机领域多年的从业经验。

在《计算之魂》中,吴军将他 20 多年的研究和从业经验,以及他对计算机科学 的深刻理解无私地分享给读者朋友。这些宝贵的经验有助于每一位从业者加深对计算 机科学的理解,少走很多弯路,加快进步的速度。

《计算之魂》前言

一个“码农”能走多远? 如果不断努力而且方法得当, 能走很远很远: 能够获得 图灵奖,成为工程院院士,也能成为改变世界的人物。

在 Google 最有名的几个“码农”中,肯尼思 ·汤普森(Kenneth Thompson)早 年发明了 UNIX 操作系统,获得了图灵奖;杰夫 ·迪安(Jeff Dean,也译作杰夫 ·迪 恩)、桑杰 · 戈马瓦特(Sanjay Ghemawat)和阿米特 · 辛格(Amit Singhal)很早 就已经是美国工程院院士了,他们分别写了Google 云计算、深度学习和网页搜索 排序的主要代码;安迪 ·鲁宾(Andy Rubin)写了今天全世界几十亿人使用的安卓 (android )操作系统,事实上安卓是由 Andrew (安德鲁)的字首“Andr-”和含义 为“小东西”的后缀“-oid”组成的合成词,字面含义就是“安迪做的小东西”—— 虽然它还有另一层含义是“一个小机器人”。当然,大家更愿意称呼他们为“计算机 工程师”或者“计算机科学家”,尽管有时这两个身份很难分清。据我的观察,汤普 森至今仍在写代码,他从不担任任何管理职务,以琢磨计算机科学中的问题为乐趣。 汤普森进入 Google 时已经 63 岁了,在 Google 期间他又开始琢磨自己比较陌生的大 数据的问题,并随后发明了 Go 语言,专门处理海量日志。

“码农”和计算机工程师其实并没有明确的界限,他们每天都在和计算机代码打 交道。只不过前者多少带点儿贬义,毕竟今天能写几行代码的人随处可见。计算机工 程师在某种程度上是自己往自己脸上贴金,在外人眼里他们再普通不过了。

但是, 同样是计算机工程师, 不同人的水平、贡献和影响力可谓有天壤之别。有 些读者读过我之前写的一些书,知道我喜欢用朗道的方法,将计算机工程师分为五 级。一级工程师的贡献是二级的 10 倍,二级是三级的 10 倍,以此类推。当然,他 们的贡献和收入常常存在指数上的差别。朗道给的是物理学家的划分原则,我在《见识》一书中提出了一个对计算机工程师和科学家的分级准则,大致是这样的。

五级: 能够独立解决问题,完成工程工作。一个能够独立工作、很好完成任务的 工程师,属于五级工程师,Google、微软和 Facebook 里面一半左右的工程师属于这 一级。部分 IT 企业里写代码的人,很多还达不到五级工程师的要求,因此被称为“码 农”也不算太过分。

四级:能够用已知的最优方法(state of the art )解决问题,并指导和带领其他人 一同完成更有影响力的工作。很多公司里所谓的技术专家、技术大拿,大致就是这个 水平。

三级:能够解决前人未解决的问题,并且能独立设计和实现产品,在市场上获得成功。目前普遍的情况是,在大部分 IT 企业中能够达到这个水平的人非常少,他们 通常是企业里的总工程师或者总架构师。这个级别的工程师在 Google 或者微软里却 不少见。

二级:能够提出重要的计算机理论和实践中的新问题,并解决它们,还能设计和 实现别人做不出的产品,也就是说这一级的人的作用很难取代。

一级:能够开创一个产业,或者奠定一个学科的基础。

每一级在各个维度差出 10 倍。

按照这个标准,杰夫 ·迪安、桑杰 ·戈马瓦特 [1]、阿米特 ·辛格 [2] 和安东尼 ·拉 万道斯基(Anthony Levandowski)[3] 可能在 1.5 级,安迪 ·鲁宾 [4] 或许能接近一级。 而我们这本书中反复提及的高德纳才是真正的一级,因为他奠定了计算机算法的基 础,我们今天所有和算法有关的工作都是以他为我们设置的平台为基础的,此外他 还是排版软件 TeX 和字体设计系统 Metafont 的发明人。人类社会向来不缺乏聪明人, 但是目前计算机工程师的水平达到一级的很少,这说明我们的聪明才智显然还有进一步发挥的潜力,这对“码农”和计算机工程师来讲是个好消息,因为可以自我提升的 道路还长得很呢!

关于五级工程师的理论,我多年前就在很多场合讲过,在这个行业里很多人都知 道。很多人毫不谦虚地把自己定在了四级或者三级,这其实是高估了自己,或许是因 为过去给出的计算机工程师最低的一级是五级。一些刚毕业进入大计算机公司的人和 我讲,我现在是五级,争取两年内达到四级的水平。我说,“不,你现在最多算是六 级,先要达到五级的水平”,于是我在五级的下面又加入了两级。

六级:能在他人指导下完成计算机工程师的工作。那些水平还不错的大学的计算 机专业硕士毕业生,或者在一流计算机公司里工作过半年、过了见习期的新人,大约 就是这个水平。

七级:本科毕业自水平不错的大学的计算机专业,但没有参加过六个月以上实习 的学生。也就是说课程的内容都学过了,就能达到这个水平。当然,从小就接触编程 的计算机天才,他们可能在高中就达到了这个水平。

因此,从本科毕业到三级计算机工程师,中间要跨过四道坎,如何跨过前两道 坎,不是我们这本书要讲述的内容,因为这两道坎绝大部分人都很容易跨过去。我们 把重点放在如何跨过后两道坎上,也就是通向三级计算机工程师之路。

怎样才能继续往上走呢?根据我的经验和我与上述计算机工程师的接触,若有志 成为最好的计算机工程师要解决四个问题。

1.判断什么事情能做,什么不能做。从事计算机科学行业的人,最重要的一点 就是要明白做事情的边界,然后在边界内做改进。比如了解今天的人工智能能做什 么、不能做什么就很重要,否则很多努力都花在了制造不可能实现的永动机上。在 这本书中,我还会不断介绍计算机科学中的各种边界,从数学的边界,到图灵机的边 界,再到计算机系统和各种算法的边界。

2.任何重大发明都有预先要求(pre-requisites),比如要烧制瓷器,就要能将炉 温长时间保持在 1300℃,后者就是预先要求。在计算机领域也是如此,在尝试前人 未做过的事情时,要知道预先要求是否已经满足。这一点在应用型的研究以及工程当 中至关重要。

Google 的迪安等人最早开发云计算的时间是 2001 年,在他们之前其实类似的工 具就有了,1997 年我在约翰 · 霍普金斯大学进行大规模计算时就用到了加州大学伯 克利分校开发的一些并行处理的工具,它们从计算机科学的角度讲和今天的云计算 很相似,但其操作是手动的。在那个年代互联网的速度不够快,以至于跨数据中心的 并行计算完全不可行,让外行来使用上千台服务器的可能性也很小,因此开发云计算 的条件不具备,需求也不强烈。但是, 进入 21 世纪之后,互联网骨干网的网速使得 异地并行计算成为可能,而大量信息处理的需求让很多非计算机专业的人士(比如生物领域的)需要一个自动调动计算资源的工具。Google 的云计算工具便应运而生 了。Google 关于并行文件系统 GFS 的那篇论文,引用的数量超过了之前所有异地并 行存储论文的总和,因此你可以认为这项工作是具有开创性的,而且异常成功;迪安 和戈马瓦特当选美国工程院院士,那篇论文在一定程度上起了作用,但它并非同类论 文的第一篇。迪安和戈马瓦特的成功之处在于,他们很清楚在什么时间点去发明什么 技术。

3. 对计算机科学的深刻理解。这种深刻理解包括空间上的和时间上的。所谓空 间上的,就是知识的广度和深度。所谓时间上的,就是从计算机科学的过去、现在和 未来看清楚它的发展变化规律。有了这样深刻的理解,才能在遇到复杂问题时找到最 简单而有效的解决方法。我在《数学之美》中介绍了辛格博士,他能用很简单的方法 解决很复杂的问题,这就如同一位米其林大厨,能够用很简单的食材做出美食一样, 但这是建立在他对网页搜索以及整个计算机科学深刻理解基础之上的。辛格遇到问 题时,能知道简单的答案在哪里,这是他在空间上全面理解计算机科学的结果。2010 年后,辛格开始越来越多地将机器学习用于 Google 的网页搜索,而在此之前,他很 少这么做。他选择那个时间点,是因为清楚当时采用机器学习的条件(包括算法和数 据)具备了。

4. 掌握计算机科学的艺术。计算机科学发展到后来成为一门艺术, 因此高德 纳(Donald Knuth,高德纳是他的中文名)将自己的作品起名为《计算机程序设计艺 术》是很有道理的。将计算机科学掌握到炉火纯青、运用之妙存乎一心的地步,需 要体会出这门学科中的一种美感。也就是说对于从业者来讲,要完成从工匠到艺术 家的升华。下围棋的人都有这样的体会,如果走了一步棋后,棋盘上的棋看上去很 别扭,这通常不会是好棋;研究物理的人也会有类似的体会,一个理论的公式如果 修修补补得很难看,通常这个理论是不完美的。在计算机科学领域也是如此,如果 一个问题是靠一堆拼凑出来的、修修补补的程序勉强解决的,说明工程师对这个问 题根本没有认识清楚。很多看似复杂的问题,其解法都非常漂亮。比如哈夫曼编码算法、网页排名(PageRank)的算法、图论中最短路径的算法以及图遍历的算法 等,都是极为漂亮的。我在书中会大量列举这样的例子,向大家展示计算机科学的 艺术。

吴军

2021 年 10 月

《计算之魂》目录

 

关于作者

以上是关于掌握算法本质背后的计算思维,尽在吴军博士《计算之魂》这本书中的主要内容,如果未能解决你的问题,请参考以下文章

本周上榜的这9本原创技术书很赞,《数学之美》作者吴军博士新书霸榜

《计算之魂》阅读随笔--(零)计算的本质

掌握计算机科学的精髓,从这本豆瓣评分9.3的书开始

编程书籍:豆瓣评分8.0以上,2021年程序员新书大盘点

2022年程序员开工第一周,应该收藏这样一份书单

计算机基础学习路线