序
今年经历了裁员之后,就开始了艰辛的找工作。因为是19年的应届生,距离毕业不到一年,所以很多公司问过之后直接说不要,比如滴滴、有赞,都是招三年以上工作经验的,两年的话特殊优秀可以考虑,一年以内直接不考虑。因为只考虑杭州,杭州的大厂不多,所以在杭州想要找到合适的工作还是很难的。
从三月初开始,就准备找工作,虽说那个时候还没有被裁,第一家面试的公司是酷家乐,那个时候什么都没有准备,直接面的,很多基础的东西都忘了,所以自然就是挂了,也没有放在心上,那个时候心态是找一找面试的感觉,酷家乐这个公司还是很不错的,只不过和我目前的业务方向不是很一致。在被裁之后,先后面了同花顺、头条、华为、有赞和阿里。
同花顺是最先拿到offer的,薪资问了一下在那个公司的同事,开出的已经算非常高了。不过同花顺的面试经历给我感觉很随意。第一面是笔试题,两道算法题,代码量还是很大的,4小时之内做完,之后把代码通过邮件发回去(可以百度的那种)。不过我觉得同花顺的面试官肯定考虑到了这个问题,因为百度根本找不到,所以还是自己写的。之后再一次技术面试就hr了。虽说薪资待遇还是很不错的,但我没有选择的原因还是和我之前的业务方向不一致,因为自己加上实习已经做了两年左右电商相关的业务(营销、流量、广告、内容、商品、交易、直播、支付、金融等等),所以考虑今后的发展,希望一直做电商相关的业务。
接着拿到offer的是华为,面试流程感觉还很正规,两次技术面、一次笔试(两道题,题目不是一般的简单),结束。但到最后才和我说现在华为社招不招正式岗位,都是外包,然后我就直接拒绝了。具体要不要作为外包去华为,大家可以百度一下,反正自己是绝对不会去的。
接着是有赞,有赞是我最想去的公司,因为女朋友在有赞,但因为有赞只招三年以上工作经验的,所以只能投爱逛,爱逛属于是有赞的子公司,具体啥情况可以去百度下,工作地点和有赞在同一个楼,然后连面试官都是向有赞借的,做有赞直播相关的业务。但是一面就挂了,相当受打击。
头条的面试经历我觉得特别神奇,头条一共有三次技术面,第一次面试到二面挂了,然后被另一个团队捞起来了,然后第二次面试到三面挂了,然后又被另一个团队捞起来了,第三次面试终于拿到了offer,可能是头条在杭州刚刚起步,招的人比较多吧,才会有这样的操作,所以我前前后后一共经历了8次头条的技术面试。我自己觉得头条前两次挂的原因就是算法,头条每一次面试都会有算法题,有的还会有sql题,在线写的那种,所以我觉得这种很看运气,因为我自己基本就没刷过算法题(工作太忙了,再加上本身也懒得刷)。头条的算法题的难度大约和leetcode上的中等难度的题差不多,所以leetcode刷一个月面头条,算法绝对没问题,像我这种没刷过的就看运气了。
最后是阿里,阿里有三次技术面、一次笔试。我通过了前两面加笔试,面试官的评价很好,但是第三次技术面一直没有消息,问过阿里认识的人,说还在流程中,但阿里的大老板不太想面,原因就是毕业不到1年,如果是毕业两年,这样的评价就很稳,所以现在阿里一直还在流程中。
上面就是我这次被裁之后的面试经历。
终于到正文了,说一下面试被问到的问题。个人觉得,阿里和头条的面试官很有水平,其他的公司确实感觉上差了一些,所以我就通过阿里和头条面试,做一个总结。总的来说头条偏向基础和算法,阿里偏向项目。个人比较喜欢阿里的面试方式,问的很多都是通过项目的开放式问题,很难准备,都是通过以往的工作经验来回答,所以面试官通过回答能很容易判断出这个人的经验这么样。基础非常扎实并且算法题刷的特别多的话比较容易通过头条、项目经验丰富且特别善于思考的人比较容易通过阿里。
技术相关
下面我通过星星的数量来表示问题的重要程度。
✨✨✨✨✨ MySQL
头条的每一次面试都会问到MySQL,阿里在一面的时候有问到,所以MySQL也别重要,每一个领域都很重要,需要掌握的很深。
基础问题:
索引,聚集索引,非聚集索引,区别?原理?怎么存储?MySQL为什么要这么设计?sql语句查询时是怎么使用的索引?
架构,物理层、逻辑层都干了什么?为什么这么设计?MySQL怎么在架构上做的sql优化?
ACID?事务隔离级别?mvcc是怎么实现的?ReadView和版本链是怎么回事?
MySQL的悲观锁?乐观锁?间隙锁?行锁?表锁?
日志?binlog、redolog、undolog都是用来做什么的?
开放问题:
线上给一张表加一个字段,会有什么问题?如果出现这个问题,你会怎么解决?(想考锁相关的问题)
你是怎么排查线上的慢SQL的?
基础的问题百度一下基本都能找到答案,多花一些时间理解一下基本都能回答出来。对于开放的问题,如果说开发经验比较少的话,可能不知道面试官想要问什么。这些就不是靠临时突击就能回答出来的,所以想进大厂平时的积累和经验还是特别重要的。
那第二个问题为例,如果经验不是很丰富的话,可能只能回答出看查询的字段是否在索引中,再回答一些常见的不走索引导致慢查的例子等。经验再好一点的能说出explain、然后怎么去看用了哪条索引、或者是全表扫描。这个问题可以从很多个角度去回答,怎么定义慢SQL,什么原因造成的?举个例子,数据库连接超时,多线程或者网络抖了再或者机器的问题都可能会出现一个很正常的SQL是慢SQL,这种情况你是怎么解决的?另外就是真的这个SQL有问题,举一些具体的例子,你是怎么排查的,有很多明明where后面的字段都在索引中,但就是没走索引,最后你是怎么解决的。在平时的工作中所解决的问题最后会变成积累和经验。因为排查慢SQL应该是后端开发最常见的和SQL打交道的应用场景了,所以面试官通过这个问题很容易看出你对于SQL的积累是一个什么程度。
举一个慢SQL的例子,是MySQL5.6版本的一个bug,我有一条索引a_b_c,查询条件是where a = xxx and b = xxx order by c,如果只有这一条索引,啥问题都没有,但是如果这张表还有另一条索引c,这个查询就不走a_b_c这个索引了,直接全表扫描。解决方式就是在sql语句中加强制走a_b_c这条索引。
✨✨✨✨ JVM
jvm问的次数仅次于MySQL。
基础问题:
jvm的内存模型?
垃圾回收机制?新生代老年代?垃圾回收算法?Gc root?
比较奇怪的是类加载机制和调优方面一次都没有问过,但个人觉得还是很重要的,尤其是调优,在不同的场景下,怎么设置jvm的参数。
开放问题:
new String("xxxx")在jvm中是一个怎样的的流程?(实际就是想问内存模型)
一个方法的执行是一个怎样的流畅?(实际上也是想问内存模型)
你们公司用的什么垃圾回收器?(我们用的是CMS,我觉得大部分公司都用的CMS吧,主要想问垃圾回收算法,我当时还说了G1,然后优劣势的对比,如果再能说出jdk高版本垃圾回收做了怎样的改进会很好)
✨✨✨✨ Redis
基础问题:
持久化方式?rdb、aof实现方式?区别是什么?优缺点?
数据结构?实际应用场景?(说一个比较好玩的场景,就是用list这个数据结构做消息队列。一般来说消息队列用MQ就好了呀,干嘛要用Redis,这个场景是在面试酷家乐的时候面试官告诉我的,说他们底层每次数据传输特别大,他们是做家装的,都是3D模型数据,正常数据都有好几兆,还需要系统之间进行传输,但不要求qps和rt,这种情况肯定没办法用MQ,用Redis的list数据结构是最合适的)
部署模式?集群?哨兵?优缺点?性能?
有了解过redis存储的时候用了什么算法吗,就是set的时候是通过什么算法放进去的?(这个问题我觉得有点偏,就问过一次,我就知道是哈希算法,具体啥哈希咋做的完全不知道,我当时就说了我只知道在集群模式下是怎么选择放到哪台机器上去的)
Redis是如何用单线程解决高并发的?epoll的原理?epoll和poll的区别?
开放问题:
有没有用过分布式锁?是什么业务场景?是怎么实现的?有什么问题?为什么知道有这个问题还这么实现?(Redis做分布式锁的细节问的很深)
✨✨✨ Spring
Spring问的不多,而且都是问原理,但是只要问到Spring就都问到AOP。Spring需要掌握到源码级别。特别推荐鲁班学院的子路老师讲的spring源码课,是免费的,是我听过的最牛逼的讲spring源码的课程,只要把公开课中所讲的知识都会了,应对啥大厂的面试都没问题,甚至可以吊打面试官。
基础问题:
AOP?(类似于织入点、切面等这些基本概念和你是怎么用的就不用说了,面试官不想听这些,直接说aop的实现原理就好)动态代理?jdk、cglib?Spring是怎么选择用哪种代理方式的?为什么jdk动态代理只能作用在接口上?用AOP的好处是什么?线上的应用场景是什么?
生命周期?(自己这块比较熟悉,被问到了之后都是一口气把所有的细节都说完了,每次都说好长时间,说完之后面试官都是直接下一个问题,生命周期相关的就不再问了,细节的点有BeanDefinition、属性注入、三级缓存、循环依赖、生命周期回调函数、aop)
✨✨✨ 锁
synchronized关键字?锁升级?
i++要变成原子操作要怎么保证?volatile关键字?原理?
Reentrantlock是怎么实现的?原理是什么?AQS队列?有参构造中传入的参数是什么作用?怎么实现的公平锁和非公平锁?
✨✨✨ zookeeper
这个感觉是因为我简历上写了熟练掌握zookeeper相关的东西,所以每次面试这块问的很多,也很深。
干什么的?应用场景?
ZAB协议(2PC、选举、主机挂了怎么办、从机挂了怎么办、脑裂问题是怎么解决的)?
分布式锁是怎么做的?和Redis做分布式锁相比有什么优缺点?
有了解过etcd吗?对比有什么优缺点?为什么etcd比较轻?
✨✨ 设计模式
设计模式这一块问的次数比较少,我记得是一共问了3次左右。但是问的方式都是一样的,就是你在这个项目中都用了哪些设计模式?所以在面试之前好好回顾一下自己项目的代码,这些设计模式或多或少都会涉及到的。比如说单例模式,交给spring管理就是呀、还有一些基础的调用类中的成员变量都会设计成单例的,例如MQ、Redis。再有一个比较常见的就是责任链设计模式,如果项目中有哪些步骤需要按照一定的链路去执行那就是责任链设计模式。这一块需要对一些常见的设计模式有一定的理解,再对自己的项目在设计模式上有一些思考,就没什么问题的。
✨✨ MQ
最开始的时候面试官肯定会问你们用的什么MQ,因为我们公司的MQ是自研的,所以我在说的时候都是我们公司的MQ的架构是怎样的。一共问了两次,我都是一口气说完的,然后面试官就都直接问下一个问题了。我是对比kafka和RocketMQ来说的,细节的点如下:
kafka和RocketMQ架构上有什么不同?优缺点是什么?我们的MQ架构是什么,对比这两个优势是什么?
怎么保证不丢消息?怎么保证不重复消费?怎么做幂等?(一般来说MQ的数据准确性都需要考虑这几个问题)
消息堵了你们是怎么处理的?
✨ RPC
就问过一次,问的是远程调用是怎么实现的。我回答的不是很深,因为没有看过dubbo的源码。我就尽量引导面试官问我zookeeper,然后给引导过去了。
✨ TCP
就问过一次
三次握手?四次挥手?
✨ hashMap
就问过一次
实现原理?resize?红黑树?多线程情况下哪里冲突?怎么解决?7、8版本都是怎么做的?
问过的技术相关的问题就这些,能够明显感觉到对于技术的要求,社招和校招的侧重点是不一样的。校招会问更基础的问题,比如TCP的握手基本每次都会面。还有线程池的参数也是这样,但是我一次都没有被问到过。还有一些排序算法是怎么实现的,也是没有问到过。
项目相关
再说项目,实际面试中一半的时间都在聊项目,这块怎么说都是因人而异,毕竟经历不一样。在准备项目的时候考虑下以下的问题:
为什么做这个项目,背景是什么?
怎么实现的,用了哪些技术?(比如说用到了redis,那么对redis的基础需要了解比较深入,面试官大概率会继续问下去)
痛点是什么?你解决了什么问题?这么解决还有什么其他的问题?如果有你要怎么解决?
项目中遇到的最大的挑战是什么?
有没有更好的实现方式?你了解这种情况业内都是怎么实现的呢?
如果遇到了xxx的问题你会怎么办?
第六条是比较难考虑的,需要经验来回答,所以在平时做项目的时候多思考,我拿我自己的红包项目举例子,平时我们发红包的qps是10所有,大促的时候最多到6000qps,所以我设计了这样的系统。那么面试官可能就会问,如果说要是有10w的qps,你们系统能抗住吗?如果扛不住,你要怎么设计你的系统来保证这个稳定性呢?当然除了这个,还会有很多的问题,这里就不一一列举我在说项目的时候面试官问的拓展的问题了。毕竟每个人做的都不一样。所以多思考为什么、qps大了怎么办、数据量大了怎么办、xxx挂了怎么办等等。
开放性问题
最后是纯开放性问题,这个我在这回面试中只被问过一次,问题是让你设计一个停车场的系统你要怎么设计?完全需要靠经验来回答。我是这么回答的,需要考虑计费、车位显示、流水分析等业务,然后每个业务的表要怎么设计,每个业务需要核心解决哪些问题,要用什么技术来解决,这是我说的整个的一个设计思路。在我校招的时候也问过这种开放式问题,比如让你设计一个附近的人的功能你要怎么实现?如果说有100w个网站的点击量,让你根据点击量进行排序获取前100个网站,你要怎么做?这种纯开放性问题就要看你平时的积累与经验了。