大家好,我是程序员小灰。小灰有一位读者朋友在阿里工作多年,担任面试官先后面试了1000+的程序员。
今天,这位小伙伴为我们写了一篇面试总结,希望可以帮到大家。
1. 面试官背景
本人在阿里3年,面试了1000人以上,经过我面试进来的同学有8人,招聘进来的同学有P5、P6、P7,面试通过率不到1%,所以内部有个说法,能进阿里的都是百里挑一的高手。
做为面试官,面试的同学形形色色,有一些同学非常优秀,也让我学到很多,今天主要讲讲作为面试官的经验,避免同学们因为非技术实力问题而拿不到offer的窘境。
2. 面试节奏
由于本人还未面试过P8因此被人主要针对P5、P6、P7讲一讲面试节奏,在阿里面试周期会比较长,一般会持续一个月之久,之所以持续这么长时间,因为每轮面试的节奏相对较长。
对于P5同学:一般4轮面试,第一轮、第二轮一般由部门的P6、P7做技术面试;第三轮会有部门主管面试综合能力;第四轮HR面试。
对于P6同学:一般也是4轮面试,和P5最大区别会增加其他部门主管的交叉面试。第一轮一般是部门P7技术面试,第二轮自己部门主管面试,第三轮其他部门主管面试,第四轮HR面试。
对于P7:一般也是4轮面试,和P6最大的不同会增加+2的面试官的面试,也就是说第二轮或者第三轮面试,一般需要有自己部门或者其他部门的P9面试。
面试周期长:一般情况下,面试周期长达一个月,基本每轮面试1周,4轮面试基本在1个月以上,因为阿里内部节奏快,事情非常多,基本上大家只有在晚上或者周末才有时间面试,导致面试周期也拖的久,面试过程中对于心理考虑非常大,要做好心理建设。
PS:阿里有一个规定面试官必须高于被面试同学应聘的岗位,之前出现过一个案例,一个P6的同学将一位面试P9岗位二面的大佬给拒绝掉了。
3. 面试各环节的坑
简历筛选阶段:阿里内部有3年2跳、5年3跳【含义3年内跳槽2次、5年内跳槽了3次,跳槽的次数包括进阿里的这次】的简历直接pass掉的要求,因为阿里工作压力和强度很大,对于员工的稳定性要求比较高。因此如果同学们有志于进入阿里,建议在一家公司一定要呆够3年以上。
学历要求:一般部门都是211及其以上,对于一些员工非常稳定的事业部,要求会更高,985或者C9才是入门劵,读书敲门砖在这个时候是非常有用的。
运气因素:但凡事都有例外,当一个新成立的部门,由于公司在和时间赛跑,需要尽快将业务上线,这时候会对相关条件适当放宽,例如我之前所在的部门,刚刚开始的时候大专生都能进来,对于稳定性也没有过高的要求,只要面试时技术、管理、沟通、抗压能力都行,基本都能进来。
但是随着人员补充到60%左右,慢慢就越收越紧了,基本和阿里集团的要求对齐。之所以将运气因素单独拿出来,是因为在面试过程中按照我的经验,70%的人会在第一轮面试被挂掉,一般都是硬实力的欠缺,例如八股文不过关、没有复杂项目的经验,其他的多多少少和运气有关系。
能力要求:只招聘高手,阿里对于新入职同学的要求会有一定要求,之前要求平凡人做非凡事,有段时间在公司内部提倡让不平凡人做非凡事情,这时对于新入职同学要求特别高。虽然具体要求一直在变化,但是有一点,新入职的同学的水平要大于团队的平均水平,确保团队整体实力随着时间的要求一致在提高。菜就是原罪,这句话真没错。
熟人推荐:这一点非常重要,上面的要求都有例外,我团队招聘进来一位哥们,5年换了4家公司,学历也就一般本科,但是他和团队一位绩效非常好的同学是之前公司的老同事,这位同学强烈推荐,认为技术能力比自己还要强,因此得到了一次面试的机会。
要引导面试官:在面试过程中,切记问一答一,特别是对于面试P6、P7同学,必挂,因为阿里内部对于沟通能力、主动性要求非常高,进来后经常面临着需要自己主动抢活干,主动和外部协调的工作要做,如果只能被动接受任务,很容易被干掉。
PS:天无绝人之路,只要大家有想进大厂的想法,一定不要放弃,如果自身的硬件条件有限,那么重点关注新成立的部门,任何大厂新成立部门招人都会网开一面的,只要进来了,在内部转岗就比较容易了,除非绩效3.25,否则只要有空缺的HC,基本问题不大。
4. 印象最深的一次面试
谈一谈上面我提到的那位哥们A,5年换了4家公司,学历也就一般本科,由于是团队小伙伴推荐的,还是想给同学一个面子,但是公司的硬性指标也在这里,因此采用了一些手段。正常面试一般面1个小时即可,这次我面了整整2个小时,全方面无视角的考察,终于得出结论,是个好苗子,公司不招聘他是公司的损失。
后面果然在各个阶段非常顺利的过了,在HR面试前,HR就挑战了我,提出这位同学硬件不够,因为面试过程印象非常深刻,因此我详细的和HR聊了我的感受,HR被说服了。面试后HR感觉也非常好,立马就发了 offer。
如下是一些面试过程中的题,面试范围非常广,基本上对于一个程序员方方面面都涉及到了。
我:开门见山,团队同学B推荐了你,但是你简历显示5年换了4家公司,能否方便介绍下为什么跳槽这么频繁。
A:是有原因的,第一家公司破产倒闭,第三家公司工作一段时间后被第四家公司收购,合同改签了,而我现在这家公司工作的时间已经超过三年,稳定性没有问题的。
解读:应该是B同学提前提到过3年2跳、5年3跳的硬性要求
基础知识方面:
我:我们先做基础技术的面试,请介绍下JVM的工作原理,以及你了解哪些参数。
A:我有一张图可以介绍JVM的内部空间细分,在白板上画出这个图
常见的参数:
-Xmx12000m -Xms12000m -Xmn5600m
-XX:SurvivorRatio=8
-XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m
-Xss512k -XX:+UseParNewGC
-XX:ParallelGCThreads=4
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=60
-XX:+HeapDumpOnOutOfMemoryError
-Doracle.jdbc.V8Compatible=true -XX:+PrintGCDetails
-XX:+PrintGCDateStamps -Xloggc:/tmp/autodump/gc.log
-XX:HeapDumpPath=/tmp/autodump/
缓存方面:
我:如何解决Redis缓存雪崩、击穿与穿透?
A:缓存雪崩是指大量的请求无法命中Redis中的缓存数据,也就是在Redis找不到数据了,那业务系统只能到数据库中查询,进而导致所有的请求都发送到了数据库。
数据库并不像Redis能处理大量请求,由缓存雪崩导致的请求激增必须会导致数据库所在宕机,这样势必会影响业务系统,所以如果发生缓存雪崩,对于业务系统肯定是致命的。
针对导致缓存雪崩的原因,有不同的解决方法:
针对大量缓存随机过期时间,解决方法就是在原始过期时间的基础上,再加一个随机过期时间,比如1到5分钟之间的随机过期时间,这样可以避免大量的缓存数据在同一时间过期。
而针对Redis解决宕机的导致的缓存雪崩,可以提前搭建好Redis的主从服务器进行数据同步,并配置哨兵机制,这样在Redis服务器因为宕机而无法提供服务时,可以由哨兵将Redis从服务器设置为主服务器,继续提供服务。
我:说说布隆过滤器的原理及应用场景?
A:如果想判断一个元素是不是在一个集合里,我们一般想到的是将所有元素保存起来,然后通过比较确定。我们熟悉的链表,树等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。
不过世界上还有一种叫作散列表(又叫哈希表)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这其实就是布隆过滤器的基本思想。
如果布隆过滤器说有一个说元素不在集合中,那肯定就不在。如果布隆过滤器说在,有一定可能性它在说谎。
比较热门的场景就是:邮件过滤,使用布隆过滤器来做邮件黑名单过滤,还有重复推荐内容过滤,网址过滤, web请求访问拦截器,等等
解读:能提到使用场景,实战经验比较丰富。
数据库方面:
我:谈一谈你对事务的隔离级别理解?
A:Read Uncommitted(读未提交)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读提交)
这是大多数数据库系统的默认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓 的 不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结果。
Repeatable Read(可重复读)
这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
Serializable(可串行化)
通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
线上经验:
我:是否有遇到过线上问题,是怎么排查的?
A:又遇到了CPU和内存的问题,生产环境CPU过高如何解决:
1.top + H 指令找出占用 CPU 最高的进程的 pid
2.top -H -p
在该进程中找到,哪些线程占用的 CPU 最高的线程,记录下 tid
3.jstack -l
threads.txt,导出进程的线程栈信息到文本,导出出现异常的话,加上 -F 参数
4.将 tid 转换为十六进制,在 threads.txt 中搜索,查到对应的线程代码执行栈,在代码中查找占 CPU 比较高的原因。其中 tid 转十六进制,可以借助 Linux 的 printf "%x" tid 指令,jvm 多条线程疯狂 full gc 导致的CPU 100% 的问题和 JDK1.6 HashMap 并发 put 导致线程 CPU 100% 的问题。
内存使用如下命令,将当前的dump文件 导出,并通过mat进行分析:
jmap -dump:live,format=b,file=heap.bin 26525
抗压能力:
我:谈一谈你从业以来遇到的压力最大的一件事情,以及你是怎么解决的
A:曾经主管交给我一个项目,非常紧急,需要在一个月内完成财务系统的大功能上线。我当时分析后发现涉及到财务5个大的模块,其中凭证、核销2个模块我之前完成没有接触过,工作量非常大,个人评估下来人力要50人日,因此将所有的功能点都列出来,标注上了开发工作量,希望能够有哪位同学协助一起,和领导沟通,最后领导同意对凭证、核销熟悉的同学支援我,并且和产品沟通后砍掉了部分需求。连续加班3周解决掉了。
解读:这位同学能够积极主动地向上寻找领导解决资源问题,而且对于软件管理有一定的了解,综合能力非常强。
好了,关于阿里的技术面试,我们就说这么多。最后,希望大家都能找到自己理想中的工作,一起加油哦~~