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,还得研究下他们的一些源码,下面我总结一下一些比较重要的知识(其实是根据面试结果来挑选)。

  1. 指针与引用的区别,C 与 C++ 的区别,struct 与 class 的区别
  2. struct 内存对齐问题,sizeof 与 strlen 区别
  3. 面向对象的三大特性:封装、继承、多态
  4. 类的访问权限:private、protected、public
  5. 类的构造函数、析构函数、赋值函数、拷贝函数
  6. 移动构造函数与拷贝构造函数对比
  7. 内存分区:全局区、堆区、栈区、常量区、代码区
  8. 虚函数实现动态多态的原理、虚函数与纯虚函数的区别
  9. 深拷贝与浅拷贝的区别
  10. 一些关键字:static, const, extern, volatile 等
  11. 四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
  12. 静态与多态:重写、重载、模板
  13. 四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr
  14. 右值引用
  15. std::move函数
  16. 迭代器原理与迭代器失效问题
  17. 一些重要的 STL:vector, list, map, set 等。
  18. 容器对比,如 map 与 unordered_map 对比,set 与 unordered_set 对比,vector 与 list 比较等。
  19. 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 系的公司,问的更多。这块认真学,一个半月就可以搞定了。

计算机网络就是一堆协议的构成,下面是一些比较重要的知识点,学的时候可以重点关注下。

物理层、链路层

  1. MTU,MAC地址,以太网协议。
  2. 广播与 ARP 协议

网络层

  1. ip 地址分类
  2. IP 地址与 MAC 地址区别
  3. 子网划分,子网掩码
  4. ICMP 协议及其应用
  5. 路由寻址
  6. 局域网,广域网区别

传输层(主要就是 TCP)

  1. TCP首部报文格式(SYN、ACK、FIN、RST必须知道)
  2. TCP滑动窗口原理,TCP 超时重传时间选择
  3. TCP 拥塞控制,TCP 流量控制
  4. TCP 三次握手与四次挥手以及状态码的变化
  5. TCP连接释放中TIME_WAIT状态的作用
  6. SYN 泛洪攻击
  7. TCP 粘包,心跳包
  8. UDP 如何实现可靠传输
  9. UDP 与 TCP 的区别
  10. UDP 以及 TCP 的应用场景

应用层

  1. DNS 原理以及应用
  2. HTTP 报文格式,HTTP1.0、HTTP1.1、HTTP2.0 之间的区别
  3. HTTP 请求方法的区别:GET、HEAD、POST、PUT、DELETE
  4. HTTP 状态码
  5. HTTP 与 HTTPS 的区别
  6. 数字证书,对称加密与非对称加密
  7. cookie与session区别
  8. 输入一个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++ 和项目可以优先,计算机基础可以突击学习,通过视频或者别人总结的笔记突击。

总之,这一套学下来,感觉需要一年了,当然,这个不好衡量,还得看你自己掌握了哪些基础。

发表回复

后才能评论