对找工作功不可没——评《深入理解计算机系统》

对找工作功不可没——评《深入理解计算机系统》

引子:
在我刚刚进入中科院计算所读研的时候,同宿舍的师兄便向我推荐了一本《深入理解计算机系统》,这本书从一个程序员的视角详细剖析了整个计算机系统,涵盖了组成原理、汇编语言、体系结构、操作系统、网络等计算机基础知识。
由于时间所限,我并没有立刻阅读,而是将其列入了找工作前的复习书单。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
顾名思义,本章详细讲解了程序的链接过程,主要分为静态链接和动态链接,以及链接过程中使用到的技术如符号解析、重定位等。
应试 ★★:知道一些基本概念即可。
修炼 ★★★★★:一个软件工程师应该懂得自己写出来的程序是怎么成为一个可执行文件的,有的时候,你很可能会被一个链接错误折磨好几天。

第八章 异常控制流 Exceptional Control Flow
顾名思义,本章主要讲解异常控制,不过这里的“异常”并不是Java或者C++里狭义的异常,而是一个广义的“Exceptions”的概念,包括中断(Interrupt),陷阱(Trap),错误(Falut),中止(Abort)等。本章同时引入了进程的概念,介绍了进程级别的 Exception:信号(signal)以及操作系统处理这个异常的手段--上下文切换(context switch)。
应试 ★★: 主要掌握进程的概念即可。
修炼 ★★★: 知道异常控制流是怎么回事,用户程序和系统交互(如系统调用)的原理和方式即可,不用太深入。

第九章 虚拟存储器 Virtual Memory
非常重要的一章,虚拟存储机制是计算机实现多任务的一项重要技术。计算机正是通过时间片技术使得每个进程在执行时仿佛独占CPU,进而又通过虚拟存储机制使得每一个进程在执行时仿佛独占内存。
10.1介绍了虚拟地址和物理地址,CPU进行寻址操作产生的是虚拟地址,通过存储管理单元(memory management unit)转换为实际的物理内存地址。
10.3~10.5讲述了虚拟存储机制的优点:使得内存可以作为硬盘的cache;能够更方便的管理内存;能更好的提供内存保护机制。
10.6 介绍了虚拟地址如何转换为物理地址。
10.7 很精彩的一节,通过Intel Pentium和Linux的实例讲述了整个存储管理机制。记得以前上操作系统课的时候,各种理论、机制学了一大堆,但就是不知道实际的操作系统到底用的哪套方法,而本节内容正是通过实例让你对刚学的理论机制有一个直观的了解。
10.8~10.10 讲述了存储映射(Memory Mapping)、动态内存分配和垃圾回收机制。
10.11 很实用的一节,列举了一些C编程中容易犯的内存引用错误。
应试 ★★★★★: 本章内容是操作系统课程的重点内容,如果考操作系统,几乎肯定会考到;10.11节的知识也能帮你应对一些程序挑错题。
修炼 ★★★★★: 操作系统中重要的基础内容,即使你只使用Java这样的高级编程语言,至少也应该弄懂垃圾回收机制吧。

第十章 系统级I/O System-Level I/O
介绍类Unix系统下的I/O读写,主要介绍系统层面的I/O接口。由于我们日常编程所用的I/O接口都是各种高级语言提供的经过封装的标准接口,故而如果不进行底层开发的话这部分知识不是必须的,我便跳过没读。

第十一章 网络编程 Network Progranmming
本章简单介绍了网络模型,TCP/IP协议,类Unix系统的socket接口等。
应试和修炼 ★★: 因为篇幅限制,本章只做了简单讲解,要掌握网络编程知识还需要参考专门的网络技术书籍。

第十二章 并发编程 Concurrent Programming
本章简单介绍了并发程序设计的内容,主要包括:
1.进程级别的并发,各子进程拥有不同的虚拟地址空间,需要IPC(InterProcess Communication)机制共享数据,切换开销大。
2.I/O复用,事件驱动,单进程运行,共享虚拟地址空间,并发效果不理想。
3.线程,介于上述两种中间,各子线程共享进程的虚拟地址空间,切换开销较小。
另外介绍了并发编程中访问共享变量的信号量机制,并给出了4类容易引起线程不安全的函数。
应试 ★★: 除应聘相关职位外,并发编程考的比较少,不过需要清楚锁机制和信号量机制等。
修炼 ★★★: 多线程程序在现今的开发中还是很常见的,但是本章介绍的比较简单,需要参考另外专门的书籍。

总的来说,我觉得这本书很适合在找工作之前读一读,因为从网上流传的各种笔试和面试题中,我们就能看出各大IT公司在招聘工程师的时候是很看重基础知识的,而对于像我这样上了三年研究生的同学来说,很多知识由于长时间没用早就忘了,所以需再要再复习一下。
但是我们可能没有时间按照课程一门一门地去复习,即使一门一门去看了,也不一定能把知识都联系起来,而这本书正好提供了这样一个视角,从程序员的角度把计算机专业最重要的基础知识都串了起来,形成了一个完整的计算机系统的概念。

时间: 2024-11-08 19:23:48

对找工作功不可没——评《深入理解计算机系统》的相关文章

猎头,希望您能更理解找工作的人

这些日子找工作,接触到了很多很多猎头,曾经看过一篇文章说,猎头喜欢和什么样的人打交道,不喜欢和什么样的人打交道,而我恰好是猎头喜欢的那种类型,因此,平均每天都会有一个新的猎头找到我. 猎头这个职业,其实表面上看是一种服务行业,但实际上我认为它是一种具有"马太效应"的人脉关系网.所谓供需关系,有需求就会有供给,前些天看过一篇报道,说现在IT市场上每年的人才需求量在30万,而每年从各大互联网行业流动出来的也就只有10余万,那毫无疑问,这流动出来的IT人才将会有不少的选择机会,因此猎头这个行

