一面是上来就问基础,还是老套的c++虚函数,多态加载过程(c和java)。我好久没看c了,答不上来。

然后就是进程和线程的区别,哪些资源是共享的,进程之间的通信方式,尤其是fork函数,出了道题目,答不上来,瞎猜了个答案,明显猜错了。

又问计算机网络的模型,我哪里记得。get和post的区别,就答了一下get没有body,然后又扯了几个,感觉答得不好。

问我怎么查看数据库语句效率,还好实习的时候,导师说了一下执行计划,稍微答了一下,又问了索引的实现。问了hashmap原理,还好我提前看过源码,虽然答得不完美,但是还行。问我当entry单个节点的链表长度太长怎么办,红黑树解决。resize的原理和过程,这个没仔细看,有点尴尬,只记得0.75系数。

编程题第一题是01背包问题,把物品分成两堆,使得物品差值尽量小,心中窃喜是01背包,打了半天后,面试官跟我说超时,因为没考虑到物品总重量很大,然后又循循善诱,让我用dp解答,搞了半天顺着他的意思做了,但是是错的,面试官没看出来,可能他先入为主的观念,觉得按他做的就是对的。

第二题是字符转数字,比较简单,我考虑了前导0和正负,但是没考虑到int负数的范围比正数少1,问题不大。然后又让我优化临界值判断有没有超过int_max,用除法判断就可以。一面就这样坎坷的结束了。

二十分钟后,二面开始。上来就要二叉树的中序遍历,递归写完了,结果让我用循环写,直接说不会,提示了一下说用栈,搞了半天还是没理清,最后在面试官提示下搞完了,但还是很难受,几乎都是他的想法,都没有自己的思考。然后又开始问基础了,又问进程和线程的区别(我真是晕了,为什么一直问这个),问我c和java哪个比较擅长,随口一答说,c。说完我就后悔了,开始问malloc和new的区别,我早忘了啊,构造函数和复制函数等等,我很后悔说c。然后问java,写了个 swap(integer a, integer b)的函数,我知道肯定有问题但是说不出来,只好硬着脸皮说,没问题,gg。问java 中switch(x)的x支持什么类型,答不上来,瞎猜了几个。

接下来谈项目,更惨,问我数据库怎么调优(我估计他应该还准备了排它锁等问题),答了看执行计划,混不过去,问我怎么看实时读写。问项目中为什么用redis,回答并发太大,问我项目最多并发多少,瞎答了个数据,然后自己傻逼又说项目中有bug,导致数据库线程占用太多,所以用redis,我真是傻逼,自己给自己挖了个坑,说不出bug是什么。接下来问spring的加载过程,加载了哪些配置文件,生命周期,关键注解有哪些,我不知道啊,难受的一逼。

最后问我说还有什么要让他了解的,此时的我万念俱灰,只想快点结束,什么都不想说了。

总结一下,字节的面试很考验基础,要是基础不牢固,很容易就挂了,而且算法能力,也很重要,上来就是01背包。特别要注意的是,千万别说自己会多门语言,会很难受,会几种,问几种,更加容易漏出破绽,还是专精一门,多做准备比较好。tcp和udp,操作系统这些也得提前准备,总之好难啊,我只是想进去做java后端开发,怎么搞得这么复杂。

--------------------------------------2019.12.5----------------------------------------------

时间过去一个多月,回想一下之前的面试经历,其实难度不是很大。主要是自己没有充分准备,有些会的知识遗忘了。

字节的考核范围大概包括:操作系统(进程线程),计算机网络(五层模型),编程语言(和岗位相关),数据库(有概率考),当然最重要的是编程能力(手撕代码)。

面试效率很高,考核很完整,说明公司投入了很多精力在招聘,当然offer待遇也是数一数二。

秋招差不多结束了,祝大家上岸成功,再不济也还有春招。