发表时间:2022-03-25来源:网络
在校学完一门编程语言后,一定要开始注重学习「计算机基础」,比如操作系统、计算机网络、计算机组成、数据结构与算法、Linux、数据库等。
特别是算法一定要学好来,因为现在国内的互联网公司在校招面试时,都爱问计算机基础方面的知识,如果你没意识到这点,等大四出去面试才察觉,那时候就已经晚了!!!
计算机基础是最重要的,什么语言无所谓,语言只是一个工具,只要对计算机足够了解,学任何东西都会快速上手。
这次就来跟大家分享下,编程语言、操作系统、计算机网络、数据结构与算法、linux、数据库这几个大厂爱考察的计算基础的学习路线。
推荐的计算基础的学习路线书单(含电子书下载方式):
作为程序员,那当然要会一门编程语言,java/c++/go都是比较主流的后端开发常用的语言,大家根据自己的喜好选择一门深入学习就好。
我自己本身是c/++后端开发,所以我这里主要介绍c++方向的。
这里讲的掌握一门编程语言,不是简单的用它写代码,需要更深层的掌握底层原理。比如在面试百度的时候,一个小时的面试,有30分钟再问C++的知识。
我看的 C++ 书籍可能比较多,下面是我还留着书。

从《C++ Primer》到《Effective C++》系列再到《C++沉思录》这些前前后后可能看了十几本左右,越往后看越体会到 C++ 的复杂性,越看越感觉难…
校招的话 C++ 一般不会问的很难,甚至如果面试官是搞 PHP 或者 Java 的可能都不问你语言相关。
所以我不建议你直接啃《C++ Primer》,把它当作一本词典来用会更好,新人上来一直看这么厚一本书很容易直接被劝退。
我推荐你从《C++ 新经典》 -->《Essential C++》 --> 《C++新经典 对象模型》这样的顺序学习,基本上校招应付面试是绰绰有余了。
如果想要在面试中在 C++ 相关做到侃侃而谈的话可以看看 Effective 系列的书籍,以及啃一啃《深入理解 C++ 对象模型》,这本书重点看「多态」的章节,可以说是很常见的一个面试点。
C++ 还有个重点就是熟悉 STL 底层的实现原理,比如 vector、list、map、deque 等等,这些容器的底层原理可以看《STL源码剖析》这本书。
这里列一下 C++ 常见面试题:
对象模型问题
C++有哪几种对象模型,C++现在使用的那一种?普通继承的对象模型是怎么样的?存在虚函数的继承对象模型是怎样?虚继承的对象模型是怎样的?为什么需要虚继承?解决什么问题?多重继承对下模型?成员变量会内存对齐么?为什么需要内存对齐?底层怎么实现的?为什么对象模型需要这样存放?智能指针问题
智能指针有哪几种?循环引用怎么解决,为什么用weak_ptr就能解决?智能指针每一种的使用场景?智能指针底层怎么支持的,怎么做到的?STL问题
STL有哪几部分组成?为什么需要迭代器?vector非尾结点删除,和插入会有什么问题?迭代器失效问题?优先级队列怎么实现的?自己实现序列式容器需要实现哪些成员函数?关联式容器呢?配置器是干嘛用的?仿函数使用在什么场景?boost库使用过么?使用过哪些函数?多态问题
为什么需要多态?多态有哪几种?静态多态是什么?动态多态呢?多态如何实现的?虚表指针是什么?虚表里面怎么存的?顺序是什么?为什么需要按照声明的顺序?虚表第一个位置存放的type_info是干什么用的?RTTI机制是干什么的?为什么需要RTTI机制?使用多态中遇到哪些问题?如果有时间的话也可以把 python 当第二语言,用惯了 C++ 再学 python,是一种不一样的体验,真的挺有意思的。
其实语言并不是那么重要,基础知识更重要,建议把更多的时间放在基础知识上,尤其是想要冲大厂的同学。
数据结构与算法这方面的话是非常非常非常重要的。
在我看来,笔试能力在秋招中要占据 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右侧有标签分类,如下图:

