记人生第一次阿里巴巴技术面试被拒经历
作为一个研发人员,我相信大家都有一个大厂梦。梦想着有一天,能够去大厂工作,去享受那种高手如林的工作环境,去真正体会什么是真正的高并发、海量存储、大数据,去这些大的舞台,发挥自己的聪明才智,做一款服务千万级用户的产品,升职加薪,走上人生”巅峰“。没错,我也同样有这样的期待,期待加入BAT这样的大厂,从投递简历到一面被拒大概经历了15个工作日,就过程而言,阿里的面试体验还是不错的,给予候选人,不管是在时间和空间上很大的自主选择权。就结果来看,让我意识到自己认知盲区,自己本身存在的缺点。
本次投递的岗位信息:
- 部门:阿里巴巴IOT事业部
- BASE:无锡
- 级别:P7
01 投递简历
由于工资上涨的脚步,无法追赶上海房价上涨的步伐,本人在两年前在无锡置业,随着年龄的日益增长,倍感生活的压力。从2019年伊始一直计划着有合适机会的话,回无锡工作,一个偶然的下午 2019年9月29,出于好奇,想了解无锡互联网相关的工作机会,通过BOSS直聘,看到阿里巴巴在无锡有HC,于是准备了一份简历,发给了招聘负责人。说实话,看完无锡的整体互联网需求,心里还是有些失落,原因如下几点:
- 机会较少,有不错产品的公司较少,大量技术外包公司
- 薪资较上海,有比较大的差距,基本是腰斩
- 上升空间、潜力有限,在这座城市从事互联网行业工作,比较容易出现天花板
那些在一线城市(北京、上海、深圳)工作IT从业人员,在选择退居新一线和二线城市的时候,需要慎重,得有心理准备。
02 预约电面
在2019年10月12号从南京出差回上海的动车上,接到了一个陌生电话,显示固话所在地 浙江-杭州 ,面试官首先会说明来意,介绍部门信息和岗位信息,Base情况。接下来,就是询问,可不可以当即进行电话面试,因为火车上人来人往(毫无准备,借口拒绝),推迟到下周二(2019年10月15号)。这里建议收到电话面试邀请的同学,在没有准备充分的情况下,不要贸然答应电话面试,建议有两种选择:
- 拒绝本次电话面试预约,表示自己最近没有换工作的计划
- 顺延面试时间,表示当前比较忙,将面试时间顺延,充分准备
据在阿里的朋友讲,之前有被拒记录,会对后面再次面试,有较大影响,可能因为第一次被拒记录,直接无法进入电面环节,更有甚者,在HR面因为之前被拒评价,被一票否决。言而总之,总而言之,认认真真准备,机会都是为有准备的人而准备的。
03 面试准备
从网上收集资料并整理发现,不管是深度还是广度,阿里面试的问题涉猎方方面面,如果之前没有准备的话,想在两天内复习完,难度较大,第一面主要是基础,大概的复习思路是:
- 从简历中挑选一个自己最熟悉,有技术亮点的项目,梳理业务流程(What、Why、How)和技术栈(架构设计,中间件,开发框架)。梳理好这些,将有助于在面试的过程中,引导并暗示面试官进行提问,把话题的主动权权掌握在自己手中,不要被面试官牵着走,容易掉到坑里去。
- 算法: 排序算法(冒泡、选择、插入、快排、希尔、归并、堆排、计数、基数、桶排)、LRU、查找算法(暴力查找、二分、二叉树、哈希)、LRU、LFU、FIFO、FILO
- 数据结构: 数组、链表(单向、双向)、树(二叉树,完全二叉树、查找树、红黑树、多路树、B-Tree、B+Tree)、图
- 千年不变的JAVA基础连环炮: JVM、Java集合、锁、并发编程(CAS、自旋、LockSupport)、网络编程(IO/BIO/NIO)、反射、动态代理、新特性、线程池、ClassLoader、线程间通信
- Spring连环炮: IOC、AOP、Spring Bean生命周期、Spring容器初始化过程、Servlet生命周期、后知处理器、BeanFactory和FactoryBean的区别、Spring处理请求过程、Spring父子容器
- ORM框架: Mybatis原理、一级缓存、二级缓存、Mapper扫描过程、动态代理过程(JDK自带与Cglib比较)
- 数据库: B+树、索引结构、索引的分类、乐观锁、悲观锁、共享锁、排它锁、MVCC、GAP、ACID特性、隔离级别、事务原理、造成数据库死锁的原因,如何避免数据库死锁、如何使用explain、什么情况下会导致索引失效、如何进行数据库优化、建立索引需要注意什么
- 中间件: nginx、配置中心(Disconf,Diamond、阿波罗)、Zookeeper、Elastic-Job、Dubbo、cat监控、Spring Cloud、ElasticSearch、oss、mq、redis、elk、druid、drools
- Web容器: Tomcat、Netty、JBoss
- 协议: Http、Tcp/IP、UDP、Https
- 加密: Md5(加盐)、AES、SHA1、RSA
- 工具: Maven、Git、UML(用例图、流程图、ER图、时序图)
- 分布式: CAP、BASE、分布式事务(两阶段、三阶段、TCC、本地消息表)、服务的互斥性、服务的幂等性、分布式锁(mysql、redis、zookeeper)、数据一致性问题
- 设计模式: 结合Spring框架:单例模式、工厂方法、简单工厂、抽象工厂、创建者、责任链、策略、代理、模版方法、观察者
- 源代码: JUC、HashMap、ConcurrentHashMap、HashTable、sync、AQS、ReentrantLock、ThreadLocal、Dubbo、Spring、Netty、NIO(epoll、selector)
- 性能调优: 代码、数据库、缓存、NoSql、JVM、页面静态化、CDN
04 电话面试
经过两天的匆忙准备,面试官非常准时地按照之前约定的时间,出现在电话的那头,而我在这头。
简单寒暄,再次确认Base信息,随即进入面试环节:
Q1:请介绍一下给你留下印象最深刻的项目是什么,用到了哪些技术
Q2:HashMap底层实现是什么
Q3:HashMap加载因子和扩容机制是什么
Q4:HashMap既然用到了红黑树,那么应该重写什么方法
Q5:ThreadLocal是如何实现的
Q6:分布式事务问题如何解决的
Q7:如何保证MQ消息和服务的幂等性
Q8:Dubbo的底层通信原理和IO模型
Q9:Dubbo的负载均衡算法有哪些,默认是什么
Q10:Dubbo和Spring Cloud的比较
Q11:有没有了解过阿里开源的配置中心产品
Q12:JDK自带的线程池比较
Q13:Spring AOP原理
Q14:Mybatis使用过程中,没有写具体的Mapper实现,是采用了什么技术
Q15:基于Jdk动态代理如何实现
Q16:JDK动态代理和Cglib比较
Q17:数据库乐观锁和悲观锁
Q18:数据库为什么要建立索引,需要注意什么
Q19:有没有看过一些源码,并做下讲解
到此,面试结束,整个电话面试时长1个小时10分,比较顺畅,有几个比较底层的问题,没有回答上来,只能讲大概,缺少全局性思维,不会的就是回答的不会,没仔细研究过的也就是回答的没有仔细。(以上问题仅凭记忆留存)
05 通知结果
在面试完第一面之后,整体自我感觉还算不错,确实有几个底层的原理性问题,没有回答上来。接下来就是等待面试结果的过程,整个等待面试结果的过程,大概的过程是这样的:
自信(感觉还可以) ---> 喜悦(还在流程中) ---> 怀疑(未收到二面通知) ---> 焦虑(是不是挂了) ---> 失落(面试被拒) ---> 释然(思考与总结)
在不知道面试结果的情况下,继续准备二面的内容,最近公司有两个比较急的项目都我这边,白天忙工作,晚上复习到2~3点。在这里,非常感谢在背后默默支持我,充当后勤部长的小高同学。在这期间,通过朋友内部查询,面试后4天,简历状态显示一直处在流程中,哈哈哈,这里我感觉应该要二面了。大概过了一周后,还是没有收到二面的通知,这个时候就有点坐不住了。再次让朋友内部确认,结果惨痛。面试官给的评价是:技术深度不够,技术热情不足,人沟通和逻辑很好,朋友也安慰我:面试就是碰,不同的面试官看中的点不一样,作为一位RD,自己心里最清楚(自己基础不够牢靠),接到结果的那一刻,心里还是有些许失落。失落之余是对自己这些年的反思和总结。也给自己在接下来的工作中,指明了方向。整个阿里面试的流程,到此结束。(吐槽一下:面试被拒,没有收到任何邮件与短信通知,建议在招聘环节中,做到有始有终)
06 思考与总结
思考:
在面试环节中,哪些问题给面试官留下了,技术深度不够的印象?
关于深度不够,个人感觉有几个原理性的问题,没有回答上来,最为致命。
在面试环节中,哪些问题给面试官留下来,技术热情不足的印象?
关于技术热情,没有做成让面试官满意的答案,现有在公司项目中的解决方案只停留在解决当前问题和能用就行阶段,源代码了解程度不够,对技术只是停留在知其然阶段,没有表现出技术改变世界的决心。
总结:
- 平时忙于处理团队的事情,对技术的深度的求知欲,逐渐降低
- 对技术原理的好奇心,逐渐丧失,只是停留在使用层面
- 准备不够充分,在投递简历之后没有利用好简历筛选的时间,梳理知识点
- 其实阿里的面试,也没有想象中的难,在深度和广度上充分准备,相信一定可以拿到Offer
计划:
- 开通本博客,记录成长历程
- 从基础着手,深入源代码,了解背后技术实现原理
- 保持好奇心
- 每周能够产出一篇技术博客
- 明年此时,再战阿里,争取能进二面