分享

具备了计算思维,你就可以四两拨千金

 金苹果6 2022-07-30 发布于北京

李开复博士在《AI·未来》一书中指出,中国科技界有一项“天然资源”,就是多到爆炸的数据。这些数据必将催生诸多赚钱的人工智能企业。而对于程序员来说,要想抓住新时代的红利,就要具备计算思维出众的算法能力

吴军老师集十年之功,写成一本《计算之魂》,帮助程序员提升自己,去抓住未来的红利。吴军老师是自然语言处理的计算机专家,也是优质高产的作家。

熟悉他作品的读者可能都会有疑问,这本书到底说的是什么,为什么需要十年时间来完成它?

因为吴军老师想要告诉程序员们,计算思维才是最重要的核心能力,以及如何去培养它。所以这十年,是吴军老师系统思考的过程,它凝结出的思想结晶,就是计算、计算机科学的魂之所在。

培养计算思维的第一步,就是要能够将现实问题转化为可计算的模型,接下来我们就从这一步开始说起。

工程师的七个等级

程序员要先对自己有一个清醒的定位,然后才知道朝着哪些方面去努力。吴军老师参照苏联科学家朗道给物理学家划分等级的方式,给程序员划分了七个等级。

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

第二级:能设计和实现别人不能做出的产品。

第三级:能独立设计和实现产品,并在市场上获得成功。

第四级:能指导和带领其他人完成有影响力的工作。

第五级:能独立解决问题,完成工程工作。

第六级:能在他人指导下完成工程工作。

第七级:能完成大学课堂作业水平的编程工作。

只看描述的话,你可能会挺自信地觉得自己能在三级,或者够上二级。那么看看吴军老师给自己的定位吧,是2.5级。也就是过了三级,但还不到二级。是不是有点被吓到,那第一级的得是什么人物?

第一级上站着手拿图灵奖的各路宗师,二级上则是谷歌这种世界顶级大厂里的技术领军人物,三级可以对标国内大厂的首席架构师。四至七级则可以从字面意思上来理解。每一级之间的差距可以理解为一个数量级,即十倍的差别。

所以这个列表不是国内大厂里的职级晋升表,而是对程序员纯粹实力的评判表。其实吴军老师也提到,大多数程序员能做到三级就很了不起。

大家不妨对照着吴军老师给自己的评级,再评估一下自己的级别,接下来就是努力学习怎样不断突破自己的天花板吧。

建立现实问题与计算的桥梁

今天的计算机功能很强大,但它并不是无所不能的,我们首先要知道计算机能解决哪些问题。这要感谢英国科学阿兰·图灵的研究工作,他为计算机划下了一条边界。

这条边界就是:计算机能解决的是那些通过有限步计算,明确能得出结果的问题。有了这条边界,计算机才算是从理论走向了实用。

那么,要将现实问题转化为计算机可解决的问题,这就要在数学上找到问题的最优解,程序员的算法能力就特别重要。

学习算法的第一步,不是刷一堆题,而是先要理解数字量级变化的差距,以及学会分析算法的时空复杂度。

例如问到int32与int64所容纳的数量,它们之间的比例应该是什么样的?

初学者脑子里也许会出现芝麻和西瓜的对比。但实际上用芝麻和摩天大楼来对比,才更准确一些。

算法的复杂度,初学者会理解成程序实际运行的benchmark值。例如对少量数据用插入排序花费5毫秒,用快速排序花了1毫秒,得出结论两种方法相差五倍,这就掉到坑里去了。

分析算法的复杂度,是假定问题中变量的值,向着无穷大的方向增长时,解决问题的算法所体现出的性能差异。大学的算法课上,老师首先讲的就是O()标记的性能计算方法,希望大家都还记得。

能够为现实问题找到数学上的解,那么接下来就要计算机上去实现它。透彻理解计算机的工作方式,掌握计算思维就是程序员摸向天花板的梯子。

吴军老师认为计算思维中最重要的首推递归思维,它是一种自顶向下,先整体再局部的思考方式。其次就是分治思想,它的核心原则是将规模很大的问题,分解成较小的可计算的子问题,再将子问题的处理结果合并,从而得到最终解。

我们先从递归思维开始说起吧。

递归:自顶向下解难题

看下书中一道简单的面试题:

有一层20级的楼梯,你从第一级开始往上走,每次可以跨一级或者两级,直至20级。比方说:1,3,5,6,8,10,12,14,16,18,20就是一种,那么从1级到20级之间可以有多少种走法?