现在图解系统电子文档开源给大家下载:
接下来,聊聊当初我是怎么学习操作系统的。
操作系统比较重要的四大模块,分别是内存管理、进程管理、文件系统管理、输入输出设备管理。
这是我学习操作系统的顺序,也是我推荐给大家的学习顺序,因为内存管理不仅是最重要、最难的模块,也是和其他模块关联性最大的模块,先把它搞定,后续的模块学起来我认为会相对轻松一些。
学习的过程中,你可能会遇到很多「虚拟」的概念,比如虚拟内存、虚拟文件系统,实际上它们的本质上都是一样的,都是向下屏蔽差异,向上提供统一的东西,以方便我们程序员使用。
还有,你也遇到各种各样的调度算法,在这里你可以看到数据结构与算法的魅力,重要的是我们要理解为什么要提出那么多调度算法,你当然可以说是为了更快更有效率,但是因什么问题而因此引入新算法的这个过程,更是我们重点学习的地方。
你也会开始明白进程与线程最大的区别在于上下文切换过程中,线程不用切换虚拟内存,因为同一个进程内的线程都是共享虚拟内存空间的,线程就单这一点不用切换,就相比进程上下文切换的性能开销减少了很多。由于虚拟内存与物理内存的映射关系需要查询页表,页表的查询是很慢的过程,因此会把常用的地址映射关系缓存在 TLB 里的,这样便可以提高页表的查询速度,如果发生了进程切换,那 TLB 缓存的地址映射关系就会失效,缓存失效就意味着命中率降低,于是虚拟地址转为物理地址这一过程就会很慢。
你也开始不会傻傻的认为 read 或 write 之后数据就直接写到硬盘了,更不会觉得多次操作 read 或 write 方法性能会很低,因为你发现操作系统会有个「磁盘高速缓冲区」,它已经帮我们做了缓存的工作,它会预读数据、缓存最近访问的数据,以及使用 I/O 调度算法来合并和排队磁盘调度 I/O,这些都是为了减少操作系统对磁盘的访问频率。
……
还有太多太多了,我在这里就不赘述了,剩下的就交给你们在学习操作系统的途中去探索和发现了。
还有一点需要注意,学操作系统的时候,不要误以为它是在说 Linux 操作系统,这也是我初学的时候犯的一个错误,操作系统是集合大多数操作系统实现的思想,跟实际具体实现的 Linux 操作系统多少都会有点差别,如果要想 Linux 操作系统的具体实现方式,可以选择看 Linux 内核相关的资料,但是在这之前你先掌握了操作系统的基本知识,这样学起来才能事半功倍。
对于没学过操作系统的小白,我建议学的时候,不要直接闷头看书。相信我,你不用几分钟就会打退堂鼓,然后就把厚厚的书拿去垫显示器了,从此再无后续,毕竟直接看书太特喵的枯燥了,当然不如用来垫显示器玩游戏来着香。
B 站关于操作系统课程资源很多,我在里面也看了不同老师讲的课程,觉得比较好的入门级课程是《操作系统 - 清华大学》,该课程由清华大学老师向勇和陈渝授课,虽然我们上不了清华大学,但是至少我们可以在网上选择听清华大学的课嘛。课程授课的顺序,就如我前面推荐的学习顺序:「内存管理 -> 进程管理 -> 文件系统管理 -> 输入输出设备管理」。
地址:https://www.bilibili.com/video/BV1js411b7vg?from=search&seid=2361361014547524697该清华大学的视频教学搭配的书应该是《现代操作系统》,你可以视频和书籍两者结合一起学,比如看完视频的内存管理,然后就看书上对应的章节,这样相比直接啃书相对会比较好。
清华大学的操作系统视频课讲的比较精炼,涉及到的内容没有那么细,《操作系统 - 哈工大》李治军老师授课的视频课程相对就会比较细节,老师会用 Linux 内核代码的角度带你进一步理解操作系统,也会用生活小例子帮助你理解。
B 站哈工大操作系统视频地址:https://www.bilibili.com/video/BV1d4411v7u7?from=search&seid=2361361014547524697书籍推荐的话,可以先看《现代操作系统》,但是我感觉这本书我感觉缺少比较多细节,说的还是比较笼统。
推荐一个说的更细的操作系统书 —— 《操作系统导论》,这本书不仅告诉你 What,还会告诉你 How,书的内容都是循序渐进,层层递进的,阅读起来还是觉得挺有意思的,这本书的内存管理和并发这两个部分说的很棒,这本书的中文版本我也没找到资源,不过微信读书可以免费看这本书。
当然,少不了这本被称为神书的《深入理解计算机系统》,豆瓣评分高达 9.8 分,这本书严格来说不算操作系统书,它是以程序员视角理解计算机系统,不只是涉及到操作系统,还涉及到了计算机组成、C 语言、汇编语言等知识,是一本综合性比较强的书。
这本书可以跳着看,有几章节是用纯汇编演示的,懂汇编的同学可以看一看,不懂的同学粗略看一看也没关系。
这里也列一下,常见的操作系统面试题;
进程、线程、协程的区别进程间的通信方式物理地址和虚拟地址如何映射?swap区是干嘛的?4g的内存可以运行8g的程序么?页面置换算法、进程调度算法多线程资源竞争问题?死锁经典问题(哲学家就餐问题)?锁的性能开销,锁的实现原理?软连接和硬连接四、计算机网络
我在知乎共输出了 20 多篇图解网络系列的文章,总字数高达 15W 字,并且手绘的图共有 500 张,收获了很多读者的认可和支持,不少读者跑来感激我,说我的图解网络在面试中帮助到他们,不少人拿到了阿里、腾讯、字节等大厂的Offer。

