面试技巧

其实,这上面两篇文章中,我已经介绍了一些关于面试的技巧,比如说,你要多关注常用组件的原理,多了解项目中的核心监控指标等等。但当你遇到一个心仪的职位的时候,仅仅做这些准备肯定是远远不够的。那么,对不同级别的候选人来说,面试官会分别关注什么呢?准备技术面试时,你需要重点准备哪些呢?在带你了解这些内容之前,我先给你分享一个我面试候选人的经历。

案例分析

这个候选人只有不到两年的工作经验,只负责开发和维护项目中一个很小的模块,在公司项目上没有得到太多的锻炼机会。但是,鉴于他的名校背景以及优异的成绩,我还是发送了面试的邀请。在面试过程中,我没有过多地考察项目相关的问题,而是把重点放在了候选人基础知识和学习能力上。

 

 

你可以看到,虽然他在项目经验上存在比较大的缺陷,但扎实的基本功还是让他赢得了Offer。

面试侧重点

其实,作为面试官,我对不同级别的候选人,考察的侧重点也有很大的不同。如果是一个应届生或者是一个有着一年左右工作经验的新人,我会更看重他的基础知识、学习能力和聪明程度,也就是所谓的“潜力",因为除非候选人非常优秀,否则你很难期望他们进入公司之后迅速独当一面,所以,我更期望通过老员工的少量引导,他再迅速成长为项目的核心成员。

对于有着三年左右工作经验的候选人,我除了要求他基础扎实以外,还需要他有良好的编码习惯和能力,于是我通常会在面试时增加现场出题编码的环节。而对于有着五年甚至更多工作经验的候选人,要求也就更高了,除了以上提到的能力之外还要求他有排查问题、解决问题的能力,整体系统的设计能力和架构能力等等。但是,说来说去,扎实的基础知识是前提,也是面试考察的重中之重。那么,在面试中我们一般会考察哪些方面的基础知识呢?

面试考察的基础知识

你应该知道,算法是基础知识考察的重点。曾经有候选人问过我,算法在实际的项目中使用的不多,为什么一定要在面试的时候考察呢?我相信,有这种想法的同学,一定不少,而这是一个非常错误的观点。因为,你平时使用的中间件和组件中,包含着大量的算法实现,了解算法可以有效地帮你了解这些中间件和组件的原理。

比如,数据库的索引一般会采用B+树,那么深入了解了B+树的原理之后,你才能更清晰地理解数据库索引的原理,在调优时也会更加游刃有余。

另外,在实际工作中,我们也需要用算法来辅助完成系统的设计。比如,在我之前的项目中,需要实现一套视频转码系统。这套系统的核心是实现一个有向无环图,如果对这个数据结构不了解,在设计系统的时候,很可能走一些弯路。而我推荐你通过在Leetcode.上刷题,提升自己的算法能力。

除此之外,操作系统和网络方面的知识也是考察的重点,这主要是因为这些基础知识确实能让你在排查问题的时候,有更多的思路。比如,我之前的系统中有一个服务的作用是接收指令,来执行一些定时的任务。它的请求量很低,但是调用它的服务经常会出现502的情况。在排除服务本身存在问题之后,我发现这个问题的发生,有一个很有意思的规律,那就是,如果前一次请求发生在5秒之前时,会出现问题,但是如果请求不断地到来,却反而不会出现问题。于是,我怀疑是和HTTP协议的KeepAlive有关。要知道,在HTTP1.1协议中,为了提高请求的效率,客户端和服务端之间是可以保持长连接的。这个长连接如果长时间空闲,就会导致系统资源的浪费,所以一般在服务端会控制这个长连接的超时时间。如果在一段时间之内都没有请求使用这条连接,服务端就会把这条连接关闭。

但是,因为服务端在关闭连接时并不会通知客户端,所以,如果客户端还是使用这条连接来请求服务端的话,就会出现错误了。而Tomcat有一个参数KeepAlive Timeout正是设置这个超时时间的,在上面的案例中,这个参数被设置成了五秒于是我把这个时间延长延长,问题果然迎刃而解了。你看,如果你对于HTTP协议理解的不深,那么面对这个问题时,就很难能够找到正确的思路。最后,你还需要着重了解自己经常使用的语言的特性。比如,我就曾经被问过在JDK6、7、8中,字符串在虚拟机中的存储位置有什么不同,而这对排查内存泄漏等问题是有帮助的。再比如,我之前排查过-个启动之后慢请求的问题,在经过CPU的Profile 之后,确认重启后JMM的JIT线程占用了大量的CPU时间。于是,我们制定了重启之后的预热方案,让服务器在重启后处理少量的请求,让JIT将热点代码编译之后再放入全量请求,这样就消除了慢请求。如果你不了解JIT,那么自然也就不会解决这个问题。

当然,除了这些基础知识以外,面试官还会结合你的项目经历来考察你的架构设计能力、排查问题解决问题的能力、系统优化能力等等。这些我们在上一期面试现场中,已经有过重点介绍,这里就不再赘述。除此以外,如果你参与了一些开源项目的维护,或者在业界的大会中有过主题分享,再或者,你有维护自己的Blog,做一些技术方面的总结,那么都可以在简历和面试的过程中提及,这些都是面试中的加分项。

大公司好还是小公司好?

最后,我周边很多年轻的朋友经常会问我,下一份工作是要选择大公司非核心项目,还是要选择小公司的核心部门?这也是你在面试准备中,需要思考的一个重要问题。在我看来,如果你是一个工作不到三年的职场新手,那么去一个大公司开拓一下眼界还是很有必要的,它能够给你小公司所没有的,规范的研发流程、高并发大流量的系统、成熟的工具和运维体系等等,这肯定会让你的技术水平得到极大的锻炼。而如果你是一个工作超过五年的“老鸟",那你不妨去小公司锻炼一下掌控整体系统全局的能力,也许会带你进入另一番天地。