给准备秋招C++后端岗位同学的一些建议
本仓库用于记录本人在今年准备春招实习和即将到来的秋招的过程中,学习和总结到的一些知识,用于自己的回顾,也对这关键的人生历程留下自己的回忆,愿不负所望,找到理想满意的工作,求职加油!!!!
1. C++
这块主要看四本书,第一本当然是《C++ Primmer》,另外三本是《Effective C++》《STL源码》和《深度探索C++模型》,搭配侯捷老师的B站课程进行学习,重点学习内容如下:
- 指针、引用、数组、内存
- 引用与指针区别
- C 和 C++ 的一些区别,比如 new、delete 和 malloc、free 的区别
- 虚机制:虚函数、虚函数表、纯虚函数
- 继承、虚继承、菱形继承等
- 多态:动态绑定,静态多态
- 重写、重载
- 智能指针原理:引用计数、RAII(资源获取即初始化)思想
- 智能指针使用:shared_ptr、weak_ptr、unique_ptr等
- 一些关键字的作用:static、const、volatile、extern
- 四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
- STL部分容器的实现原理,如 vector、deque、map、hashmap
- 模板特化、偏特化,萃取 traits 技巧
- 编译链接机制、内存布局(memory layout)、对象模型
- C++11 部分新特性,比如右值引用、完美转发等
2. 力扣和剑指offer
计划力扣先把前两百题挨着刷一遍,剑指offer刷两遍,第一遍手撕各种不同实现的代码,理解清楚原理,第二遍先看题目讲思路,写出最优的代码并分析时间复杂度和空间复杂度,力扣做完以后把力扣的题目按照解题方法分类,然后按照类别再把这两百道题目,进行一一学习,做完以上就每日刷一下每日一题就OK啦,剑指offer的题目真的都是超级重要的题目,大家一定要认真一道一道做呀,面试遇到很多次原题了。
3. 程序员代码面试指南
在刷完力扣和剑指offer以后,相信对手撕代码有了一定的认识,能力也提高了一些,但是难度还是不够,在这本书中,跟着左神把代码都总结一下,一定会有所收获,这部分我还会把参加左神算法课上课的笔记上传到这里,也希望大家多多报名左神的课程啊,真的超级棒!!!
4. 操作系统
操作系统主要是跟着B站学习和总结,哈工大李治军操作系统课程链接,南京大学蒋炎岩操作系统课程链接,主要学习进程与线程管理,内存管理,IO与文件系统,设备管理,四大模块进行逐一攻破!!!我用的书是《现代操作系统》大黑书,另推荐《Linux内核设计与实现》参考,重要的内容如下:
- 操作系统由哪些构成
- 进程的状态、切换、调度
- 进程间通信方式(共享内存、管道、消息)
- 进程和线程的区别
- 线程的实现方式(一对一、多对一等)
- 互斥与同步(信号量、管程、锁)
- 死锁检测与避免
- 并发经典的问题:读者写者、哲学家就餐问题
- 为什么需要虚拟内存,MMU 具体如何做地址转换的
- 内存为什么分段、分页
- 页面置换算法
- 文件系统是如何组织的
- 虚拟文件系统(VFS)是如何抽象的
- …
5. 计算机网络
计算机网络也主要是看B站,这里计划看的课程是韩立刚老师计算机网络,韩立刚老师计算机网络课程链接,主要学习结构中的三层,网络层,传输层,应用层,另外两层大致了解就行。
需要掌握的网络协议和知识:
- HTTP、TCP、IP、ICMP、UDP、DNS、ARP
- IP地址、MAC地址、OSI七层模型(或者 TCP/IP 五层模型)
- HTTPS安全相关的:数字签名、数字证书、TLS
- 常见网络攻击:局域网ARP泛洪、DDoS、TCP SYN Flood、XSS等
常见的问题:
- ARP工作过程
- IP地址
- IP分片
- NAT(UDP打洞)
- 链路层访问控制协议
- TCP协议相关
- 三次握手,四次挥手
- 状态转换
- TCP状态中TIME_WAIT
- 拥塞控制
- 快速重传,慢启动
- TCP如何实现可靠传输的(如何基于UDP实现可靠传输)
- TCP连接建立为什么不是两次握手(三次握手的充分必要性)
- TIME_WAIT的存在解决了什么问题,等待时间为什么是2MSL?
- 为什么有了 MAC 地址还要 IP 地址,IP 地址和 MAC 地址的区别是什么?
- 如何理解广播域和冲突域?
- 路由器和交换机有什么区别?
- TCP 连接的本质是什么,真的是“链接”吗?(曾经被问过:Java socket 创建的 TCP 连接,对于主机挂了和 JVM 挂了有什么区别?)
- 从URL输入到页面展现到底发生了什么?
书籍推荐:《计算机网络自顶向下》《TCP/IP详解卷1:协议》《图解HTTP》
6. 网络编程
C++ 后台开发基本是离不开网络编程的,其实甚至整个后台开发也可以看做是在做网络编程。Linux 下网络编程核心的包括系统编程和网络 IO 两个部分:
- 进程间通信方式:信号量、管道、共享内存、socket 等
- 多线程编程:互斥锁、条件变量、读写锁、线程池等
- 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
- 高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 Proactor
- IO 复用机制:epoll、select、poll(破解 C10K 问题的利器)
书籍推荐
《Linux高性能服务器编程》后面几章关于高性能服务器程序框架、高性能IO、IO复用、定时器、多线程编程、线程池和进程池还是讲得非常全面到位的,值得一看,看完基本上对于整个网络编程就有了框架.
《Linux多线程服务器端编程》这本书同样强烈推荐,这是陈硕大佬写的书,这是难得的讲解 C++ 多线程编程的书。
HTTP服务器:Linux C/C++ 人手一个的项目,https://github.com/imarvinle/WebServer,https://github.com/linyacool/WebServer,这两个分别是编程指北大佬和牛客linya大佬写的,记得关注两位大佬的公众号哦。
7. 数据库
数据库这块计划先学会使用MySQL,看 《MySQL必知必会》 ,面试经常考的是索引和并发控制,这部分有两本书 《高性能MySQL》 ,《MySQL技术内幕》 ,常见的面试题目:
- 索引存储结构:B树、B+树索引、Hash索引
- 索引的使用:主键索引、覆盖索引、最左前缀原则、索引下推等
- 锁:乐观锁、悲观锁、表锁,行锁,意向锁,读锁,写锁等等
- MySQL InnoDB MVCC 实现机制
- 存储引擎:InnoDB、MyISAM等,各自的优缺点
- 事务:ACID理论