0%

《CS:APP》 读后记录

总评

​ 《深入理解计算机系统》书名的翻译存在一定的误导,英文原名《Computer Systems A Programmer‘s Perspective》直译为 《程序员视角下的计算机系统》,所以使用CS:APP指代这本书。

先上结论:CS:APP,值得学习。这本书站在初学者的视角,对计算机系统几大重要的部分做了深入浅出的介绍。如果读起来有困难,可以学得更深入一点后在尝试,心急的话可以辅以网课。不要怕耗费时间,付出的时间对得起获得的知识。

​ 对于计算机相关的初学者,看着厚厚的一本书,没有勇气开始阅读的话,请想想大学上过的许多不知所谓的课,空耗时间,收获寥寥。而这本给初学者量身定做的书,则会给你带来收获知识的惊喜。


​ 劝学结束,开始个人的感想。

​ 关于版本,我阅读的是中文版。(英文阅读学习能力欠缺,日后加强)首先,在2019年6月第1版中确实存在几处明显的错误,但很容易分辨,绝不可能影响理解。其次,对于翻译质量的争议,大可不必。对于专业书籍,名词准确,前后逻辑连贯就是合格的。中文版CSAPP毋庸置疑是合格的,由于原版的内容就足够优质,翻译的中文版质量远超国内大多数教科书。最后,因为微不足道的缺陷就做出否定判断,不是学习良好态度。

​ 关于内容深度,本书是CMU计算机相关专业的先行必修课,内容的特点在于覆盖面广,通俗易懂,由浅入深。有人指责其内容过浅可以跳过不读,直接读专门书籍,对此,我的看法是,这本书整体并不浅,先读专门书籍,再回头读这本书,也会有惊喜的收获。如果先读CS:APP,也请不要止步于此,继续阅读专门书籍,深入学习理论,并积极参加实践,实现理论。

阅读前水平

​ 先对能力水平做一个简单的划分。

阶段名称 阶段能力
小白阶段 没接触过计算类专业,只是电子产品用户
初学阶段 学习过编程语言,对计算机系统的几个部分有简单的了解
中等阶段 对计算机系统整体有一定的了解,对几个方向有深入的认识
高等阶段 对计算机系统的各个环节如数家珍,但不要求在多个方向有创见
…. ……

​ 我曾在初学阶段购买了这本书,尝试阅读,最终在第三章终止了阅读。一方面是没有时间,另一方面是缺乏自学的前置知识,挫败感很强。

​ 进行了更加深入的学习,列举几个比较重要的项目

  • 搭建一个单周期CPU,运行机器指令程序(涉及计算机组成)

  • 一个网络探测项目的后端搭建(涉及计算机网络,python)

  • 编译原理相关的实验 (涉及编译,LLVM)

  • 实现了支持多客户端的TLS VPN项目(涉及计算机网络, 多线程多进程并发)

  • 组队从零实现了一个在硬件平台上可用的RISCV架构的类UNIX 操作系统 (涉及ISA,OS, 编译,链接,装载)

    做完这些,我自认为已经走到了初学阶段的末期,摸到了中等阶段的门槛。

    之后,重读CS:APP,速度前快,中慢,后快,粗略估计总耗时30~40h

    有一种水平恰好相当的感觉,熟知的内容和陌生的内容六四开,读起来很舒适。

CSAPP章节简评

由于我个人的学习和实践经历,以下章节的难度为主观评价,仅供参考

章节名称 难度 备注
第1章 计算机系统漫游 入门常识
第2章 信息的表示和处理
第3章 程序的机器级表示 涉及过汇编
第4章 处理器体系结构 大部分未涉及过
第5章 优化程序性能 较好懂,但难精
第6章 存储器层次结构 计组涉及过部分
第7章 链接 即使涉及过,还是难
第8章 异常控制流 大部分未涉及过
第9章 虚拟内存 部分涉及过
第10章 系统及I/O
第11章 网络编程 部分涉及过
第12章 并发编程 部分涉及过

后续工作

​ 有很多可以延伸地方:

​ 《C++反汇编与逆向分析技术揭秘》作为 第3章 程序的机器级表示 的扩展。如果不熟悉C++,但是熟悉C,推荐《C++ primer》中英两版皆可,作为入门,然后上手一个1500行+ 的C++ 项目即可。

​ 《计算机组成与设计 硬件/软件接口》 作为 第4,5,6章 的深入学习,更高阶的可以参考《计算机体系结构》

​ 《程序员的自我修养——链接、装载与库》 作为第7章 链接 的扩展,第7章有很多看着云里雾里的地方,需要加强学习。

​ 由于已经实现过一个OS内核,对于第9章和第10章的内容是较为熟悉的,对于主流OS的实现并不熟悉,可以深入学习Linux内核。如果此前对OS实现并不了解,可以参考一些OS数据,《操作系统导论》可以作为入门书籍。

​ 后三章的内容比较综合,都是我在各类项目中接触到的,可以参考《TCP/IP 详解》卷一 卷二 用于了解网络协议栈的细节及其实现; modern C++的一些并发特性的实现,陈天 · Rust 编程第一课,这两者可以用于查看不同语言对于高并发的支持; 还可以查看 高性能服务器相关的书籍,这些涉及到架构设计方面,与分布式系统有强相关就不拓展了,以后有机会,可以试试这个方向。

​ CS:APP 对于编译这个阶段是一笔带过的,但是这个部分也很重要,可以参考这个博客 学习编程语言与编译优化的一个书单 包括了:《程序设计语言——实践之路》(介绍语言及编译的大背景);《自制编译器》 作者青木峰郎,有一个可用的C子集编译器实现;《编译器设计》,覆盖编译初级到中级的知识

​ 除了这些计算机系统的相关知识外,最重要的技能 应该是 编程能力和英语,

​ 编程和算法方向参考书籍如下:《数据结构和算法分析 C语言版》、《算法导论》、《编程珠玑》以及刷题。

​ 英语,各人有各人的方法,我主要是 刻意学习,学以致用。

最后的话

​ 读完CS:APP,做了一些有趣的项目,给了我坚持做下去的信心。但在这里,需要给自己一些警醒。CS:APP 的英文版是国内一些高校系统编程教材,我只是做完了别人初入大二做了的东西。

​ 另外,也不必过于焦虑,学习是一个渐进的过程,我享受的是收获新知,勤于思考,并不是与人争逐。每一步都踩得踏实,会走得更远。