现在面试介绍过往的项目经历是面试过程中一个很重要的组成部分,相信你在以往的面试中也一定深有体会。从项目经历中,面试官不仅可以了解到项目研发的整体过程,也能够从中了解到你的技术方案设计思路,排查线上问题的能力,以及对于项目架构演进方向的把握。那么,在介绍自己的项目经历时,你要如何介绍才能抓住面试官内心的痛点呢?在回答这个问题之前,我还是给你分享一个我面试候选人的例子。

候选人虽然工作年限不长,经历的项目也只有一段,但是这段经历是某个大厂耳熟能详的成功项目,有着很高的井发请求量。我猜测,他应该在项目中受到了比较好的锻炼,可是当我邀约了面试之后,出现了问题。

案例分析

 

 

 

相信你能猜到,这个候选人最终没有通过面试。本来,高井发的社区系统是他的项目亮点,可是在介绍时,他却不了解项目的核心数据指标,也对系统的调优和疑难问题的排查知之甚少,自然不会通过面试。那么我从面试候选人的经验中给你总结出一些,介绍项目经历的关键注意点,期望你能在今后的面试中可以借鉴。

我的建议

其实,在介绍项目经历时讲一些项目背景是可以的,也是必要的,这样可以让面试官对项目有一个全景的认识。但这些背景知识不宜过多,因为毕竟是技术面试,面试官需要在1个小时左右对你的技术能力有正确的判断,所以你介绍项目经历时,最好从技术角度出发。比如,如果你做了一个社区的项目,那么项目的整体架构是一体化的还是服务化的?拆分成了哪些服务?服务之间是通过什么协议,又是怎样交互的,使用了哪些开源的组件,做组件选型时经过了哪些考虑等等,这样方便面试官在这些技术点上做一些深入的展开。

这里有一个小窍门,你可以有意地引导面试官,间一些你想要他问的问题,比方说,如果你对Kafka、 RocketMQ 等消息队列有比较深入的了解,你可以多讲讲这方面的内容。具体来说,使用哪些消息队列解决了哪方面的问题,在其中遇到了哪些坑,又是怎么优化的。这样一来,你就可以把面试官引入一个你比较熟悉的领域,面试成功的几率就大大增加了。

除此之外,你在项目介绍中要多突出个人对项目的贡献,而不仅仅是项目本身的并发有多高,技术方案设计的有多厉害。的确,成功的项目确实可以给你带来比较大的红利,但你毕竟只是这个项目中的一颗螺丝钉,做出的贡献也是有限的。在面试中,面试官更关注你个人对整个项目做了什么样的改变。为此,我建议你从下面三个点出发回答:

  • 针对复杂的需求你设计了哪些方案,这些方案中技术的难点是什么,你在方案设计中是如何解决的?
  • 在项目中遇到了哪些疑难诡异的问题,你排查问题的思路是怎样的?
  • 在项目运维过程中出现了哪些性能方面的问题,你又是怎么来优化的?

当然了,如果你想用这三点让面试官眼前一亮,那么就需要在平时的工作中多积累案例,而不是只给出“遇到问题就加日志排查代码"性能出现问题就加索引、加缓存”这样简单的答案了。

有一个之前面试的案例。这个案例涉及排查一次自研的RPC框架的故障,回答的思路如下:项目中使用的RPC框架存在某个Bug,偶发地出现RPC客户端发送给RPC服务节点的所有心跳包全部超时,从而让RPC客户端认为服务节点已经发生故障,然后RPC客户端就不会将流量发送给这个服务节点。由于项目中使用了Netty3 框架,我就理了一遍Netty3的连接过程的代码,确认是Boss线程或者NioWorker线程某个地方阻塞了。

然后,我通过strace (系统调用抓取工具)抓取那段时间的系统调用,发现Boss线程中涉及的系统调用全部完成了,却没有发现把socket fd (文件句柄)注册给NioWorker的selectorfd (文件句柄)的系统调用,于是确认是NioWorker的问题。

后来我打印了jvm thread stack trace (Java的线程堆栈),发现所有的NioWorker线程阻塞在Object.wait, 代码位置是Class.for-Name,这样就导致所有的NioWorker不再处理新的Register task (注 册任务), NettyClientBootstrap中所有的ConnectFuture的状态自然不被标记,最终导致上层所有的连接超时。再往下追查后,我发现JDK6中确实存在类初始化过程中出现死锁的Bug, 在升级到JDK7之后问题就得到解决。

你看,本来是一个偶发的RPC框架层的问题,而你在追查这个Bug的过程中涉及到了Netty网络编程、系统调用追踪,和多线程锁诊断等知识,面试官在听到这样的案例之后也会认可你排查问题的思路和能力。

我还想给你的建议是,在介绍项目时,你要多突出项目中的亮点,比如,你的项目中核心系统的请求量是10万次/秒,数据量是百亿级别,在项目研发过程中你使用了Linuxprofle工具排查系统负载高的问题,或者使用布隆过滤器解决缓存穿透的问题的。那么你在回答时,请求量和数据量这些数据会是个亮点,这些排查问题和解决问题的方法也将是亮点。不过,这一点是针对具有高请求量的项目来说的,那么,如果你的项目中没有那么高的请求量,你要怎么回答呢?

我的建议是,你可以结合自己了解到的高并发的知识聊一聊,如果项目到达了某一个量级可以在架构上做哪些的改造和优化。比方说,你做一个直播的项目,平时的流量也不高,突然请到了杨幂这样的流量大咖来做直播...那么你就可以抛出这个假设,然后和面试官聊聊以下几点:

  • 如何使用多级缓存应对杨幂直播间的极端热点请求:
  • 几万甚至几十万人同时在直播间内发言时,要如何优化消息的延迟:
  • 如何通过压测评估目前系统承载流量的能力,以便明确如何制定扩容的计划。

这样面试官不仅能了解你应对高并发大流量的思路,也会认为你对系统架构的未来发展是有规划,有想法的。

总的来说,面试是双方的“博弈”,你不能被动地接受面试官的询问,而是要循循善诱,扬长避短,在介绍项目经历时,多争取主动,把面试官引到自己擅长的领域;在平时的工作中要多关注系统的性能指标,多去参与同事排查性能问题,解决诡异Bug的过程,与他们讨论系统优化的思路。这些经历会成为你面试的素材,让面试官对你眼前一亮;当然,你也需要多关注业界的技术发展,多思考新的技术在你的项目中有哪些应用的场景,这样也可以让面试官觉得你的技术视野比较广阔,具备独立思考的能力。

最后

既然我提到了项目经历,那么,你在面试的过程中是如何讲述自己的项目经历的呢?面试官又针对你的项目经历问了哪些问题呢?你的回答是否得到了面试官的肯定呢?欢迎在评论区留言指正!