C++/Linux开发学习路线
一般开发岗主流的就是 Java 后台开发,前端开发以及 C++ 后台开发,现在 Go 开发也是越来越多了,今天把 C++ 后台开发学习路线补上。
写之前先来回答几个问题
1、C++ 后台开发有哪些岗位?
C++ 后台开发的岗位还是很多的,例如游戏引擎开发,游戏服务端开发,音视频服务端/客户端开发,数据库内核开发等等,而且 C++ 也能用来写深度学习,做硬件底层这些。
总之,C++ 后台开发的岗位,还是很丰富的,大家不用担心找不到合适的岗位。
2、C++ 后台开发岗位需求量大吗?
一般大公司大需求量会多一些,小公司需求量较少。
说到岗位需求量,那肯定是 Java 的岗位需求量是最大的,当然,学 Java 的人也是最多的,假如你要学习 C++,那我觉得你要定位大公司可能会好一点,进大公司反而会比 Java 容易。
假如你觉得自己实力很一般,够不着大公司,那我觉得你可以考虑学习 Java,因为大部分小公司,Java 岗位多一些。
但是呢,假如你是应届生,那么语言其实也不是特别重要,只要你 把计算机基础和算法学好,就算你是学 Java 的,也可以去面 C++;学 C++ 的也可以去面 Java。
我当时是学 Java 的,不过秋招那会还面了几个 C++ 岗位,直接和面试官说我不会 C++ 就可以了,他会问你其他的知识。
下面跟大家说一说 C++ 后台开发学习路线,为了方便大家做规划,每一个模块的学习,我都会说下大致的学习时间
一、C++ 基础
假如你有 C 语言基础,那么这块感觉花个三四个月就能拿下了,假如你是零基础的,估计还得学两三个月的 C 语言,也就是说,得花半年时间才行,没有 C 语言基础的可以B站找一个看,貌似翁凯老师讲的挺不错,可以考虑。
C++ 这块,重点需要学习的就是一些关键字、面向对象以及 STL 容器的知识,特别是 STL,还得研究下他们的一些源码,下面我总结一下一些比较重要的知识(其实是根据面试结果来挑选)。
- 指针与引用的区别,C 与 C++ 的区别,struct 与 class 的区别
- struct 内存对齐问题,sizeof 与 strlen 区别
- 面向对象的三大特性:封装、继承、多态
- 类的访问权限:private、protected、public
- 类的构造函数、析构函数、赋值函数、拷贝函数
- 移动构造函数与拷贝构造函数对比
- 内存分区:全局区、堆区、栈区、常量区、代码区
- 虚函数实现动态多态的原理、虚函数与纯虚函数的区别
- 深拷贝与浅拷贝的区别
- 一些关键字:static, const, extern, volatile 等
- 四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
- 静态与多态:重写、重载、模板
- 四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr
- 右值引用
- std::move函数
- 迭代器原理与迭代器失效问题
- 一些重要的 STL:vector, list, map, set 等。
- 容器对比,如 map 与 unordered_map 对比,set 与 unordered_set 对比,vector 与 list 比较等。
- STL容器空间配置器
等等。
根据书来学就可以了,然后学到一些重点,可以重点关注一下。
书籍推荐:
1、《C++Primer》,这本书内容很多的,把前面基础的十几章先看一看,不用从头到尾全啃,后面可以字典来使用。
2、《STL 源码剖析》,必看书籍,得知道常见 STL 的原理,建议看个两三遍。
3、《深度探索C++对象模型》,这本主要讲解面向对象的相关知识,可以帮你扫清各种迷雾。
面试题:学完之后可以通过面试题复习,这里整理了: C++面试题分类阅读指南(附答案)
除了语言部门,其他其实和 Java 的类似,例如计算机基础,算法这些。
二、数据结构与算法的学习
大学第一学期你入门了某种语言之后,就要开始学习数据结构与算法。当然,不一定是第一学期,对于非科班的也一样,也是建议这个学习顺序。当然,你有自己的目标,完全可以按照自己的来。
我的文章是主写数据结构与算法的,我秋招也是靠着这个优势拿到 offer 的,所以我认为数据结构与算法是非常非常重要的,可能你会听到工作都基本没用到这些知识啊,或者库函数都帮我们封装好了啊,我们干嘛要学。
如果你这样想的,那你就错了。对于想要找工作的来说,这方面的知识是必考的,所以你得学;对于已经工作的来说,这方面的知识,可以让你学习到很多设计思想,所谓 数据结构 + 算法 = 程序,而且你学了这个,你会发现学习其他知识,上手的特别快。综上,数据结构与算法必学。
好吧,上面扯了这么多,就是告诉你,数据结构与算法的重要性,好了,下面我介绍下入门数据结构必学的有哪些,不过你跟着书本的学习顺序来就是了。
1、基础数据结构的学习
1、时间复杂度、空间复杂度
2、链表、队列、栈
3、树(二叉树,查找二叉树、AVL树,红黑树等)
4、图(图有好多种算法,深度/广度搜索,最短路径、最小生存树等)
如果你是科班的,那么这些我觉得你大一第二学期都学完是最好的了,没学完也问题不大,有些人可能是先教《离散数学》这本课,为数据结构与算法做铺垫。
书籍推荐:《大话数据结构》、《数据结构与算法分析:C语言描述版》,学哪一本?都可以,问题不大,我当时学的是第二本。大家记得根据自己的语言去学,我上面列举的,都是用 c 语言来实现的,这里我也写过如何阅读:《数据结构与算法分析–xx语言描述版》怎么读+重点章节
2、算法的学习
在大一大二,真心建议你们把算法基本功打好,后面就真的没啥时间刷题之类的了,因为无论你以后要学习哪个方向的,算法都是实用的,会一些算法,说话也都自信了。算法的学习,刷题是必须的了,但不建议盲目刷题,而是先学习一些算法思想,在找对应的题刷,要学的主要有:
1、十大排序算法
2、递归、贪心、回溯、动态规划、枚举等
推荐书籍:《阿哈算法》、《算法设计与分析基础》适合入门;《算法第四版》、《算法导论》、《编程之美》适合进阶
视频:这种还是挺建议看书,我没看过视频,,这里就不介绍了。
3、保持算法的学习
算法的学习,真的是靠积累的,而刷题是必须的。而且学校都会举办一些比赛,这里还是比较建议大家去参见的,这样也能让你更加有激情着去学习。当然,每年都会有很多 ACM 编程大赛,要不要参加呢?这个看你了,也不是说参加就一定好,看你自己吧,具体可以参考我之前一篇文章说的:我是继续打 acm 还是把精力花到学习其他技能去?
大家可以在 leetcode 长期保持刷题,一天一两道,或者一个星期三四道都行。
另外,如果时间不多的,那就把《剑指offer》刷个一两遍就行了,只有 剑指offer 的刷题攻略,我也写过:剑指offer刷题攻略
三、计算机基础的学习
看过我文章的都知道,我一直强大计算机基础的重要性,所以这里必须列举要学的有哪些。刚才说了选择一门语言深入,你在深入学习的过程中,肯定也在学习学校开设的专业课,包括:计算机网络 + 操作系统 + 数据库 + 汇编 + 计算机组成原理 + 编译原理 等等。
其实给他们排优先级是不大好的,这样给他们排,感觉容易被大佬喷,不过没办法,对于小白来说,我还是想排以下顺序
1、计算机网络 + 操作系统
2、数据库 + 计算机组成原理(数据库相应你们可能已经先学过 MySQL 了)
3、汇编 + 编译原理
不过呢,比较重要的是计算机网络 + 操作系统 + 数据库,这三门我单独拿出来说一下重点吧。
四、计算机网络
无论你是从事啥岗位,无论是校招还是社招,计算机网络基本都会问,特特是腾讯,字节,shopee,小米等这些非 Java 系的公司,问的更多。这块认真学,一个半月就可以搞定了。
计算机网络就是一堆协议的构成,下面是一些比较重要的知识点,学的时候可以重点关注下。
物理层、链路层:
- 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到显示页面的流程(越详细越好,搞明白这个,网络这块就差不多了)
书籍推荐:零基础可以先找个视频看看,然后有了一定基础可以看《计算机网网络:自顶向下》这本书,这本书建议看两遍以及以上,还有时间的可以看《TCP/IP详解卷1:协议》。
五、操作系统
操作系统和计算机网络差不多,不过计算机网络会问的多一些,操作系统会少一些,总结起来大致:
1、进程与线程区别
2、线程同步的方式:互斥锁、自旋锁、读写锁、条件变量
3、互斥锁与自旋锁的底层区别
4、孤儿进程与僵尸进程
5、死锁及避免
6、多线程与多进程比较
7、进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket
8、管道与消息队列对比
9、fork进程的底层:读时共享,写时复制
10、线程上下文切换的流程
11、进程上下文切换的流程
12、进程的调度算法
13、阻塞IO与非阻塞IO
14、同步与异步的概念
15、静态链接与动态链接的过程
16、虚拟内存概念(非常重要)
17、MMU地址翻译的具体流程
18、缺页处理过程
19、缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
书籍推荐:《现代操作系统》
六、MySQL
数据库一般主流的有 MySQL 和 Oracle,不过建议大家学习 MySQL 了,因为大部分公司都是使用 MySQL,也是属于面试必问,而且工作中 MySQL 也是接触的最多的,毕竟工作 crud 才是常态。
下面这些是我认为比较重要的知识点:
1、一条 sql 语句是如何执行的?也就是说,从客户端执行了一条 sql 命令,服务端会进行哪些处理?(例如验证身份,是否启用缓存啥的)。
2、索引相关:索引是如何实现的?多种引擎的实现区别?聚族索引,非聚族索引,二级索引,唯一索引、最左匹配原则等等(非常重要)。
3、事务相关:例如事务的隔离是如何实现的?事务是如何保证原子性?不同的事务看到的数据怎么就不一样了?难道每个事务都拷贝一份视图?MVCC 的实现原理(重要)等等。
4、各种锁相关:例如表锁,行锁,间隙锁,共享锁,排他锁。这些锁的出现主要是用来解决哪些问题?(重要)
5、日志相关:redolog,binlog,undolog,这些日志的实现原理,为了解决怎么问题?日志也是非常重要的吧,面试也问的挺多。
6、数据库的主从备份、如何保证数据不丢失、如何保证高可用等等。
7、一些故障排查的命令,例如慢查询,sql 的执行计划,索引统计的刷新等等。
对于 2-4 这四个相关知识,面试被问到的频率是最高的,有时候面试会让你说一说索引,如果你知道的多的话就可以疯狂扯一波了,具体可以看我写的 MySQL 学习路线:肝完了,我的 MySQL 学习之路
七、网络编程
网络编程这块,有些公司还是问的挺多的,特别是 IO 多路复用,同步非同步 IO,阻塞非阻塞啥的,当时面腾讯基本每次都问,,,,学习 C++ 这块还是要重视一下,下面我说一下比较重要的吧。
1、IO多路复用:select、poll、epoll的区别(非常重要,几乎必问,回答得越底层越好,要会使用)
2、手撕一个最简单的server端服务器(socket、bind、listen、accept这四个API一定要非常熟练)
3、线程池
4、基于事件驱动的reactor模式
5、边沿触发与水平触发的区别
6、非阻塞IO与阻塞IO区别
书籍:可以看一看《Unix网络编程》
八、Linux 补充
八股文大家基本都知道是啥,不过很多人都没有把 Linux 写上去,其实 Linux 的范围很大,例如 Linux 内核啊,Linux 网络编程等等。
这种不同的岗位可能需要掌握的要求不同,所以我也不讲这些,今天主要帮大家捋一捋 「Linux 基础」这块,就是面试中有可能会问到的,这块需要准备的还是比较少的,下面做一些汇总,方便帅友们到时候可以更加有针对性去复习。
另外,基础操作命令我就不说了,就说一些需要注意的点
基础
1、文件系统:主要就是要了解下 inode,block,superblock,block bitmap 这些关键词的含义。
2、目录的大致含义:例如像 proc 这个目录就放一些进程相关的信息,默认软件安装在 usr 目录等等,这其实是一种规范,这个要大致了解下。
3、文件一些属性:例如有些文件可读,可写,可执行,对应 rwx 权限这些, 通过 d 可以知道这个一个目录等等。
4、软连接与硬链接
5、VIM 的几种模式区别了解一一下
进程与内存等(这块是重点)
1、几个进程命令:ps,top,pstree,netstat,这几个进程要自己用一用,工作后经常用到的,重点学习了解下。
2、Linux 进程的一些状态,记得好几种:R,D,S,Z,T 这五种,要了解下。
3、孤儿进程,僵尸进程 要知道(重要),然后还得知道如何解决这种情况,例如出现大量僵尸进程怎么办
4、中断相关:软中断啊,不可中断状态啊
5、内存中的 Cache 和 buffer 的区别
6、了解 Swap 区
7、SiGCHLD 信号,waitpid() 和 wait() 函数
几种重要的 IO 模型
1、同步,异步。
2、阻塞与非阻塞
3、select,epoll
4、NOI与IO
一些命令
如果可以,find,grep 这几个搜索相关的命令学下,因为项目会打印日志,我们需要捞日志来分析,就会经常用到 find,grep 这些,到时候面试官问到你也可以说。
项目故障排查
这块其实就是和实际工作比较靠近,做项目有时候会用到啥的,上面的优先学的,有空了再学一学这些
1、通过工具来追踪进程的栈轨迹,就是分析异常的原因,例如用 top 和 jstakc 来定位
2、掌握一些分析进程 IO,CUP,内存的工具,例如 pidstat
3、用 jsp,jstack 来分析死锁原因,一般就是通过栈信息来查看。
学习资料指导
有时间 + 零基础的,就看下《鸟哥Linux私房菜》这本书吧,讲的很细,可以看下,跟着做实验,容易做的实验可以跟着做,麻烦的就不需要了,看前面基础的部分就行,后面的可以不看了。
但是呢,这本书只是入门,其实很多没讲的,例如 select,epoll,僵尸进程啥的啊,这种一般,你们哪个不同就看找对应的文章就行,通过文字来逐个了解突破哦。
暂时先说这么多,后面再慢慢补充了,我说的这些都是我自己当时学过的,可能不是那么全,但是核心的基本都说了。
九、项目
项目是必须要做的了,Java 的项目教程满天飞,不过 C++ 的会少一些,至少没那么多培训机构视频可以白嫖,不过大家可以跟着书,或者 github 上找或者自己花点钱买一个付费视频吧。
我感觉至少做一个吧,比如做一个聊天系统也行,反正都行吧。
十、学习顺序
我建议有时间的,可以先入门下 C++ ,然后就是开始学习数据结构与算法,算法这块长期保持刷题,然后一边深入学习 C++,之后学习计算机网络,操作系统,在之后学习网络编程,项目这块放到最后面。
如果时间比较紧的,算法这块可以放松一点,C++ 和项目可以优先,计算机基础可以突击学习,通过视频或者别人总结的笔记突击。
总之,这一套学下来,感觉需要一年了,当然,这个不好衡量,还得看你自己掌握了哪些基础。