《计算之魂》读书笔记——第一章

很享受周末一个人读书的时光,少了很多工作和生活的打扰,可以安静而尽情地徜徉在文字之间,感受那些或壮阔或优美或宁静或严谨的语言符号在思维中流淌,将思绪带到一个新的世界。

周末花了两三个小时读完《计算之魂》第一章,触发了很多对技术生涯的反思。我们在技术的道路上似乎一直匆匆忙忙,学生时代匆忙地应付考试,工作之后匆忙地完成开发任务,做管理之后匆忙地扩充自己的通识,生怕被抛进时间的轮下。我们可以轻而易举地完成一个冒泡排序的任务,驾轻就熟地设计一套软件架构,自认为严谨地对比着各种各样的数据,以寻求最符合实验预期的结果。然而,我们却很难成为一名顶级工程师。

吴军老师在《硅谷来信》专栏中就提到借助朗道对物理学家划分等级的方法,将计算机工程师划分为五个等级的,不同等级的工程师在贡献和成就上常常存在指数级的差别。大致的划分如下:

五级工程师:能够独立解决问题,完成工程工作。一个能够独立工作、很好完成任务的工程师,属于五级工程师。部分IT企业里写代码的人,俗称的“码农”,很多都达不到五级工程师的要求。

四级工程师:能够用已知的最有方法解决问题,并指导和带领其他人一同完成更有影响力的工作。很多公司里的技术专家、技术大拿,大致属于这个水平。

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

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

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

从这样的划分角度来讲,我能想到的一级工程师大概只有图灵、冯·诺依曼和高德纳了。图灵提出了计算机的数学模型,冯·诺依曼确定了计算机通用的系统结构,而高德纳奠定了计算机算法的基础。算法是计算机的灵魂。好的算法和坏的算法,虽然都能解决问题,但对于大数来说,往往差之毫厘,结果却是千里之别。

在硬件条件给定的情况下,产品的性能在于软件,而软件的核心就是算法。而衡量算法的好坏,就需要有一套明确的标准及测试方法。1965年,尤里斯·哈特马尼斯(Juris Hartmanis)和理查德·斯特恩斯(Richard Stearns)提出了算法复杂度的概念。而最早将算法复杂度严格量化衡量的就是高德纳,他因此被誉为“算法分析之父”。在今天,全世界的计算机领域都以高德纳的思想为准。高德纳的思想可以概括为三部分:

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

2. 决定算法快慢的因素可被分为两类,第一类是不随数据量变化的因素,第二类是随数据量变化的因素。比如有两种算法,第一种算法次数是3N^2,第二种算法次数是100NlogN,其中N是要处理的数据量。前面两种算法,不管是第一种算法中的3,还是第二种算法中的100,都是常数,跟N的大小没关系。但是后面的部分则和N关系比较大,当N很大时,N^2要比NlogN大得多。

3. 两种算法在复杂度上哪怕只相差一点,在N很大之后,效率可能就差出万亿倍了。书中给出了一个例子,就是用比较容易想到得选择排序或插入排序和专业人士常用得快速排序对10多亿个QQ号排序,计算量分别是大约100亿亿次和30亿次,这个差别简直就是天壤之别了。

所以,这就有了衡量算法复杂度的大O概念。我们可以把一种算法的计算量或者占用空间的大小,用N的一个函数表示,如F(N),这个函数的边界可以用数学上的大O概念来限制。根据数学上对大O概念的定义,如果两个函数f(N)和g(N)在N接近无穷大时,其比值只差一个常数,那么它们就被看成是同一个数量级的函数,也就是具有相同的复杂度。

另外,如果一个算法的复杂度由一高一低两部分h(N)和l(N)组成,即f(N)=h(N)+l(N),那么后面数量级较低的部分l(N)可以直接忽略,O(f(N))=O(h(N)+l(N))=O(h(N))。

在解决实际的工程问题时,常常没有标准答案或最佳答案,却有好的方法和平庸的方法之分。从业者在水平上微小的差距,会导致他们采用不同的方法做事情,而结果往往有天壤之别。这就是为什么一流工程师的贡献会是二流工程师的10倍。如果我们想在计算机行业中持续往上走,唯一的途径就是不断提升自己。

你可能感兴趣的:(读书笔记,算法)