赞
踩
大家好,我是小林。
之前有读者问我,学习计算机基础有什么推荐的书?
这一个我就很有心得了,因为我大学的专业并不是计算机专业的,是电气自动化专业的,所以学校的课程并没有操作系统、计算机网络、计算机组成、数据库这类课程,但是还是会有编程课。
所以,计算机基础这些课程都是我自学过来的,期间看过了很多的书,也在中国慕课和 B 站刷过很多视频,踩过不少的坑。
其实在自学过程中,最容易踩坑的地方就是不看自己当前水平,盲目跟风买那些豆瓣高分的大而全的计算机黑皮系列的书,然后学几天,就放弃了。
这些大而全的计算机黑皮书当然很经典,但是它们并不适合新人入门学习,因为这类书籍的内容都充满大量的专业术语,我们人在看到陌生又难以理解的词汇时,就会感觉很吃力,脑子看着就会很累,就会驱使你做简单和快乐的事情,比如睡觉、刷短视频、玩游戏。。。
不要问我,为什么知道的那么清楚,因为我就是这么踩坑过来的。
所以,我认为学习一门学科的时候,要从最基础的书开始学起,接着搭配视频快速入门,然后再渐渐步入到这些大而全的计算机黑皮书。
关键的问题来了,计算机基础有哪些入门的基础书和视频呢?
接下来,我就跟大家分享下,我看过的书和视频,都是从入门再到进阶的路线。
很多人同学在大一的时候,就学会了一门编程语言,大概率都是 C 语言,有了一定的编程能力,就可以开始学习数据结构与算法。
数据结构与算法这方面的话是非常非常非常重要的,想要冲大厂的同学们如果这方面不过关可能连笔试都过不去,更别谈面试的手撕算法了。
首先推荐《大话数据结构》这本入门级别的书,因为书里的内容都是大白话,而且还图文并茂,读起来还是很顺畅的。
然后视频推荐《浙江大学的数据结构》课程,在 B 站就能搜索到,课程是老师带大家用 C 语言来实现各种常见的数据结构。
现在大多数高级语言都会有容器,就是把一些常见的数据结构封装成了容器,然后使用起来就比较方便,但是不利于我们理解底层的数据结构是怎么变换和操作的,所以这门课还是很有意义的。
如果想要实战的话,可以去 Leetcode 官方出品的免费教程 Leetbook,网站很细心的按照各个知识点循序渐进地罗列了出来。讲解知识 + 实战演练,学习起来会比看书效率高。
之前有位校招去字节的读者分享过他的算法学习心得,我觉得写的不错,这里我就直接贴出来。
在我看来,笔试能力在校招中要占据 60% 的重要程度。
首先笔试不过,你根本没有面试的展示机会。其次面试中也会反复让你手写代码,以字节为例,每一轮面试都是1-2道编程题,有时候不怎么聊简历;百度每一轮面试有一道编程题。现在公司的面试模式就是这样,如果代码没搞出来,大概率会被淘汰。
并且最窒息的是这些代码题都不简单,一般都是 leetcode中等到hard难度。
刷题主要可从以下三个渠道。
第一个,剑指offer:
https://www.nowcoder.com/ta/coding-interviews
第二个,leetcode:
https://leetcode-cn.com/problemset/algorithms/
第三个,近期面试中常考题:
https://www.nowcoder.com/activity/oj
《剑指 offer》作为大经典,是一定要刷两遍以上的,很多题都是面试时的原题,里面包含了很多笔试常用的思想方法,反复看,反复研。
我一开始每天 10 题,过两遍以后,要求自己每天快速过剑指一遍。
leetcode 由于题目十分之多,刷完是不可能的。我的意见是 leetcode 作为你弱项的专项练习。
leetcode 右侧有标签分类,如下图:
另外在巩固完弱项的情况下,建议将 leetcode 前 300 题刷熟练,据我个人面试经历,国内大厂面试出的代码题 80% 都是这个范围内的。
另外,我在刷题的时候看了 labuladong 总结的算法小抄,对算法的理解很有帮助。
最后根据我的面试经历,根据个人感觉,公司常考题有:
其实也没有什么技巧,多刷题,多理解就好了。
计算组成原理确实是分为两个方向,一个是硬件电路的,一个是软件程序的。
我自己本身是干开发的,所以我这次分享的机组资料是跟软化程序有关的,也就是不会涉及到硬件电路的东西,即使你不会数字电路、微机原理也是可以直接学习的。
先极力推荐 b 站的《计算机科学速成课》,这个课程是国外录制的,内容真的是好,视频的动画很精美,讲课的时候不会很死板,反正就是不看后悔、相见很晚系列。
对于入门计算机组成,可以先看前 10 个视频,看完这 10 个视频也就不到 2 个小时,看完前 10 个视频对计算机的工作方式就有一个基本的了解了。
看完前 10 个视频就可以开始看书了。
讲真,不太建议小白一上来就看那些厚的不行的计算机组成原理的黑皮书,这些书是经典的没错,也正是由于它们是经典的,所以这些书的知识体系很全、很多、很厚。
但是这样很容易让初学者迷失在里头,可能刚兴致勃勃看几十页就放弃了,于是这些厚的不行的书就成为了你们的垫书神器,知识没学多少,颈椎病倒是治好了。
对于初学者,我推荐两本书《计算机是怎么样跑起来》和《程序是怎么跑起来的》,这两本很薄而且图文并茂,作者都是用大白话的方式来阐述知识,这点对初学者非常友好。
这两本不用 1 个月就能看完,因为在看这两本书的时候,你会看的很顺畅,相比学习的心态,你更多的是会带着「好奇心」的心态去读。
其中**《程序是怎么跑起来的》是一个「微缩版本」的计算机组成原理**,你可以只选择看这一本,从这本书的名字也可以知道,它是从计算机是怎么运行程序的视角来讲的,然后把涉及到的计算机硬件和它们之间是如何协作的一点一点的给大家带出来,让大家能瞬间明白这些计算机硬件的作用。
这本仅仅是入门级别,主要的作用是让初学者明白计算机组成原理这门课是学什么的,以及梳理主要的知识体系,用了这本书的概念后,在去深入计算机组成的时候,就不会雨里雾里的。
另外,《编码:隐匿在计算机软硬件背后的语言》这本书也很不错,是本科普类的书,非常适合非科班的同学,主要讲是计算机工作的原理(二进制编码、加减法运算、计算机部件、浮点数定点数、处理器等),也就是跟计组息息相关的知识,它的内容很有趣味性,并不想教科书那样晦涩难懂,丝毫不会让你感到生硬,读起来很畅快。
想要深入学习计算机组成原理的同学,我首先推荐《计算机组成与设计:硬件 / 软件接口》这本书,
这本书确实很厚,差不多 500 多页,但是**书从来没有人规定一定要从头读到尾,一页页的读的。**重要的不是看完一本书,而是从书上学到多少,解决了什么问题。
大家可以挑这几个章节看,跟开发者关系比较大的章节:
看书觉得很累,也可以结合视频一起看,这里推荐哈工大的《计算机组成原理》视频,在 b 站就可以直接看,大家自己去搜索就可以。
看书和看视频可以相互结合的,比如你看视频看了计算机指令的内容,然后你可以不用继续往下看,可以回到一本书上,看书上对应这个章节的内容,这是个很好的学习方法,视频和书籍相辅相成。
你要是觉得哈工大的计组课程太难,你可以看王道考研的计算机组成原理的视频课程,同样 b 站在这里插入代码片
就可以看。
这个视频虽然是针对考研的,但是也是可以作为学习计组的资料,讲的内容不会太深,适合你快速建立计算机组成原理体系,和梳理计组知识的脉络。
另外,在推荐一本《深入理解计算系统》这本书,人称 CSAPP。
可能大家以为这本书是讲操作系统的,我最开始也以为是这样。后面当我开始啃这本书的时候,发现我大错特错,它远不止我想的那样。
这本书是从程序员的角度学习计算机系统是如何工作的,通过描述程序是如何映射到计算机系统上,程序是如何执行的,以及程序效率低下的原因,这样的方式可以让大家能更好的知道「程序与计算机系统」的关系。
CSAPP 涵盖的内容非常多,有计算机组成 + 操作系统 + 汇编 + C语言 + Linux系统编程,涉猎的领域比较多,是一本综合性的书,更是一本程序员修炼内功的指引书。
CSAPP 主要包括以下内容:
你会发现有部分内容和《计算机组成与设计:硬件 / 软件接口》这本书重合了,重合的部分就是重中之重的计算机组成原理知识了,而且内容都是差不多的,你可以看完一本书的内容,然后跳到另外一本看相同章节的内容,多本书的结合可以让我们更加容易理解。
这两本书有个区别:
其他重合的计组知识都大同小异。
CSAPP 的视频课程是国外老师录制的,但是在 b 站已经有好人帮我们做了中文字幕,看了这视频,相当于在国外上了一门计算机课的感觉。
B站地址:https://www.bilibili.com/video/BV1iW411d7hd
如果你是在校生,有了一定 C 语言基础后,非常建议你就开始看这本书,有精力也可以做做 CSAPP 的 lab。越早开始看,你的收益就越大,因为当计算机体系搭建起来后,你后面再深入每一个课程的时候,你会发现学起来会比较轻松些。
对于已经工作了,但是计算机系统没有一个清晰认识的读者,也可以从这本书开始一点一点学起来,这本书是很厚,但是并不一定要把书完完看完,每个章节的知识点还是比较独立的,有关硬件的章节我们可以选择跳过。
操作系统真的可以说是 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 网络模型。
OSI 参考模型与 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 站《计算机网络微课堂》视频一起学习,这个视频是湖南科技大学老师制作的,PPT 的动图是我见过做的最用心的了,一看就懂的佳作。
《计算机网络微课堂》
看完入门系列,相信你对计算机网络已经有个大体的认识了,接下来我们也不能放慢脚步,快马加鞭,借此机会继续深入学习,因为隐藏在背后的细节还是很多的。
对于 TCP/IP 网络模型深入学习的话,推荐《计算机网络 - 自顶向下方法》,这本书是从我们最熟悉 HTTP 开始说起,一层一层的说到最后物理层的,有种挖地洞的感觉,这样的内容编排顺序相对是比较合理的。
但如果要深入 TCP,前面的这些书还远远不够,赋有计算机网络圣经的之说的《TCP/IP 详解 卷一:协议》这本书,是进一步深入学习的好资料,这本书的作者用各种实验的方式来细说各种协议,但不得不说,这本书真的很枯燥,当时我也啃的很难受,但是它质量是真的很高,这本书我只看了 TCP 部分,其他部分你可以选择性看,但是你一定要过几遍这本书的 TCP 部分,涵盖的内容非常全且细。
要说我看过最好的 TCP 资料,那必定是《The TCP/IP GUIDE》这本书了,目前只有英文版本的,而且有个专门的网址可以白嫖看这本书的内容,图片都是彩色,看起来很舒服很鲜明,小林之前写的 TCP 文章不少案例和图片都是参考这里的,这本书精华部分就是把 TCP 滑动窗口和流量控制说的超级明白,很可惜拥塞控制部分说的不多。
《The TCP/IP GUIDE》
白嫖站点: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 入门的话是了解 SQL 语法,进阶的话是深入底层实现原理。
千万不要一上来就看《高性能 MySQL 》,我曾经先读《高性能 MySQL 》然后一路暴雷… 因为这本不是入门的书籍!
我先介绍下 MySQL 的重点知识,也是面试常面的知识点:
MySQL 入门推荐《SQL必知必会》,这一本很薄的书,主要是讲数据库增删查改的 SQL 语法。
学完 SQL 语法,我们不能止步,要深入去了解 MySQL 底层知识。
这里建议先看《MySQL 是怎么运行的》,这本书含有很多图,是小白学习 MySQL 底层知识的最佳书籍,看了下作者简介,他是裸辞一年在家里写出来的这本书,看的出来非常用心的了。
MySQL 用的最多的就是 InnoDB 引擎了,所以进一步学习 InnoDB 是很有必要的,这里推荐《MySQL技术内幕》,这本书可以结合《MySQL是怎么样运行的》一起看。
好了,看完上面的,你对 MySQL 已经有相当多的认识了,MySQL 还有一本高性能的书《高性能 MySQL 》,非常的经典,这本书比较厚,大家可以当作字典,索引章节大家可以去看看,看完后你对索引的认识又会刷新一遍。
要入门Redis,就要先知道这东西怎么用,说白了,最开始就是先学习操作Reids的相关命令,就像我们入门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 去构建实际的应用,然后举一反三, 把书中介绍的程序和方法应用到自己遇到的问题上。
没有人规定看书一定要一页一页的全部看完,我们要知道看书的目的是什么?
无非不就是收获知识,和解决问题嘛。
所以最好的看书方式是带着问题去翻阅,比如:
我之前也写过一篇我的看书心得,帮助到了很多同学,建议没看过的同学,去看看; 看书的一点小建议
看到这,很多小伙伴会说了,学了这么多计算机基础,怎么将这些知识点融会贯通呢?
我之前写过一篇文章,用一个案例把计算机原理 + 操作系统 + 数据结构 + 计算机网络融会贯通,带大家感受下感受计算基础之美:如何将计算机组成、操作系统、计算机网络、数据结构与算法融会贯通?
这次分享就到啦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。