作者 | 中华石杉
责编 | 伍杏玲
本文经授权转载石杉的架构笔记(ID:shishan100)
【程序人生 编者按】作者是一个不知名的小公司出身,原先年薪不到20万,通过自己的努力不断的提升技术,
最终收获多个知名互联网公司的Offer,年薪达到30多万,几乎翻倍!
半年多的准备,1个月的面试,从准备时的信心满满,到初试牛刀的当头一棒,再到沉下心来,不断补足短板,再度启程,最终拿下目前的Offer。
面试准备是一场持久战,个中滋味、唯有自知。在即将入职新公司之前,特意将这一路走来的心得体会分享出来,给自己做一个总结,也跟广大筒子共勉。
互联网公司的"面试套路"
经过这次跳槽面试北京多家互联网公司之后,楼主总结出了一个“面试套路”。
一般的有一定技术氛围的互联网公司的面试,大致可以分为三面:
一面:基础
一面面试官一般是团队里比较资深的工程师,进去之后的同事。而一面一般会问的基础内容包括:集合、网络、IO、并发、基本数据结构和算法、JVM。
根据楼主的面试经历,如果是面试互联网公司,一面一般都会挑出上述所说的一个或几个专题提问。
数据结构算法不用多说了,楼主建议从准备面试开始,一天刷一到两道算法题。
不用选择太难的题目,但是经典的排序、查找算法,基本的数据结构比如二叉树、链表、堆栈,这种一定得会,否则写不出来就回家。
另外,建议大家去看看JDK的底层源码,比如集合包、并发包的源码。看的时候一定要边看边总结边画图,这样最后记在你脑子里的,是一幅幅的图片。
如果光看不画图的话,除非你是天才,否则一定很快就忘了!楼主自身的血泪教训。
总之,如果能做到上述几点:掌握经典数据结构算法题目,并且可以在面试现场,跟面试官画图聊聊JDK底层源码的话,一面必过。
二面:项目经验
二面面试官一般是你未来团队Leader,一般会结合项目来进行考察。举个例子,下面就是一个比较典型的项目连环炮:
*
你说你项目用到了xx技术,OK,那你说下具体使用场景?
*
为什么你要这么使用?
*
这么使用的好处和坏处?
*
在用的过程中有遇到什么问题吗?怎么解决的?
*
解决之后是否对里面的原理深入了解?
一般二面就会从项目各个细节入手,考察各种技术在项目里是如何运用的,并且技术是如何结合业务来落地的。
然后有的面试官会继续深挖,看看你对自己项目中用到的技术,掌握的是否足够深入。
所以除了结合项目把某个技术说清楚外,最好对这个技术有一定的深度。
举个例子,如果项目里用到了微服务相关的东西,那么如果你去看过Spring Cloud相关的源码,比如Eureka、Ribbon、Feign这些组件源码,
那么面试会很加分。
楼主在面试最后拿到Offer的那个互联网公司时,就提到了自己项目中用到了微服务,并且由此去看了注册中心Eureka的源码。
然后从源码层面,详细画图阐述了其内部的心跳机制、多级缓存机制等等,甚至给面试官指出了Eureka中存在的一些Bug,那一轮面试楼主印象很深刻,和面试官聊的非常开心。
三面:综合能力
三面的话,如果是中小公司,可能是CTO面试。如果是大公司,可能是你未来进入的团队的Leader的Leader,比如说部门总监之类的级别。
总的来说,三面面的比较杂,每个公司都不太一样。有的会接着问你基础,有的会再问你项目,有的直接给你聊情怀,五花八门的都有。
楼主觉得,最重要的还是一二面,前两面的反馈很重要。三面的话,只要正常回答,都没啥问题。
跳槽前的技术积累
接下来,再说下跳槽之前的准备。
楼主3年经验,去年下半年由于不满足于之前公司的技术氛围和薪资,加上本人又比较能折腾,希望进那种比较知名的互联网公司挑战一下,因此萌生了跳槽的想法。
所以从去年下半年开始,利用业余时间学习了大量技术。从系统的开始准备,到面试第一家公司,大概花了半年的时间。
准备期间学习的技术包括:
(1)Redis缓存相关技术,以及高并发下的缓存架构设计
这块是互联网公司必用必问的,所以楼主对Redis技术进行了深入系统的学习,同时了解了一些常见的架构设计技巧。
(2)Elasticsearch
现在互联网公司一般都有全文检索的需求,比如网站或者APP里的搜索框,所以ES技术用的越来越广泛。
因此对ES技术也是进行了从头到尾的学习,对其底层算法、原理以及优化技巧都做了深入的了解,面试的时候,全部能够画图讲解。
(3)微服务相关技术
微服务就不用说了,互联网公司必备,现在系统都是用微服务架构来设计的。因此楼主对Dubbo、Spring
Cloud技术栈都进行了全面的学习,而且对这些技术都阅读过底层源码。
(4)JDK源码、设计模式
文章最开始就说了JDK源码的重要性,因此楼主将重要的JDK底层源码,比如集合包、并发包的源码都读了一遍。此外,对各种设计模式也做了一定的研究。
(5)分布式事务、分布式锁
分布式系统这块,也是面试互联网公司必问的技术。
(6)常见面试技术问题的梳理和总结
包括数据库、网络、IO、分库分表、MQ等等。
以上技术,楼主都进行了系统的学习和研究,而且很多技术都尝试在自己负责的项目中进行了运用和实践。
大概花费了有半年的时间,几乎都是夜以继日的学习,没有什么娱乐的时间。因为去年就希望在2019年的春节后可以换一家公司,改变自己的命运!
苦修半年,成果检验
在准备了大概半年后,下面就是楼主正式开始面试的经历。
面试第一周:无情打击,当头一棒
首先就是写简历投简历,楼主在刚过完年后就裸辞了,然后开始投简历。
虽然大致知道主要面试的是哪些知识点,但是写完简历之后,自己都不敢投,因为毕竟没太多的面试经验。
所以第一周仅仅面试了2家,当时有面试也会往后推,主要是不想浪费机会。
新东方在线
新东方旗下的在线教育公司,听说马上要上市了。
首先是一个多线程编程的面试题,比较简单。然后就是开聊项目,在项目中穿插问知识点,这次面试因为有不少知识点自己有点忘了,所以很多东西没回答太好。
比如说SQL执行计划中你最关心的字段,这样的问题,都没有回答好。最后的结果是一面就挂了。
第一周面试就被打击了,有点沮丧。有很多知识点我自己也知道,但是就是没有掌握,明显是去被吊打的节奏,浪费了新东方这个机会。
然后周末两天,哪也没去,在家里不分昼夜的全力复习,补足短板。
面试第二周:查漏补缺,稍有起色。
用友
首先是去了之后开始做笔试题,主要是分析哪些SQL使用到了索引,为什么索引失效,大概有10多条SQL分析。
面试过程中,我主要是往自己擅长的点上面去聊,包括JDK底层的源码,Spring Cloud等方向,全程我在讲。
然后二面的面试官说我不太合适,他们想找能写前后端的人,不需要互联网方向的那种。
所以,楼主在这里给各位筒子提个醒,投简历一定慎重,如果你是打定想去互联网公司的话,非互联网公司就不要浪费时间了。
在面试过程中我一共碰到三家这样的,套路都是类似的,先是一套面试题,然后就一面,面完之后就是回去等消息。
某中小型的互联网金融公司
一面
一面直接开聊,先聊基础,聊到Synchronized锁的实现原理,CAS实现原理,Juc包下并发类的场景使用场景。
然后开始聊框架源码,我讲了讲Spring
Cloud中Eureka的源码,Hystrix框架的源码,然后聊了一下集合相关的类,例如HashMap、ConCurrentHashMap等等。
聊到一半之后,面试官对我的态度友好了很多,还探讨了一些读源码的方法。
然后拿着一张笔试题,两个算法题,二选一,随便做一个。
楼主属于那种算法底子一般的,平时刷题也不多,看到算法题就有点慌,最后面试官说写个二分查找吧。
就这样,我想由于前面给面试官的印象稍微好一点,所以这块就放我过关了。
二面
二面的面试官开始抽查了一些知识,包括Mysql索引优化、索引结构、Redis缓存雪崩、穿透等相关的问题,还问了一些并发相关的问题。
然后给了一个系统设计的场景:在分布式场景下,100万的优惠码,怎样保证每个用户只能领取一个?领取了之后,再次点击还是之前领取的那个。
我的思路是使用存放在redis中再结合分布式锁,然后给演示了执行过程,勉强说的过去,最后说有没有更好的实现方式,想了一会,然后认怂。
接着问了JVM类加载流程、GC回收算法、GC回收器。刚好这块没有看,只能回答对这块不熟。
最后面试结束,问了一下期望薪资,然后叫我等一下,准备去叫HR。过了一会儿说,这周还要再面试一些人,然后会综合考虑,就送我出去了。
当时比较郁闷,不过现在想想很正常,一个有几年经验的工程师竟然对JVM这些常见的知识点都不熟悉,可怕。结果当然也是挂掉了。
没说的,楼主赶紧的背着书包回去,恶补JVM相关的知识点。
一家给银行做系统的小公司
一面是一个号称架构师的人面的,一上来我就开聊Spring Cloud源码,刚好他们也在用这套框架,包括Hystrix。
刚好我对这块很熟悉,他们只是使用默认的配置,对里面的原理就是一个黑盒。我一通讲还带画图,直接将他征服。然后就是问我期望薪资,带我见老板,入职日期我拖了一周,算是增加了一点信心,拿到一个保底Offer了。
面试第三周:一鼓作气,拿下Offer
一家A轮融资的在线教育公司
一面
首先一面就是给一台电脑你,有三道题目,任选一道让你做,过了开始下一面。
*
用多线程统计1到1000000之间有多少素数
*
用Java实现一个订单号生成器
*
给一个数组,归并排序
题目都比较常规,一面顺利通过。
二面
二面首先基本问了一些项目,然后你提到什么就问什么。
比如楼主提到线程池,他就问线程池的参数有哪些,分别的作用是什么?然后问了一些基础的知识集合,并发之类。
然后二面还问了Spring Cloud框架源码,Eureka增量拉取注册表机制。
然后就是一些基础:CAS、CAS有哪些问题以及怎么解决,Volatile、Synchronized、线程池、Redis、Mysql索引、索引优化、索引失效、索引底层结构等。
令我印象深刻的是问了我数据库中整型除了int,还有哪些整型(tinyint、bigint)。面试官说好奇好多人都回答不出来,我当然也是没回答出来。
由于当晚面完二面都比较晚了,然后约了第二天下午5点CTO面试。
三面
三面是CTO面,问的很基础,比如Https怎么防止被抓包?讲讲什么是BIO、NIO、AIO?(当场说没研究这块)讲讲JVM类加载流程(第二次跪在上面了)。
然后问了些生产环境的问题,问了生产环境Mysql怎么部署,我说单机部署,对分库分表没有深入研究,估计这几个问题的抽查,就被CTO灭了。最后问了下期望薪资,然后回去等消息。
心态:本来对这家在校教育以为稳了,结果一直没有电话联系我,此时已经过去了2两周,除了一个小公司Offer以外,没有拿到其他的Offer。
然后稍微有点知名度的都在这周的安排表上,我在想如果这周没搞定一个的话,北京的独角兽都没剩下多少了,瞬间感觉压力大了。
再加上这家复试完之后,没有立即给答复,一般都是凉了,此时有点心态崩了。
后续:一天之后,HR没有联系我,由于听说他家技术氛围不错,我就主动打电话过去了,最后的结果是给Offer,薪资在大概20多万的样子,常规性涨薪幅度。确实也是自己存在很多问题,好多知识都没有答出来。
国内最大的互联网招聘网站
一面
一面从基础到项目通通问了下,项目层面没有深究,对并发这块的基础知识问了,最后是问了分布式锁的实现原理。
楼主讲了基于Redis和基于ZooKeeper的分布式锁实现原理以及框架的源码,另外深入讲了Spring Cloud源码。
然后就是问了Dubbo了解多少,让你设计一个Dubbo,你会怎样设计,然后设计一个限流熔断框架,你会怎么设计?
再就是针对Redis问了下使用场景,怎么使用,缓存穿透、缓存击穿等问题。
一面总体来说,还比较顺利,一面过了之后开始二面。
二面
二面问了下项目,没有太过于深究项目,问了项目开发过程中遇到哪些问题,怎么解决的?
然后问了下哪些场景使用到多线程,是怎么使用的,知道线程池的原理吗?生产环境数据库怎么部署?Redis怎么部署?
主从数据同步的原理了解吗?主从架构的延时和数据丢失怎么解决?有遇到系统OOM的问题吗,怎么解决?做过哪些JVM优化?为什么要这样配置?
面完后问了期望薪资,说这周会通知,楼主知道又进入备胎模式了,经过上次的经历,知道戏份不大了。
结果意想不到的是,最后居然人家发Offer了,而且年薪达到了30多万。
一家中小型的互联网金融公司
一面
一面技术官并没有问太多的问题,主要是我讲了Spring Cloud的源码,然后他们准备转向Spring
Cloud,最后问了下Redis缓存穿透、缓存雪崩,之后就是一些大而形式的问题。
二面
问了数据库锁有哪些,什么情况下造成数据库的死锁,怎么避免数据库死锁。然后就是哪些场景下使用了设计模式。
接着问了下期望薪资,给砍了一点下来,我觉得二面面试官可能觉得我对Mysql这块的锁不是很熟悉,但是也给Offer了,年薪不到30万的样子。
一家D轮融资的在线教育公司
一面
一面是结构化面试,从各个方面开始聊,聊集合、并发、网络、IO,Linux命令。
然后开始聊Spring
Cloud框架源码,最后聊的挺欢快的,当然有些问题没回答出来,但是气氛聊的可以,加上面试官的提示,最后也给出了答案,特别是Linux命令这块。
二面
二面主要是深入项目细节,最后听我讲完项目之后。问我什么是CAP理论。其实当时我已经掉入坑中,但是还很傻逼的回答了CAP理论和BASE理论。
然后问我你的项目符合CAP理论吗?项目中这么保证一致性?RabbitMQ这块的交换器的三种模式是什么?最后跪了。
好未来(美国上市的教育公司)
首先就是从简历第一条开始往后面聊,集合、并发、网络、IO原理等,最后问了Spring
Cloud的源码,将近聊了一个小时,然后说二面会二天内通知,我就知道凉了,最后果然没让通过。
某垂直领域电商公司
一面
问基础,ConcurrentHashMap原理、CAS、Synchronized底层原理,底层采用不同的实现方式(自旋锁等)的不同。
JVM原理,Young区为什么要有2块Survival区,只有一块行不行。
然后问了索引结构、B+树、索引优化、聚簇索引,这么建立聚簇索引,全部是基础的问题,没有涉及任何框架源码和项目情况。
二面
内推放水,简单问了BeanFactory和SpringApplicationContext是什么关系,有什么不同。然后几个简单问题。然后就给Offer了。
必要商城
一面
一面是基础问题,类似于上面的基础问题一般,大同小异,没有很大差别。
二面
二面开始问项目,讲完项目之后,由于二面的面试官是老乡,而且面完之后我就知道没戏了,就请教了老乡,能给一些建议吗?
老乡说他二面就不会问基础的知识点了,因为已经过了一面,他作为二面主要考察的是这个项目你是否真的做过。
第二,你做的项目是否符合他团队目前的需求。
第三,项目中的技术难点是否存在,以及解决方案是否合理,还有一些分布式的场景怎样解决。
第四:考虑我能不能过他领导的下一关,最后也是收获蛮多,后来也没给offer。
赶集网
一面下午5点赶过去,跑了一天已经很疲倦了,然后开聊,先讲项目,项目中穿插着问一些知识点。
比如面试官问了Mysql索引、事务的隔离级别,可重复读是怎么实现的,Mvcc机制等等。
当然更多的是场景设计,设计一个分库分表的场景,根据什么来设计。
疲惫的我想直接回去了,后来面到7点之后,说老大在开会,下次通知来复试,然后就回去了,最后也没给Offer。
总结
将近一个月的面试,主要收获了下面这些Offer:
*
一家给银行做系统的小公司
*
某A轮融资的在线教育公司
*
某中小型互联网金融公司
*
国内最大的互联网招聘网站
*
一家垂直领域电商公司
综合下来,楼主最终选择了知名度最高的那家独角兽公司,而且它的年薪也给到了30多万,薪资是给的最高的。
投简历策略
先在小公司跑几家,面几家之后,就会有感觉了,知道大致的套路是啥了。
第二,如果打定主意去互联网的话,非互联网公司不要投。跑来跑去的时间,不如把知识复习扎实点。
简历中的知识准备
我感觉技能点不用写太多,我就写了20条,其实10条核心技能点就差不多了。
应该面试一二线厂的话,他们按照他们的风格去考察,你写了的也会问,没写也会问,所以10条核心知识点就够了。
按照惯常的三面策略,每一面的侧重点都不同,你可以自己给自己考察,然后不会的赶紧找资料复习。
比如一面通常都是基础知识,二面通常围绕项目来考察,三面通常就是生产环境,解决问题的能力,系统场景设计等等。
论面试心态的重要性,千万别崩
因为每个面试官的喜好不一样,很有可能跑了好几家之后,依然没有收到Offer,难免会有一些气馁。
楼主的建议是此时你应该放慢一下节奏,把这几天没回答出来的问题总结出来,不会的赶紧去查漏补缺,无论你之前准备的多好,你面试的过程中都会暴露出很多问题。
然后感觉差不多了,再次大规模的投递和面试,我的面试主要集中在第三周,第一周和第二周面试较少,主要是在复习和小公司练手。
最后就是知识点的总结,比如在JVM这块我就掉坑几次了,后来也是面试跑了一天回来,再累也坚持找资料把漏洞补上了。
这样回答问题,能让面试官两眼放光
这个算是楼主这一个月面试下来,总结的一点经验吧,楼主自己觉得还是蛮有用的,各位筒子如果不嫌弃,也可以自己试试啦。
举个例子,比如面试官问你:你们分布式事务怎么做的?
那么,你可以按照这样的思路回答:
*
在项目中某场景使用到了分布式事务。
*
为什么要用分布式事务?
*
怎么使用的分布式事务?
*
在使用过程中遇到了什么问题,然后怎么解决的?
*
如果看过源码,讲讲分布式事务框架的源码和实现思想
如果每个技术,都按照这样的思路,每个问题都这样去回答,回答两三个问题,面试官就不会怀疑你技术能力了。
作者简介:中华石杉,十余年BAT架构经验倾囊相授
公众号:石杉的架构笔记(ID:shishan100)
热 文 推 荐
☞工作 996,生病 ICU!这一次,程序员不忍了!
<http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651009699&idx=1&sn=ee20d4c4e48f2bdac94c530a43112096&chksm=8bad8154bcda0842aa6972f04e8d0f1fe289135a693bf60ae5d5db81809fe19bd963ccb7a369&scene=21#wechat_redirect>
☞人间真实!一行代码引发的恐惧
<http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651009774&idx=2&sn=447017f03b9ff43d8d5ac91ac49d6506&chksm=8bad8119bcda080fea5fd382e6e59579fb5f01de1cf012dcd7110b9634ea5e1d306055ee9969&scene=21#wechat_redirect>
☞不怕程序媛不努力,就怕摊上苏明玉的爸爸樊胜美的妈 | 程序员有话说
<http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651009774&idx=3&sn=aa80ab67ac5bfa8528f0a0c78bd328ef&chksm=8bad8119bcda080fb8adb5d8a3339601227116f841df278d5c9b081ed1776cdba5ba18c943bd&scene=21#wechat_redirect>
☞GitHub 近 100,000 程序员“起义”:向“996”开炮!
<https://blog.csdn.net/csdnnews/article/details/88892113>
☞交恶微软、拒绝乔布斯,21 岁的他是如何开发出 Linux 的?
<https://blog.csdn.net/csdnnews/article/details/82185783>
☞爬取了10W条数据,我们整理出了这份北上广深租房图鉴
<http://mp.weixin.qq.com/s?__biz=MzA3MjY1MTQwNQ==&mid=2649826841&idx=2&sn=2487a619ae92474c0ac0d936876dc87f&chksm=871e81fbb06908ed0d55ac4f699024429952090376aa02b9222dba254d9a4af1ebcf92d8815b&scene=21#wechat_redirect>
☞特朗普盯上谷歌在华AI中心,CEO皮查伊上演“拉锯战”
<http://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247503952&idx=1&sn=8b690ab148f1c55a257d2886d6320dcd&chksm=e99ee3a9dee96abf8da2b326c6ace06300331e998f8fdeaa6419cf6776591dcbc80ce4ad48a9&scene=21#wechat_redirect>
☞10分钟狂赚800枚比特币? 这个边玩游戏边赚钱的涂鸦少年做到了!
<http://mp.weixin.qq.com/s?__biz=MzU2MTE1NDk2Mg==&mid=2247493748&idx=1&sn=84a619bde45a18ce97a52bc3f73190df&chksm=fc7fb689cb083f9fd7191fe130ae9cbdff6b5793517a31c9a4a461be3d80ea6ab7d995c02ce8&scene=21#wechat_redirect>
☞现实!程序员只有跳槽才能涨薪吗?
<http://mp.weixin.qq.com/s?__biz=MzA5MjcxNjc2Ng==&mid=2650559656&idx=1&sn=a260ffb59ffb7586d5842666af88013f&chksm=88601f19bf17960f0ec3c2d4501bee1e1332be69063ee72bef0e4fd5dca723138637114f197a&scene=21#wechat_redirect>
System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"
你点的每个“在看”,我都认真当成了喜欢
热门工具 换一换