迷茫之后,拿下C++/Golang大厂实习offer
这是一个同学今年斩获了几家大厂c++实习offer,并分享一下面试c++/golang后台方向的一些经验和面试技巧,希望面C++的同学可以少走弯路。
链接:
https://www.nowcoder.com/discuss/611710?type=all&order=time&pos=&page=2&channel=-1&source_id=search_all_nctrack
个人情况
面试准备
八股总结:
C++:
C++ 不懂必查:
Go:
计网:
OS:
数据库:
其他技术类:
手撕:
面经
字节跳动
阿里云
蚂蚁金服
腾讯 PCG:等三面
总结
个人情况
楼主 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 刷题与总结,比如滑动窗口、回溯这种题都是有套路的, 同时,每写一道题后也要关注时间/空间复杂度, 不能为了刷题而刷题。另外看到有人说很多题做了以后就忘,我觉得很正常,从实习到秋招,本身就是一个抗遗忘曲线的过程,除开多总结以外,也要时常刷题保持手感。
关于项目/实习方面,项目我可能没有太多的经验,但我理解和实习是差不多的效果,我很多次面试,全程基本都在问实习项目,而八股方面简单带过。
所以项目/实习是很重要的,一个是减轻背八股的压力,二个是可以让面试由你主导(面试官不一定懂你做的什么),但对于自己的项目/实习,一定要很熟悉,对上下游的关系、数据流通、并发量要梳理清楚,对项目某个技术点除开原理要知道选这个技术的原因(体现出自己的思考能力)。
八股总结:
内容比较详尽的八股总结:
https://www.cnblogs.com/zhang-qc/p/9410862.html
C++:
我粗读了一遍 “Primer C++”,也从中学习了 C++ 11,有些内容不太理解可能会直接看别人总结的八股,"Effective C++" 还在学习中;C++ 11 后的标准我就看了一些别人总结的内容,不是很了解,实际面试也就被问到过一次。
C++ 不懂必查:
https://en.cppreference.com/w/
八股总结 1, 这个答案可能有错误:
https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21
八股总结 2:
https://www.nowcoder.com/discuss/164721?type=0&order=4&pos=4&page=1
STL 推荐按照 6 大组件边看边总结,最好是看《STL源码剖析》,或者 侯捷老师的网课( 侯捷老师语速有点慢,建议 2 倍速 ):
http://c.biancheng.net/stl/
https://www.bilibili.com/video/BV1BX4y1G7bX
Go:
初学:http://www.topgoer.com/
我主要看的( 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:
https://www.zhihu.com/column/c_1258281375809056768
redis 八股总结 2:
https://www.zhihu.com/column/c_1231226679504166912
其他技术类:
这方面推荐大家按自己的项目来,比如我项目用到了 es、hive,这方面可能会了解的多一些。
手撕:
https://codetop.cc/#/home https://www.acwing.com/
面经
字节跳动
一面:
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)跳箱子,每个箱子上有增加体力或者减少体力的蘑菇,给定初始体力,问是否能到达最后一个箱子,最大剩余体力是多少?
三面:
3 月又被 ailab 捞了,语音组的工程岗,还是我意向的 C++ 岗,然后不知道是不是面评好就两面。字节 ailab:等 hr 面结果
一面
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 就是打错
三面交叉面:
1、get、post 区别
2、linux 系统 ipc
3、向量点积、叉积
4、矩阵的秩
5、给一个随机数生成器怎么生成正态分布
6、容器和虚拟机区别
7、一个 string,让你分成 5 个 string,任选 >=3 个可以还原,<3 个不行(我答的 (t, n) 门限 + 拉格朗日插值法,他说会下去查查)
蚂蚁金服
AntMonitor 团队,感觉工作偏 sre 而且又是 Java,我就拒了。蚂蚁 A ntMonitor:已拒
一面:
二面:
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)你未来想做什么方向的后台开发(给我拿网络方向列了一堆子方向,我:...)
腾讯 PCG:等三面
一个做内部产品孵化的部门,一面我就想拒了,没想到面完又来个初试通知(我以为是挂了又被其他部门重新捞),但没想到还是这个部门(面试官:咱们初试有俩面哦),想着反正今年也不会去腾讯,就面面看。
一面:
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,怎么优化
17)手撕:
https://www.acwing.com/problem/content/572/
二面:
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
总结
个人觉得自己算不上大佬,只是运气好找到实习罢了,后续还需要继续努力学习,大家可以参照我给出的资源进行学习,必定事半功倍。