缘由
两个月前的一天深夜,熟睡的我被呼啦啦的一声惊醒,正要往床底下钻,透过皎洁月光看见了散落一地的书,原来是书架塌了。
作为只能租住小房间的北漂儿,当初只买了个便宜的塑料书架放书,原本就习惯于等亚马逊活动囤书,再加上单位时不时发放的当当购书卡,每次三本两本的,不知不觉就买书如山倒了。知乎、豆瓣里被人推荐过的、说得上名字的CS经典书籍基本齐全了。
惊魂未定的我看着满地的书,莫名地有些生气,这些书大多要么只是偶尔需要时翻两页,要么就是刚买来兴致勃勃地看了目录和第一章就束之高阁了,其中甚至有几本还没拆塑封。
于是就跟自己打了个赌:认真读完一本大部头。如果失败了就清空书架把书卖掉,从此不买纸质书;如果成功了,就奖励自己一个礼物,同时再接再厉持续阅读。
权衡之下选择这本《深入理解计算机系统》作为目标,一是因为它是CS专业的第一门基础课,有益于后续的知识衔接,比如计算机网络、操作系统等;其二难度不大,不管白天工作累不累,都可以坚持下来每天翻看几页;第三是篇幅较多,一鼓作气完成之后,面对其他的大部头可以”一览众山小“,不会被篇幅吓倒。
计划:每周6天,每晚8点开始,1.5-2小时,大约三到四个月读完。
方法:不拘泥于细节,也不强求完成所有习题,以理解为主地阅读。
实际完成时间:2019/05/08——2019/07/04
笔记记录:不罗列知识点,合上书写出收获和感想即可。
梗概
按章节简述一下学习心得,有兴趣读或者正在读本书的可以作为参考,如果近期不打算读CSAPP可以跳过这部分。
本书第1章为全书概览,对计算机系统有个整体性的认知,后面会分章节详细讲解,所以第一章不必太抠细节。其余章节在内容上分为三个部分,分别从硬件层、操作系统和应用程序三个层面来讲述计算机系统。
硬件层
第2章讲述的是无符号数、有符号数以及浮点数的表示和运算。无符号数的表示和运算都很符合直观;有符号数(补码)的特殊之处在于其最高位的权值是(-2^(x-1)),各种不符合直观的运算结果和类型转换,根源其实都在于这个权值,抓住这一点基本就可以理解各种看似奇怪的结果了。
第3章讲机器指令,对于一个非CS专业出身、平日只在框架内写业务代码的人来说,之前每次读本书都是被这一章的汇编代码劝退的。但静下心重新看,才发现机器/汇编指令是最简单直观的代码,一个指令就是一个最简单的操作步骤,没有什么抽象和复杂的逻辑,画出流程图,一切都明了。
第4章难度略高,书中分析了处理器的指令集体系结构和基本工作流程,然后自己实现了一个简易版的处理器!本章卡了好些天,读不懂那个简易处理器的实现过程。后来跳着读完本章,先理解了处理器应该是什么样的,再回头来看处理器的设计和实现过程,搞清楚每一步的目标和大致方案,就跨过去了。
第5章在理解了前一章讲述的处理器的工作流程之后,从处理器和编译器层面提出了一些可以提升程序性能的代码编写方法。由于目前我们编写的代码距离底层越来越远,本章讲述的方法并不一定适用,理解即可。
第6章介绍存储器层次结构,主要讲了高速缓存的工作原理,以及如何编写高速缓存友好的代码,同第5章一样,可能不适用于一些高级语言,理解为主。
操作系统
第7章讲述链接器的执行过程,就是将多个可重定位目标文件合并成一个可执行目标文件的过程。看似是C语言的东西,但很多知识可以类比到前端的Webpack打包机制,当然Webpack打包与链接过程区别还是挺大的,这里也算是我的一个知识盲区,因为配置文件实在太难写了,很早以前写过一次之后,其他项目就都是复制粘贴了。
第8章讲异常和进程控制,理解关于进程的著名的两个抽象:独立的逻辑控制流与私有的地址空间。通俗一些就是两个“看似”:看似每个进程都是按顺序执行的;看似每个进程都独享整个内存。
第9章讲虚拟内存,也就是第8章中第二个“看似”的实现原理。宏观上并不难理解,但具体的实现和优化还是挺复杂的,虽然书中已经进行了很大程度的简化了。
应用程序
第三部分的章节篇幅都较短,并非是因为简单,而是因为过于复杂了,本书只是讲了个皮毛,可能连“导论”都算不上。
第10章介绍I/O,理解将I/O设备抽象为文件、将I/O操作抽象为读/写文件即可。
第11章简要介绍了计算机网络、套接字接口和HTTP协议,不过对前端来说就太熟悉了,展开来学各自都是一本大部头。
最后一章的并发编程是个更大更复杂的问题,甚至可以算是计算机专业最难的一个领域。书中介绍了多线程模型以及互斥锁,简要讨论了并发编程的线程安全、竞争和死锁问题,对于后台开发人员来说都是要深入学习的重点和难点。
思考
知道自己爱玩,所以做计划的时候预留出了足够出去玩的时间。但万万没想到“宅”才是我的主属性,周末就吃饭睡觉打游戏看书,不到俩月就读完了,不知该欣喜还是感到悲哀。
曾经在导师“晚上不来实验室就扣钱”的“胁迫”下养成了晚自习的习惯,在工作初期还引以为豪地坚持每晚学习,但半年之后就慢慢懈怠了。这次重拾晚自习的习惯,收获的不仅仅是书上的知识,还有内心的充实和自信。
曾经也和很多同行朋友一样,对于计算机专业快速的技术迭代、行业大规模的裁员还有传说中的35岁诅咒感到焦虑不安,一边疲于应对工作中搬砖一样的业务代码,一边又疲于学习层出不穷的新框架。
实际上,以武功作为类比的话,框架就是外功套路,三大前端框架就相当于目前顶尖的拳法、腿法和投技,要闯荡江湖,首先得精通一种套路,要能解决实际问题;而要成为宗师高手,更重要的则是内功的修炼,也就是计算机的设计原理、运行过程以及扩展和优化方法。内功足够深以后,才能跳出套路,根据实际情况选用合适的套路,甚至自创套路。以此来看,像CSAPP、算法导论、编译原理、操作系统等等经典大部头,简直就是易筋经、乾坤大挪移和九阴真经啊!
这些书虽然摆在书架上每天都能看到,但之前一直是作为“有生之年”来看待的。如今读完一本再回头看,其实并没有那么困难和遥远,只要保持习惯,两三个月一本,差不多一年就可以读完计算机专业最基础的几个科目,令非科班出身的程序员弥补上最大的短板,也为之后技术上的深度提升打好了基础。
对我个人来说,接下来第一件事就是参考计算机专业的课程表和网上的一些学习方法和书籍的讨论,做个具体的阅读或学习顺序,如果有价值的话也会分享出来。读者有任何推荐和建议也希望不吝赐教。
原文地址:https://www.cnblogs.com/dlzj/p/11146472.html