帅地吐血整理:那些让你起飞的计算机基础知识
我公众号里的文章,写的大部分都是与计算机基础知识相关的,这些基础知识,就像我们的内功,如果在未来想要走的更远,这些内功是必须要修炼的。
框架千变万化,而这些通用的底层知识,却是几乎不变的,了解了这些知识,可以帮助我们更快着学习一门知识,更加懂得计算机的运行机制。
当然,在面试中也经常会被问到,特别是对于应届生,对于春秋招,也可以看看我前阵子写过的文章历经两个月,我的秋招之路结束了!。
也有读者经常问的计算机基础知识究竟是指啥?学习顺序?推荐书籍?
我公众号的读者学生以及非科班的应该挺多的,所以我今天这篇文章就写一写,我学过的计算机基础知识,看过的书以及我学过的顺序
当然,以下是我个人的一些经验,并且学过的一些知识,仅供参考,也欢迎大家进行补充,文章涉及的资料文末都会提供。
一、计算机网络
在我们用的程序中,99% 都离不开网络,作为一个程序员,我觉得了解计算机网络是必须的,在大学的课程中,一般也都会开设这一门课。
在我学习这门课之前,我就特别好奇,一台电脑是怎么把消息发给另外一台电脑的呢?例如:
1、两台电脑啥线路也没有相连,怎么就能把消息发送给他呢?
2、世界上的电脑那么多,咋就能找到那台特点的电脑呢?有人说我们可以 MAC 或者 IP 来唯一标识啊,可是,我就有点疑惑了,世界那么大,电脑那么多,有了这个标识,我们该怎么找到他呢?遍历所有电脑?
3、多个程序同时发消息给一台电脑,电脑是如何准确把这些消息拿给这些不同程序的呢?
4、发送的消息丢失了怎么办?
总之,一大堆疑问,看了计算机网络之后,才豁然开朗。自己也写了一篇评价不错的文章:一文读懂一台计算机是如何把数据发送给另一台计算机的
所以这里,我是强烈建议大家学一下的,在面试中,计算机网络也是高频考点,这里我大致总结一下一些必学协议以及面试高频考点:
物理层、链路层:
MTU,MAC地址,以太网协议。
广播与 ARP 协议
网络层
ip 地址分类
IP 地址与 MAC 地址区别
子网划分,子网掩码
ICMP 协议及其应用
路由寻址
局域网,广域网区别
传输层(主要就是 TCP)
TCP首部报文格式(SYN、ACK、FIN、RST必须知道)
TCP滑动窗口原理,TCP 超时重传时间选择
TCP 拥塞控制,TCP 流量控制
TCP 三次握手与四次挥手以及状态码的变化
TCP连接释放中TIME_WAIT状态的作用
SYN 泛洪攻击
TCP 粘包,心跳包
UDP 如何实现可靠传输
UDP 与 TCP 的区别
UDP 以及 TCP 的应用场景
应用层
DNS 原理以及应用
HTTP 报文格式,HTTP1.0、HTTP1.1、HTTP2.0 之间的区别
HTTP 请求方法的区别:GET、HEAD、POST、PUT、DELETE
HTTP 状态码
HTTP 与 HTTPS 的区别
数字证书,对称加密与非对称加密
cookie与session区别
输入一个URL到显示页面的流程(越详细越好,搞明白这个,网络这块就差不多了)
上面写的这些协议,我觉得是比较重要的,特别是在面试中。之前写过一个计算机网络入门教程:别看教材了,帅地熬夜肝了一份计算机网络极简入门教程
对于新手推荐视频:可以看韩老师讲的视频,在哔哩哔哩搜索韩老师就可以找到 韩老师讲高校《计算机网络原理》。
推荐书籍:《计算机网络:自顶向下》、《图解http》
我是先看了视频,在看这两本书的(文末我会给出电子版)。
二、操作系统
操作系统也是一门非常重要的知识,在面试中也是问的非常多(当然,看公司,有些公司技术栈是 Java 的,可能问的比较少)。对于操作系统,要学的也挺多,例如:
啥是进程,啥是线程,他们的本质区别?我们运行一个程序时,数据放在哪里?代码放在哪里?咋就还要分堆和栈?线程切换时是上下文是啥意思?
虚拟地址是什么鬼东西?线程需要那么多种状态干啥子?什么是乐观锁、悲观锁?死锁是怎么造成的?解决死锁的策略有哪些?等等
大致就是如下知识
进程与线程区别 线程同步的方式:互斥锁、自旋锁、读写锁、条件变量 互斥锁与自旋锁的底层区别 孤儿进程与僵尸进程 死锁及避免 多线程与多进程比较 进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket
管道与消息队列对比
fork进程的底层:读时共享,写时复制
线程上下文切换的流程
进程上下文切换的流程
进程的调度算法
阻塞IO与非阻塞IO
同步与异步的概念
静态链接与动态链接的过程
虚拟内存概念(非常重要)
MMU地址翻译的具体流程
缺页处理过程
缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
推荐视频:这个我没看过视频,所以想学的,我推荐去中国mooc大学找各大高校的课,也可以去国外找对应的课。
推荐书籍:我看过的书籍是《操作系统—精髓与设计原理(第八版)》,不过大佬们都推荐《深入理解计算机操作系统(原书第三版)》,我看过目录,感觉还不错,这里也推荐这一本。不过对于零基础的,我建议可以先看一本专门给小白看的书:《程序是如何跑起来的》。
操作系统的学习,还是挺枯燥的,不过,只有把最难的啃过去,才能变的更加强大。
三、数据库(这里我用 MySQL)
在大学的课程里,一般都会开设一门数据库的课程,不过这门数据库是没有针对某一种数据库语言的(例如 MySQL、Oracle)。不过我这里只讲 MySQL的学习,别问为什么,问就是我逃了二十分之十九的课。
把MySQL学好,还是特别重要的,千万不能停留在会用的层面上,而是应该要了解一下原理,特别是对于要面试的同学,会问挺多原理,我每次被问到 MySQL 我都会信心大增。
记得腾讯、shopee面试时,面完 MySQL,面试官好像对我刮目相看了。好了,不吹了,说这些也是强大 MySQL 的重要性。下面就说我学过的一些知识以及推荐的学习资料吧。
对于 MySQL,需要学的还挺多的,例如,
1、一条 sql 语句是如何执行的?也就是说,从客户端执行了一条 sql 命令,服务端会进行哪些处理?(例如验证身份,是否启用缓存啥的)。
2、索引相关:索引是如何实现的?多种引擎的实现区别?聚族索引,非聚族索引,二级索引,唯一索引、最左匹配原则等等(非常重要)。
3、事务相关:例如事务的隔离是如何实现的?事务是如何保证原子性?不同的事务看到的数据怎么就不一样了?难道每个事务都拷贝一份视图?MVCC 的实现原理(重要)等等。
4、各种锁相关:例如表锁,行锁,间隙锁,共享锁,排他锁。这些锁的出现主要是用来解决哪些问题?(重要)
5、日志相关:redolog,binlog,undolog,这些日志的实现原理,为了解决怎么问题?日志也是非常重要的吧,面试也问的挺多。
6、数据库的主从备份、如何保证数据不丢失、如何保证高可用等等。
7、一些故障排查的命令,例如慢查询,sql 的执行计划,索引统计的刷新等等。
推荐书籍:连 sql 都不会写的,推荐《SQL必知必会》,接着推荐《MySQL技术内幕:InnoDB存储引擎》。
四、数据结构与算法
数据结构与算法,我就不想多说了,看我文章的都知道,,重要性不用说。我秋招最大的优势估计就是数据结构与算法的掌握了。
上面三门课程的学习,基本也都是离不开数据结构的,对于如何学习数据结构与算法,可以看这篇:【方法篇】帅地也学过几年算法,谈一谈「如何学好算法」。
五、汇编
我觉得,如何有时间,学习下汇编是必须的,学习了汇编,能够更好着帮助我们知道计算机是如何处理程序代码的,例如寄存器和内存是如何使用的?循环、函数调用、数组是如何实现的?地址是怎么一回事?等等。
很多二进制代码是可以反编译成汇编的,如何你会汇编,那么可以帮助我们更好着去理解一些东西。所以这里建议大家学习下汇编,并且要动手写一些程序。
对于汇编的资料,我可能没啥好推荐的,自己看的不多。看过两本书,对于入门的,我建议看 王爽的那本书《汇编语言(第三版)》,不过这本只适合入门,如果想继续,可以看《汇编程序设计》。
六、编译原理
说实话,编译原理还挺难,反正我觉得很难,不过有时间我觉得可以学学,学了这个你可以知道我们的编译器如何分析我们的代码的,例如词法分析,语法分析,语义分析等等。当然,你未来可能会自己写个特定分析代码的编译器也不一定,这个时候,就更加需要学了。
对于学习的资料,我觉得可以看视频 + 书。视频的话中国 mooc 大学搜索即可,书的话,说时候,我也看的不多,只看过学校指定的教材,所以这里给不了多少建议,自己当当自行搜索,哪本热门卖哪本勒。
七、计算机组成原理
其实组成原理我觉得也是挺难的,如果你数字电路学的比较好,可能会稍微简单一些,记得当时这门课的最后一个任务就是自己做一个 8 位的 CPU,通过做这个 CPU,真的涨了 很多知识。
对于这门课的学习,我觉得重点就是要弄明白整数啊,浮点数啊,这些在计算机是如何存储的,两个数相加是如何通过电路的与或门操作的。
个人觉得,跟着学校的课本来就行,不用学的太深入,面试问的也不多。
八、学习顺序
个人觉得算法,计算机网络,操作系统和 MySQL 是刚需,这几门要先学,如果是大一大二,推荐优先学算法,然后计算机网络,操作系统和数据库这些,也可以并行学习。
至于汇编,编译原理和计算机组成原理,其实面试考的不多,可以有时间再学,没时间就先放一放。
总结
暂时先介绍这么多吧,说实话,学了这些,不单单是多学了一门知识,更重要的是可以提升你的罗辑思维,给你带来更多的 idea。
然后上面的书籍我也整理好了,但是书籍经常百度云失效 + 版权风险,大家如果需要,可以加我的企业微信,通过好友请求后,发送「资源」,会自动拉你进群,之后群公告文档领取。
记住,好友请求通过后,发送「资源」两个字,一定要按照要求来,否则不会拉,为了节省帅地的时间,大家进去记得看公告,资源都在公告里。
一定要看公告,资料在公告文档里
一定要看公告,资料在公告文档里
一定要看公告,资料在公告文档里