IT从业者怎样才能走得更快、更远?吴军博士新书给了答案

人邮异步社区 2023-02-17 09:04:13

如果推荐信息技术产业的必读书,《浪潮之巅》是绕不开的一本。很多已经工作了的人看完后的第一反应是“太遗憾了”,遗憾为什么没能在大学期间阅读这本书。

这本书或许能给迷茫大学生们一个看待未来发展的新视角,理解产业变迁的大势,进而在选择从事的行业时有所判断。

刘未鹏在博客文章《怎样花两年时间去面试一个人》里谈到

有足够多的人足够早就开始焦虑就业的事情,包括大学生和职场新人。

很多人在本科就希望整点东西出来,他们有一腔的激情和抱负,有强大的动力,但就是不知道自己需要掌握哪些技能才能满足雇主的要求,求告无门,整年整年苦闷的像没头苍蝇一样乱撞。

往往很想学点东西,但又不知道哪些重要哪些不重要,到底该学到什么程度,不知道导致不确定,不确定导致决策瘫痪,干脆嘛也不动,荒废时间。

还有很多人想投入精力,去学习和实践,去成为企业需要的人,但是他们就是不知道往什么方向走,所谓有动力没方向。

 

计算机是许多国家大学生首选的专业,每年都有无数的计算机专业毕业生涌入就业市场,怎样在大学期间学习并提升自己的专业能力?怎样在职业发展上快速成长、走得更远?

这两个问题每个年轻人都会遇到,但又缺少指导。

就像《数学之美》让很多人由衷认同“数学知识除了用作科学家们的头脑游戏以外,确实有非常令人惊叹的实际应用”。

2021年吴军博士的新书计算之魂》,则让很多计算机从业者,不仅是行业内的新人,还有很多从业多年的专业人士爱不释手,感叹于计算机科学于算法的“有趣而且有用”。

5折购书链接:https://item.jd.com/13515688.html

 

对于计算机行业的从业者,这本书不亚于一位道行高深的前辈,提供了做事情的正确方式。

在开篇先划定了从业者的七级标准,然后以不同的问题,从不同的角度分析,要达到某一等级需要具备怎样的知识或能力。

书中也给出了具体的人物作为例子,参考分级说明他们高超的水平。

这就让读者有了前行标杆,然后再通过十大模块逐步修炼内功(计算思维)和基本功(计算机科学的掌握与实际应用能力),两者相辅相成,进步与提升自然就只是一个静待花开的过程。

对于非IT行业的从业者,可以略过计算细节,而将重点放在计算机科学特殊的思维方式上,体会一些信息时代特殊的做事方法。

 

 智力题的背后是另一种思维方式 

 

有一个挺广泛的游戏——抢20

你和一位对手来做一个游戏。你们其中的一个人先从 1 和 2 中挑一个数字,另一个人则在对方的基础上选择加 1,或者加 2。

然后又轮到先前的人,你或者他可以再次选择加 1,或者加 2。之后双方交替地选择加 1 或者加 2,谁正好加到 20,谁就赢了。你用什么策略保证一定能赢?

这些计算机相关的有趣问题还有很多,很多人在面试中也会被问到,比如汉诺塔问题、七分黄金问题、小白鼠试验问题、两个玻璃球问题、25名选手竞争前三名问题、捕鼠策略问题、三对老虎过河、12球问题等,

这些看似智力题的背后,其实考察得是计算机科学与计算思维方式

《计算之魂》通过这些有趣的问题以及头部互联网企业的面试题,将看似艰深、庞杂的计算机科学知识拆解成了10个相对独立的模块,在每个模块内由浅入深、逐步剖析原理,结合产品分析理论、算法在实际应用中发挥的大用途。

让读者领悟计算机科学的精髓,培养一些特殊的思维方式、掌握信息时代正确的做事方法

 

  计算思维  

 

从卡内基梅隆大学周以真教授提出“计算思维”一词,到少儿培训机构对孩子的各种思维培养的宣传,似乎不提计算思维都有点落后了。

但到底什么是计算思维?怎么才能培养计算思维?真正讲透这两个问题的文章或书几乎没有。

一般计算思维的讲解都会谈四个基本步骤:分解、模式识别、抽象、算法,以及三个延伸方面:建模、评估、泛化。这几个词都非常抽象,用李国杰院士的话来说就是“从概念到概念”,更不提掌握其核心思维了。

