一场突如其来的疫情席卷了上海,招聘季的金三银四也不复往年荣光。疫情,战争,坠机……2022年越来越魔幻了。今年的职场,旁人我不知道,身边的朋友都是求稳,同事也鲜有跳槽的。作为一名面试官,今年收到的简历总体质量也不如去年那么好。说了很多年的凛冬将至,现在是真的感受到了一丝寒冷。
不过虽是寒冬,另一方面看其实竞争压力也相对小了些。风险之中也有机会,分享一次去年年底在B站面试的经验吧,准备跳槽的朋友或许用的上。
那是一个没有疫情的上海,那天我闲来无事,刷刷Boss直聘,偶然弹出一条Bilibili的招聘信息,说道:
不好意思放错图了。
于是跟Bilibili的面试官来了四轮隔着屏幕的亲密接触。因为没打算在年底跳槽,而这个岗位又是急招,于是不了了之。但前三轮技术面还是很有参考价值的,给各位想社招进大厂的朋友一点参考。
个人概况:本人普通双非本科毕业,工作四年半。
职位概况:哔哩哔哩C++音视频流SDK岗。
一面 纯技术
1-自我介绍,项目经历
这个大家各不相同,以一个流利但不失亮点,响亮又不失文雅的方式介绍一下自己就好。不过据我了解,面试官一般会利用这段时间看一下你的简历,因为一般顾不上提前看。且职位越高的面试官出现这种情况的概率越高。
2-根据项目经历开始问细节
同样因人而异,主要是根据简历上提到的技能和项目经历发问。我这里大概问了我GPU和CPU的区别,Zigbee的带宽,AD的采样精度,硬盘存储速度,消息订阅发布的机制等等。这个环节大概就是确认一下过往项目经历的真实性。
3-看看代码
来,先看看这段代码哪里有问题?
void getMemory(char *p,int size){
p=(char*)malloc(size);
}
int main(){
char* str=NULL;
getMemory(str,10);
strcpy(str,"hello");
printf(str);
free(str);
return 0;
}
这个环节就是考基础了。这里大家应该能很快看出来getMemory这个函数用了值传递而非址传递,因此指针str一直是NULL。那么对str做的strcpy操作会使程序发生段错误,是一道很基础的C语言面试题。
而通常这种代码题不会答完一个答案就结束了,面试官一般会根据你的回答刨根究底的追问,看你能不能抵挡住。
于是面试官接着又问什么情况会引起段错误,答内存溢出,访问非法地址,二进制目标格式不兼容等。
面试官接着问类似的内存泄漏是如何引起,最终会导致什么后果。答未释放申请的内存,程序最终会不断占用内存直至崩溃。
4-手撕代码
来,链表反转。
大家上网一搜一堆的。这里我用了头插法。面试官让换一种方法,于是换了尾插法。
再来,斐波那契数列获取指定序号对应的值。这里我用了递归实现。
int func(int num){
if(num==0){
return 0;
}else if(num==1){
return 1;
}else{
return func(n-1)+func(n-2);
}
}
然后面试官便问我不用递归如何实现。答不用递归就用循环,于是吭哧吭哧写了个斐波那契数列的循环生成放到了vector里。
然后面试官继续问,假如我要获取第4G个数据的值,那你这个vector不就撑爆了,如何优化?
哦对,好久没刷过题,犯了低级错误。答不用存这么多,只存2个数就够了(斐波那契数列中第三个数开始,每一个数都是前两个数的和)。
5-tcp/udp的区别?
基础题了。tcp基于连接,三次握手,四次挥手,保证可靠,udp可以广播,不用连接,不保证可靠之类的说了一大堆。
抓住不丢包这个点问为什么不丢包?答有ack确认。
丢包了怎么办?
丢包用包号连续性确认,根据需求重发或忽略。粘包问题则用包长度解决。顺便聊了聊mqtt的发送级别。
6-智能指针的作用是什么?
C++基础题了。用RAII的思想,将资源用对象的方式处理,在析构函数中释放资源。unique_ptr保证独占,没有拷贝构造函数,shared_ptr有引用计数,weak_ptr不参与引用计数,可以解决循环引用的问题。
7-const的作用
const int func(const int& arg)const{} 这三个const的作用?
第一个是返回值不许被修改,第二个是入参不能被修改,第三个是类内非静态成员变量不许被修改。
接着问,如果想修改需要怎么做?答mutable关键字。
接着问,什么时候会用mutable关键字?
我这儿有点没明白他的意思,这谜底不就在谜面上吗?但我还是乱七八糟扯了几句,说有可能这个函数要对上层隐藏实现细节,或者需要被修改的这个成员变量需要更新但不影响对象的状态等等。面试官听完也没说什么。
8-编译原理底层知识
面试官问我最近在开发什么项目,我说在写编译器。他就说你给我讲讲编译流程,我说预处理,词法分析、语法分析、中间代码生成、中间代码优化、生成目标代码等等。
他接着问编译和链接的区别是什么?这个问题我没看过官方回答,根据自己的理解说编译就是将源文件编译为目标文件,链接就是将这些目标文件链接起来变成一个最终的可执行文件(后来面试完上网搜答案,跟我自己临时想出来的说法一模一样)。
一面过。
二面 纯技术
1-先做个自我介绍
于是面试官趁我自我介绍的时间快速看了一遍我的简历。
2-手撕代码
二叉树反转。
我用了递归实现。
void Mirror(TreeNode* root) {
if(root == nullptr)
return nullptr;
TreeNode* node = root->left;
root->left = root->right;
root->right = node;
Mirror(root->left);
Mirror(root->right);
}
接着问,这中间镜像部分代码封装成一个函数试试。又考察址传递和二级指针的知识点。
接着问,二叉树中间再加个mid节点,如何反转?
这里递归的语句里加一句Mirror(mid)就好。
3-编译器底层知识
cpp返回对象时,编译器会做哪些优化?
正好最近看过这个相关的书。答主流编译器都对直接返回对象做了优化,可原地构造,比使用std::move还要省一次移动构造过程。
4-平常遇到新项目或新技术会怎么学习?
答通过开源项目、经典书籍、网课等。
5-简历上的项目经历细节
这里问的我想不起来了,就是根据简历上提到的项目开始问细节,问设计细节,问技术细节,问实现细节。反正全是我简历上项目涉及到的知识点,都在射程范围之内。
一般面试官都会盯着简历找点发问,所以大家简历上写的内容一定要准备充分。
二面过。
三面 技术主管
这里开始就没手撕代码了,大佬上来先介绍了哔哩哔哩的福利,落户啊之类的。然后开始聊人生,聊理想,聊规划,聊目的,聊愿景。
1.你和你的领导有了分歧怎么办
2.用过哔哩哔哩App吗
3.关注了哪些up主吗
4.为什么要投我们公司
5.个人未来的打算和规划
6.我感觉你们领导对你也挺重视的,挺重用你的,你为什么会想这个时候跳槽呢?
这些问题就如实回答吧,第一题考察你好不好管理,第二题看你对公司产品印象如何,第三题看你的兴趣爱好,第四第五第六看你的思路、规划。
7-你现在工资多少?
我故意往高了说,然后依然被鄙视了:你们芯片行业确实穷啊。
我说芯片行业老板对硬件工程师比较重视,软件的地位相对差一些。
他说确实,他当年也是从嵌入式单片机行业转到互联网的。然后巴拉巴拉聊了些人生感悟,相谈甚欢。
8-你有什么要问我的吗?
那会儿爱奇艺裁员还在热搜上挂着呢,于是我问了爱奇艺裁员对中长视频行业有没有影响,尤其是您公司。
他说影响肯定有,不过B站是UGC(用户生产内容)的模式,跟爱奇艺这种买剧或者跟娱乐圈有深度绑定的模式还是有差别,况且最近娱乐圈在整顿清朗,所以爱奇艺们会受影响。B站总体而言影响不大。
我接着问了这个岗位具体的工作内容,然后结束三面。
三面过。
四面 HR面
HR面就比较常规了,依旧是聊履历,聊规划,聊人生。这里回答得体就好,准备一些官方回答,一般不会出差错。
不过她想让我年前入职,说年后不一定有HeadCount。我说年前估计不行,我年终奖还挺多的。前面聊人生的环节我就有意暗示出我其实没想在年底跳槽的想法,主管大大也是慧眼如炬,基本上大家就心知肚明,心领神会,心照不宣的明白了。后面大家客套一番,结束四面。
总的来说这个岗位偏C,音视频流也不是我想从事的方向,但哔哩哔哩各位面试官人都很nice,我面试的时候都是前脚还在公司开会,下一秒就拎着电脑参加面试了,啥都没准备,面试官也没有在意说你怎么题都不刷就来面试了,我都是临场现想的,耗费了挺长时间,但人家也没说啥。对B站这个公司印象非常好,没能合作只能说缘分未到,也许来日方长。
祝大家都能找到理想的工作。