C++ 学习路线及推荐学习时间:一、C++基础(3个月)学习重点:掌握面向对象的三大特性(封装、继承、多态),类的访问权限(private、protected、public),类的构造函数、析构函数、赋值函数、拷贝函数,移动构造函数与拷贝构造函数对比,深拷贝与浅拷贝的区别,内存分区(全局区、堆区、栈区、常量区、代码区),C++与C的区别,struct与class的区别,struct内存对齐,new/delete与malloc/free的区别,内存泄露的情况,sizeof与strlen对比,指针与引用的区别,野指针产生与避免,多态(动态多态、静态多态),虚函数实现动态多态的原理、虚函数与纯虚函数的区别,继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?静态多态:重写、重载、模板,static关键字(修饰局部变量、全局变量、类中成员变量、类中成员函数),const关键字(修饰变量、指针、类对象、类中成员函数),extern关键字(修饰全局变量),volatile关键字(避免编译器指令优化),四种类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast),右值引用,std::move函数,四种智能指针及底层实现(auto_ptr、unique_ptr、shared_ptr、weak_ptr),shared_ptr中的循环引用怎么解决?(weak_ptr),vector与list比较,vector迭代器失效的情况,map与unordered_map对比,set与unordered_set对比,STL容器空间配置器。参考书籍:《C++ Primer》(第5版)、《STL 源码剖析》、《深度探索C++对象模型》二、计算机网络(1个月)学习重点:理解OSI7层网络模型与TCP/IP四层网络模型,学习五层网络模型架构,链路层(MTU、MAC地址),网络层(地址解析协议、IP与MAC地址的区别、网络层转发数据报流程、子网划分、子网掩码、网络控制报文协议ICMP、ICMP应用举例),运输层(TCP与UDP的区别及应用场景、TCP首部报文格式、TCP滑动窗口原理、TCP超时重传时间选择、TCP流程控制、TCP三次握手及状态变化、TCP四次挥手及状态变化、TCP连接释放中TIME_WAIT状态的作用、SYN泛洪攻击解决方案、TCP粘包、TCP心跳包、路由器与交换机的区别、UDP实现可靠传输),应用层(DNS、FTP协议、HTTP请求报文与响应报文首部结构、HTTP版本对比、HTTPS加密流程、方法:GET、HEAD、POST、PUT、DELETE、状态码、cookie与session区别、输入一个URL到显示页面的流程)。参考书籍:《计算机网络》(第5版)、《TCP/IP详解卷1:协议》、《图解HTTP》三、操作系统(1个月)学习重点:进程与线程的区别,线程同步方式(互斥锁、自旋锁、读写锁、条件变量),互斥锁与自旋锁的底层区别,孤儿进程与僵尸进程,死锁及避免,多线程与多进程比较,进程间通信方式(PIPE、FIFO、消息队列、信号量、共享内存、socket),管道与消息队列对比,fork进程底层(读时共享,写时复制),线程上下文切换流程,进程上下文切换流程,进程调度算法,阻塞IO与非阻塞IO,同步与异步概念,静态链接与动态链接,虚拟内存概念,MMU地址翻译流程,缺页处理过程,缺页置换算法(最久未使用算法、先进先出算法、最佳置换算法)。参考书籍:《Unix环境高级编程》、《Linux多线程服务器端编程》四、网络编程(1个月)学习重点:掌握IO多路复用技术(select、poll、epoll的区别),手撕最简单server端服务器(socket、bind、listen、accept),线程池,基于事件驱动的reactor模式,边沿触发与水平触发的区别,非阻塞IO与阻塞IO区别。参考书籍:《Unix网络编程》五、数据结构与算法及刷题(2个月)学习重点:深入理解数组、链表、栈、队列、堆、二叉树(二叉搜索树、平衡树、红黑树)、B树、B+树、哈希表及哈希冲突、排序算法(堆排序、快速排序、要求面试时手写出这两种排序算法),二分法(旋转数组找target),回溯法(全排列、复原IP地址),动态规划(掌握基本动态规划题如斐波那契数列、接雨水、股票最佳买入时机)。参考书籍:《大话数据结构》六、mySQL数据库(7天~15天)学习重点:数据库存储引擎(InnoDB、myISAM、Memory),数据库索引类型及原理(B+树索引、哈希表索引),锁机制(悲观锁、乐观锁),事务特性(ACID)、事务并发问题、隔离级别及实现原理,多版本并发控制(MCVV)原理。参考书籍:《高性能MySQL》七、项目(2个月)建议学习一个项目,如改编自《Linux高性能服务器编程:使用muduo C++网络库》的“web高性能服务器”项目,同时伴随学习网络编程、操作系统、C++知识。总结:深入学习上述内容需要一年甚至两年时间,非科班学生建议6个月时间扎实学习C++基础、计算机网络、操作系统、网络编程、数据结构与算法。个人学习经验:2020年3~8月在家学习C++,7、8月份掌握基础并完成MFC小项目。9月学习计算机网络,10月至12月编写多线程服务器项目,同时复习网络编程、操作系统、C++知识。1月~2月学习数据结构与算法并刷题,3月开启海投模式,4月收到字节跳动的正式offer。