计算之魂是由吴军著作的书籍,吴军博士曾担任腾讯公司副总裁,是信息领域的知名专家。该书由两位中国工程院院士李国杰、郑纬民推荐。本书宗旨:掌握计算思维,在边界内全力以赴,把握计算机科学的精髓,成为计算机领域顶尖人才。
开端
一个“码农”能走多远?如果不断努力而且方法得当,能走得很远很远;能够获得图灵奖,成为工程院院士,也能成为改变世界的人物。Kenneth Thompson 最早发明了 UNIX 操作系统,获得了图灵奖;Jeff Dean、Sanjay Ghemawat、Amit Singhal 很早就成为了美国工程院院士,分别写了 Google云计算、深度学习和网页搜索排序的主要代码;Andy Rubin写了 Android 操作系统。
本书前言就将引出历史有卓越贡献的程序员,同时将计算机工程师分为五级。一级工程师的贡献是二级的10倍,二级是三级的10倍,以此类推,我们可以对照一下自己所处的等级,甚至还有对应的六级与七级。
五级:能够独立解决问题,完成工程工作。一个能够独立工作、很好完成任务的工理师,属于五级工程师,Google,微软和facebook里面一半左右的工程师属于这一级。部分IT企业里写代码的人,很多还达不到五级工程师的要求,因此被称为“码农”也不算太过分。
四级:能够用已知的最优方法 (state or the art) 解決问题,并指导和带领其他人一同完成更有影响力的工作。很多公司里所调的技术专家、技术大童,大致就是这个水平。
三级:能够解決前人未解決的问题,并且能独立设计和实现产品,在市场上获得成功。目前普遍的情況是,在大部分 IT 企业中能够达到这个水平的人非常少,他们通常是企业里的总工程师或者总架构师。这个级别的工程师在 Google 或者微软里却不少见。
二级:能够提出重要的计算机理论和实践中的新问题,并解决它们,还能设计和实现别人做不出的产品,也就是说这一级的人的作用很难取代。
一级:能够开创一个产业,或者奠定一个学科的基础。
成为最好的计算机工程师
-
判断什么事情能做,什么不能做:明白做事情的边界,在边界内做改进;
-
任何重大发明都有预先要求:也就是充分必要条件,尝试前人未做过的事情,判断预先要求是否满足;
-
对计算机科学的深度理解:包括空间上和时间上;
-
掌握计算机科学的艺术。
计算的本质
电子计算机是 1946 年被发明出来的,但计算机有 2000 年的历史,中国的算盘是最早的计算机。算盘是用于辅助计算的工具,与其他历史计算工具不同的是算盘打熟了,用的是肌肉记忆,人所提供的不过是机械动能,而非头脑中的运算能力。
从算盘的设计和使用上可以看出构成计算机的三个要素:计算单元、存储单元、控制单元(指令序列)。任何能计算、有存储能力、受指令控制的机器都可以被算作计算机,在这三个要素中,人们习惯于把它们再分成硬件和软件。人们通常忽视了控制部分,只注意到计算和存储,早期计算机发展的过程中,复杂度和它能够解决的问题的复杂程度是同步增加的。但是当问题越来越复杂之后,就无法制造出更复杂的计算机了,也就是说用复杂方法解决复杂问题思路走不通。
算法的规范化和量化度量
在早期的计算机中,哪些控制功能要通过开关电路做成硬件、哪些由程序控制,这个边界不清楚。直到 冯·诺依曼他当时复杂美国氢弹工程,需要进行大量的计算,EDVAC-艾迪瓦克是在 1944 年被提出来的通用电子计算机设计方案,是计算机的鼻祖。
EDVAC的意义在于它涵盖了一种通用的计算机体系结构,并且告诉后人计算机需要顶层设计的。冯·诺依曼体系结构将计算机分为了软硬件两个部分,整个行业比较关注的是硬件,直到 60 年代程序设计的是否合理、效率的高低、占用资源的多少就需要认真的考虑了。
高德纳 - Garther 的《计算机程序设计艺术》奠定了计算机算法基础,并且他在 35 岁那年就斩获了图灵奖,以奖励他在算法上的贡献。他的思想主要包括三个部分:1. 比较算法快慢的时候,只需要考虑数据量特别大,大到近乎于无穷大的情况。2. 决定算法快慢的因素可能由很多,但大致可以分为两类:a. 不随数据量变化的因素;b. 随数据量变化的因素;3. 两种算法复杂度上哪怕只有一点点,N 很大之后,效率可能就差出万亿倍了。
怎么找到最好的算法和排序的讨论
引例中四种不同的算法,反应从业者水平上的微小的差异,会导致它们采用不同的方法做事情,而结果就是天壤之别了。能够把一个问题的复杂情况想清楚的人,具备其他人所不具备的两个长处;首先:他考虑问题很周全,当好科学家有时可以靠聪明和灵感,但是当好工程师,还需要考虑问题周全;其次,他又一个非常清晰的头脑,能够把复杂的问题想清楚。
那么如何找到最好的算法呢?首先是对一个问题边界的认识,其次是优化算法最常用的方法就是检查一种算法是否在做大量无用功,已经得出 X < Y,且 Y < Z,就无需再比对 X、Z 的大小了。最后,我们需要逆向思维,从小推到大的规律思维,或者是高中学习的数学归纳法,在大数据解析时候不一定适用。
排序的算法以 O(N2)的选择排序、插入排序,O(N·logN)的归并排序,快速排序,堆排序可以得出,首先,要尽量的避免做大量无用功的方法;其次,接近理论最佳值的算法可能由很多种,除了单纯考量计算时间外,可能还有很多考量的维度,比如空间复杂度、稳定性;
总结
计算机科学之路是比较漫长的,回顾伟人们以极致求精的思维去看待问题,解决问题,将一门科学艺术从边界模糊到逐渐清晰奠基,造福后人做了伟大贡献。前两章的内容主要讲述了计算机的三大要素,控制单元是最显著于电子计算机的重要部分。
计算机是用来解决大数据量的问题的,所以在随着数据量剧增的情况下,程序设计的是否合理、效率的高低、占用资源的多少就需要认真的考虑了。将计算机算法规范化后是给高效利用资源提出规范操作流程,也就是避免做大量无用功,同时理论值最佳后其他维度考量。
整体内容提升的思维方向是需要具有逆向思维和顶层设计思维,看待问题要考虑周全,并且要由非常清晰的思维。