把很多看似神秘的词讲透一直是吴军博士写作的最大特点。我直接引用了《计算之魂》中对计算思维的解释:

“和人不同,计算机在一开始就被设计用来处理规模大得多的问题,因此计算机有条件采用与常人完全不同的方式来解决问题。

如果一个人能够站在计算机的角度想问题,我认为他具有“计算思维”,这就如同我们说某个人具有科学思维或者工程思维一样。”

也就是说计算思维是一种解决问题的方式方法,是可以习得的。

不过,我们对这个世界的认识是由近及远,从少到多,一点点扩展开来的,这就是人类固有的认知和思维方式,根植于我们的基因中。这样的认知和思维方式让我们很容易理解具体事物,但是限制了我们的想象力和大局观

《计算之魂》里讲了计算机科学的10大模块内容,与人类思维方式不同的地方很多都进行了说明。比如编码,简单理解就是给事物命名,比如起名字、街道名等。

但我们生活中的编码一是没有考虑重复问题,而且是从具体经验逐步抽象出来的。

但计算机编码从设计之初就是为了区分不同对象的,在一开始就先根据需要区分的对象的数目设计好编码,再把真实世界里的对象对应到某个编码中,因此计算机中的编码从一开始就是抽象的。

吴军博士认为,培养计算思维的关键是突破“三关”

 

01

 递归——逆向思考 

 

讲递归需要先讲递推,递推是人类本能的正向思维,我们小时候学习数数,从 1、2、3 一直数到100,就是典型的递推。

与递推相对应的是递归,如果用递推的方法计算一个整数的阶乘,比如 5 的阶乘,要从小到大一个个乘起来,即 5!=1×2×3×4×5。

那么如果用递归的思维怎样计算阶乘呢?它要把上述过程倒过来。比如要算 5!,先假定 4! 是已知的,再乘以 5 即可。

当然,大家会问,那 4!怎么算呢?很简单,采用同样的方法,把它变成 3!×4。至于 3!,则用同样的方法处理。最后做到 1! 时,我们知道它就等于 1,至此不再往下扩展了。接下来,就是倒推回所有的结果,从 1!、2! 一直倒推回 5!。

递归是一种自顶向下、先全局后局部的逆向思维。

如果用递归的思想来解决开篇的“抢20”问题,就会很清晰了。

要想抢到 20,就需要抢到 17,因为抢到了 17 之后,无论对方是加 1 还是加 2,你都可以加到 20。而要想抢到 17,就要抢到 14,以此类推,就必须抢到 11、8、5 和 2。

因此对于这道题,只要你先说出 2,你就赢定了。这便是递归的思想。顺着这个思路想问题,无论是抢 30 还是抢 50,都可以这样处理。这里面最核心的地方在于,要看清楚无论对方选择 1 还是 2,你都可以控制每一轮两人喊出的数字总和为 3,从而就可以牢牢控制整个过程了。

 

02

 分治——分而治之 

 

在复杂、庞大的老大难问题前面,人容易产生拖延症。一个有效的解决方法是把问题拆解,化大为小,化繁为简,逐一攻克。

计算机虽然相比人类能处理规模大得多的问题,而且计算速度非常快,但是世界上依然有很多规模巨大的问题不方便直接解决,这要么是因为计算量太大,要么是因为数据量太大、占用资源太多,当然也可能两者兼而有之。

比如大规模矩阵相乘,矩阵的横、竖两个维度都为几亿个,这样的矩阵相乘无法在一台服务器上直接完成,甚至不可能用一台服务器存储下来。

这类问题的解决关键是善用分治算法,其原理主要是以下三步

 

首先,它将一个复杂的问题分成若干个简单的子问题进行解决。这一步被称为分割(divide)。

然后,解决每一个子问题。这一步被称为征服或者解决(conquer),也就是分治这个词中“治”的来源。在这一步中,如果子问题非常简单,就直接解决了;如果子问题依然很大,那么还需要递归调用分治算法,把子问题分成更小一级的问题来解决,直到那些被分出的子问题能够直接解决为止。

 

最后,对子问题的结果进行合并(combine),得到原有问题的解。

在《数学通识50讲》的发刊词中,吴军博士介绍了自己准备的这一数学课程的特色:把一门数学课从完整的体系变成一个个的知识点,讲透之后,再还原回体系。比如,再难的几何题,其实最终都可以拆成五个最基本的公理。

