今天收到了正式offer的邮件,可以把昨天不敢发出来的小结发出来了,希望对大家有帮助。如果下面的内容有错误或者不恰当的地方,欢迎讨论指正。祝大家都能顺顺利利地上岸。
2021.4.8
实习小结
3.18和3.19两天一口气投了十份简历,一直到今天,断断续续地测评,笔试和面试,有的时候真的挺累的。不得不吐槽一些公司,流程慢,慢的同时还养鱼。
简单做个小回顾吧,因为面试过程中我没有录音,大部分面试结束后也没做记录(腾讯一面记了下),因此下面的面经只是我现在能够想起来的部分或者印象比较深刻的点。说实话,面试还是个交流的过程,大部分时候面试官问的题目都是有上下文的,因此看到不会的面经题目也不要慌,刚好是你不了解这块而已,面试官问的应该大部分都是你会的。
目前面的公司有美团,腾讯,百度,字节,快手。明天京东,虎牙一面面试,字节4月13号三面。
美团
后台开发 一面
面试官搞java的,刚开始自我介绍之类的,学校的课程什么的。后面问我会java不我说不会,会数据库不,我说不会。问我哪方面学得比较好,我说C++和操作系统花的时间比较多。然后丢给我一道hard,他上网去搜C++面试题去了。做完了之后:
C++内存布局
多态
进程和线程
进程间通信方式
死锁
有什么想问的。
最后估计过了半个多月收到感谢信了,挂的不亏,运气不好,java面试官来面你,和他讲多态,感觉他都听不懂,交流不起来。。。
腾讯
TEG基础架构岗 一面 2小时20分钟
面试体验比较好,和面试官是一种交流的状态,不会的面试官也会引导你。回忆下遇到的问题,没顺序,也有遗漏。
static关键字。
虚函数相关,怎么调用到虚函数的,还有一些其他问题,现在忘记了。
静态多态和动态多态区别。
重载、覆盖、隐藏区别。
静态库和动态库区别。这一块和面试官讨论了很久,感觉自己理解的不是很好。
vector的工作原理。
map的工作原理。红黑树等等,map的迭代器失效问题。
为什么父类析构函数要是虚函数?
TCP建立连接的过程。
进程,线程,协程的区别。从内核实现角度讲了讲,但是感觉说的不是很好。
进程间通信,线程间同步方式。
上面那题我说到了内存屏障,面试官说C++不是已经提供了这样的接口吗?能不能讲讲?我说那一块有点难,还没太搞懂。
epoll的相关问题,通知你的时候怎么知道是什么事件。问这个问题应该是面试官想看你到底了解不了解原理。还有一些关于IO多路复用其他相关的细节,现在想不起来了。
阻塞IO和非阻塞IO的区别,这一块面试官问采用非阻塞IO时,read返回信息,是通过返回值来传达内核缓冲区没准备好吗的信息吗?好家伙,掉进他的坑了,我脑子里记得应该是通过设置errno变量,但又记得read出错返回-1,设置成非阻塞应该不算是出错的情况吧,自己脑补了一波回答错了,掉印象分。。
非阻塞模式下返回值 <0时并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的, 继续发送。
ping得通,但是浏览器访问不成功。怎么排查,面试官一步步引导。ping得通,说明IP层没问题,服务器ip正常,问题可能在应用层或者传输层。应用层http协议,有可能服务端正常运行,但是服务端应用程序没正常运行,当然也有可能是本地应用层程序未正常运行;也有可能服务端端口未开放。
服务器设计模型。这一块讲到了些服务集群和一点DNS轮转负载共享的东西,接下来问我DNS相关的东西。最后问到本地主机怎么知道附近的DNS服务器在哪呢?这块忘记了。
查看进程的pid,如何查看一个进程的二进制可执行文件在哪个目录下。我说不太清楚,不过猜了下/proc/pid下应该会有这个信息,面试官说这也是一种方法。刚刚上网查了下,反而没查到其他方法。
简单介绍下项目。问了些项目的思路和一些细节。
如何去改进项目,从两个方面讲了下:正确性上,性能上。
上面提到了序列化的改进,问我知道哪些常见的序列化库,讲了protobuf,还没讲完面试官就问我为什么项目里不用,我说当时主要是想练C++新特性,不想花过多时间学习protobuf。
你知道那些业界正在用的RPC框架呢。讲了下知道的C++写的RPC框架。
目前业界真正使用的协程的业务场景。说了个微信的libco。
代码题:
单例模式。这个太亏了,前几天面美团,就问到了这个,当时说不会,事后也没有及时去学习,今天又问到了。
设计一个文件系统。支持:
ls(string path),如果是文件,显示文件名,如果是目录,显示目录下所有的文件名及目录名。
mkdir(string path),根据路径创建一个目录,如果涉及父目录,父目录上也有要对应目录文件。即模拟实际mkdir。
add_content_to_file(content, path),将内容添加至路径名的对应文件,如果没有该文件,创建该文件。
print_content(string path),如果是个文件,显示该文件所有内容。
本来以为面了两个多小时还挺稳的,应该能过,没想到后来给我发的邮件是运营开发,流程也还是一面的,感觉有点失望,虽然后面运营开发二面的时候面试官说她们还是基础架构岗。
运营开发 一面
自我介绍,大数据专业?那你懂spark,hadoop,mapreduce这些吗?不懂。我说OS相对来讲花的时间比较多,她说,那好吧,我们来...还是来问点计算机网络吧。问完了计网后面就问了些操作系统:
- 常规的TCP协议和UDP协议,它们之间的比较。
- 如何实现UDP变得可靠呢?模仿TCP的可靠机制(序列号,确认机制,重传机制)来回答就可以,最后吹了点udt和kcp。
- 然后问了点操作系统相关的。进程间通信。我记得我给她讲得很细,最后给她讲笑了。。。其他的基础知识题就忘记了。
代码题:
设计一个会议预约管理系统。一天24小时,可以预约任意时间段,保证会议时间之间不会交叉。问了下面试官时间精度,她说是分钟,然后回答了个用24 * 60大小的位图来记录状态。
本来要写快速排序,后面她没找到那个题,换了个复原IP地址,leetcode原题,以前没写过,想了想说了下回溯的思路,写了个大概的代码框架,没让跑通。
最后结束的时候,她问我为啥你大数据专业,对大数据相关却不怎么熟悉呢?我说我意向岗位是后台开发方面,大数据方面学校教的比较浅,自己也没花时间学。她说这是个误区,后台开发也要学分布式大数据相关的。我内心OS:当然知道要学了,但是我学得完嘛我。。。后面反问,运营开发是偏运营还是偏开发,她说偏开发,只不过开发的业务不怎么涉及高并发,高可用这些。
运营开发 二面
基础知识
- int,short,long,long long类型大小。
- 如何判断你的电脑是32位操作系统和64位操作系统。
- zeromq一点点东西,我答了一些然后说不是特别了解,就没细问了。
- 其他,忘记了。
代码题:
一个类,含有两个数据成员,std::string和C风格的字符串。重载类的operator=().
问我刷过多少题,我说一百多。然后她给了我道简单的字符串转short的题。挺多边界条件要考虑的,我写的时候太呆了,没考虑到。
腾讯一共就面了三面,流程是真的慢,一个礼拜约一面,三面结果到现在也还不知道。当然,从另一角度来说也怪我,怪我太菜了,进了tx的鱼塘,没有强到直接给我安排面试。(狗头)好吧,我是真的菜,写完这篇文章去看了下腾讯的状态,灰了。
百度
百度三面一个下午面完的。统一进行面试的,也就是说面你的面试官以后不一定是你的同事。
一面
自我介绍
基础知识
问了些数据结构。印象深刻的就是AVL树和红黑树了。
计算机网络,介绍下TCP和UDP。
其他,忘记了。
代码题
字符串匹配,跑通。用了普通的指针比较方法,问了下时间复杂度。我讲着讲着发现我代码写的有bug,和面试官讲,她说没事,暂时不扣这些细节,然后又问我有没有更好的方法,问了好几次,后面和群友沟通才知道面试官想让我答KMP。
反转链表,说了下思路,不用跑起来,她说时间只有一小时。
二面
二面本来是个大叔,开头问我你数据结构咋样,我说一些简单的还行,红黑树这种细节旋转的不太行。然后看我简历,说我给你换个面试官吧,看你简历方面都是和系统相关的,我慌得一批。后来是一个戴着口罩的非常年轻的小哥来面,感觉他很细节。(滑稽)
基础知识
开头问我map是怎么实现的,我说底层的数据结构依赖是红黑树,还没接着往下说,他说不对,红黑树还不够。我直接人傻了,然后和他battle一番,感觉他不太熟C++,和他讲了下C++的map,unordered_map(hashmap)还有multi系列。后面来给我抠细节了,从底层数据结构开始,一直到插入操作,删除操作,查找操作,每步的具体流程是怎么样的。回答的过程中他觉得你讲的不够细致的地方会问你这一步到底是咋样的,我直接自闭,最后我绕晕了,直接说这块不是很清楚,我下去再好好看看。严重怀疑面试小哥前一天晚上刚看完某个语言的map源码。
然后问http协议和https协议了解吗,我说大概知道一些,但是很细节的地方就不是很清楚了。然后他说那直接来吧,ssl握手过程细节知道吗。我说不太清楚。然后就“那还是来写题吧。”
代码题
- 计算x的n次方。以前没写过这道题。先写了个暴力,后面写了个二分,没考虑到n为负数的情况,面试官说我让你加一行代码来补足负数的情况(内心OS:可以,这很geek)。
三面
自我介绍。问了下平时怎么学习的。有没有团队合作过项目。做过让你印象深刻(或者难度很大)的项目是什么。兴趣爱好是啥。诸如此类。最后可能觉得没啥问的,问了个智能指针。反问。
hr面
入职事宜。
字节
一面
基础知识
- C++问了很多。现在记得的:开头问了个SFINAE,当时只能说出这是个啥,又问我它作用是什么呢?没答出来。C++智能指针,lamda表达式等等C++新特性。
- 32位系统和64位系统的区别。我从几个小点讲了下,然后又问它们的指令集是一样的吗?
- 协程的应用场景,和进程,线程相比优势在哪。具体的切换开销,tlb刷新等等,同步异步思想等等。
- http协议相关,不是很了解,然后问传输层协议。流量控制,拥塞控制,快速重传,快启动等等,网络这块问得很细节。
- 其他的忘了。
代码题:
刚开始给了个二叉树的序列化和反序列化,说写这个可以嘛,我说写起来可能有点复杂(因为要自己建树啥的,然而我也没说不写),然后给了道节点的最近公共祖先。想了五分钟,就和面试官说没思路。面试官又换了道,二叉树的层序遍历。
二面
基础知识
- 还是先问C++相关,问得很多很细,印象深刻的有一部分是虚函数虚指针之类的。还有一个问题比较印象深刻:一个对象指针,类型是基类指针类型,指向子类对象,使用后
delete p
,然后又进行p->func()
(func里面有操作对象数据成员)和p->virtual_func()
操作,问这两个操作合法吗?如果不合法是什么时候出错(编译期还是运行期)。看到这的同学可以实验下,结果可能会出乎你的意料。 - 各种C++新特性,比如std::optional,std::bind(),std::function() ......
- 现在你要自研一个操作系统,要你实现进程间切换,要做哪些工作。按照Linux系统的进程切换来答就行。
- 上一面面试官说你网络这块回答的不是很顺畅,我们来聊聊网络吧,问了下各层协议。按照五层模型回答了下。又问欸,那七层模型是什么?
- 在搜索栏输入一个网址到显示网页内容的过程中,用到了哪些协议。
- 其他,忘记了。
代码题
- 面试官会议室只预约了一个小时,他还要面下一个人。最后还剩十五分钟左右吧,给了一道题,删除字符串A中的所有子串B,面试官让我别紧张,时间比较紧。我卡卡直接string的.erase()和.substr()用的飞起,后来面试官说忘记和你说了,不能使用C++标准库的东西,意思就是自己用C风格来写,最后时间不太够,说了下思路。
清明放假前面完的二面,当时面试官说整体挺不错的,C++也学得不错,我这给你过了。听到还是有点小开心的(我可真是虚荣)。后来放完假约了4.13三面。
快手
一面
基础知识
- 在代码框里输了几个结构体,问了下它们的大小。
- 其他基础知识,现在忘记了。只记得后面和场景相结合的题了。
- 一个程序,有两个执行分支。case A {....} case B{....},我们已知case A是经常会被执行的,case B很少会被执行。但是在程序实际运行过程中发现,执行case B部分相比case A耗时反而更多。这是为什么,明明case A执行次数更多,耗时反而少。如何解决这个问题。刚开始答的是如果涉及IO操作,那就是page cache刷新的原因。然后面试官说没有IO操作。然后就想到了L1的指令cache和数据cache,L2cache,L3cache。面试官说确实是这个原因,主动说了下如何解决这个问题,就是再写一个程序执行case B(笑)。
- 文件系统相关,磁盘上一2G文件。通过write系统调用向该文件进行覆盖写(写2G)。将每次写的大小参数设置成4090和4096字节,发现这两种情况速度差距非常大,每次写4090字节速度极慢。追加写却没有问题。是什么原因?面试官给的提示:”通过IO工具发现,每次写4090字节的情况:不仅仅是写操作,还涉及读操作。这个读操作怎么来的?“
- 现在公司自己有一套内存存储系统,可以按redis来理解,现在内存中有两批数据A,B,都是{key, value}形式,A数据的value较小,只有几字节,而B数据的value较大,几KB。现在传输A,B两类数据,A数据反而会超时,而B数据不会超时。会是什么原因。举个例子来讲,假设给A设定的超时时间是20ms,发现每次传输A数据都要耗费40ms,并且每次传输A数据耗时都是40ms。面试官一直提示40ms我也没答出来。后面查了下是客户端延时ACK + 服务端未禁用naggle算法。
- 又问了个TIME_WAIT导致的问题,相信大家都看过,就不细说了。
- epoll的水平触发和边缘触发。谁更高效?为什么?使用边缘触发时候要注意些什么。
- 好像还问了些其他的网络相关的小问题,现在不记得了。
代码题:
- 递归建树,非递归遍历树。我没太理解意思,就开始写了。递归建树,一个序列能够递归建树吗?没太想明白,然后用层序遍历的序列建树,非递归中序遍历树(栈)。写完了的时候跑了下,通过了。然后就问面试官,递归建树怎么建,建的了吗。还是我理解错了你的意思。我是非递归层序遍历建树的。他说没事,说递归建树很简单,可以写出来的,你没写出来也没关系,主要是考核下你的代码能力和代码速度,我主要看看你的这个非递归遍历。看了下,说没问题。
hr面
收到hr面的时候是很惊喜的,因为那个时候没有一家公司的流程到hr面,快手直接安排当天hr面,我还问后面还有技术面吗,电话那头说没有了,说给我免了两轮技术面。快手太看得起我了。(感激)hr面主要沟通了下入职事宜。
最后,感谢@快乐小代码,手动艾特,感谢就完事了。
找工作是肉眼可见的付出就会有回报。一起加油。
全部评论
(22) 回帖