计算机基础书籍推荐 #
在自学过程中,最容易踩坑的地方就是不看自己当前水平,盲目跟风买那些豆瓣高分的大而全的计算机黑皮系列的书,然后学几天,就放弃了。
这些大而全的计算机黑皮书当然很经典,但是它们并不适合新人入门学习,因为这类书籍的内容都充满大量的专业术语,我们在看到陌生又难以理解的词汇时,就会感觉很吃力,脑子看着就会很累,就会驱使你做简单和快乐的事情,比如睡觉、刷短视频、玩游戏。
所以,学习一门学科的时候,要从最基础的书开始学起,接着搭配视频快速入门,然后再渐渐步入到这些大而全的计算机黑皮书。
关键的问题来了,计算机基础有哪些入门的基础书和视频呢?
一、数据结构与算法 #
数据结构与算法是非常非常非常重要的,想要冲大厂如果这方面不过关可能连笔试都过不去,更别谈面试的手撕算法了。
- 算法: 动态规划、回溯算法、查找算法、搜索算法、贪心算法、分治算法、位运算、双指针、排序、模拟、数学、……
- 数据结构: 数组、栈、队列、字符串、链表、树、图、堆、哈希表、……
数据结构学习 #
首先推荐 《大话数据结构》 这本入门级别的书,因为书里的内容都是大白话,而且还图文并茂,读起来还是很顺畅的。
然后视频推荐 《浙江大学的数据结构》 课程,在 B 站就能搜索到,课程是老师带大家用 C 语言来实现各种常见的数据结构。
现在大多数高级语言都会有容器,就是把一些常见的数据结构封装成了容器,使用起来比较方便,但是不利于理解底层的数据结构是怎么变换和操作的,所以这门课还是很有意义的。
如果想要实战的话,可以去 LeetCode 官方出品的免费教程 Leetbook,网站很细心的按照各个知识点循序渐进地罗列了出来。讲解知识 + 实战演练,学习起来会比看书效率高。
算法学习 #
算法刷题可从以下三个渠道。
第一个, 剑指offer
第二个, 力扣
第三个,近期 面试中常考题
《剑指 offer》作为大经典,是一定要刷两遍以上的,很多题都是面试时的原题,里面包含了很多笔试常用的思想方法,反复看,反复研。
leetcode 由于题目十分之多,刷完是不太可能的。可以把 leetcode 作为弱项的专项练习。leetcode 右侧有标签分类,如下图:
另外在巩固完弱项的情况下,建议将 leetcode 前 300 题刷熟练,国内大厂面试出的代码题 80% 都是这个范围内的。
另外,labuladong 总结的 算法小抄 对算法的理解很有帮助。
公司常考题有:
- 链表类(链表反转类题目)
- 二叉树类(二叉树的遍历类型题,最大公祖先类题目)
- 字符串操作题目
- dfs/bfs
- 动态规划(这个考的基本都是 leetcode 上的或者是背包问题,对于动态规划问题其实有很多种类,比较见到的就是一维动态和二维动态),另外还有区间调度类型的题目(贪心算法,也属于动态规划的一种特殊情况)。
其实也没有什么技巧,多刷题,多理解就好了。
二、计算机组成原理 #
计算组成原理确实是分为两个方向,一个是硬件电路的,一个是软件程序的。
入门学习 #
先极力推荐 b 站的 《计算机科学速成课》 ,这个课程是国外录制的,内容真的是好,视频的动画很精美,讲课的时候不会很死板,反正就是不看后悔、相见很晚系列。
对于入门计算机组成,可以先看前 10 个视频,看完这 10 个视频也就不到 2 个小时,看完前 10 个视频对计算机的工作方式就有一个基本的了解了。看完前 10 个视频就可以开始看书了。
不太建议小白一上来就看那些厚的不行的计算机组成原理的黑皮书,这些书是经典的没错,也正是由于它们是经典的,所以这些书的知识体系很全、很多、很厚。这样很容易让初学者迷失在里头,可能刚兴致勃勃看几十页就放弃了,于是这些厚的不行的书就成为了垫书神器,知识没学多少,颈椎病倒是治好了。
对于初学者,推荐两本书 《计算机是怎么样跑起来》和 《程序是怎么跑起来的》,这两本很薄而且图文并茂,作者都是用大白话的方式来阐述知识,这点对初学者非常友好。
这两本不用 1 个月就能看完,因为在看这两本书的时候,相比学习的心态,更多的是会带着「好奇心」的心态去读。
其中《程序是怎么跑起来的》是一个「微缩版本」的计算机组成原理。从这本书的名字也可以知道,它是从计算机是怎么运行程序的视角来讲的,然后把涉及到的计算机硬件和它们之间是如何协作的一点一点的给带出来,让读者能瞬间明白这些计算机硬件的作用。这本仅仅是入门级别,主要的作用是让初学者明白计算机组成原理这门课是学什么的,以及梳理主要的知识体系,有了这本书的概念后,再去深入计算机组成的时候,就不会雨里雾里的。
另外, 《编码:隐匿在计算机软硬件背后的语言》这本书也很不错,是本科普类的书,非常适合非科班的同学,主要讲是计算机工作的原理(二进制编码、加减法运算、计算机部件、浮点数定点数、处理器等),也就是跟计算机组成息息相关的知识,它的内容很有趣味性,并不像教科书那样晦涩难懂,丝毫不会让你感到生硬,读起来很畅快。
深入学习 #
想要深入学习计算机组成原理的同学,首先推荐 《计算机组成与设计:硬件 / 软件接口》这本书,这本书确实很厚,差不多 500 多页,但是书从来没有人规定一定要从头读到尾,一页页的读的。重要的不是看完一本书,而是从书上学到多少,解决了什么问题。
可以挑这几个章节看,跟开发者关系比较大的章节:
- 第一章:计算机抽象以及相关技术,这个章节主要是介绍了计算机组成的思想,可以简单快读,不用重点读;
- 第二章:指令,大体上讲的是计算机是如果识别和运行指令的,以及代码到指令的过程;
- 第三章:计算机的算数运算,介绍的是计算机是如何进行加减乘除法的,以及浮点数的运算;
- 第五章:层次化存储,讲的是计算机的存储层次结构,而且重点讲的是 CPU Cache。
看书觉得很累,也可以结合视频一起看,推荐 B 站 哈工大的《计算机组成原理》视频。
看书和看视频可以相互结合的,比如看视频看了计算机指令的内容,可以不用继续往下看,可以回到这本书上,看书上对应这个章节的内容,这是个很好的学习方法,视频和书籍相辅相成。
要是觉得哈工大的计组课程太难,可以看 B 站 王道考研的计算机组成原理的视频课程。
这个视频虽然是针对考研的,但是也是可以作为学习计组的资料,讲的内容不会太深,适合快速建立计算机组成原理体系和梳理计组知识的脉络。
另外,再推荐一本 《深入理解计算系统》这本书,人称 CSAPP。
这本书是从程序员的角度学习计算机系统是如何工作的,通过描述程序是如何映射到计算机系统上,程序是如何执行的,以及程序效率低下的原因,这样的方式可以让读者能更好的知道「程序与计算机系统」的关系。
CSAPP 涵盖的内容非常多,有计算机组成 + 操作系统 + 汇编 + C语言 + Linux系统编程,涉猎的领域比较多,是一本综合性的书,更是一本程序员修炼内功的指引书。
CSAPP 主要包括以下内容:
- 信息表示(如何使用二进制表示整型、浮点数等);
- C 和汇编语言的学习(通过汇编语言更深入地理解C语言是什么);
- 计算机体系结构(存储层次结构、局部性原理、处理器体系结构);
- 编译链接(C语言如何从文本变成可执行文件、静态链接、动态链接);
- 操作系统的使用(异常控制流、虚拟内存、多个系统调用介绍);
- 网络及并发编程(并发的基本概念、网络相关的系统调用的介绍)。
这本书有部分内容和《计算机组成与设计:硬件 / 软件接口》这本书重合了,重合的部分就是重中之重的计算机组成原理知识,而且内容都是差不多的,可以看完一本书的内容,然后跳到另外一本看相同章节的内容,多本书的结合可以让我们更加容易理解。
这两本书有个区别:
- 《计算机组成与设计:硬件 / 软件接口》讲的指令格式是 RISC 的;
- 《深入理解计算系统》讲的指令格式是 x86 的;
其他重合的计组知识都大同小异。
CSAPP 的视频课程是国外老师录制的,但是在 B 站已经有好人做了中文字幕,看了这视频,相当于在国外上了一门计算机课的感觉。
B 站地址: 【精校中英字幕】2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频
这本书是很厚,但是并不一定要把书完整看完,每个章节的知识点还是比较独立的,有关硬件的章节其实可以选择跳过。
三、操作系统 #
操作系统真的可以说是 Super Man,它为了我们做了非常厉害的事情,以至于我们根本察觉不到,只有通过学习它,我们才能深刻体会到它的精妙之处,甚至会被计算机科学家设计思想所震撼,有些思想实际上也是可以应用于我们工作开发中。
操作系统比较重要的四大模块,分别是 内存管理、 进程管理、 文件系统管理、 输入输出设备管理。这是推荐的学习顺序,因为内存管理不仅是最重要、最难的模块,也是和其他模块关联性最大的模块,先把它搞定,后续的模块学起来我认为会相对轻松一些。
学习的过程中,可能会遇到很多「虚拟」的概念,比如虚拟内存、虚拟文件系统,实际上它们的本质上都是一样的,都是向下屏蔽差异,向上提供统一的东西,以方便我们程序员使用。
还有,你也遇到各种各样的 调度算法,在这里可以看到数据结构与算法的魅力,重要的是我们要理解为什么要提出那么多调度算法,因什么问题而因此引入新算法的这个过程,才更是我们重点学习的地方。
到这里,你会开始明白进程与线程最大的区别在于上下文切换过程中,线程不用切换虚拟内存,因为同一个进程内的线程都是共享虚拟内存空间的,线程就单这一点不用切换,就相比进程上下文切换的性能开销减少了很多。由于虚拟内存与物理内存的映射关系需要查询页表,页表的查询是很慢的过程,因此会把常用的地址映射关系缓存在 TLB 里的,这样便可以提高页表的查询速度,如果发生了进程切换,那 TLB 缓存的地址映射关系就会失效,缓存失效就意味着命中率降低,于是虚拟地址转为物理地址这一过程就会很慢。
你也开始不会傻傻的认为 read 或 write 之后数据就直接写到硬盘了,更不会觉得多次操作 read 或 write 方法性能会很低,因为你发现操作系统会有个「磁盘高速缓冲区」 ,它已经帮我们做了缓存的工作,它会预读数据、缓存最近访问的数据,以及使用 I/O 调度算法来合并和排队磁盘调度 I/O,这些都是为了减少操作系统对磁盘的访问频率。
……
还有一点需要注意,学操作系统的时候,不要误以为它是在说 Linux 操作系统,这也是初学的时候犯的一个错误,操作系统是集合大多数操作系统实现的思想,跟实际具体实现的 Linux 操作系统多少都会有点差别,如果要想 Linux 操作系统的具体实现方式,可以选择看 Linux 内核相关的资料,但是在这之前应先掌握了操作系统的基本知识,这样学起来才能事半功倍。
入门系列 #
对于没学过操作系统的小白,建议学的时候,不要直接闷头看书。毕竟直接看书太特喵的枯燥了。
B 站关于操作系统课程资源很多,比较好的入门级课程有 《操作系统 - 清华大学 》 ,该课程由清华大学老师向勇和陈渝授课,课程授课的顺序,就如前面推荐的学习顺序:「内存管理 -> 进程管理 -> 文件系统管理 -> 输入输出设备管理」。
该清华大学的视频教学搭配的书应该是 《现代操作系统》,可以视频和书籍两者结合一起学,比如看完视频的内存管理,然后就看书上对应的章节,这样相比直接啃书相对会比较好。
清华大学的操作系统视频课讲的比较精炼,涉及到的内容没有那么细。 《操作系统 - 哈工大》 李治军老师授课的视频课程相对就会比较细节,老师会用 Linux 内核代码的角度带你进一步理解操作系统,也会用生活小例子帮助你理解。
深入系列 #
《现代操作系统》这本书感觉缺少比较多细节,说的还是比较笼统,而且书也比较无聊。
这里推荐一个说的更细的操作系统书 —— 《操作系统导论》,这本书不仅告诉你 What,还会告诉你 How,书的内容都是循序渐进,层层递进的,阅读起来还是觉得挺有意思的,这本书的内存管理和并发这两个部分说的很棒。
去年国内也出了一本不错的操作系统书 《现代操作系统-原理与实现》,这本书不怎么厚,把操作系统重要的知识都讲了一遍,而且书中配图比较多,学起来不会太费解。
当然,少不了这本被称为神书的 《深入理解计算机系统》,豆瓣评分高达 9.8 分,这本书严格来说不算操作系统书,它是以程序员视角理解计算机系统,不只是涉及到操作系统,还涉及到了计算机组成、C 语言、汇编语言等知识,是一本综合性比较强的书。
四、计算机网络 #
计算机网络相比操作系统好学非常多,因为计算机网络不抽象,如果想要知道网络中的细节,可以通过抓包来分析,而且不管是手机、个人电脑和服务器,它们所使用的计算网络协议是一致的。也就是说,计算机网络不会因为设备的不同而不同,大家都遵循这一套「规则」来相互通信,这套规则就是 TCP/IP 网络模型。
TCP/IP 网络参考模型共有 4 层,其中需要熟练掌握的是应用层、传输层和网络层,至于网络接口层(数据链路层和物理层)只需要做简单的了解就可以了。
对于应用层,当然重点要熟悉最常见的 HTTP 和 HTTPS,传输层 TCP 和 UDP 都要熟悉,网络层要熟悉 IPv4,IPv6 可以做简单点了解。
学习一个东西,就要从我们常见的事情开始着手。
比如, ping 命令可以说在我们判断网络环境的时候,最常使用的了,你可以先把你电脑 ping 你舍友或同事的电脑的过程中发生的事情都搞明白,这样就基本知道一个数据包是怎么转发的了,于是你就知道了网络层、数据链路层和物理层之间是如何工作,如何相互配合的了。
搞明白了 ping 过程,就明白了两个计算机是怎么通信的了,然后你学起 HTTP 请求过程的时候,会很快就能掌握了,因为网络层以下的工作方式,在学习 ping 的时候就已经明白了,这时就只需要认真掌握传输层中的 TCP 和应用层中的 HTTP 协议,就能搞明白 访问网页的整个过程了,这也是面试常见的题目了,毕竟它能考察网络知识的全面性。
重中之重的知识就是 TCP 了,TCP 不管是 建立连接、断开连接的过程,还是数据传输的过程,都不能放过,针对数据可靠传输的特性,又可以拆解为 超时重新、流量控制、滑动窗口、拥塞控制等等知识点,学完这些只能算对 TCP 有个感性的认识,另外还得知道 Linux 提供的 TCP 内核的参数的作用,这样才能从容地应对工作中遇到的问题。
入门系列 #
如果要入门 HTTP,首先最好书籍就是 《图解 HTTP》 ,作者真的做到完完全全的「图解」,书籍不厚,几天就可以看完。
如果要入门 TCP/IP 网络模型,可以看 《图解 TCP/IP》,这本书也是以大量的图文来介绍了 TCP/IP 网络模式的每一层,但是这个书籍的顺序不是从「应用层 —> 物理层」,而是从「物理层 -> 应用层」顺序开始讲的,这样一上来就把最枯燥的部分讲了,很容易就被劝退了,所以建议先跳过前面几个章节,先看网络层和传输层的章节,然后再回头看前面的这几个章节。
另外,想了解网络是怎么传输,可以看 《网络是怎样连接的》,这本书相对比较全面的把访问一个网页的发生的过程讲解了一遍,其中关于电信等运营商是怎么传输的,这部分可以跳过,当然感兴趣也可以看,只是觉得没什么必要。
如果觉得书籍过于枯燥,可以结合 B 站 《计算机网络微课堂》视频一起学习,这个视频是湖南科技大学老师制作的,属于一看就懂的佳作。
深入学习 #
看完入门系列,相信对计算机网络已经有个大体的认识了。
对于 TCP/IP 网络模型深入学习的话,推荐 《计算机网络 - 自顶向下方法》,这本书是从我们最熟悉 HTTP 开始说起,一层一层的说到最后物理层的,有种挖地洞的感觉,这样的内容编排顺序相对是比较合理的。
但如果要深入 TCP,前面的这些书还远远不够,赋有计算机网络圣经的之说的 《TCP/IP 详解 卷一:协议》 这本书,是进一步深入学习的好资料,这本书的作者用各种实验的方式来细说各种协议,虽然这本书真的很枯燥,但是它质量是真的很高,这本书可以多看几遍 TCP 部分,因为涵盖的内容非常全且细,其他部分可以选择性看。
如果说最好的 TCP 资料,那必定是 《The TCP/IP GUIDE》 这本书了,目前只有英文版本的。有个专门的网址可以白嫖看这本书的内容,图片都是彩色,看起来很舒服很鲜明,这本书精华部分就是把 TCP 滑动窗口和流量控制说的超级明白,很可惜拥塞控制部分说的不多。
白嫖站点: http://www.tcpipguide.com/free/t_TCPSlidingWindowAcknowledgmentSystemForDataTranspo-6.htm
当然,计算机网络最牛逼的资料,那必定 RFC 文档,它可以称为计算机网络世界的「法规」,也是最新、最权威和最正确的地方了,困惑大家的 TCP 为什么三次握手和四次挥手,其实在 RFC 文档几句话就说明白了。
TCP 协议的 RFC 文档: https://datatracker.ietf.org/doc/rfc1644/
实战系列 #
在学习书籍资料的时候,不管是 TCP、UDP、ICMP、DNS、HTTP、HTTPS 等协议,最好亲手尝试抓数据报文,可以用 Wireshark 工具看每一个数据报文的信息,这样你会觉得计算机网络没有想象中那么抽象了,因为它们被你「抓」出来了,并毫无保留地显现在你面前了,于是你就可以肆无忌惮地「扒开」它们,看清它们每一个头信息。
这里推荐 2 本关于 Wireshark 网络分析的书:《Wireshark 网络分析就这么简单》 与 《Wireshark 网络分析的艺术》。
这两本书都是同一个作者,书中的案例都是源于作者工作中的实际的案例,作者的文笔相当有趣,看起来堪比小说一样爽,基本不用一个星期 2 本都能看完。
五、MySQL #
MySQL 入门的话是了解 SQL 语法,进阶的话是深入底层实现原理。千万不要一上来就看《高性能 MySQL》,因为这本不是入门的书籍!
这里先介绍下 MySQL 的重点知识,也是面试常面的知识点:
- 基本语法:select/delete/insert/update、limit、join等
- 索引:B+树,聚族索引,二级索引,组合索引,最左匹配原则,索引失效、慢查询
- 事务:事务四大特性ACID,事务隔离级别,MVCC
- 锁:全局锁、表级锁、行级锁、快照读、当前读、乐观锁、悲观锁、死锁
- 日志:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)
- 架构:读写分离、主从架构、分库分表、数据库和缓存双写一致性
MySQL 入门推荐《SQL必知必会》,这一本很薄的书,主要是讲数据库增删查改的 SQL 语法。
学完 SQL 语法,要深入去了解 MySQL 底层知识。
这里建议先看 《MySQL 是怎么运行的》,这本书含有很多图,是小白学习 MySQL 底层知识的最佳书籍。
MySQL 用的最多的就是 InnoDB 引擎了,所以进一步学习 InnoDB 是很有必要的,这里推荐 《MySQL技术内幕》,这本书可以结合《MySQL是怎么样运行的》一起看。
看完上面的基本对 MySQL 已经有相当多的认识了,MySQL 还有一本高性能的书 《高性能 MySQL》,非常的经典,这本书比较厚,可以当作字典,索引章节可以重点看看,看完后对索引的认识又会刷新一遍。
六、Redis #
要入门 Redis,就要先知道这东西怎么用,说白了,最开始就是先学习操作 Redis 的相关命令,就像入门 MySQL 的时候,都是先学习 SQL 语言。
入门 Redis 推荐 尚硅谷 Redis 视频课,在 B 站就可以看,讲的还是挺清晰的,也把 Redis 很多重点知识也讲了,比如 Redis 基本数据结构、持久化技术、主从复制、哨兵、集群等等,一套连招下来,就基本入门了。
Redis 官网也有一整套的命令详解,遇到需要或者不会的地方可以查一下: http://doc.redisfans.com
视频是帮助我们快速入门,但是并不能至于视频,因为一些细节的知识点视频上并没有提及,这时候就要回归书本。
这里推荐学习 Redis 的圣经级别的书 —— 《Redis设计与实现》,因为它太经典了!
这本书不是教你如何使用 Redis,而是跟你讲解 Redis 是怎么实现,怎么设计的,也就是源码级别的学习,但是书上并没有大段贴代码,作者是用伪代码的方式来讲解,所以读起来不会太难的。
书本上主要围绕这几大知识点:数据结构、AOF和RDB持久化技术、网络输入输出系统、主从复制、哨兵模式、集群模式。
到这里其实已经是入门 Redis 了,不仅会了 Redis 基本命令,还懂 Redis 的实现,剩下的就是学习如何在实战中运用 Redis。
这里推荐 《Redis实战》 这本书,该书通过实际的例子, 展示了使用 Redis 构建多种不同的应用程序的方法。
处于进阶阶段的 Redis 学习可以通过阅读该书来学习如何使用 Redis 去构建实际的应用,然后举一反三, 把书中介绍的程序和方法应用到自己遇到的问题上。
七、看书心得 #
没有人规定看书一定要一页一页的全部看完,我们要知道看书的目的是什么?
无非不就是收获知识和解决问题嘛。所以最好的看书方式是带着问题去翻阅,比如:
- 带着程序是如何在计算机里跑起来的问题,去学计算机组成原理;
- 带着输入一条 url 到网页显示, 期间发生了什么的问题,去学习计算机网络;
- 带着进程、内存、磁盘是如何被操作系统管理点,去学习操作系统;
- 带着如何实现一个高并发网络模型,去学习网络编程;
- …
在原文基础上做了修改,原文地址 https://xiaolincoding.com/cs_learn/cs_learn.html