互联网大厂是如何360°无死角考察技术候选人的?
最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的 Java 工程师岗位时遇到了不少困惑。
这些同学说自己也做了精心准备,网上搜集了不少 Java 面试题,然而实际去互联网公司面试才发现,人家问的,和你准备的对不上号,这就很尴尬了......
因此,从这篇文章开始,笔者准备写一个长期连载的系列文章:《Java 进阶面试系列》。主要跟大家聊聊中大型互联网公司 Java 面试中的一些热门、高频的技术问题。
希望这个系列的文章,能在年后金三银四的跳槽季中,助各位小伙伴一臂之力。
中大型互联网公司面试官是如何发问的?
先来体验一个真实的面试连环炮,现在一些中大型互联网公司的面试官,在面试候选人时,一般都会采取连环炮的策略来深挖一个候选人的技术水平。
举个例子,比如说看你简历上写了熟悉消息中间件(MQ 技术)。那么可能我们就会有一个类似下面这样的连环炮式发问:
说说你们公司线上生产环境用的是什么消息中间件?
那你们线上系统有哪些技术挑战,为什么必须要在系统里引入消息中间件?
你们的消息中间件技术选型为什么是 RabbitMQ?
为什么不用 RocketMQ 或者是 Kafka?技术选型的依据是什么?
你们怎么保证消息中间件的高可用性?避免消息中间件故障后引发系统整体故障?
使用消息中间件技术的时候,你们怎么保证投递出去的消息一定不会丢失?
你们怎么保证投递出去的消息只有一条且仅仅一条,不会出现重复的数据?
如果消费了重复的消息怎么保证数据的准确性?
你们线上业务用消息中间件的时候,是否需要保证消息的顺序性?
如果不需要保证消息顺序,为什么不需要?假如我有一个场景要保证消息的顺序,你们应该如何保证?
下游消费系统如果宕机了,导致几百万条消息在消息中间件里积压,此时怎么处理?
你们线上是否遇到过消息积压的生产故障?如果没遇到过,你考虑一下如何应对?
你们用的是 RabbitMQ?那你说说 RabbitMQ 的底层架构原理,逻辑架构、物理架构以及数据持久化机制?
你们 RabbitMQ 的最高峰 QPS 每秒是多少?线上如何部署的,部署了多少台机器,机器的配置如何?
你们用的是 Kafka?那你说说 Kafka 的底层架构原理,磁盘上数据如何存储的,整体分布式架构是如何实现的?
再说说 Kafka 是如何保证数据的高容错性的?零拷贝等技术是如何运用的?高吞吐量下如何优化生产者和消费者的性能?
看过 Kafka 的源码没有。如果看过,说说你对 Kafka 源码的理解?
你们用的是 RocketMQ?RocketMQ 很大的一个特点是对分布式事务的支持,你说说它在分布式事务支持这块机制的底层原理?
RocketMQ 的源码看过么,聊聊你对 RocketMQ 源码的理解?
如果让你来动手实现一个分布式消息中间件,整体架构你会如何设计实现?
上面仅仅是 MQ 相关技术问题的一部分,实际上,一个比较好的面试官的问题,就是从技术面、技术点、项目实践几块来抽丝剥茧的发问。
技术广度的考察
首先考察候选人技术面的完整性,因为工作中是需要具备一定的技术视野的,不能说光知道消息中间件,但是分布式缓存却一无所知。
类似于以前高考的时候,你语文特别好,结果物理特别差,那也是不太合适的。
所以工程师首先要避免自己的技术短板,尤其是三到五年经验的同学,已经彻底度过了自己人生的职场生涯的初期小白入门菜鸟阶段。
所以,务必在工作三到五年的时候,保证自己的技术绝对没有任何短板,整体技术栈要或多或少都知道一些,不能出现盲区。
比如,我现在问你,你们公司有没有什么业务场景是可以用 NoSQL 的?现在国内各个公司用 NoSQL 的技术都有哪些选型?具体 NoSQL 可以解决什么问题?
如果你一问三不知,这就是典型的技术短板,你至少需要大概知道,每个技术一般在什么情况下用,怎么来用,解决的是什么问题。
因此,上面说的消息中间件、分布式缓存、海量数据、分布式搜索、NoSQL、分布式架构、高并发、高可用、高性能这些技术。并不是说真的要求工作几年的同学都要精通到源码层面。
而是说你工作几年以后,应该有一定的技术广度,开阔的技术视野。
底层技术的考察
现在很多互联网大厂都会有基本功的考察,举个例子,Java 虚拟机的核心原理、内存模型、垃圾回收、线上 FullGC 卡顿性能优化、线上 OOM 内存溢出问题。
Java并发中的 volatile、锁优化、AQS 源码;Netty 背后的 IO、网络相关的知识。
其实这种底层技术,是线上高负载大型系统的架构设计和开发,必须要具备的。
因为底层技术不扎实,很多中间件或其他高阶的技术,都无法深入理解其原理。
而且很多时候,解决线上系统的生产故障,都需要这些技术。因此,底层技术的掌握是一个优秀工程师必须具备的素养。
技术深度的考察
此外,我们一定会深入考察候选人平时工作中熟悉的以及常用的一些技术。
举个例子,比如你项目里用了 Redis 或者是 Elasticsearch。只要你用过了,而且是你某个项目里的核心技术,那么一定会用连环炮式的发问,深入各种细节、底层、生产环境可能遇到的技术挑战。
总之,就是要用压力测试出来你在这块技术水平掌握的到底有多深,实践经验有多强。
一个好的面试官,自己本身技术功底扎实,是可以对一个技术问出一连串的连环炮的,就比如上面的那个消息中间件的连环炮发问。
而且只要面试官在一个技术上的深度超过候选人,那么通过不断加深的发问,是可以考察出来一个候选人在自己最熟悉的技术领域的技术深度的。
举个例子,比如说你对一个技术的掌握是否达到了源码级别:
是否对某个框架,或者是中间件深入的理解底层的源码实现,从源码级别说清楚它的架构原理?
是否对这个技术有过线上的高可用部署,承载过高并发流量的访问?
是否对这个技术在线上生产环境解决过各种各样的复杂技术挑战?
是否基于这个技术落地到你的业务系统中,设计出各种复杂的系统架构?
通过这种连环炮,可以非常好的考察出某个候选人对技术深度的掌握。技术深度的考察是中大型互联网公司面试官对一个高级/资深的候选人必须考察的。
因为如果一个人工作五年以上,来应聘高级职位的话,那我们绝对是要求他对至少一个技术领域有着较为深入的研究的。
比如说起码你得深入阅读过某个热门技术的核心源码,有一定的技术功底,可以解决一些复杂的线上故障。
技术广度决定了你可以利用各种技术来做项目,但是技术深度决定了你的技术功底。
你未来学新东西有多快,线上系统出了故障你能否快速定位和解决,你能否基于对技术的深刻理解为公司的项目设计和开发出复杂而且优秀的架构出来,这都取决于技术深度。
小结一下:上面我们用一个面试连环炮,引出了平时中大型互联网公司面试官是如何发问的。
然后从技术广度、底层技术、技术深度几个角度说了一下,我们一般如何考察候选人的技术。
接下来将会从项目经验的考察、系统设计的考察、候选人与岗位的匹配、多轮面试官的协作考察出发告诉大家互联网公司是如何全方位、无死角的考察候选人的。
知己知彼、百战不殆,面试也是如此。你只有真正了解了面试官的选拔标准,考察范围,才能更好的进行针对性的准备,成为行走的“offer 收割机”。
上面咱们用一个面试连环炮引出了平时中大型互联网公司的面试官是如何发问的。
紧接着从技术广度、底层技术、技术深度几个角度说一下,我们一般是如何来考察候选人的技术。
中大型互联网公司如何来考察候选人的技术?
下面我将会从项目经验、系统设计、履历/学历/素质、候选人与岗位的匹配、多轮面试官的协作这些方面,继续告诉大家,互联网公司是如何全方位、无死角来考察候选人的。
项目经验的考察
项目经验,绝对是面试官必须考察的,很可能上来就是让你先画一下项目整体架构图,说一下你们项目用了哪些技术以及核心的业务思路。
然后从项目入手,考察你项目里各个技术掌握的如何,通过连环炮对你掌握最好的技术进行深入考察,对一些高阶技术的考察,直接下探到底层。
举个例子,如果你说你们公司里用了 dubbo 作为服务框架:
那么会问问你 Dubbo 底层的通信框架是什么?Netty?Mina?
然后再问问你底层的 NIO 是啥?网络通信里的长连接和短连接是啥?
你是否看过 Dubbo 的源码?Dubbo 源码中你印象深刻的对并发技术的运用是什么?
一些面试官喜欢从项目展开问各种技术,也有一些面试官上来直接从你简历上的技术开始发问,从技术深入到项目。这就看个人喜好了。
当然无论如何,最后总会聊到项目的一些业务细节,好的面试官会掌握一个原则:死扣细节。
提问时,必须要深入到你把某个业务细节讲清楚,以及结合这个业务细节到底是如何落地和设计技术方案的,如何使用各种技术在业务中的。
比如你说你用了 Redis:
那就会进一步问你,你哪个业务用了 Redis?那个业务的流程请你叙述一下?
在 Redis 里你们具体是选用了哪种数据结构存放什么数据?数据的过期时间是什么?如果缓存过期了,你的数据兜底方案是什么,到哪儿去回查?
你的 key 如何设计的,为什么要这么设计?你的这个业务把数据放在了 Redis 里,是其他哪个业务来查 Redis?为什么要这样子做?如果不用 Redis 会怎么样?
这只是一个例子,实际上各种技术都可以在项目里深扣细节。这就能考察出,你对这个技术的实践到底有多深,经历过多么复杂的线上业务的实践,能 hold 住一个技术解决线上系统中的哪些问题。
总之,从项目里,我们可以看出你是否负责过复杂业务架构下的分布式系统的设计和开发?
你们的系统是否面对线上高并发大流量高负载场景的挑战,你是否经历过这种技术挑战?
你们的系统是否承载过亿级别海量数据的存储以及高性能读写的挑战,你是否解决过这些问题?
此外,从项目考察中,还可以直接看出你的整体能力技术定位。你是仅仅负责过一个模块呢?还是负责过一个子系统?
或者是作为架构师负责过一个完整的项目群,带过几十人的团队,设计过大规模复杂的系统架构?
所以说,你到底把控过什么样的项目,具备什么样的能力,从你负责过的项目里,直接可以看出来。
如果你来面试的是中级的岗位,那么可能我们觉得你技术整体 ok,独立负责过核心模块的开发,同时对各种技术都有一定的实践经验,就 ok 了。
如果你面试的是高级/资深的岗位,那么我们会看看你是否带领一个小团队独立负责过一个有一定复杂度和难度的完整系统的架构设计和开发。
如果你面试的是架构师的岗位,那我们肯定是要求你在一个公司里主导过很多人协作完成的大型而且复杂的项目群。
并且我们要求你对一个大型系统架构有深度的思考和整体的把控,而且这个项目要有足够的技术挑战,大用户量、高并发、海量数据,等等。
因此,项目考察,是重中之重。很多同学平时积累了不少的技术学习,但是有一个很大的问题是,项目经验和实践太少。
这些同学可能确实没经历过复杂系统的架构设计的历练,所以非常容易在项目经验考察这块出现问题,被面试官判定为技术不错,但是经验缺乏。
系统设计的考察
这个也是很多互联网大厂的面试官,在考察一些高级工程师及以上的同学,喜欢发问的。
一般会把自己公司或者团队里的一些业务场景拿出来,或者是普遍性的一些业务场景,然后来问你如何针对这个业务场景设计系统架构?
举几个例子:
如何设计一个电商秒杀系统架构?
如何设计一个消息推送系统架构?
双 11 大促的时候如何设计系统的动态扩容/缩容的机制?
类似诸如此类的一些场景式的系统设计考察。其实这个主要是用一些你可能没接触过的场景,来现场考察一下你的架构设计思维。
尤其是针对上面说的高级/资深、架构类的岗位,我们尤其会注重现场考察你没接触过的业务场景的架构设计。
因为毕竟你来了以后,肯定要让你接触全新的业务,然后立马给出合理而且靠谱的架构设计方案,在新的公司来落地你的经验。
很多同学平时不太注意积累系统设计的能力,导致出去面试的时候,人家一问场景系统设计问题,直接发蒙了。
所以,平时应该对公司里各种业务场景多思考,自己设定一些挑战,比如假设你公司的请求量暴增 100 倍,数据量暴增 100 倍,你的系统架构应该如何设计?
多给自己设立挑战,然后去尝试着思考设计,才能积累出系统设计的思维和能力来。
基本功的考察
很多大厂都会考察候选人的基本功,尤其是数据结构和算法。比如现场手写一些常见的算法题。
很多同学很容易倒在基本功这块,一些基础的数据结构和算法题都不会写,那就是有点问题了。
这里强调一下,这个东西并不是应届生专用的,其实也代表了一个工程师,甚至一个架构师的基本技术素养问题。
因此建议大家平时还是要注重基本功的保持,平时写写算法题,熟悉一下数据结构,能保持自己的技术素养不会掉落。
否则数据结构和算法都不熟悉,对复杂系统的技术细节把控基本也就没法做到,因为很多复杂分布式系统的源码里,到处是自己写的数据结构和复杂算法。
整体背景考察
最后一定会综合看一下一个候选人整体的背景,如履历背景/学历背景/过往经验/综合素质。
例如考察履历背景:
你过去是外包公司出身?还是传统 IT 公司出身?或者是一些小型互联网公司?或者是一二线大互联网公司出身?
另外你的学历如何?是大专?普通本科?211 / 985 本科?普通硕士?211/985 大学的硕士 or 博士?
你过去做的都是一些内部系统,比如 OA 系统,财务系统?或者都是 C 端系统,有上千万用户量的系统?或者你过去做的都是某种偏门的项目,比如爬虫之类的?
你的沟通表达能力如何?性格是否踏实和 nice,不浮躁?你是否有团队协作精神?
这些综合性的东西,其实都会在我们的整体考察范围之内,都会纳入考虑范围内,最后决定要不要发 offer。
候选人与岗位需求的匹配
按照上述流程考察下来以后,会经历多轮面试,基本一次好的面试就可以综合考察出一个候选人的完整情况了。这个候选人的技术面是否完整,是否有几个技术领域有足够的深度?
候选人做过什么样的项目,项目的实践经验如何,把控过多大的团队和多大的项目,对全新业务场景的系统设计能力如何,基本功如何,综合背景和素质如何。这些东西,基本上都可以很好的考察出来了。
此时就会将一个候选人跟岗位的需求进行匹配,比如说你要招聘的是一个资深 Java 的岗位,需要他过来开发的是公司里较为核心的子系统。
然后呢,你公司的技术栈是 Dubbo、ZK、Kafka、Redis,等等。
你们公司每秒有上万的并发访问压力,数据量一亿以上,线上系统偶尔故障,比如高并发下 ZK 突然报错异常,导致系统业务中断,然后需要带 4 个初级和中级的兄弟一起开发。
这时,你考察完一个候选人,就知道他的技术能力是否匹配这个岗位,技术深度能否 cover 住线上系统常见的一些故障。
能否在线上故障的时候,立马有足够的源码功底分析、定位和解决问题。是否有过类似足够的高并发和海量数据的项目经验。
是否带过几个人独立把控过一个核心系统的架构设计和开发,过去的公司背景咋样,学历咋样,综合素质咋样。这个候选人和岗位需求是否匹配,基本上就出来了。
多轮面试官的分工协作
上面列举了大量的技术考察的内容,实际上很难说是一轮面试官直接完成的。
因此,一般我们都是分成多轮面试官协作考察。但是根据不同的公司,不同轮的面试官的职责会稍微有一些不一样。
比如说一面面试官可能主要就是考察一下技术内容,包括技术面以及连环炮发问考察技术深度,以及算法功底,不太涉及项目。
二面面试官可能会着重考察项目经验,系统设计,同时对技术深度也会继续考察。
三面面试官可能会从你把控过的项目规模、带的团队规模、团队管理能力、规范和流程设计能力、整体工作履历背景和经验、软素质(沟通表达、团队协作、价值观,等等)来考察你。
上面说的只是一种分法,一个公司内的不同团队的分工可能是不一样的。
也有的可能是一二面都是考察技术面和技术深度,不涉及项目,三面来考察你的项目经验,四面来考察你的一些综合素质。
或者可能你面的职位很高,比如是总架构师之类的职位,也许还有 CTO 或者技术 VP 出来面试你第五轮。
但是不管如何分,整体考察的内容都是上面的那套东西以及那个流程和过程。
作者:中华石杉
编辑:陶家龙、孙淑娟
出处:转载自微信公众号:石杉的架构笔记(ID:shishan100)
中华石杉:十余年 BAT 架构经验,一线互联网公司技术总监。带领上百人团队开发过多个亿级流量高并发系统。现将多年工作中积累下的研究手稿、经验总结整理成文,倾囊相授。微信公众号:石杉的架构笔记(ID:shishan100)。
精彩文章推荐: