最近突然回想起几年前的一次上海业内电商大厂的java面试经历,虽然过了那么多年,从一位电商小白发展到自己也面试了无数java求职者,基本套路和方向在行业内依然没有发生根本性的改变,下面就通过我的一次面试经历的分享深度剖析给大家一名java技术人员的面试本质。
技术面试轮次论
首先其实各个公司的面试流程几乎是大同小异,分为多轮面试,许多初入职场的同学可能觉得多论面试无非就是多个人一起把把关,或者公司的hr要求面试流程使然,其实这些理解都太片面了,为什么需要技术面试多轮次,更深一层次的原因在与不同的面试轮次其实考察求职者的侧重点根本不同,如果无法理解其中侧重点三字的本质,则会对自己陈述的内容完全打不中面试官心里,可能许多面试官觉得差不多就这么过了,但掌握真正的精髓可以让你一击即中。
基础能力面试
一般公司的技术面试不考虑hr分为三轮,第一轮是最“基础”的技术面试,只所以叫基础绝对不是其面的技术很基础的意思,而是一般会找一个团队中相对高级或资深的程序员来面你一下,这个人有可能是个小team leader,也有可能是个普通的能力强一点的开发而已。当时我去某一电商大厂内面试,一面是一个看似就有点干货的眼镜男程序员。首先最最通用的java基础:
-
HashMap的实现结构原理,java8对HashMap的结构做了哪些优化?
考察数据结构知识以及你是否用过java8
-
java线程池中coreSize,maxSize,queueLength,keepAliveTime,rejectStrategy那么多参数之间的联系和相互作用的影响是什么?
考察多线程知识
-
java并发处理的方式有哪些?
考察并发处理知识
-
jvm分为哪几个区,他们之间的关系如何,gc时会做哪些事情
考察jvm和gc知识
其实这些题若平时工作或学习中从来没有在意,仅仅只是用用框架或者改改别人写的代码,做做小demo的程序员,面试前一定要复习准备多遍,而且必须深入理解掌握,大厂对人的基本素质看的是很重的,若你连基础原理都讲不清楚立马会给你打上一个loser或者浮躁者的标签,然后深入到java web的知识:
-
http协议get和post的区别
考察http基本协议
-
servlet的原理是什么?讲一下它的一个完整的生命周期?
考察servlet知识
-
多个http的请求若要访问同一个变量的时候一般怎么处理,是用threadLocal还是直接用单例访问,各有什么优缺点?
考察你对web项目多线程处理中单例及threadLocal的理解
紧接着就是java框架,给大家的忠告,若时间不够不要去搞ssh或者ssm的结合体框架,专心学好spring原理,springboot和mybatis:
-
spring的DI,AOP,IOC的原理和应用分别是什么?
大家看清楚,首先要谈好原理(动态代理,cglib代理,扩展等),然后再谈应用,不要上来就举例说你在项目上的应用
-
spring bean有哪几种作用域,bean的生命周期是怎么样的?
bean的理解一定要到位,不然答不好
-
springboot有接触吗,谈谈你对它的理解,它为什么好?
这题是你的加分项,可以谈谈以前没有springboot时配置一个东西有多么坑,有了springboot后多么简单,然后一定要从原理上说为什么springboot简单了,这样又可以体现你研究过springboot的原理,又能用它去解决问题
-
mybatis的orm相关知识?
着手从orm的原理到mybatis的应用开始谈,然后讲讲mybatis的sql自动生成以及分页插件等,体现你在项目中的实战一点都不少
以上一些问题若你都可以从容回答,且答案正确的话,非常恭喜你,你在这位基础能力的面试官眼中基础能力很好,可栽培,然后他会用心的去考察你的下一步相关域的能力,于是这位面试官就开始考察我的数据库技能了:
-
mysql的事务隔离级别分别有哪几种,每种分别可以解决哪些问题,又不能解决哪些问题
考察你对数据库事务的理解能力,在理解这个问题之前大家要先理解清楚什么叫读快照,什么叫读当前,大家可以先学一下这篇文章 传送门1 传送门2
-
mysql索引的结构是什么样的,查询效率又如何
学完上述内容再谈索引结构和查询效率,大家要记住,主键查询即便上亿数据都可以无压力,唯一键查询和主键基本相当,非唯一索引区分度好的千万级别数据无压力,区分度差一点的百万级别能凑活,再上去一点就不行了
若这些都回答的不错,再次恭喜你,这位资深技术同学开始会跟你聊分布式了:
-
有没有用过什么rpc框架,rpc的基本原理是怎么样的,如何实现一个自己的rpc框架
聊聊dubbo,聊聊springcloud,看你用过哪个,可以先简单的讲一讲具体的应用和解决的问题,再深入原理讲其实现方式,若你了解实现方式那么怎么实现一个rpc框架就不算是问题了
-
分布式环境下如何解决事务的问题
最最show你能力的时候到了,什么都别说,先聊cap和base理论,讲明分布式环境下要么确保一致性牺牲可用性,典型(二阶段提交性事务),要么确保可用性牺牲一致性但要确保最终一致性,例如(最大努力提交性事务,可用消息中间件确保消息最终成功消费实现。tcc型事务,可用事后回滚型方式解决。补偿性事务,可以谈谈异常定时处理机制等)
以上这些你都答好了,那真正恭喜你,第一面“基础面试”你通过了
项目能力面试
于是这位资深程序员同学带着我的简历离开了会议室,让我坐在那里等,我好好梳理了一下思路,因为奇怪的是他没有问我项目经历,可能刚才聊着聊着技术聊的太high太深入了,我要准备好利马被问项目的准备。果然二面一般都是某个大组的team leader,他会根据前一个面试官给他的技术反馈决定是否要继续深入的问你一些问题,当然不排除那些不交接的公司把之前的技术问题重复的问,这个时候你一定要耐心再耐心的去回复问题,千万别觉得之前你说过了,这次我就说的快一点,一旦二面继续问你深入的技术就代表他也是个典型的技术男,很负责任,你要配合他。
终于谈到了项目经历,一般问题会以讲一讲你在自我介绍或者简历中写的一个项目吧,我记得当时被问到的是我简历中写的一个日租办公室的类交易网站,可能跟他们的电商业务有些许联系,这个时候你一定要梳理一下思路,一旦聊到项目对于面试官而言肯定是不清楚你整体的业务逻辑的,你不能上来就说一个点,而是要在全盘的角度出发去介绍你的项目,最好是在面试教室的白板上画一下你的介绍框架及步骤
-
用三到四句话介绍你这个项目在产品维度是做什么的
例如:这个项目是在线提供了一个以天为单位出租办公位的电商平台,分为用户端app和admin运营后台两块,运营在线发布工位服务,用户通过app浏览、交易购买出租工位
-
画一下你的系统架构图
不是每个小白程序员或资深开发可以画出整个的系统划分的,没有关系,我现在告诉你,你需要对你自己简历中写的一个项目提前了解清楚全面的系统设计,有多全面就要多全,了解不到?那就编吧,按照你在产品形态上看到的去划分你的模块,比如我当时就画了这个项目分为用户模块(有用户登录,注册服务),工位模块(创建发布工位,排期查询服务),交易模块(下单购买,第三方支付对接)这三块
-
澄清技术选型
你的系统是不是用springboot做的,是不是用的dubbo的rpc,数据库用的是不是mysql,前置是否有nginx反向代理等,有没有用缓存redis
-
我负责的是其中哪一块,把他讲清楚
我负责的是其中下单购买这一块的流程,画一张时序图,讲清楚你在其中的业务逻辑实现的细节等。
讲完了这些我已经口干舌燥,可以考虑喝一口水然后问一下面试官是否有什么问题,见招拆招,问到答不上来的要说:“这一块实现由于涉及的系统离我比较远,并不是十分清楚,但是如果是我来做的话我会*****”,大家记住后面那句话非常重要,既体现你的诚实又体现你的主动思考的能力,老板都喜欢这样的员工。
终面
最终我被带到了对应部门的团队负责人的办公室里,不是每家公司的都有机会让你见cto面试的,尤其是大厂,不过如果有机会见到cto,也不必紧张,其实和部门总监面试过程差不多。到最终一面的时候总监一般考察的是这个人的思考能力,抗压能力,全局观等,尤其是面试高级程序员或者架构师之类的,全局观就非常重要,因此到这一环节在聊一些问题的时候千万不要聚焦于一些技术细节上反复的说,还要更全面的解释问题,体现自己的思考,抗压等,最典型的问题例如:
- 你在工作中遇到过一次最难解决的问题是什么,你当时是怎么解决的?
提前准备好这一类的问题,十有八九都会被问题,可以讲一个技术难题,时间又紧张的要死,你最后费了九牛二虎之力,查资料,做实验演习,咨询专家,加班深入等,最后解决了它
第二个问题当时那位技术总监给了一段很长的铺垫,现在回忆起来也属于他认为的整个电商行业的通点问题:“每一个电商公司当规模大到一定的程度,用户也起来的,活动也搞的越来越频繁,价格也越来越吸引人,都会面临秒杀这样一个棘手的高流量问题,业内频频有网站因为技术能力滞后跟不上业务发展速度,经常被秒杀搞挂,导致业务发展不前,作为一名资深的程序员,你会如何去设计你的秒杀系统呢?”当时我就被问闷逼了,由于是业内电商大厂,而我又没有足够的电商项目经验,最后一面因为这个问题被刷了,可见当时的技术总监对我的回答并不是很满意,于是乎这些年来,我经过不断的磨练实战,并且通过自身的努力扛过了天猫双十一,口碑双十二的巨峰流量,为大家总结了 秒杀性能实战论 希望能带给大家帮助,不要在终面留下遗憾
作者:龙虾三少
链接:http://www.imooc.com/article/287681
网友评论