有的面试者会从第一级开始逐级研究有多少种可能,然后寄希望找到规律,总结公式来解决问题。这种从前往后,从小到大的推导方式符合人的自然直觉,也被称为递推方法(Iterative)。但递推的计算方式解这道题会比较复杂,面试者很难在几十分钟内完成。

递归(Recursive)与递推相反,它是一种逆向思维。递归是自顶向下,先全局后局部的思维方式。

那么用递归的思想来解决,先假设F(20)是最终解,那么要走到20级,就得先走到19或者18级。那么F(20) = F(19) + F(18),可以总结出递归公式:F(n) = F(n-1) + F(n-2)。

那么第一级只有一种情况,就记为F(1) = 1,第二级为F(2) = 2,第三级套用递归公式计算,为F(3) = 3,第四级为F(4) = 5 ……

所以最终结果F(20) = 10946。有同学可能已经看出来了,这就是斐波那契数列。如果把问题换成求斐波那契数列的第N项值,估计同学们很快就能做出来。这就是将现实问题转换成可计算的过程

递归之所以能够解决难题,吴军老师总结其有两个主要优点:

第一,解决当前的一步问题,就能解决全部问题。例如上面计算梯级走法问题里,要计算20级,只需要关心19级与18级就可以,以此类推。

第二,每一步的解决方法都是相同的,程序只要反复调用就可以。这就是调用自身的形式,但必须要有结束条件,否则就产生无法终止的函数调用。

分治:化繁为简好计算

分治思想,它是将规模很大的复杂问题,分解为简单可计算的子问题,求解后合并,得到最终的结果。

引用书中对于分治思想的实现步骤,表述如下:

第一步,分割(divide):将一个复杂的问题,分成若干个简单的子问题。

第二步,解决(conquer):判断子问题是否易解,如是直接计算返回;否则再将子问题分解至易解。

第三步,合并(combine):将每一层的微小局部结果逐级合并,直至最上层得到完整问题的解。

有同学会觉得,这跟把大象关进冰箱有什么区别?看起来好像是,但举个栗子,同学也许会改变想法,这个栗子也跟大象有关。

曹冲称象的故事,大概是最典型的分治思想应用。曹操的部下按照常规思维出主意,要么造个超大的秤(超额消耗资源);要么把大象宰了剁成片来称(不能解决问题,就解决造成问题的对象)。

聪明的曹冲想到了这个问题的等价情况,这就为分割建立了基础。所以第一步分割,就是将石头一块一块地搬上船;第二步是解决,判断所有石块重量与大象等重了,就逐块地称重;第三步就是合并,将所有石块的重量相加。

吴军老师在书中提到,谷歌提出的MapReduce编程模型,就是分治思想的典型应用。

将一个大任务拆分成小的子任务,并且完成子任务的计算,这个过程叫做Map,对应于分治思想中的分割。将中间结果合并成最终结果,这个过程是Reduce,对应分治思想中的合并

MapReduce开启了云计算的时代,使用大量廉价的服务器,就可以并行实现大数据的分析与处理,从而构建起高效可伸缩的弹性云服务。

而MapReduce的两位主要发明者,是Jeff Dean 和 Sanjay Ghemawat ,这对共用一台电脑编程的好兄弟。这个成就,说明他们具备了二级工程师的水平。

这就是修炼思维的重要所在,别人只会大力出奇迹,而具备了计算思维,你就可以四两拨千金。

结语

谷歌公司招人的标准非常之高,候选人被谷歌录取的难度,是被哈佛、斯坦福这类顶尖大学录取难度的20倍。因为其创始人 Larry Page 与 Sergey Brin 认为一个优秀的工程师的生产力,是平庸工程师的五十倍。

那么,对于程序员来说,修炼计算思维,善于在现实问题与计算之间建立桥梁,寻找问题的最优解,就是走向优秀工程师的必经之路。

书中开列的算法面试题是一大亮点,吴军老师曾笑称,能全部解出来的,世界上的顶级大厂可以随便进。但我想他的目的,并不是将这本书定为大厂敲门砖,而是以具体问题引出思考的逻辑,说明计算思维的奥义。

《计算之魂》给程序员们指明了前进的方向,但并不意味着可以一蹴而就。这仍然需要程序员打好计算机科学的基础,对问题善加思考,不断挑战自己,在理论学习与工程实践中逐渐成长,直至触及程序员的天花板。

Image

本书是吴军近十多年的技术与思考沉淀力作,他将人文历史与计算机科学相结合,通过一些具体的例题,分10个主题系统地讲解了计算机科学的精髓。

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

文章编辑:阿诺   审校:桐希

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多