本人之前写了一篇博文,程序员如何获得高并发的经验?得到了不少点击量,所以在这篇博文里再来补充一波,着重讲下零高并发项目经验的人如何通过面试得到实践机会。
前文也已经说了,要得到高并发经验,一般得分两步走,第一通过面试得到实践机会,第二在项目中提升,其实难点在第一点,在零基础前提下,准备高并发方面的面试,确实难。而通过面试找到项目实践机会后,可能会被人鄙视,也会被领导认为很水,但好歹得到了能进一步提升的机会。
这里特别提一句,大厂技术面试官一般眼睛都很毒,高并发项目经验,或者高并发方面只有理论经验的候选人,通过寥寥几个问题就能问出。这点大家不要有侥幸心理,就说我吧,我至今高并发经验不足3年,没法和大厂一些大牛面试官相比,但我都能排查出大部分高并发方面只会说不会做的的求职者。
在零基础前提下,准备高并发方面的面试的难点在哪里呢?
1 高并发的组件大多是运行在linux上,windows很难搭建环境,没有环境其它就不用说了。
2 大多数零基础的同学,不知道高并发场景下的分布式组件怎么用,或者只知道如何用简单的api。由于缺乏项目经验,所以大多数同学不知道分布式组件在项目里是怎么用的。
3 在学分布式组件解决高并发问题方面,往往只会孤立地使用某个组件,比如孤立使用redis做缓存,孤立使用rabbitmq做消息中间件,但现实场景下,往往是综合使用多个分布式组件,协同解决高并发问题。
4 由于只会理论,没有在项目里接触过高并发开发,所以普遍缺乏分析排查解决高并发方面问题的经验。在高并发场景下,往往会用到集群,熔断,限流等。在使用高并发组件的时候,往往也会踩到不少坑,比如mycat方言不对,netty半包,消息中间件重发等。大厂面试官往往是会通过这些经常遇到的问题,来确认求职者的高并发方面的经验,而一些没有高并发项目经验的求职者,在这方面往往是不堪一击的。
下面就以我考核高并发技能的方式,让大家体验一下零项目经验高并发求职者的难度。
1 不问概念,比如redis数据结构,netty重要组件。因为零项目经验的高并发求职者一定背过。
2 第一层难度,这块问题不固定,我先问,你项目里用到哪些分布式组件,然后指着用过的分布式组件,问下Java环境下的基本api和配置。比如用过Redis我就问Jedis的语法,用过Netty就问java层面如何做通讯协议,用过RabbitMQ就问Spring Boot要做哪些配置。
我就问你用过的组件,java里是怎么用的。我发现不少只会背理论的求职者,单纯讲组件(比如Redis或netty等)很熟悉,但不知道怎么和Java整合,这就说不过去了。
3 第二层难度,有些求职者自己搭建过环境,知道分布式组件的api。对这些求职者,我进一步提问,和我说下你用(Redis,Kafka,Netty,nginx等的)分布式组件的项目场景,比如你说你用Redis,你们项目的数据量是多少?你们项目是用单机版Redis还是Redis集群,如果是单机版Redis,你们怎么确保高可用?
这样当我结合项目背景问的时候,会发现不少高并发方面的求职者露馅。用他们的话说,nginx都是部署在windows上的,redis只用单机版,而且数据量不高。这也能说明不少求职者没有高并发分布式组件的使用经验。
4 其实如果求职者能结合项目背景说分布式组件的用法,至少能说明有高并发的经验,在一些高并发要求比较低的岗位,这样的表现,至少在分布式组件这块,就可以过关了。但如果要面试资深开发或架构,那么还需要问 第三层难度,即在高并发分布式组件方面解决过哪些问题?这样能证明求职者有一定的高并发项目实践经验。
这方面网上有现成的问题,比如Dubbo超时问题,多注册中心问题,Redis内存溢出问题等。
不过话说回来,零高并发项目经验的求职者,如果准备方法得当,其实也能通过项目背景和实际解决过的问题,证明自己有高并发项目经验。本人当时就做到了,而且我目前在辅导不少学员,让他们在面试中能很好地展示高并发经验。也就是说,广大朋友,哪怕你高并发方面缺乏项目经验,只要好好准备,一样能通过面试得到实践机会,大家应当有信心。我甚至还根据我的培训经验,出了一本Spring Boot整合分布式组件,实现高并发功能的书。
京东链接:https://item.jd.com/10038484613526.html。
我就用这本书里的内容举例,来说下我是怎么辅导成功我的一个小弟。我小弟用了我的书,听了我的课,目前也成功找到了一个高并发项目的实践机会,公司虽然不是大厂,但在业内也算有名。
1 我小弟本书具备Spring Boot+JPA开发经验,这其实也是高并发经验的基础。
2 我这本书里,讲了在windows环境下搭建Redis,MyCAT,RabbitMQ,nginx,dubbo+zookeeper,MongoDB等组件运行环境的步骤,请注意是windows环境,而不是linux环境。虽然生产环境中,这些组件都在linux环境下,因为大家平时都用windows,而且这些组件在windows和linux环境下的开发差异不大,所以这本书就在windows下搭环境,这样大家能很方便地重现开发环境,有了环境后,后面的事情就好办了。
3 我让我小弟环境搭建好以后,首先照着书里的步骤,运行一通spring boot整合诸多分布式组件的项目,这样他好歹知道怎么用,而不会仅仅知道怎么说。然后我就让他为每个组件,找个业务背景。其实也不用找,书里自然讲了背景,比如redis组件是用在库存环境等。
4 会用+结合业务背景使用高并发分布式组件以后,我再让我的小弟背些分布式组件方面的常用坑,以及常规的使用经验,无非是dubbo调用超时,redis超时,redis内存溢出,dubbo整合zookeeper的要点等。这方面不要太深,不用涉及到算法,也不用涉及到底层技能。而且这方面内容我书里大多也提到。最后我让我小弟通过书里给出的秒杀案例,串起来讲多个分布式组件的使用要点。
5 这个是要点,我让我小弟主准备了不少解决高并发问题的说辞。高并发问题其实也很普遍,无非是redis超时,kakfa由于重发而导致的不幂等,dubbo注册中西中心失效等。这些方面,我让我小弟准备哪些点呢?问题是如何发现(无非是通过日志告警或系统卡顿发现),如何排查(到linux看日志,日志中看到哪些具体的关键字),如何解决(改文件或改配置)
在听我讲之前,我小弟基本上只会背理论,面试时很快会被打回原形。但看了我的书,听了我多次讲解以后,(我小弟和我公司很近,前后加起来大概听了我不到2个小时辅导,但他回家后用了很多功夫),我小弟再出去面试,面了4次以后就找到一份高并发的开发工作了。
其实我成功辅导我小弟的例子,不是孤例,我周末兼职在一家培训学校讲课,用这套方法也帮助了不少学员成功找到高并发方面的工作,这也是,我敢于向大家推荐我书的原因。