2015找工作总结

写给哪些明年需要找 IT 相关工作,或者现在正在找工作的同学们.... 特别是那些觉得自己项目经验不足,或者觉得自己方向太偏的孩子们(可以跟我比一比). 从去年11月份到现在,差不多折腾了一年.真想说,终于可以歇会了.唉,找工作真是件体力活. 关于我 研三学生,明年毕业. 本科: 专业叫理科基地班,说白了就是做物理的.本科的时候因为一门课,自学了编程,从此爱上了写程序. 研究生:专业是计算机应用,但其实老师的方向还是偏物理,我也就不介绍我的项目了(就像90%以上的面试官一样,不会感兴趣的). A

深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构

万丈高楼平地起,计算机系统就像程序员金字塔的地基.理解了计算机系统的构造原理,在写程序的道路上才能越走越远.道理LZ很早就懂了,可是一直没下定决心好好钻研,或许是觉得日常工作中根本用不到这些,又或许是每次拿起书看到那些复杂的底层架构,看到存储器,寄存器,CPU,总线等等这些概念就头大.总之,由于各种各样的原因,对这块的知识一直没有认真花时间去钻研.那么你可能会问,那你写这篇博客的题目不就是准备学习这方面的知识吗?是的,LZ 准备下定决心钻研了,至于原因如下: ①.经常用一些不知其所以然的技术,会

一个学渣的2014找工作之路

本人是某二线城市的985大学的标准学渣一枚,本科时候贪玩,基础奇差无比,挂科很多,奖学金没有,大学四年代码都没写过多少行,准备了大概一两个月,考上本校的研究生. 还好身边有大神,是他们对我的指引起了很关键的作用,所以感谢"Bean"和"大哥"对我的影响.研究生第一年,开始写代码,才发现计算机科学是那么有意思.第一年的课程很紧,也要感谢"KG"的指导,让我拿到人生中的第一份奖学金. 第二年被导师派到北京某国企实习,在那里尝到的工作中的酸甜苦辣.积累

深入理解计算机系统9个重点笔记

引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容,这对每个想要深入学习编程的程序员来说都是至关重要的.只有很好的理解了系统到底是如何运行我们代码的,我们才能针对系统的特点写出高质量.高效率的代码来.这本书我以后还需要多研究几遍,今天就先总结下书中我已学到的几点知识. 重点笔记 编写高效的程序需要下面几类活动: 选择一组合适的算法和数据结构.这是很

读书笔记《深入理解计算机系统》(第三版) 概述

<深入理解计算机系统>第三版刚出来不到一周,便买下了这本书:之所以阅读本书,一方面源于网友推荐以及豆瓣不错的评分.评价:另一方面是针对本人非科班出身,计算机系统相关的知识相对比较薄弱,很多情况下此类知识需要工作之外的时间自学.补涨此类知识,而该书从程序员的角度进行阐述.展示了计算机系统的各个层面的知识以及其影响程序的正确性.性能.实用性,更容易引起某些上层和下层的知识接轨理解,以期望可以融汇各方面的知识. 明白程序的运作过程,编写更好的软件程序,对底层过程了解以完善自己知识体系和提高信心.接下

关于找工作和工作的一点思考:劳动经济学观点

笔者不是牛人,换过工作的也不是很多,不过在找工作和工作的过程中还是形成了一点感想,写下来和大家讨论. 基本观点 我主要从经济的角度分析这个问题.首先工作是什么:是一种雇佣关系.从市场经济的角度,这是劳动在劳动市场(Labour Market)中进行交换的过程.这里就有个要注意的地方:在市场中进行交换的,是劳动,不是劳动者这个人,这个容易理解.另外,也不是劳动者的技术或能力,而是劳动这个过程.什么意思呢?比如富士康雇佣工人组装手机,对于富士康来说,它需要的是工人把手机组装起来这么一个过程.如果一个

亲爱的程序猿们怎么找工作

神秘的刀郎在 2003 年成名,成名歌曲是<2002年的第一场雪>. "2002年的第一场雪,来得比往年要晚一些.停靠在八楼的二路汽车,带走了最后一片飘落黄叶.--" 正是在 2002 年,我大学毕业,找了份售后技术支持的工作. 2003 年的时候,奔波在河北维护程控交换设备,我们破旧的桑塔纳里,经常传来刀郎沙哑的嗓音. 好吧,我承认,这篇文章与刀郎没有半毛钱关系.可是当年红遍大江南北的刀郎,现在已经找不着了吧. 请给我的决赛文章<Qt Quick 图像处理实例之美图

校招找工作经历,好事多磨

好久没有写博客了,都说每一次写博客都说一次梳理生活工作的好机会,我也想每天都来梳理一下生活与工作,但就是太懒,很多时候有很多话想要写下来但是一想到要打那么多的字心情一下子就萎了,我觉得以后的聪明人一定会发明一种能够读意念的装置,不用打字想一想就能够把想说的话打出来,想想又不太现实,人脑这么复杂的东西,特别是现在人总是会想太多,连路上见个漂亮的姑娘都能YY,如何真有那种能够写出意念的东西,那么每天该产生多少垃圾呢? 今天是个特别的日子,阔别了那个曾经待了两年零十五天的地方,重新和小伙伴们生活在一起