《大厂逆袭之路》第一期(更新中....)
1、大学四年学习清单
2、如何让算法学的不那么差?
惯例瞎扯几句
计算机基础的重要性我就不必多说了,「帅地玩编程」这个公众号也是主打计算机基础 算法相关知识,学习计算机基础,认准「帅地玩编程」。
实不相瞒,前阵子我被我们组的 leader 叫去谈话,说是好好学习,快速提升自己,特别是对于计算机的那些基础知识,也不能丢掉,你们看吧,计算机基础知识,想不学都不行。
不过说实话,对于计算机基础,帅地在学习的过程中,也没有运用啥方法论,也没啥技巧,可能和很多人一样,就是简单粗暴着看书,所以这篇文章,我也很难告诉你们学习的骚技巧或者捷径,所以大家不要有太大的期望,更多的是和大家讲一讲,我自己是如何学习的计算机基础知识的,然后供大家一个参考,假如你是学生或者非科班或者计算机基础很薄弱的工作者,或许可以参考一下。
计算机基础指哪些?
在微信,还是经常有小伙伴问我:你们说的计算机基础具体是指哪些呢?,这个问题,感觉算起来,已经被问过 10 次了。
计算机基础包括哪些?如果要全部都说的话,其实我也不清楚,这个还得看如何定义计算机基础,如果要说很底层的那些基础的话,可能就涉及到机器码、电路之类的了,说太多估计就把你吓跑了,虽然好多我也没学过,不过,最常见的几门计算机基础课,大概就是这几门了:
1、计算机网络
2、操作系统
3、计算机组成原理
4、汇编语言
5、编译原理
其中,计算机网络和操作系统,也是面试中被问的最多的两门课程,如果你没有太多的时间来学习这些课程,那么可以优先学习计算机网络和操作系统,之后再学习计算机组成原理、汇编语言和编译原理,当然,如果你还是在校生,那么这些课程都会在大二大三学习到,我希望你能好好学习下,特别是计算机网络和操作系统这两门课。
我是如何学习?
对于如何学习这个事情,我觉得我一句话就能回答完了,因为真的没啥技巧,我基本就是看书为主,视频为辅,看这些知识有时候容易困,因为有些真的是挺枯燥,特别是编译原理和计算机组成原理,又难又枯燥。
一种比较有效的学习方式就是从工作中用到的知识点出发,这样你可能是带着疑问去学习的,目的性也比较强,学起来会比较有趣,学完之后也会豁然开朗。
但是,假如你是一个学生,那么是很难从工作中遇到的知识点出发的,特么你都啥也不会,或者说,如果你对计算机基础知识一窍不通,那么就算你有疑问,你也是很难知道从哪里学起的。
所以,我的建议就是,如果可以,一定要系统学习一下,千万不要觉得以后工作了,或者等用到了再来学习,一定要从 0 到 1,系统学习起来,所谓系统,就是找一本书,从头看到尾,就是这么简单粗暴。
讲一讲我平时是怎么看这些书的
其实我在看这些书的时候还是非常快的,因为我会以最快的速度看一本书,会先从总体上掌握这门知识,不会去死扣某个知识点,一遍看过去,理解了就行了,但如何你问我细节,我可能都忘了,很多只是大概知道是怎么一回事。
一般来说,对于操作系统和计算机网络,我都看了两遍,第一遍只求理解,心中知道个大概,看的很快,总体上知道操作系统是怎么一回事,网络是如何链接起来的。
看完第一遍之后,我会看这本书的目录,看到某个标题时候,自己思考一下是怎么一回事,例如TCP 是如何保证可靠性传输的,我会思考一下该如何保证,然后会打开对应的页面去看看大佬们都是怎么写的,因为可靠性传输,其实会涉及到很多种方法,第一遍看的,虽然当时理解了,但其实很多也都忘了,这时我会在看一遍,再次为大佬们想出的方法卧槽一遍。
不过,我第二次并不会从头到尾看,而是根据目录来看的,第一次看的时候,其实有时候是一边看一边犯困的,但是第二次看的时候,会 get 到更多的点,心中不断着给大佬们点赞,卧槽,我怎么没想到还能这样做!
总之就是,先快速且系统着从总体把握这门知识,看的过程中犯困很正常,之后会根据目录,一边思考自己的想法一边看看书上是如何实现的,因为当你什么也没学的时候,其实你的想法是很少的,但是当你看了很多人的想法之后,你的脑袋也已经有了各种想法,也就是说,在第二遍看的时候,你一定要思考。
还有一种就是,我第一遍有时候是通过看视频学习的,把视频快速看完之后,再系统着从头到尾看书,我也不会一边看视频一边看书,而是疯狂着,以最快的速度刷完视频。
无处不在的计算机基础
我们都说计算机基础很枯燥,学了也很少用到,但我觉得,正是因为枯燥难学,才有了人与人之间的差距,并且我觉得计算机基础知识也是处处都存在的,例如你学习 redis 的时候,可能会学到缓存的淘汰算法,如果你学习过操作系统的内存置换,那么你一眼就能看懂了。
例如你可能经常听说过重量锁和轻量锁,重量锁很消耗性能,如果你没有学过操作系统的话,可能你并不清楚重量锁为啥就消耗性能了?内核切换咋就消耗性能了?但是如果你学过操作系统中的进程/线程的话,可能就知道重量级锁和轻量级锁的本质区别了。
不过在我看来,学习计算机基础知识最重要的,就是让我们学到了各种设计思想,而这种设计能力会伴随我们终生,你在学习的过程中,会学到各种各样的方法,并且都是你最开始没有想到的方法,方法积累多了,你就能产生属于自己的新想法。
说实话,我在学习的过程中,并不觉得很枯燥,相反觉得很有趣,因为我在不停着吸收新知识,吸收前人的精华,例如计算机网络中的流量控制、拥塞控制、HTTPS 的加密算法等等,我特么就没想到,还能这样做,要我,肯定无法设计出这么严谨的算法,所以在看的过程中,真的觉得很过瘾。
当然,有时候也会犯困,实不相瞒,犯困往往是因为有点难,看了一大堆描述之后,居然忘了刚才看了啥,然后看着看着就困了就不想看了,我也就先跳过了,之后在回过头来看。
简单说下具体都需要学些什么 书籍推荐
对于如何学习,貌似我说了好像和没说一样,这也没办法,因为确实没什么学习技巧,我说的先快速把握全局,在根据目录来深入思考,这是我的方法,适不适合你,其实我也不清楚,下面我简单说下一些相对重要的知识点,相当于抛砖引玉,看看你掌握了多少
1、计算机网络
计算机网络是工作中用的最多的吧,真的无处不在。最常见就是 HTTP 协议了,这必须学,get 和 post 的本质区别,通过他们报文的定义来区分就好,不需要死记硬背你之前看过的那些面试题。
HTTPS 是如何解决 HTTP 明文问题的的,数字证书解决了什么问题?为啥 HTTP 是一种无状态协议?啥是无状态协议?
TCP,UDP 也是必须掌握的了,特别是 TCP,TCP 是如何保证可靠传输的呢?啥是拥塞控制和流量控制呢?啥时拆包粘包?这必须掌握。
IP 地址主要用来干啥?为啥还需要子网,子网掩码?世界这么大,IP 这么多,他们怎么寻址?
咋就还有公网 IP 和私网 IP 了?NAT 转换解决了啥问题?
DNS 除了能进行域名解析,还是解决了啥问题?
……
等等,我说的这些,基本都是重点,你们可以看看自己掌握了多少。
至于视频的话,我在 B 站看过韩立纲的视频,地址:https://www.bilibili.com/video/BV17p411f7ZZ?from=search&seid=4498723187261542166
感觉还不错,33 个小时,1.x倍播放,其实很快就能看完,之后刷了《图解 http》和《计算机网络:自顶向下》两本书,书籍太容易失效了,我就不整理了,你们可以在这个 GitHub 上找到:https://github.com/iamshuaidi/CS-Book
2、操作系统
咋就还有进程和线程之分?为什么要有挂起、运行、阻塞等这么多种状态?怎么就还有悲观锁和乐观锁,他们的本质区别?
进程咋还会出现死锁,都有哪些处理策略?进程都有哪些调度算法?
虚拟内存解决了什么问题?为啥每个进程的内存地址就是独立的呢?
为啥 cpu 很快而内存很慢?磁盘怎么就更慢了?
听说中国 mooc 有些课程讲的不错,大家可以去找找勒,我主要是看书的,新手可以先看《程序是怎样跑起来的》,之后看《现代操作系统》或者《深入理解计算机操作系统》,对于书籍在我那个 GitHub 上可以找到。
3、汇编
学了汇编,估计你就更加理解地址是怎么一回事了,顺序、分支,循环、函数调用、数组之类的,是如何通过寄存器来运行的呢?
小小的几个寄存器,居然还能实现这么多复杂的操作?
如果你能用汇编写个红黑树的话,那就,呵呵了
书籍的话,我看的是王爽写的《汇编语言》。
4、计算机组成原理
计算是如何用 0 和 1 表示各种数值的?为啥要有补码?0 和 1 是如何表示的?
计算机是如何进行加减乘除的?为啥计算机无法精确表示某些浮点数?
计算机是如何知道内存地址的?
计算机组成原理还是有点难度,书籍暂时没有推荐的,大部分知识,其实《深入理解计算机操作系统》这本书,其实都有包括。
后面的,就不继续写了,你们可以来补充勒。
总结
对于计算机基础如何学习,如我刚才所说,我一句话就能说完了,但还是硬生生扯出了这么多,这边文章既然是讲「我是如何学习」的,所以我也不会凭空捏造自己的学习方法,而是真实描述自己的学习方法,可能并不适合每一个人,甚至可能感觉自己看了和没看一样,但如果对某些人有用,那么感觉就值了。
因为在写这篇文章的时候,其实我也没有把握,真心觉得没啥学习技巧,更多的还是需要自己去死啃,视频 书籍,死磕一遍,应该就差不多了,之后遇到问题,在去查找对应的文章深入了解。但是,如果你没学过,比起看文章,我依旧坚持希望你去系统看书学习一遍!
基础路漫漫,大家加油!