为了方便阅读我把图解网络整理成了PDF,大家可以作为面基突击的手册,现在开源给大家下载:
聊下我当初学计算网络的心得。
计算机网络相比操作系统好学非常多,因为计算机网络不抽象,你要想知道网络中的细节,你都可以通过抓包来分析,而且不管是手机、个人电脑和服务器,它们所使用的计算网络协议是一致的。
也就是说,计算机网络不会因为设备的不同而不同,大家都遵循这一套「规则」来相互通信,这套规则就是 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 的动图是我见过做的最用心的了,一看就懂的佳作。
B 站视频地址:https://www.bilibili.com/video/BV1c4411d7jb?p=1看完入门系列,相信你对计算机网络已经有个大体的认识了,接下来我们也不能放慢脚步,快马加鞭,借此机会继续深入学习,因为隐藏在背后的细节还是很多的。
对于 TCP/IP 网络模型深入学习的话,推荐《计算机网络 - 自顶向下方法》,这本书是从我们最熟悉 HTTP 开始说起,一层一层的说到最后物理层的,有种挖地洞的感觉,这样的内容编排顺序相对是比较合理的。
但如果要深入 TCP,前面的这些书还远远不够,赋有计算机网络圣经的之说的《TCP/IP 详解 卷一:协议》这本书,是进一步深入学习的好资料,这本书的作者用各种实验的方式来细说各种协议,但不得不说,这本书真的很枯燥,当时我也啃的很难受,但是它质量是真的很高,这本书我只看了 TCP 部分,其他部分你可以选择性看,但是你一定要过几遍这本书的 TCP 部分,涵盖的内容非常全且细。
要说我看过最好的 TCP 资料,那必定是《The TCP/IP GUIDE》这本书了,目前只有英文版本的,而且有个专门的网址可以白嫖看这本书的内容,图片都是彩色,看起来很舒服很鲜明,小林之前写的 TCP 文章不少案例和图片都是参考这里的,这本书精华部分就是把 TCP 滑动窗口和流量控制说的超级明白,很可惜拥塞控制部分说的不多。
白嫖站点:http://www.tcpipguide.com/free/t_TCPSlidingWindowAcknowledgmentSystemForDataTranspo-6.htm当然,计算机网络最牛逼的资料,那必定 RFC 文档,它可以称为计算机网络世界的「法规」,也是最新、最权威和最正确的地方了,困惑大家的 TCP 为什么三次握手和四次挥手,其实在 RFC 文档几句话就说明白了。
TCP 协议的 RFC 文档:https://datatracker.ietf.org/doc/rfc1644/计算机网络常见面试题:
tcp 三次握手和四次挥手https 建立连接过程tcp 滑动窗口、流量控制、拥塞控制TCP的TIME_WAIT 和CLOST_WAITUDP和TCP对比输入一个URL,回车后直到渲染出页面中间发生了什么?(dns是属于TCP还是UDP)session和cookie的区别get和post的区别路由器和交换机分别在什么层数据库一般是说 MySQL 和 Redis 两个比较常用的数据库,MySQL 是关系型数据库,Redis 是非关系型数据库。
MySQL 我是先读《高性能 MySQL 》然后又学了某客时间上的《 MySQL45 讲》最后最近再看《 MySQL 是怎样运行的》,又是一路暴雷…
所以我建议你先看《MySQL是怎样运行的》,然后在某客时间上看《MySQL实战45讲》,最后稍微看一看《高性能MySQL》(挑章节看,这本书讲的太深,理解起来比较困难)。
最好在学完这些之后自己动手去部署一个 MySQL,然后挑一些小项目做一做。
Redis 的话我是先看了一遍《Redis设计与实现》,然后在某客学了《Redis 核心技术与实战》,在看实战经验的过程中,感觉有一些吃力,于是又返回去看了一遍《Redis设计与实现》。
建议先看《Redis设计与实现》,有了基础知识之后可以选择看一下其他 Redis 的书籍或视频加深基础,然后去某客时间学习一下《Redis设计与实现》。
Linux系统主要要掌握的三个点:
Linux 命令Linux 系统编程Linux 网络编程Linux 命令的话我建议你先看《鸟哥的 Linux 私房菜》,对 Linux 命令有了一些了解之后,可以再看一看《Linux 系统编程》、然后学 Linux 网络编程。
说下我学 Linux 网络编程的心得。
当初在学网络编程的时候,看见网上的人都说 UNP(Unix 网络编程)、APUE(Unix 高级环境编程)这两本书是网络编程圣经的书,那么好学的小林,那肯定毫无犹豫买了。
书到货后,我瞬间就懵逼了,这两本书是我买过最厚的书,这尼玛怎么学?
跟着书本的节奏,学了一段的时间,是懂了些 Linux 网络和系统 API 的用法,摸索来摸索去都是各个 API 的细节,始终不知道高并发网络框架是如何实现的。