这五个公理,又可以推导出几何学的任何结论。就如同几种乐高积木可以搭出任何形状一样。这一过程其实就是对分治思想的应用。

分治思想不仅在构建学科知识体系上有用,吃透了原理,在工程上能解决别人看来无解的问题。

MapReduce是谷歌开发的一种分布式计算框架,用于大数据的并行处理,帮助工程人员很方便地利用云计算所提供的巨大计算资源,完成对超大规模任务 的计算,同时利用并行处理缩短计算时间。

MapReduce 的设计者们不仅知道如何将大量复杂的计算问题通过分治算法来解决,而且还能够开发出一种比较通用的工具解决一大批问题,远远超出一般的从业者。

 

03

 平衡——空间与世间 

 

郑纬民院士在推荐序中说的,“人们平时在追求卓越时,通常追求的是单一的指标。"

但是在应用计算机算法时,我们始终要考虑成本和效率之间的平衡,特别是在时间和空间上的平衡。任何一个资深的计算机行业从业者,都应对此有深刻的认识。”

计算机的存储结构就是时空权衡的一个最佳例子。计算机本质上是传输、处理和存储信息的机器。

处理器内,第一级高速缓存 L1的访问速度最快,但容量最小;第二级高速缓存 L2的访问速度比L1慢,容量比L1大;第三级高速缓存 L3,但L3 的容量相比 L1、L2 都大了很多。内存、硬盘等的容量更大,但访问速度也更慢。

计算机的存储系统本身是快速发展的,在过去的 10 多年里,云计算有了长足的发展,今天在外部存储之后又多了一级云存储。

 

他山之石,可以攻玉。不是每个人都要会编程,但学习工程师的思考方式,了解编程能做什么以及不能做什么,掌握计算思维,对我们的职业发展以及未来会很有帮助。比如,其中的计算机编码,对于其他学科的试验对照组设置很有借鉴意义,可以通过最少数量的试验组获得最多的信息。

 

工程思维 

 

计算机是一门注重实践的学科,一名合格的工程师除了理解算法,还需要在实际工作中历练。

这也是《计算之魂》不同一般算法书或计算机教材的地方,除了最重要的站在计算机的角度想问题(掌握计算思维),作者结合自己三十余年的工作经验,在一个个面试题的背后分析了对计算机工程师软技能以及认知上的要求,比如少做无用功、考虑问题周全、算法掌握熟练、用尽可能少的资源同时完成多项任务等。

 

01

 大数 

 

我们都知道计算机运行速度越来越快,但这个速度的变化到底有多大提升,其实我们的感觉可能不及对火车到高铁速度的提升感受来得那么直观。

虽然很多人对乔治·伽莫夫在《从一到无穷大》书中写的两个酋长感到不可思议,但在计算机处理的数据规模面前,我们能直观区别出的大数和那两位想不到比3更大的数的酋长一样,更大的数对于我们现实生活中有限的感受来说都是无穷大。

对大数的理解可以说与很多计算机知识紧密关联,甚至决定了了我们对问题、算法的判断与选择。《计算之魂》第一章就大数和数量级的概念进行了说明,再引出对算法好坏的衡量。

很多算法书都会提及复杂度O(N)、O(logN)、O(NlogN)、O(N2),因为我们对大数缺乏直观的感受,很多时候只是死记硬背下不同复杂度的优劣,这在实际中是很难灵活运用的。

很多理论教科书里都讲了,但不亲身经历一两次教训,是很难有深刻体会的。因此作者在书里穿插了大量的个人经历、参考数据,比如大学实习时做的财务软件、对10亿个QQ号进行排序等,让读者对算法复杂度在量级上的区别有相对直观的认识。

 

02

 少做无用功 

 

作为一门应用科学,计算机科学中的很多问题都没有标准答案,只有更好的答案,而寻找更好的答案是计算机科学家和工程师努力的目标。

不同算法的好坏如何衡量,不是具体问题具体分析,而是采取一致的评判方法,也即是高德纳的思想:

1.在比较算法的快慢时,只需要考虑数据量特别大,大到近乎无穷大时的情况。

2.决定算法快慢的因素虽然可能有很多,只考虑随数据量变化的因素,即N 趋近于无穷大时和 N 相关的那部分。

3.两种算法在复杂度上相差哪怕只有一点点,N 很大之后,效率可能就差出万亿倍了。

 

确定衡量标准,如何不断优化算法呢?以“总和最大区间问题”为例:

