一、C++基础(3个月)
1、面向对象的三大特性:封装、继承、多态
2、类的访问权限:private、protected、public
3、类的构造函数、析构函数、赋值函数、拷贝函数
4、移动构造函数与接贝构造函数对比
5、深接贝与浅贝的区别
6、空类有哪些函数?空类的大小?
7、内存分区:全局区、堆区、栈区、常量区、代码区
8、C++与C的区别
9、struct与class的区别
10、struct内存对齐
11、new/delete与malloc/free的区别
12、内存泄露的情况
13、sizeof与strlen对比
14、指针与引用的区别
15、野指针产生与避免
16、多态:动态多态、静态多态
17、虚函数实现动态多态的原理、虚函数与纯虚函数的区别
18、继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?
19、静态多态:重写、重载、模板
20、static关键字:修饰局部变量、全局变量、类中成员变量、类中成员函数
21、 const关键字:修饰变量、指针、类对象、类中成员函数
22、extern关键字:修饰全局变量
23、volatile关键字:避免编译器指令优化
24、四种类型转换:static_cast、 dynamic_cast const cast、 reinterpret_cast
25、右值引用
26、std:move函数
27、四种智能指针及底层实现:auto_ptr、unique_ptr、SShared_ptr、weakptra
28、shared_ptr中的循环引用怎么解决 (weak_ptr)
29、vectora与list比较
30、vector送代器失效的情况
31、map与unordered_map对比
32、set与unorderedset对比
33、STL容器空间配置器
二、计算机网络 (1个月)
1、OSI7层网络模型:应用层、表示层、会话层、传输层、网络层、链路层、物理层
2、TCP/IP四层网络模型:应用层、运输层、网际层、接口层。综合OSI与TCP/IP模型,学习五层网络模型;从上向下架构:应用层、传输层、网络层、链路层、物理层
链路层
3、MTU
4、MAC地址
网路层
5、地址解析协议
6、为啥有IP地址还需要MAC地址?同理,为啥有了MAC地址还需要IP地址?
7、网络层转发数据报的流程
8、子网划分、子网掩码
9、网络控制报文协议ICMP
10、ICMP应用举例:PING、traceroute
传输层
11、TCP与UDP的区别及应用场景
12、 TCP首部报文格式(SYN、ACK、FIN、RST必须知道)
13、 TCP滑动窗口原理
14、 TCP超时重传时间选择
15、 TCP流程控制
16、 TCP拥塞控制 一定要弄清楚与流量控制的区别
17、 TCP三次握手及状态变化。为啥不是两次握手?
18、 TCP四次挥手及状态变化。为啥不是三次挥手
19、 TCP连接释放中TIMEWAIT状态的作用
20、 SYN泛洪攻击。如何解决?
21、 TCP粘包
22、 TCP心跳包
23、 路由器与交换机的区别
24、 UDP如何实现可靠传输
推荐学习视频
4个小时搞懂tcp/ip协议栈,从tcp/ip协议栈原理到实现一个网络协议栈https://www.bilibili.com/video/BV1NA411y7Vc/
应用层
25、 DNS域名系统。采用TCP还是UDP协议?为什么?
26、 FTP协议(了解)
27、 HTTP请求报文与响应报文首部结构
28、 HTTP1.0、HTTP1.1、HTTP2.0对比
29、 HTTP与HTTPS对比
30、 HTTPS加密流程
31、 方法:GET、 HEAD、POST、PUT、 DELETE
32、 状态码:1、2、、3、4、5
33、 cookie与session区别
34、 输入一个URL到显示页面的流程 (越详细越好,搞明白这个,网络这块就差不多了)
三、操作系统 (1个月)
1、进程与线程区别
2、线程同步的方式:互锁、自旋锁、读写锁、条件变量
3、互锁与自旋锁的底层区别
4、孤儿进程与户进程
5、死锁及避免
6、多线程与多进程比较
7、进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket
8、管道与消息队列对比
9、fork进程的底层:读时共享,写时复制
10、线程上下文切换的流程
11、 进程上下文切换的流程
12、 进程的调度算法
13、 阻塞10与非阻塞IO
14、 同步与异步的概念
15、 静态链接与动态链接的过程
16、 虚拟内存概念(非常重要)
17、 MMU地址翻译的具体流程
18、 缺页处理过程
19、 缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
操作系统的内容看起来不是很多,实际上每个问题答案的底层原理要弄懂还是很考验基本功的。比如:互锁与自旋锁的区别,实际上涉及到阻塞时线程的状态是不一样的。互锁阻塞的线程是挂起的,此时系统会优先执行其它可执行的线程,就会将阻塞的线程切换到可执行线程,而当临 界区执行的时间非常短时,此时线程切换频繁、开销较大,此时就会采用自旋锁的方式,让阻塞的线程处于忙等状态。
推荐学习视频
四、 网络编程?(1个月)
1、IO多路复用:select、 poll epoll的区别 (非常重要,几乎必问,回答得越底层越好,要会使用)2、手撕一个最简单的server端服务器 (socket、 bind、 listen accept这四个API一定要非常熟练)3、线程池4、基于事件驱动的reactor模式5、 边沿触发与水平触发的区别6、 非阻塞IO与阻塞I0区别
推荐学习视频
五、数据结构与算法"及刷题 (2个月)
1、数组
2、链表
3、栈
4、队列
5、堆
6、 二叉树:二叉搜索树、平衡树、红黑树
7、 B树、B+树
8、 哈希表及哈希冲突
9、 排序算法:冒泡排序、简单选择排序、插入排序、希尔排序、归并排序、堆排序、快速排序(要求能够面试时手写出堆排序和快速排序)
10、 二分法:旋转数组找target
11、 回溯法:全排列、复原IP地址
12、 动态规划(掌握基本的动态规划的几个题其实就够了,如:斐波那契数列、 接雨水、股票的最佳买入时机)
推荐学习视频
六、 mySQL数据库 (7天~15天)
1、数据存储引擎:InnoDB、 myISAM Memory2、数据库索引类型及原理:B+树索引、 哈希表索引3、锁:悲观锁、乐观锁4、事务:事务的四大特性 (ACID)、事务并发的三大问题、事务隔离级别及实现原理5、多版本并发控制实现机制 MCVV 原理参考书籍:《高性能MySQL》
推荐学习视频
后端技术:中间件开发(redis、nginx、mysql)https://www.bilibili.com/video/BV1iM4y1C7mQ/
七、项目 (2个月)
如果时间够的话就可以写一个项目,当然大部分人写的项目都是一个烂大街的项目,也就是 "web 高性能服务器"。其实就是根据陈硕大神写的 《Linux高性能服务器编程:使用muduo c++网络库》进行改编,当然啦,读懂这本书还是很耗时的,学习其中的思想也会受益浅的。
推荐学习视频
八、总结
按照上面推荐的内容来学习的话,要学习得深入一点的话1年的时间肯定需要的,甚至2年也不足为 其。当然对于非科班的学生来说,大部分都没有充足的时间的,这时候建议尽量把C++基础、计算 机网络、操作系统、 网络编程、数据结构与算法这五个部分的内容学得很扎实,大概6个月的时间。