后面我又重新找了一波关于网络编程的书,找到了这两本:《TCP/IP 网络编程》和《Linux高性能服务器编程》。
《TCP/IP 网络编程》绝对是新手村级别的书,书里的内容不会有过多的术语,作者都用大白话来表达,配图也很清晰,也有介绍我想知道的网络框架,虽然是比较基础的多进程服务端模型、多线程服务端模型、异步 IO 模型。而且最后一章实现了简单的 HTTP 服务端,让我知道了从代码角度是怎么解析 HTTP 报文的,以及状态机是如何实现和运转的。《Linux高性能服务器编程》这本书主要是网络框架为主,前几章关于网络基础知识对于掌握了计算机网络知识的同学可以直接跳过的,你看,很多知识是想通的,当我们知道掌握了这块知识后,在学习新一本书的时候,就可以跳过重叠的内容。在这本书我学到了,Reactor、Proactor、信号、定时器、多进程编程、多线程编程、进程池和线程池等。这两本书让我大概知道了如果一个服务端要服务多个客户端时,不是就简单写个 socket 编程就完事,而是还要结合 IO 多路复用 + 多线程的思想,也就是 Reactor 的设计理念,知道了这些事情后,后面我在看很多开源框架的网络模型时候,发现大多数基于 Reactor 的思想来实现的。
有了网络编程总体的视角后,在需要深入理解 socket api 中各种属性设置(超时、非阻塞 IO、阻塞 IO 等)和异常处理就要回归 APUE 这本书。
到这里我才知道 UNP 和 APUE 为什么会被称为网络编程圣经级别的书,原因是书里各种细节和异常都写的很全,也很细致,可以应对工作中很多问题。
但是事实证明,它并不是个入门级的书,所以 UNP 和 APUE 的用途比较像字典,在需要的时候去查阅就好。
Linux 常见面试题:
Linux常用命令,查看系统负载情况,查看端口号,端口号被占用怎么办如何查看服务器运行时间?看是否有重启和宕机?Linux系统的gdb调试io多路复用,reator 模型epoll和select区别,水平触发和边沿触发僵尸进程、孤儿进程阻塞io/非阻塞io/同步io/非阻塞io如果您是刚入学的大一大二的学生,那么我建议您要着重计算机基础知识的学习,语言只是表达思想的工具,对于计算机的理解会帮助您去理解学习语言。
同时也要注重实践,多去写代码,学会使用 Debugger 去调试,选择一个现代的 IDE,可以帮助您去更好的学习,如 JetBrains/VisualStudio 等,这些学生都可以去申请免费试用,可以去申请 GitHubStudentPack。
学习 Linux 也可以使用 WSL 去学习,相对安装 Linux 系统来说要简单许多,同时也不要忘记了学习代码风格,代码风格太差会影响你找 BUG 的能力和耗费的精力,也有可能造成一行代码报五个错的奇葩情况。
还要学会如何使用搜索引擎,查找文档可以去 Microsoft Document、IBM Knowledge Center、cppreference 等,找具体问题可以去 Github 和 StackOverflow 等,学会如何提问也是一种很重要的东西。
对语言不必要求什么都学,我认为到毕业时会使用一门 OOP 语言和一门脚本语言即可,语言实际上是一种触类旁通的东西,重点在于思维的培养。
要去大胆的做一些自己当前能力之外的项目,在学习完基本的软件工程学的基础上,或者说只要你了解了面向对象思维和基本的设计原则如「高内聚,低耦合」。
去做一些自己真正感兴趣的事情,自己去设计这个软件的架构和实现,所谓实践出真知,不要惧怕做有挑战性的项目,Just do it(干就完了)。
对于未定义行为(undefined behavior)不必耗费太多精力(如++i+++i+++i这样的毒瘤题目。
如果您和我一样是大三大四的同学,正在找工作或者准备找工作,那么我推荐您大致看一下面试经验,复习「八股文」,实际上我建议您结合之前的学习去理解,很多东西是上文提到的八大思想的具体实现。
以我个人为例,我在学习「八股文」期间,很多东西是去理解,把他挂载到之前的一个知识点上,面试开始前几个小时去大致看一下具体细节,在理解的基础上,您可以和面试官款款而谈。
对于「八股文」,我们要尽量融会贯通,建立起完整的计算机体系知识结构,这样学习起来会事半功倍。
对于算法的训练,如同上文,刷一刷 leetcode,总结一下算法思想,再加上适当的练习即可。
对于自己写的项目,大致回想一下有哪些技术难点或者有趣的地方,能够具体从想法的出现,解决的方案,中途的问题,后续的测试,未来的发展方向做讲解即可。
最后,如果文章对你有帮助
记得给小林三连哦,你们的三连对我非常重要
也欢迎大家关注 @小林coding
上一篇:C++的异常处理机制(一)
下一篇:c++ using语法
百度云网盘app(更名为百度网盘)下载v13.17.4 官方安卓版
305.43MB |系统工具
云上嵩县客户端下载v3.0.1 安卓版
181.13MB |资讯阅读
掌上芦淞客户端下载v4.0.1 安卓官方版
75.18MB |资讯阅读
大埔网app最新版下载v4.2.10安卓手机版
50.98MB |资讯阅读
naverpapago翻译软件官方下载v1.11.5 最新版本
143.67MB |生活服务
悦程商旅软件下载v2.16
47.59M |生活服务
月犬旅行app下载v1.0.13
46.4M |生活服务
茶竹永川网官方版下载v7.9.4.1 安卓版
87.73MB |社交娱乐
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14
玩梗我更强下载v1.0.0 安卓版
其它手游烹饪偶像烹饪餐厅下载v3.2.8 安卓最新版
其它手游烹饪偶像内购破解版下载v3.2.8 安卓版
其它手游烹饪明星厨师中文版下载v3.2.8 安卓版
其它手游布娃娃破坏游乐场下载v1.014 安卓版
其它手游烹饪明星厨师内购破解版下载v3.2.8 安卓版
其它手游孢子进化手机游戏下载v0.2.108 安卓版
其它手游我要切爆全场下载v13.0.0 安卓版
其它手游开心农场3动物园中文版(farmville 3)下载v1.66.51444 安卓版
其它手游