对找工作功不可没——评《深入理解计算机系统》
引子:
在我刚刚进入中科院计算所读研的时候,同宿舍的师兄便向我推荐了一本《深入理解计算机系统》,这本书从一个程序员的视角详细剖析了整个计算机系统,涵盖了组成原理、汇编语言、体系结构、操作系统、网络等计算机基础知识。
由于时间所限,我并没有立刻阅读,而是将其列入了找工作前的复习书单。2010年8月,我用了一个月的时间读完了这本书的原版《Computer System:A programmer\'s perspective》。后来的事实证明,读完这本书对我找工作的历程帮助很大。
正文:
在阅读的过程中,我对该书的各个章节做了一些标注,以备将来重新翻阅的时候参考。这些标注主要从两个角度进行,一是对我找工作应试(包括笔试和面试)有没有用,二是对我自身的技术提高有没有用,所以分为应试和修炼两个指标,参照流行的打分标准将其分为从★到★★★★★五个等级。
在找工作顺利结束之后,我又回顾了一下之前的标注,结合自己的笔试、面试经历,重新修订了一下。其中应试指标的评分主要是以我的求职目标(互联网行业偏算法的软件工程师)为参照,和其他职位的要求会有些出入。
第一章 计算机系统漫游 A Tour of Computer System
本章对计算机系统做了一个总体的介绍,用简单明了的语言概括了一些后续章节将要重点展开的概念。
应试 ★★:在笔试中可能会碰到一些整体上的概念题。
修炼 ★:属于计算机最基本的概念。
第二章 信息的表示和处理 Representing and Manipulating Information
本章介绍了信息在计算机中的表示形式,重点讲述整数和浮点数的表示形式。
应试 ★:应试中很少会考到。
修炼 ★★★:有很多人可能写了多年的代码都不知道浮点数是如何用那4(8)个字节存储的,不知道其实表达式(x-y<0)并不能替代(x
第三章 程序的机器级表示 Machine-Level Representation of Program
本章其实就是汇编语言课程的复习。
应试:重要程度依赖于求职目标,如果是和我一样偏算法的工程师,汇编语言是不会考到的。
修炼 ★★★★★:理解汇编语言和寄存器结构是后面很多内容的基础。
第四章 处理器体系结构 Processor Architecture
本章其实就是计算机体系结构课程的内容。主要介绍的内容有处理器结构,各种逻辑门、功能单元,指令集;指令的执行,指令执行的流水线等。
应试 ★: 对于软件相关职位来说,很少会考到这么底层的东西的。
修炼 ★★★: 对于从事软件层面的技术人员来说,不用深入,但是也应该理解,知道是怎么回事。
第五章 优化程序性能 Optimizing Program Performance
本章讲述如何优化程序的执行效率,包括代码的优化,编译器的优化,以及CPU级别的优化。
5.1-5.6节 主要介绍了几种能有效提高代码性能的方法。
应试 ★★★★: 经常会有一些让你寻找程序瑕疵的问题,如果你能看出代码在哪些细节上可以优化,必定能加分不少。
修炼 ★★★★★: 你当然需要知道编译器在什么层面上能自动帮你优化代码,在编译器无法优化时你自己又如何在小细节上进行优化。
5.7节以后 主要介绍了CPU级别的优化,微指令的概念,功能单元上微指令的并行,程序分支的预测等。
应试 ★: 对于软件相关职位来说,基本不会考这些东西的。
修炼 ★★★: 不用深入,但是应该知道并能够理解。
第六章 存储器层次结构 The Memory Hierarchy
本章详细介绍了计算机系统中的存储结构。
6.1 介绍了不同种类的存储设备以及对应的存取数据的方式。
应试和修炼 ★: 很少会考到,了解一下即可。
6.2-6.7 介绍了存储设备的组织形式,着重介绍了Cache及其工作方式,程序是如何和cache打交道的,不同的循环嵌套顺序、遍历方向等对cache命中的影响。
应试 ★★★★: 在面试中,经常会考到跟cache相关的题目;修改循环嵌套顺序以提高cache命中率也是一些程序改错题的高级玩法。
修炼 ★★★★: 存储结构和cache是计算机中很基础也很重要的概念。
第七章 链接 Linking
顾名思义,本章详细讲解了程序的链接过程,主要分为静态链接和动态链接,以及链接过程中使用到的技术如符号解析、重定位等。
应试 ★★:知道一些基本概念即可。
修炼 ★★★★★:一个软件工程师应该懂得自己写出来的程序是怎么成为一个可执行文件的,有的时候,你很可能会被一个链接错误折磨好几天。