C/C++核心基础知识高效学习避雷指南
首先声明,本文内容主要是针对编程相关的内容,即是本文讨论的是编程重点。
有些这里说不是重点的内容可能在面试时一样要通过八股文重点准备。
本文档是可以评论的,有什么想法大家可以在评论区留言。
可能听起来有些矛盾,但事实就是面试造火箭,工作拧螺丝。
该文档持续更新,最新的链接在语雀。
首先声明,本文内容主要是针对编程相关的内容,即是本文讨论的是编程重点。
有些这里说不是重点的内容可能在面试时一样要通过八股文重点准备。
可能听起来有些矛盾,但事实就是面试造火箭,工作拧螺丝。
*************
学习过程中主要存在的误区
- C++ Primer的书籍能学半年
- 数据结构算法 跟风刷题
- 23种设计模式学习过程中没有侧重点
- Linux编程,啃全部的《UNIX环境高级编程, 812页》或者《Linux/UNIX系统编程手册 1176页》
- 计算机网络抱着课本啃,比如抱着《计算机网络(第8版) 谢希仁 484页》
为什么说要先快速掌握核心的知识,是因为只有通过写项目才能把各种知识真正串起来,写项目中遇到一些之前没有遇到的语法或者技术点,可以再去查书籍和博客。
0 校招该如何准备
尽量至少提前半年准备,见过不少985的网友,在7/8月份才开始准备找工作,然后连C++新特性、Linux系统编程、网络编程都不了解的,读研两年时间都花在导师给的任务上,出现找算法工作力不从心,找开发工作又没有准备的尴尬状态。
校招时间:
3、4月就开始实习投递
7、8月就开始提前批了
9、10月校招高峰期
11月大公司基本上招完了,只剩中小一些的公司
12月 只剩小公司了
第二年
3、4月春招,有些朋友大公司寄望补录(从目前的就业形势看,大公司补录的机会极少,因为这个时候以及开始招实习生了)
所以一定要提前准备好 3、4月实习投递、7、8、9、10月的校招高峰。
如果秋招错过了怎么办?那也不要摆烂,准备好项目,春招继续投,后续也可以投社招岗位的。
1 C++相关
C++基础
c++面向对象之封装、继承、和多态
C++ STL重点
先重点掌握容器的使用:
- [string容器]
- [vector容器
- [deque容器]
- [stack容器]
- [queue容器]
- [list容器]
- [set/ multiset 容器]
- [map/ multimap 容器]
容器算法可以先以了解为主。
对于不同容器的内部实现,后续看八股文的时候再深入。
C++ 新特性重点
- 智能指针(先重点掌握shared_ptr)
- 左右值引用(但不用太沉迷)、mov、forward
- thread、condition、mutex、atomic
- function、bind
- future、aysnc、promise、packaged_task
- 可变模版参数(variadic templates
- decltype / auto
- 实现一个C++11的线程池
实现一个C++11的线程池 差不多就可以把C++常用新特性串联起来。
不建议把c++14、17、20等等特性都一次学完。(注意,可以大致先了解下有什么新的特性就行)
2 数据结构算法
校招是不是一定要刷力扣
大公司、中小公司对算法要求区别:
- 字节、腾讯、美团、百度、阿里这些公司是要好好刷题的,200道起
- 像深信服这级别的公司对算法要求没有那么搞,大部分还是数组、链表、排序、查找、二叉树等算法题。
- 像瑞芯微、全志、联发科这类的芯片公司,对于算法这块也是考核常规的数组、链表、排序、查找、二叉树等算法题
建议:
- 先平衡自己的能力,确定可以冲哪一类的公司,不要无脑地把大量的时间花在刷题上;
- 网上搜索对应公司历年的面试题,有针对性地做准备,不要跟风冲自己能力不及的公司;
3 设计模式
常见设计模式23种,也不要全部重点去看,工作一般常用的就五六种,可以先重点看常用的设计模式,其他的以了解为主,
常用的设计模式:
- 单例模式
- 工厂模式
- 策略模式
- 观察者模式
- 责任链模式
- 组合模式
但需要做些扩展,比如单例模式
可以到准备八股文的时候再进一步复习,前期学编程先别纠结那么多各种细节,即使花了时间,面试前还是得准备。
4 Linux系统编程
如果Linux没有基础,可以先学习Linux常用命令,但不要无脑照着 《linux菜鸟教程命令大全》来。
对于shell编程,有个入门经验就行,主要是知道shell脚本的作用,大致理解脚本的运行逻辑就行。
重点放在Linux api编程上。
写代码不要用vim写,不要用vim写,可以使用vscode远程连接Linux系统写代码。
多进程
目前进程间通信大部分都是用的socket,即使大部分的进程间通信学习的时候不用作为重点内容,常见的主要是pipe。
重点掌握的内容:
- fork父子进程
- exec系统调用
- 僵尸进程
- 进程回收
- 进程间通信重点掌握pipe,其他不要花那么多时间,但八股文还是要背诵,比如喜欢问哪种进程间通信效率高
- 掌握进程的基本信号处理方式
多线程
Linux系统里多线程最为重要,大部分程序都会使用多线程。
重点:
- 线程创建、销毁、退出等待
- 信号量
- 互斥锁,工作中主要使用互斥锁,但面试读写锁也会被问到
- 条件变量
- 自己实现一个消息队列(生产线程、消费线程、队列、互斥、阻塞、唤醒等)
- 在消息队列和stl的基础上,实现一个线程池
信号
注意进程信号、线程信号的处理
重点:
- 信号发送、信号处理、信号屏蔽
- 特别需要留意的是网络编程相关的信号:
- 大部分书籍里提到的信号还是得好好看,信号内容相对也比较少
因为大部分开源项目会对这些信号(部分)设置,一定要理解其作用。(可以在网络编程的时候再重点理解)
其他
比如mmap等,这个也是需要重点掌握
5 Linux网络编程和原理
网络编程核心基础
核心是实现
- tcp客户端和服务端的通信
- udp 客户端和服务端的通信
- 注意阻塞和非阻塞
- select/poll/epoll实现服务端的io多路复用(客户端其实也可以使用select/poll/epoll)
Linux网络编程要掌握到什么程度
网络编程核心基础 -> reactor网络模型 -> 构建业务。
顺序:
- 实现reactor网络模型,实现echo业务
- 然后接入线程池,实现echo业务
- 构建http业务
- 构建webserver
- 添加日志(注意日志性能)
虽然很烂大街,但reactor网络模型是Linux开发的核心知识,可以把之前学到Linux编程串联起来。
Linux网络编程进阶
多线程、多线程、epoll+线程池不同reactor网络模型的区别
不能单只学会epoll+线程池的reactor网络模型,也要进阶学习其他reactor网络模型。
百万连接该怎么处理
怎么实现单机百万连接,是否需要优化操作系统参数,每条tcp链接占用多少资源
udp可靠性设计
如何实现udp可靠性传输,可以帮助我们理解网络传输原理,这个需要深刻理解tcp的基础上才能实现。
网络原理是不是要看教科书
重点是理解tcp、udp传输原理。(这个需要多看一些八股文,计算机书籍讲的是比较一般的)
http1.0 1.1 2.0 3.0
websocket等。
看书补充:可以看看 图解HTTP + 图解TCP/IP + 图解网络硬件 系列书籍。
6 通信协议设计
为什么要掌握通信协议设计
其实tcp、udp本身就属于通信协议设计,目的是让发送方和接收方 能够按照一定的格式发送和处理数据。
我们讲的通信协议设计,比如微信, 发消息
如果一个人连续发送多条消息,服务器怎么识别?有些朋友说间隔时间那么大,但如果我们是用代码做测试?
连续调用send(消息1), send(消息2), 如果"消息1和消息2"有粘包,服务器是收到"消息1消息2",那怎么拆分?
客户端和服务端该如何沟通
要实现客户端和服务端的沟通,就需要两端约定好通信协议。
常见序列化协议
json > protobuf > xml等
序列化的核心:把程序对象转为字节序列,以便后续再把字节序列还原为对象。
为什么要序列化,比如一个对象里有很多变成字段,比如name和address,如果不做序列化如何发送给对方。
{ "name": "darren", "lastName": "Jai", "address": "长沙岳麓区 高新区麓谷企业广场", "age": 25, "password": "admin@123" }
7 日志库
日志性能和什么有关系
注意fwrite和write的区别。
追求吞吐量:缓存后批量写入
追求实时性:每笔数据调用write写入。
什么是同步、异步日志
同步日志:指当输出⽇志时,必须等待⽇志输出语句执⾏完毕后,才能执⾏后⾯的业务逻辑语句
异步日志:⽇志输出语句与业务逻辑语句并不是在同⼀个线程中运⾏,⽽是有专⻔的线程⽤于进⾏⽇志输出操作。
如何实现日志的高吞吐量写入?
8 持续更新中
要做什么项目?
学习一定要有侧重点,20%是开发最常用的知识需要先掌握
#24秋招避雷总结#
C/C++学习难度较大且方向较多,设置的开发环境也比较多,为了节省大家的时间,程序员老廖我创建了该知识库,大家可以参考知识库的文章系统学习。