文章目录
- 1. 秋招过程
- 2. 在这之前
- 3. 如何学习Cpp后台开发
- 4. 面试题整理
- 5. 总结
秋招已经结束一段时间,是该总结一下了。 经过无数次的纠结,还是决定去互联网公司修修福报:( 往年的秋招都是金九银十嘛,但是今年由于疫情的影响,互联网公司的秋招貌似比往年提前了一些。一些公司从六月底七月初就已经开始了提前批的招聘。 我在秋招中全是投的北京的Cpp后台开发岗位,虽然自己学习计划上的好多东西还没来得及学,但秋招过程也不算太艰难,有幸在九月初拿到了百度提前批和快手两家的offer,在这之后感觉该面的公司也都面了,就没再继续投递简历,省出一些时间来学习了。
秋招过程
如果秋招之前就在心仪的公司实习了,那么走内部转正是一条比较好的途径。因为疫情再加上忙实验室的项目,上半年一直宅在家里。在6月,我开始更新自己的简历,6月28日,投递了字节跳动的提前批。那时候任何准备都没有,就挂在二面了。从那之后开始看面经,整理面试题,然后开始陆续的投递其他公司。之后一段时间基本就是面试 整理面试题 复习知识点中度过的,从8月开始,各大厂正式批也开始了,相较于提前批(一般是不用笔试的,但简历可能筛的严格点),正式批增加了笔试环节,一些公司还要做性格测试心理测试,整个周期就变得比较长了。9月开学之后,就基本没再投递简历,把之前投过的继续面了下。 其实秋招这段时间,要笔试面试,可能还要忙其他事情,所以剩下的时间基本上就用来看面经、刷题了。核心的、系统的学习要在这之前就要完成的。 如果离秋招还有比较长的时间,还是要把时间放在基础知识的学习上。如果临近秋招了,那就多刷题、多看看面经。
在这之前
在研一的上学期,手头上有本本科买的《汇编语言》,我想不能让它浪费了啊,就在课余时间自学了一遍,之后我开始考虑毕业后从事什么方向,因为自己本科时候参加过ACM,对c stl熟悉一些,再加上实验室的研究方向是偏底层点的,需要学习操作系统的知识,于是就选定了Cpp后台开发这个方向。选好方向,就去牛客网、知乎等地方去阅读别人的学习经验和总结,经过一番调研,就对这个方向需要学习哪些东西有所了解了。然后我就开始学习相关知识了,因为服务器程序大多都在Linux系统下,我就把实验室电脑装了ubuntu,平时就用这个系统。然后买了《C Primer》,重新学习C 。在这期间,穿插着学习了vim、gcc、gdb、git等工具的使用,之后又读了《effective c 》。寒假前跟着舍友去参与软件所的一个项目,学习了一周Qt,写了一个简单计算器练手。
Cpp的基本知识学的差不多之后,又开始系统编程的学习,我发现《Unix/Linux编程实践教程》更适合入门,然后从网上下了电子版开始阅读,之后对系统编程有了个基本的认识,在看这本书时写了一个小的终端弹球游戏。
之后没有读APUE(UNIX环境高级编程)那本书,而是买的《Linux/Unix系统编程手册》,内容相对要新一点,在学线程那一块时写了一个线程池。期间读了几个小程序的源码tinyhttpd、webbench,代码行数都非常少,还是很容易阅读的。为了准备实习,之后又做了些算法题,快速把《剑指offer》过了一遍。之后面了几家公司,暑假去百度视频实习了一段时间。 实习的时候是在adx广告交易平台项目,负责带我的同事由易到难地给我安排任务,先是读项目源码、然后改代码、最后再实现需求。在这期间主要是体会了工作的流程、业务的学习(挺重要的)、新技术的学习。最后慢慢入门项目了,结果实验室有新项目,于是就回学校了。刚要能干活就跑路了,我还是有点愧疚的…这段时间每天要通勤四个小时,还要忙实验室的项目,真的是挺累的,所以以后租房一定要离公司近点的… 九月回学校之后,计划有变,新项目就中止了。于是我又接着学习《STL源码剖析》,读空间配置器部分时模仿着写了一个内存池,为了学习map,又去学习了一遍红黑树的原理。之后又开始学习网络编程,看UNP(UNIX网络编程)、《TCP/IP详解(卷一)》,学习ip协议部分时,写了一个ping程序。 2020疫情在家的上半年,主要是在忙实验室的项目,也正好趁机补充一些操作系统的知识,先是看了LKD(Linux内核设计与实现),之后为了写内核模块又读了ULK(深入理解Linux内核)的内存管理一章,最后也实现出了内核模块的功能。 回顾我的Cpp后台学习过程,感觉看书占用了很多的时间(虽然不是每本都通读的),其实可以看书少一些,更有重点一些,然后多再多一些动手实践,毕竟编程是一门需要多动手实践的技术。另外就是我的学习计划也只执行了一部分,一直想看的《Linux多线程服务端编程:使用muduo C 网络库》在秋招前也没来得及看,要是看完了这本书,再做一个像样点的项目,也许在秋招中就能再多一些优势了吧…我想学习计划推进比较慢的原因是我还花了好多时间在一些课外书上面吧,但是这也没办法,开阔眼界也很重要。
如何学习Cpp后台开发
Cpp这门语言很强大,但是这也导致了它的特性比较多,学起来相对比较费劲。再就是只学Cpp并不能做出什么比较有用的东西,你还得学习系统编程、网络编程,而这两块内容比较著名的几本大块头就会劝退一波人,所以Cpp后台开发的一个特点是涉及的知识点比较多、相对比较底层、学习周期比较长。但是它的优点也是显而易见的,系统编程、网络编程依赖于系统的API,都二三十年没什么变化了,相较于更上层的一些技术,迭代更慢,所以Cpp程序员更有可能拥有比较长的编程生涯,再就是学习Cpp的过程中,基础更扎实了,之后向其他语言迁移也会相对容易些的。 那么如何学好Cpp后台开发(其他语言也一样),网络上也有很多优秀的总结,其实无非就是做好以下几件事:1.多读一些计算机领域的经典书籍。2.多敲代码练习。3.多读一些优秀开源项目的源码。4.自己做一个完整的项目。5.多做做算法题。对于学生来说,有机会一定一定要去实习,在实践中会进步的更快。 这里也有几个优秀的学习总结:
- 我的C 后台/基础架构岗位学习路线
- Linux C/CPP 后台开发学习路线(大厂SP、SSP)
- 后台开发核心知识
- CS-Notes
面试题整理
面试考察的基本都是计算机基础 项目 算法题,这是我记录的一些面试题:
面试记录
代码语言:javascript复制20200707
面试情况
一面:
自我介绍
挨个谈项目
内存池
建议我与STL中的空间配置器对比测试一下。
线程池
建议了解一下无锁队列的实现
QT做的计算器引申出逆波兰表达式(忘记了)
问CPP了解哪些:
STL:
问STL的特色或者说特点有哪些
有哪些容器
每个容器的底层实现是什么
类型萃取(没说清楚,建议我再回去捋一下)
STL中的算法有什么印象
sort怎么实现的(只记得快排了,其实是快排 插入排序 堆排序)
快排讲一下时间复杂度,什么时候效率最低,最坏时间复杂度。
面向对象:
面向对象三大特性是什么
分别解释封装、继承、多态
多态分为编译时多态和运行时多态,分别讲一下(编译时多态想不起来了)
虚函数使用及原理
友元类和友元函数(只讲了友元函数)
C 11:
std::move()
std::forward()不会
算法:
二叉树层次遍历
redis了解吗
有什么想问我的
二面:
数据库(直接不会):四大特性(原子一致隔离持久)、索引
进程间通讯有哪些
tcp和udp区别
为什么建立连接需要三次握手,断开连接是四次握手
求最长不重复子串
2G内存10G日志(全是uid,有可能每一个都不重复),找出出现频率前10的uid。
有什么想问我的
20200727
面试情况
一面:
自我介绍
讲一下实验室负责的内容,进程怎么保证可信的
protobuf的优点,它的编码原理了解过吗
http和https的区别
编译时多态
运行时多态(虚函数、纯虚函数)
如果拷贝构造函数不加引用符号会怎样(会不断地调用拷贝构造函数死循环)
算法:复制带random指针的链表(第一次遍历先按next拷贝链表,并用map记录旧节点和新节点的映射,第二次遍历设置random)
二面:
自我介绍
进程的fork过程
fork之后,是怎么判断虚拟页的归属权
讲一下页表,为什么要分级
为什么虚拟地址不跟跟物理地址一一对应,为什么分级。
拥塞控制算法
进程状态机
设计数据结构,在x时间内允许消息最多发送y次。
算法:合并m条链表
三面:
自我介绍
学过的技术有哪些
描述一下三次握手和四次挥手。
如何让一个类不能创建对象(问纯虚函数的效果知道,问效果就不忘了是纯虚函数了!!!)
进程间通讯方式
线程间同步方式
进程和线程区别
web服务器接受连接的最大数量,怎么改。
内存池如何实现的,如何彻底解决内存碎片问题(是想问虚拟内存?)
nginx了解吗
算法:获取两个二叉树的最大相似子树,返回根节点(两棵子树完全一样称两棵树相似,最大的意思是相似子树的节点个数最多的)
存在问题
计算机网络不够扎实,拥塞控制机制都忘了
算法能力还是不够
20200728
面试情况
一面:
自我介绍
说一下百度实习做了什么
protobuf和json区别
你对工作的期待是要非常契合吗?如果其他技术栈呢?
vector和list的区别
new和malloc区别
三次握手四次挥手(应当描述出状态转换过程)
什么时候会出现time_wait状态
tcp慢启动
滑动窗口
讲一下缺页中断
浏览器输入一个地址发生了什么
http响应码(301和302区别)
mysql底层为什么是b 树,不是别的。b树操作的时间复杂度?
红黑树在stl的应用
STL的map和set为什么选择红黑树
深拷贝和浅拷贝
redis了解吗
linux查看磁盘空间df -h、查看物理内存使用情况free
整数数组,只有一个元素出现一次,其他都是两次,找出出现一次的元素。
有一个元素出现一次,其他都是三次,找出出现一次的。
公司里做工程类的比较多,你的垂直领域可能用不上,你怎么抉择
如果你进公司后发现部门挺边缘的,你怎么抉择你的处境
有什么要问我的
20200729
面试情况
一面:
网络:
tcp三次握手
time_wait状态
tcp里面有哪些定时器
网络编程的大概流程
poll和epoll区别
粘包问题
操作系统:
进程表里面有哪些数据
描述ELF文件
进程间通讯方式
算法数据结构:
排序有哪些,哪种排序比较快
描述快排过程
描述堆排序过程
哪些排序稳定,哪些不稳定
了解哪些树的结构,b树和b 树的区别
cpp:
拷贝构造函数什么用
宏定义和const区别(这两个什么关系?)
new跟malloc区别(new的具体过程)
其他:
查看端口对应的进程
gdb调试过程
jvm内存模型
python的list和tuple区别
缓存了解哪些,比如分布式缓存
描述写的线程池
问的挺广,我的不足之处
20200803
面试情况
一面:20200803
自我介绍
线程池
讲一下多态
何时会发生死锁
很多小文件,每个文件中有很多单词。给定一个单词,求包含该单词的文件名。(内存中存放不下又该怎么处理)
手写代码:根据奇偶重排数组
问思路:多路归并链表,从每个链表头选最小结点这里如何优化。用小根堆/优先队列
二面:20200820晚
自我介绍
线程池的线程数量如何设置
无锁队列怎么实现(boost中有实现)
Cpp:
初始化队列的作用
返回一个类中成员变量的引用会怎样
函数重载的原理
网络:
poll和epoll区别及适用场景
算法:
寻找空洞数字(实现BitMap)
输出二叉树中p1和p2的最近公共祖先到根节点。
mysql、redis、kafka等中间件!
数据库!
python!
三面:20200825下午
自我介绍
介绍实习工作
介绍实验室工作
20min实现一个ls命令(需要的api假定都有)
手写单例模式(懒汉式)
在这三面中你认为自己表现怎样
过往学习和实习经历中有哪些自豪或记忆深刻的事
如果通过面试能够提前来实习吗
反问
20200811
面试情况
一面:
自我介绍
介绍实习工作
http和https的区别
发生死锁的条件
进程和线程的区别
线程间同步方式
进程间通讯方式
了解消息队列吗
了解数据库吗
数组中寻找峰值,要求tc:logn
20200828
面试情况
一面:
多种方法求解:给定0返回1,给定1返回0.
只有一个题,20min就结束了…
20200901
面试情况
一面:
序列化协议的区别
指针和引用的区别,使用时需要注意什么。
多态
虚函数和纯虚函数
c 的特点
手写生产者消费者
大数相加(链表从高位往低位存储数据)
接受转java吗
20200904
面试情况
一面:20200904
自我介绍 介绍项目
gdb使用方式
Makefile会写吗
cpp智能指针以及使用场景
数据库索引
b树b 树区别
超大数组排序
手写合并两条有序链表
口述合并k条链表思路
20200905
面试情况
一面:20200905
算法:不重复元素的数组中,可重复取数,求和为target的所有集合
fork
四次挥手
cpp11
智能指针
虚拟地址
自我介绍介绍项目
反问
二面:20200905
算法:
一个奇数行奇数列的矩阵,元素只有0或1,最少翻转多少次行或列,使得满足所有行列都是偶数个1.
合并区间
智能指针
研究生期间工作内容,成就感来自哪里
实习工作内容,有哪些挑战
觉得工作中会有哪些挑战
面试体验
20200912
面试情况
一面:
自我介绍、简历项目
说一些linux命令
…都忘了
算法:给定字符串,分割出所有合法的ip地址
20200916
面试情况
一面:
自我介绍、介绍项目
详细问实习情况
了解的网络编程模型
Reactor模式
protobuf 2.0和3.0的区别
vector扩容
进程数量限制
各种中间件
看过的书
算法:寻找环的入口结点
20200926
面试情况
一面:20200926现场面
简历、专利、实习
内核模块、调试方法、elf文件
无符号整数转有符号整数
20200929
面试情况
一面:20200929
有虚函数的类的实例占多少字节
实例中能不能有两个虚函数指针
虚继承
new如何判断内存分配失败、如何通过null判断内存分配失败
i 和 i
系统调用
调用约定
堆区栈区的区别
虚拟地址转物理地址方法
算法:逆序打印链表值
二面:20201017
自我介绍 介绍项目
虚函数应用场景
如何不通过虚函数实现多态
查看进程打开了哪些文件描述符
查看进程占用的端口信息
gdb调试基本命令 多线程调试
线程安全是什么意思,有哪些方式来实现
可重入锁、可重入函数
判断字符串是否为合法的ipv4
下面是我整理的一些常见面试题,仅供参考。我还是建议你在学习的时候自己整理,这样印象会更深刻,如果只是单纯的背面经,在面试中,面试官稍微变换一下或者深入问一下,就知道你到底有没有理解这个知识点了。
- 基础知识_Cpp
- 基础知识_操作系统
- 基础知识_网络
- 基础知识_算法笔记
- 基础知识_设计模式
- 基础知识_数据库
总结
应届生找工作,能力是根本,但是学历真的很重要。记得18年只有240万人考研,21年就涨到370万了…本科生也越来越难找到好的工作了,计算机专业越来越内卷的形势下,我们能做的还是要不断练好自己的内功。 记得有这样一句话:迷茫的时候,选择更艰难地那条路。
欢迎与我分享你的看法。 转载请注明出处:http://taowusheng.cn/