CSAPP读前读后感:关于技术成长的一些思考

缘由

两个月前的一天深夜,熟睡的我被呼啦啦的一声惊醒,正要往床底下钻,透过皎洁月光看见了散落一地的书,原来是书架塌了。

作为只能租住小房间的北漂儿,当初只买了个便宜的塑料书架放书,原本就习惯于等亚马逊活动囤书,再加上单位时不时发放的当当购书卡,每次三本两本的,不知不觉就买书如山倒了。知乎、豆瓣里被人推荐过的、说得上名字的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

时间: 2024-10-12 17:04:34

CSAPP读前读后感:关于技术成长的一些思考的相关文章

【原创】PHP程序员的技术成长规划

PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶

PHP程序员的技术成长规划

PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:基础阶

(转)PHP程序员的技术成长规划

(转)PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 本文按照目前主流技术做了一个基本的梳理,整个是假设PHP程序员不是基础非常扎实的情况进行的设定,并且所有设定都非常具体明确清晰,可能会让人觉得不适,请理解仅代表一家之言.(未来技术变化不在讨论范围) 第一阶段:

学习方法:如何在工作内外获得持续的技术成长

成长永远不是一种结果,而是一种累积效应,更是一种习惯,每个人都时刻在累积,但成长力度却相差甚远,原因就在于特定客观环境内,是各种束缚导致自己打破不掉习惯以及打破后不能坚持.要突破就要从工作内外这两个战场下手,工作内是最佳的成长之地,而工作外是工作内所不能提供的试验田,可以有更多的涉猎与想法验证. 成长本质是突破天花板 几乎每个人都遇到了成长受限.成长瓶颈.成长迷茫的问题,每个人的原因背景都不同,比如: 转行做前端,在大公司里,业务与团队环境趋于稳定,找不到成长机会,与同龄人也有差距,心有不甘想要

2019年终总结 | 我的写博元年及技术成长之路

今天是2019年的最后一天,每年的年底我都会感慨时间过的太快了,不知道像我这样的人有多少, 回想起2018年在公司做年终总结时,我当时提出了一个观点:每个程序员都应该有自己的技术知识体系, 这也是能区分程序员水平的一个因素,比如你说你用过RabbitMQ,那如果让你给一个没用过RabbitMQ的程序员讲解下,你该如何讲解呢? 我相信很多程序员可能不知道该怎么讲,但有的程序员就可以讲解的很清晰,这就是所谓的技术知识体系. 讲解的思路可能包含以下几点: 什么是RabbitMQ? 概念,与Active

「程序员思维训练」1. 读前声明

本书作者:Andy Hunt「催康 译」 读前须知: 本书是对 高级程序员 的思维训练,包括个人提升和团队管理等 在没有达到本书的读者水平的情况现 建议跳读,先了解,取其所需 一本书没有必要一次性读完「针对所有的书籍而言」期间你还可以做很多事情,这样可以提高阅读的效率 Chapter 1 绪论 诀窍 :始终关注情境 经验之谈不是指令清单,它们必须在一定的情境下使用 切记随波逐流                                Only dead fish go with the f

作为CTO,在技术成长和组织管理孰轻孰重

CTO,中文(首席技术官)英文Chief Technology Officer,即企业内技术最高负责人,是CEO的左膀右臂,是个管理岗,应该重视组织管理,辅以自身技术成长,具备从宏观上引领技术发展的能力.    我认为作为CTO,主要职责分为四点,分别为熟悉公司业务.带队伍.定战略.拿结果.技术服务于业务,熟悉公司业务,才能更好的为公司服务,为公司创造更大的价值,而没有业务作为支撑的技术,往往虚无缥缈,不切实际,更无法为公司带来利润.带队伍又可以定义为团队建设,团队建设的重点在于选人.培养人.创

《30天自制操作系统》读书笔记(1)读前感

做一个自己的操作系统, 在我看来一直是不可以思议的,而且奇妙的,像是吉他手亲手打造一把自己的吉他? 似乎这个比喻不太恰当, 但是,感觉是一样的. <30天自制操作系统> 为日本的川和秀实先生所著, 有人说他是 "<XX天学会XXX>之类的书中为数不多的几本好书之一." 这本书的优点非常明显,通俗生趣,甚至于有点啰嗦:而且作者无私地提供了源代码而且允许你以任何方式使用,也提供了编译的所有工具,所有东西都是"开箱即用",不容易出问题. 作为后生我

随谈10年的技术生涯和技术成长

先简单分享自己这10年在技术上曾经感觉到明显迷茫的阶段: 阶段1:只会增删改查: 时间:大学期间(2005年-2006年) 学习的方式:看视频.看书.(学会了使用控件的增删改查,和写SQL语句). 自我感觉:XX管理系统已不在话下,反正网站弄来弄去也是增删改查,这大概就是无知者无畏. 如何破:(走出社会去就好了). 阶段2:能快速实现功能,却不会思考: 时间:(2006年-2009年) 学习的方式:看博客.大量的编码(第1年,封闭式开发(1天敲15个小时代码),第二年后:每周六天,每天到夜里3点