写在前面
2021 年的春招找实习暂时告一段落了,这段时间在牛客网以及各个实习群受益匪浅,主要包括一些面经与知识整理。非常感谢热心分享的大佬们,此时也想把自己的一些面试准备与经历整理出来,希望能帮助到有需要的人。
个人情况
楼主 985 科班本硕,本科绩点还行有幸推免读研,无 ACM 经历,在找春招实习前有过 4 段实习经历,分别是腾讯、华为和两段未写上简历的不知名小公司。本科时就一心想找 C++ 的工作,但奈何当时技术水平极菜(停留在 C98 时代的编程水平),结果大四面小公司 C++ 岗的时候一个问题都不会;读研选了一个比较闲的实验室,起初也没想着为校招做准备,直到看到同学投腾讯实习拿了 offer,才慌慌张张跟着投了简历,结果是一面挂。
从那时决定要开始好好学习八股,我在牛客上找到一些八股总结,然后照着上面的问题一条条看下来,LeetCode 也差不多是那时开始刷的(主要是按 Tag 刷),剑指 offer 大概也刷了几遍,每日一题可能想起来就打个卡;之前本想准备一个 C++ 项目,但由于个人时间规划能力较弱,最终也没搞出来。
个人觉得自己的劣势在于时间规划能力(主要是又懒又贪玩),这导致没有花大量时间去准备校招内容,技术方面没有太亮眼的项目,大多八股内容也没有系统地看过相关书籍,写题方面 LC 大约写了 400 题,也不是很够看,可以说是各方面都不是很突出,所以我非常庆幸能拿到几家 offer。
面试准备
我主要面的是 C++、Go 岗位(大多是后台开发),在八股方面准备了 C++、计网、OS、数据库、数据结构与算法等内容,也看过一些 Go、RPC、protobuf、MQ、k8s 等内容。我主要是看书或者总结他人的面经,这里我推荐大家有时间一定要看书或者源码,因为它们一般都是系统而又准确的,而网上的资料则取决于作者的水平(有的甚至是错误的),但是也要有的放矢地阅读,可以通过面经知道哪些是常考内容从而选择性地细读。
在面试中,八股并不是决定性的考察部分,更多地可能是考察知识面广度,我个人觉得八股背得差不多即可,比如拿到一篇面经,能答出 8 成就足够了,所以不要死钻研某条冷门八股,而是可以把时间放到刷题或者场景设计题上,因为有些公司(比如字节跳动)在这方面有一票否决权。当然,这只是我个人的经验,仁者见仁,智者见智吧。
在做题方面,我觉得要按 Tag 刷题与总结,比如滑动窗口、回溯这种题都是有套路的,同时,每写一道题后也要关注时间/空间复杂度,不能为了刷题而刷题。另外看到有人说很多题做了以后就忘,我觉得很正常,从实习到秋招,本身就是一个抗遗忘曲线的过程,除开多总结以外,也要时常刷题保持手感。
关于项目/实习方面,项目我可能没有太多的经验,但我理解和实习是差不多的效果,我很多次面试,全程基本都在问实习项目,而八股方面简单带过。所以项目/实习是很重要的,一个是减轻背八股的压力,二个是可以让面试由你主导(面试官不一定懂你做的什么),但对于自己的项目/实习,一定要很熟悉,对上下游的关系、数据流通、并发量要梳理清楚,对项目某个技术点除开原理要知道选这个技术的原因(体现出自己的思考能力)。
关于心态方面,就我而言,我心态最炸的时候是 1 月挂字节广告后,面完极度怀疑自己,但随后自己对面试做了复盘,觉得挂的原因更多的可能是交流方面的误会(当然面试官可能不这么觉得哈哈),从而调节好了心态。所以我觉得,面试不过也不要气馁,踏踏实实复盘,不会的查漏补缺,尽人事听天命,争取下一次面试好好发挥。
八股总结:
内容比较详尽的八股总结:
C++:
我粗读了一遍 “Primer C++”,也从中学习了 C++ 11,有些内容不太理解可能会直接看别人总结的八股,"Effective C++" 还在学习中;C++ 11 后的标准我就看了一些别人总结的内容,不是很了解,实际面试也就被问到过一次。
C++ 不懂必查:
八股总结 1,这个答案可能有错误:
八股总结 2:
STL 推荐按照 6 大组件边看边总结,最好是看《STL源码剖析》,或者侯捷老师的网课(侯捷老师语速有点慢,建议 2 倍速):
Go:
初学:
我主要看的(https://github.com/KeKe-Li/data-structures-questions)总结的面经,我觉得内容涵盖还是比较全的,另外平常写 Go 有不明白的内容直接(https://golang.org/pkg/)搜索。
计网:
计网的八股内容还是比较多的,出于时间关系(懒),我基本只看了面经...
对 C++ 岗来说网络编程是必考内容,我因为本科计网课就学过网络编程并配合看了一些 UNP 内容,还算能应付过面试,这方面我推荐大家可以自己写一些 demo 并且阅读源码(比如 select、epoll),从顶至下都要有一些了解。
OS:
同理计网,八股只看了面经。
linux 命令本科的时候看的《鸟哥的linux私房菜》,一些底层原理看过一些常考八股的源码,这方面推荐大家学写一下 ucore(存疑)。
数据库:
同理计网,基本只看了面经,然后我项目用了 redis,也准备了 redis 相关八股
redis 八股总结 1:
redis 八股总结 2:
其他技术类:
这方面推荐大家按自己的项目来,比如我项目用到了 es、hive,这方面可能会了解的多一些。
手撕:
推荐 CodeTop:
面经
微软上海
之前听微软同学说上海今年 hiring freeze,但还是发了笔试,然后我做了 90 分。过了大概 2 周约面,听介绍似乎是 azure 做 data 相关的部门,前两面平行面,(据说)过一个可进 LEAD 面。
微软上海 C+AI:已 oc
笔试:
应该都不是原题,每个人题不完全一样。
1)一道简单贪心
2)给你上下界,问之间有多少个数可以拆成 x*(x + 1) 的形式
3)字符串压缩(比如 AAAAB -> A4B),给你一个字符串 s 和数字 k,问使从 s 删去 k 个字符后并压缩后的最短长度。
一面:
1)自我介绍
2)redis 优势、劣势
3)redis 底层数据结构
4)redis 支持事务吗,什么命令?什么数据类型的支持事务?
5)LeetCode 877、LeetCode 486、BST 的中位数(能怎么优化,我以为要我找个 logn 的,后来他说双指针快一些…)
二面:
1)自我介绍,实习项目遇到最大的困难
2)HTTP、HTTPS,HTTPS 过程
3)TCP、UDP,TCP 三次握手,为什么不是两次
4)对称加密非对称加密区别、优劣
5)LeetCode 53、数字缩写(给定数字和精度,比如 1234.56 和 2,输出 “1.23k”)
三面 LEAD 面:
1)自我介绍(英文),实习项目,遇到最大的技术困难与解决方式
2)你讲的这个方案有调研过业界怎么做的吗?那你为什么不用 kafka?
3)项目 redis 做什么用的。redis 有什么典型应用场景,redis 怎么保证数据一致性
4)LeetCode 22(撕了一道又开始问别的了)
5)从数据库并发读数据然后转成特定格式文件有什么优化(我从 fork 多进程 + epoll 角度答的)
6)如果数据库数据量很大呢?(我答的哈希槽 + 归并,面试官没评价,但我面完复盘觉得不太对…)
7)要你设计上面这个场景的函数,怎么设计,怎么保证复用(多种格式文件)
8)C++ 多态,类和对象区别(什么时候使用),纯虚函数(什么时候使用,举例)
9)static,static 修饰类呢(我:没见过),构造函数析构函数,智能指针
10)进程线程,HTTP 与 HTTPS
字节跳动
1 月初面的字节广告穿山甲,我个人复盘是觉得一些沟通上的误会,导致手撕没有写的很完美,同时 Go 方面的八股准备的确实不足,所以挂了。
字节广告:一面挂
2 月被教育部门捞了,我个人觉得教育部门与我的职业发展路径相悖,但本着积累经验的想法,就面面看。
字节教育:已拒
一面:
1)自我介绍
2)讲讲区块链怎么保证数据不被篡改
3)区块链挖矿是什么,如果难度目标要求的 0 过多(比如 70 位),nonce 只有 32 位遍历一遍也无法满足怎么办
4)讲讲 redis 数据结构、数据类型
5)哪些用了 ziplist,讲讲 ziplist,如果要变动数据,编码方式会改变吗,怎么变动数据
6)讲讲跳表,查询时间复杂度
7)用过 zset 吗,用过什么命令,什么情况用 zset
8)redis 怎么做持久化
9)项目 redis 做了什么工作
10)MySQL 引擎是什么,innodb 怎么存储文件
11)讲讲 B+ 树,B+ 树有什么优点,你确定 B+ 树省空间?(这里被网上的资料坑了...)
12)LeetCode 113
二面:
1)项目详细讲讲,项目架构,怎么做负载均衡(nginx,中间件),redis 做了什么工作
2)浏览器输入 url
3)为什么用 hive,hive 与 MySql 区别,hive 为什么适合大数据
4)三次握手,第三次握手失败了怎么办?是否会重发?重发次数多少?如果服务端没接到第三个数据包但是客户端发送了第三个数据包之后再发一个数据包怎么办?
5)为什么是三次,不是两次、四次
6)跳箱子,每个箱子上有增加体力或者减少体力的蘑菇,给定初始体力,问是否能到达最后一个箱子,最大剩余体力是多少?
三面:
1)自我介绍
2)介绍项目,es 与 mysql 区别,为什么用 es,redis 用了什么数据类型,项目中 redis 一定可以做到去重吗,为什么要去重,redis 超时?
3)cpp 多态,为什么要面向对象,多态是为了什么
4)HTTPS,数字证书是什么,CA 是什么
5)进程与线程,为什么要有多线程,同一进程下的线程挂了其他一定挂吗
6)了解数据序列化吗
7)go 的 context,什么是上下文
8)虚拟地址,new 的时候发出的是什么地址,new 一个地址会访问几次物理地址
9)LeetCode 207,时间复杂度?
3 月又被 ailab 捞了,语音组的工程岗,还是我意向的 C++ 岗,然后不知道是不是面评好就两面。
字节 ailab:已 oc
一面
1)自我介绍
2)项目难点,为什么不直接用任务队列的 map,项目为什么用 es,es 不是全文检索?怎么做存储
3)Go 与 C++区别,C++/Go 编译过程,怎么做第三方库管理
4)C++ 用过什么编译
5)红黑树,与 AVL 树的优劣
6)redis 为什么快,有什么数据结构,讲讲 SDS、跳表
7)一般项目什么时候用 redis
8)有什么负载均衡的策略
9)LeetCode 114,LeetCode 33,33 这题如果是两个不相关的递增数组呢(我用递归写了个 logn~n 之间复杂度的算法,面试官要我再好好想想)
二面
1)自我介绍
2)讲讲实习工作
3)并发量,怎么控制链路,怎么提高服务利用率,下游服务有没有语音类的
4)项目怎么用 redis
5)项目怎么用 es,为什么不用 MySQL,有没有用到倒排索引机制,用了 es 什么检索机制,es 怎么清空
6)map 和 unordered_map
7)vector 怎么扩容
8)多线程和多进程的区别
9)RPC 了解过吗,thrift、protobuf 用过没有
10)了解过怎么做深度学习模型构建吗,就是知不知道你下游的一个算法模型如何从零构建
11)LeetCode 92
阿里云
阿里云存储的 C++ 岗位,一面过于简单八股让我一度以为是 KPI,目前 hr 面已过等 oc。
阿里云存储:已 oc
笔试:
LeetCode 1411、LeetCode 815,第一题卡了半天 1e9 + 7 导致没时间写第二题,最终应该是 60 分。
一面:
1)socket 编程判断对端断开
2)三次握手为什么三次
3)tcp 靠什么保证可靠
4)tcp 序列号,为什么设计这个序列号
5)实习遇到的最大困难
6)手撕,二叉树逆序分层打印(不停问我怎么优化,我从 move 写到指针写到 unique_ptr 写到手写 list)
二面:
1)项目某个点问了 1h
2)判断单词是打错还是手抖,比如原串 word,wwworrd 就是手抖,xord 就是打错
三面交叉面:(快速 QA,不会就过,有些我忘了,问了很多数学)
1、get、post 区别
2、linux 系统 ipc
3、向量点积、叉积
4、矩阵的秩
5、给一个随机数生成器怎么生成正态分布
6、容器和虚拟机区别
7、一个 string,让你分成 5 个 string,任选 >=3 个可以还原,<3 个不行(我答的 (t, n) 门限 + 拉格朗日插值法,他说会下去查查)
蚂蚁金服
AntMonitor 团队,感觉工作偏 sre 而且又是 Java,我就拒了。
蚂蚁 AntMonitor:已拒
一面:
1)LeetCode 297
2)自我介绍
3)华为的工作
4)腾讯的工作,监控做了什么
5)进程线程协程区别
6)虚拟地址
二面:
1)自我介绍
2)腾讯工作
3)项目用的 HTTP 是什么(有没有了解过 HTTP3.0),接口是 REST?
4)讲讲 RESTFUL 的特点、好处
5)tcp、udp 区别,tcp 为什么说是面向连接,有没有了解过有连接的 udp
6)进程调度,为什么要进程调度,linux怎么提高进程优先级
7)进程线程的区别,goroutine 与 os 的线程区别(构造)
8)构造函数抛异常,应该怎么做
9)快排,工业界怎么优化(随机、三向切分),为什么小于 n 用插入排序(我答的栈消耗,他说如果用迭代写的快排呢,我:不知道)
10)网络包分片
11)怎么判断一个 os,栈是向上还是向下增长
三面:(被吊打...)
1)实习和学习经历,几段实习学到了什么
2)C++ 智能指针解决了什么事,move 和 copy有什么区别,std::copy 会有什么问题
3)我想说的是 strcpy 会有什么问题,怎么解决
4)Go 怎么做内存分配,怎么 GC
5)linux 怎么内存分配,了解比如 malloc 后系统做了什么吗,了解 linux 内核内存池吗,要你设计内存池你怎么设计
6)你项目用了 es,为什么用 es,了解 es 怎么做检索的吗,你项目的链路是 trace 链路还是(没听懂)链路(后面听我讲完:你这项目听起来很简单啊,我:???)
7)了解 swap 具体怎么实现的吗
8)(估计看我磕磕巴巴答得不好)你读 linux 源码多吗
9)(没听懂)什么什么 cache 你了解过吗,知道怎么实现不
10)你说用过 hive,知道 hive 底层怎么做存储的吗,了解什么存储系统吗
11)你未来想做什么方向的后台开发(给我拿网络方向列了一堆子方向,我:...)
腾讯
老东家了。
去年的面经:
腾讯 CSIG:一面挂
我大概看了 4、5 天面经就去面了,连最简单的二分都写得磕磕巴巴,那当然是挂啦。
腾讯 IEG:已离职
腾讯 PCG:已 oc
一个做内部产品孵化的部门,一面我就想拒了,没想到面完又来个初试通知(我以为是挂了又被其他部门重新捞),但没想到还是这个部门(面试官:咱们初试有俩面哦),想着反正今年也不会去腾讯,就面面看。
一面:
1)自我介绍
2)tcp 三次握手四次挥手,大量 time_wait,三次握手 ddos 攻击,怎么解决
3)https 过程
4)http 状态码,302 是什么
5)进程、线程、goroutine
6)进程间的通信,说说他们适用场合
7)myisam、innodb,他们的存储文件区别
8)隔离级别,mysql 默认什么
9)死锁条件、预防、避免
10)redis,如果 string 很多 redis 存不下怎么做(没听懂),用过 zset 吗,说说底层结构
11)bloom filter,能删除节点吗
12)了解什么设计模式,讲讲生产消费者模式、单例模式,go 怎么写单例模式
13)如何设计一个秒杀系统(我写 cpp 的不太会这方面,我就从系统拆分、mq、分库分表、读写分离、缓存角度说了自己的想法)
14)mysql 优化了解过吗,讲讲 procedure
15)linux 用过什么命令,怎么查端口占有,说说 top 几个字段含义,清空文件用什么命令
16)如果代码中有很多 if else 或者 switch,怎么优化
二面:
1)自我介绍
2)进程、线程、goroutine
3)tcp 三次握手四次挥手
4)浏览器输入 url 发生了什么
5)linux top、ps,查看文件有多少行用什么命令
6)go 的 局部变量存在哪
7)go 的 gc
8)redis 过期策略
9)以下程序的输出
#include <stdio.h>
int main()
{
int i = 0;
int arr[3] = {0};
for(;i<=3;i++) {
arr[i] = 0;
printf("Hello, World! \n");
}
return 0;
}
10)字符串相减,类似 LeetCode 415
三面:
1)自我介绍
2)详细讲讲项目,有什么难点,你这个用消息队列不是更好
3)用过什么消息队列
4)redis 怎么用的,redis 有什么数据结构,zset 怎么实现的
5)redis 为什么快
6)微博消息推送系统怎么设计(我说全扔 kafka blabla,他问我具体点呢,然后我就说不下去了)
7)分布式生成唯一 id
VMware
我觉得面试不难但是可能对简历要求高?
VMware:已 oc
一面:
1)自我介绍
2)goroutine 的理解,与线程、进程的区别
3)channel 使用、线程安全
4)slice 的注意事项
5)项目回调超时和重试有什么处理
6)项目具体怎么从场景分配到任务,怎么控制执行顺序
7)回调有什么需要注意的地方
8)任务去重
9)网络模型
二面:
1)自我介绍
2)项目遇到的困难
3)多态的理解
4)动态多态怎么实现的,举个你用到过多态的例子
5)智能指针
6)stl 用过什么容器,stack 是容器吗,deque 时间复杂度,deque 底层实现
7)构造函数抛异常
8)内存泄漏,没有回收一定会有内存泄漏吗?
9)lru 实现,时间复杂度,空间复杂度可以优化吗,lru 线性扫描
总监面:
1)自我介绍
2)你做的是算法模型吗?详细讲调度逻辑、场景服务
3)算法模型跑在哪,平台用过并发吗?
4)你住哪,一周几天,期望做什么工作
5)华为项目的背景
EMC
就一面。
Dell EMC:等 oc
一面:
1)自我介绍
2)C++ 继承、封装、多态
3)public、protected、private
4)vector、list、set
5)红黑树
6)讲讲排序算法
7)三次握手
8)线程进程区别
9)LeetCode 64、还有一题应该是 mid 难度但我没在 lc 找到
国内某私募
出于个人信息考量就不说名字了,是一家 bar 很高的私募,我也是尝试性投的 C++ 开发岗没想到就过了...然后这家是我收到的第一个 offer,我思来想去后还是拒了,主要是觉得做私募方向走窄了。
国内某私募:已拒
笔试:
codility 上三道 mid~hard 难度的题(非原题),时间很充裕,我应该是 ak 了。
一面:
1)自我介绍
2)你的研究方向
3)为什么选择 C++ 岗
4)用什么 C++ 标准
5)move 语义怎么实现,标准库支持 std::move() 操作的类型,std::move() 减少拷贝次数的例子,什么情况下需要用 std::move()
6)C++ 11 的线程库,线程开发,go 怎么做并发
7)C++ 11 原子操作
8)类的成员函数后面加 const
9)模板用的多吗
10)map 自定义 key 怎么做,用 class 怎么做,用 functional(lambda?)呢,C++ 17 才有?
11)list 和 vector 都什么情况用,vector 不考虑扩容随机插入时间复杂度,list 没有扩容插入复杂度,怎么样做到 O(1)
12)unordered_map 访问时间复杂度,这个 O(1) 和 vector 的有区别吗,最坏时间复杂度
13)priority_queue 底层容器默认是什么,为什么用 deque 而不是 vector,deque 底层实现
14)智能指针介绍下,shared_ptr 怎么使用,底层怎么实现,n 个 shared_ptr 托管同一个指针的空间占用,引用计数怎么做的
15)反问
二面 onsite:
1)自我介绍
2)原子操作是什么,i++,++i 线程安全,汇编,是原子吗
3)C++ 11 特性
4)auto 和 decltype
5)智能指针
6)讲讲 move 什么时候用,所有智能指针都可以用吗
7)局域网两台机器 A,B;B 是文件系统,A 读 B,怎么提高网络速率
8)linux 看端口占用
9)tcp、udp 区别
10)介绍 C++ 的锁,自选锁进程是什么状态
11)C++ 和 Go的区别,GC 什么时候用好
12)unique_ptr 怎么设计
这家实习包括校招给的都很多,而且 onsite 的时候大家对我都很好,但觉得我更适合互联网,所以还是含泪拒了 offer。
总结
个人觉得自己算不上大佬,只是运气好找到实习罢了,后续还需要继续努力学习,也欢迎大家与我交流沟通。
全部评论
(36) 回帖