给定一个实数序列,设计一个最有效的算法,找到一个总和最大的区间。

《计算之魂》里介绍了四种算法,一步步演示了如何不断找到更优的算法

方法1:做一次三重循环,复杂度是 O(N3)

方法 2:做两重循环,复杂度是 O(N2)

方法 3:利用分治算法,复杂度为 O(N LogN)

方法 4:正、反两遍扫描的方法,复杂度为 O(N)

 

在计算机科学中,优化算法最常用的方法就是检查一种算法是否在做大量无用功。

比如,在这个总和最大区间问题里作者就分析哪些扫描、哪些加法是无用功。

在排序问题里,也逐步分析了直观的排序算法时间到底浪费在哪里、有效的排序算法效率来自哪里以及针对特殊情况更好的答案,直观地理解寻找更优化的算法的精髓就在于少做无用功,而不仅仅是背下每个算法的复杂度。

拥有了找出无用功的能力,你就能做成他人做不到的事情。曾经看到过一个很有意思的提问,有人问邹欣“如何平衡工作、写书、家庭?”邹欣的回答是“别的事我不太做,就做你提到的那些事。”

 

用我们普通人的标准来看,吴军博士可以说是非常高产、高效率的人,写了十几本畅销书、开了八个得到专栏、进行了很多线上分享,还是硅谷的风险投资人,而且每年会有专门的时间去旅游。

很多读者也在《硅谷来信》专栏中向吴老师咨询了关于提高效率的问题,虽然问题不同,但吴老师多次分享的答案核心就是一句话——“少做事”。

在决定开始做一件事前,好好选择,不能什么事情都去做。人生算法和优化计算机算法的核心是相同的,掌握判断什么是无用功的能力,少做事,做成事。

 

03

 事情的边界

 

人工智能、大数据、云计算、量子通信,在充斥着各种技术热名词的当下,《计算之魂》能让我们更好的理解技术大势和边界,冷静思考,集中精力在边界内做事。

除了各种算法的边界,吴军博士还在书中谈到了很多热门技术的边界

比如关于人工智能的极限,作者没有纠结哪些事人工智能做得比人好、哪些事人工智能不能战胜人,而是从本质上打消了“世界上所有的事情是不是计算机都能做得比人好”的担忧。

因为有答案的问题只是世界上所有问题中很少的一部分,而人工智能可解问题又只是有答案的问题中很少的一部分。作者的书中对这几个问题的关系进行了完整的论述

再比如作者在书里讲了自己遇到的关于云计算的事情。

这是一家做云计算的公司早期发生的事情。当时他们利用 Hadoop 开源软件搭建的云计算系统效率非常低。

公司的一些技术骨干就向我咨询,我一听就发现他们对于存储的理解完全不到位,比如他们花了很大的精力提高云存储中的文件系统的随机访问效率。

我明确地告诉他们,这件事做不到,各种云存储中的文件系统,比如 Google 的 GFS 或者 Hadoop,都是为了解决一台服务器无法存下海量数据而设计的,根本不是为了随机访问而设计的。

这就如同在磁盘上访问一个数据,不可能做到和内存同样快。如果他们需要提高大量数据随机访问的效率,就需要用类似 Google 的BigTable 这样建立有索引的,而且大量内容存储在内存之中的云计算工具。

不盲从、不焦虑。世界每天在变,信息充斥着周围,对问题的本质与边界有清晰的认识,我们就能能多一份理性,少一分不必要的担忧。

 

04

 置信度 

 

置信度在大学数学中有一席之地,但真正能理解核心思维进行应用则并非易事。

作者在书里讲了很多工程上的合理近似,比如高频单词二元组问题的随机抽样与齐普夫定律、矢量量化的思想等。

合理近似对于理论上讲有解,但是计算时间特别长的问题,可极大地提高问题处理的速度,让不可解的问题得以解决。

 

2016 年,Google 的 AlphaGo 战胜了李世石。事前很多著名的计算机科学家都觉得这件事是不可能的,因为下围棋的策略数量太多,是呈指数爆炸式增长的,这么多种情况搜索不过来。

Google 采用的搜索策略蒙特卡罗博弈树搜索如果不做任何近似,搜索量确实太大了,计算机无法完成。

但是相较于其他所有实用的博弈策略,这个算法做了如下两个改进。

  • 第一个改进是纵向的简化,引入了马尔可夫假设,即当前的一步棋和后面有限步的棋有关,而不是和整盘棋有关。

  • 第二个改进是横向的简化,具体讲就是在搜索时的剪枝策略,剪掉博弈树中不太可能的分枝,减小博弈树的宽度。

这两个改进能节省多少时间呢?有人可能觉得搜索时间变为了原来的成千上万分之一,其实至少能变为原来的上百万分之一。

 

05

 等价性 

 

许多经典的问题,比如上台阶问题、兔子繁殖问题等,它们的解都是斐波那契数列。更专业一些的,满二叉树、凸多边形的划分问题、N 个字符的字符串合并问题,这些问题的解都是卡特兰数。这一现象的背后是等价性。

等价性也决定了计算机和 IT 产品容易通过模块化实现,即再复杂的计算都可以等价成很多加、减、乘、除的运算,再进而等价成开关电路的逻辑运算。也就是说,只要实现了后者,就可以间接地实现前者。

在计算机科学中,我们常常会遇到这样一种情况

某个问题很难解决,不过存在一个容易解决的等价问题,于是我们会先解决那个等价问题,等到它被解决后,原来的问题也就迎刃而解了。

这就好比在几何里,虽然两个三角形全等的定义是三条边和三个角都相等,但是我们不需要直接从这些方面证明,只需要证明两个角相等、另外有一条边相等即可,后者的难度要比原先定义中的难度低很多。

在计算机科学上也是如此,计算机科学家常常要证明两件事情是等价的,而计算机工程师的工作则是要实现等价的桥梁。

比如,网约车司机和乘客、婚恋网站上男女双方、读者和被推荐的新闻、搜索关键词和广告都是配对问题。

等价的问题扮演着很重要的角色,解决了其中的一个,就解决了一批。而如果我们发现某个问题等价于一个长期以来都没有解决的问题时,最好把这个问题放一放,不要看到其中的一个表述似乎很简单,就试图去解决它们。

 

 知识地图 学习是需要方法的 

 

在《如何高效学习》一书中,斯科特·扬总结了自己的高效学习方法——整体性学习法,核心是建立起知识点间的关联,将其转变为自己的观点。

但对于大多数人来说,“上课随便听,考前疯狂记,半年忘光光”更是一种常态,因此对计算机科学是缺乏全局、系统的认识的。

《计算之魂》非常好的一点就是通过十个模块架构起了计算机科学的知识框架(尤其是其中的算法和系统结构),读者能跟随本书构建起学习计算机科学的知识地图,而不是独立的组成原理、冒泡、排序,按图索骥,自然提升更快。

在每一个模块中,融入了许多趣味十足的“智力题”、典型应用、前沿知识。比如编码,《计算之魂》中讲了分割黄金问题、小白鼠试验问题,在深度学习中应用广泛的矩阵的表示,以及音视频等信息压缩中的哈夫曼编码。

将这些看似零散的知识由浅入深、有机地组织成一个知识模块,阅读、理解起来非常流畅,不得不佩服作者对本质的清晰把握、对知识的系统构建以及出色的表达能力。

更难得的是,这是作者学习、从事计算机相关工作三十余后的心得总结,加之对精髓的重点把握与深入浅出的系统讲解,可以说解决了新手或者初学者的两大拦路虎:有什么用?太过枯燥。

算法相关的书不在少数,大学里也是重点课程之一,但真正弄懂算法的实际应用的可以说是少数,甚至很多算法工程师调侃自己是“调参工程师”。

《计算之魂》里就给了很多算法在实际产品,而且是一流产品中的应用,比如分治算法和MapReduce。虽然是老掉牙的话,但兴趣确实是最好的老师。

作者曾作为资深研究员和副总裁分别任职于Google 公司和腾讯公司。参与过非常多的面试,对于工作中工程师的核心能力以及企业在面试中对候选人的能力考查有比较深、比较准确的了解,在阅读后,我们就有了明确的使劲的方向,能力的提升也就水到渠成。

用书中的话来说就是“按照正确的方法做事情,不断训练自己,在这个领域的成功是可以复制的”。

 

 

 

 

...全文
156 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

263

社区成员

发帖
与我相关
我的任务
社区描述
作者在书中结合自己对计算机工程师的五级分级标准,详细讲解了不同层次的解决方法、思考深度,深度阐述题目背后的计算机科学精髓。
算法人工智能青少年编程 个人社区
社区管理员
  • SoftwareTeacher
  • 高博
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