如何做好技术面试?
共 2510字,需浏览 6分钟
·
2021-05-14 12:48
前面几天,花了一些精力写了几篇关于Service Mesh的技术文章。
写这样的技术文章不太容易,需要大量的准备过程,阅读,实践等,输出之前,要有大量输入,且需要先自我理解透彻,再转化加工后,才有一篇像样的文章。
今天先暂停下这个系列,在此临时插入一篇关于面试方面的,明天的更新再继续Service Mesh系列。另外,下周一笔者就正式上班了,后面可能更新就没有前面几个月这么频繁,但依然会努力做到每周至少更新两到四篇。
笔者本人毕业十年,参加过不少大大小小公司的面试,作为面试官也面试过不少本科或硕士应届毕业生,社招候选人等。
关于面试,也有很多同行分享过,但总感觉不是很全面。
其实面试是一个体现技术实力、沟通能力、谈判能力的一个综合的博弈过程。
在接触过的很多面试官,至少有一半我认为不合格。基本上聊几句就知道,他面试候选人之前,没做任何准备。问的问题跨越度很大,基本属于想到哪就问哪。
而我去面试候选人之前,一般会准备由浅入深的问题,通常的做法是将问题列出来,放在电脑上。
个人比较推荐的做法,是拿到候选人的简历后,先关注他的过往项目,分析下其中哪些部分较具挑战,用到了哪些技术,然后再针对特定的人来设计面试的问题。
如果一个从没有做过前端开发的候选人,那么类似jQuery、TypeScript等问题就没必要出现,或者应该尽量放在最后,象征性地问问即可。
个人比较推崇的方式,是先理论后实践,先简单后复杂,先基础再框架,先细节后架构。这样来设计技术问题,由浅入深循序渐进,对每一个方向,问到候选人回答不了的程度。
一般来说,后端开发的问题会问到诸如String的原理、hashCode和equals等,然后是容器系列,Collection、List、Set、Map等,这方面的一般会让候选人比较HashMap和ConcurrentHashMap,或者ArrayList与CopyOnWriteArrayList,基本上就要涉及原理;然后会逐步切换到JVM方面,transient、volatile、synchronized等关键字的作用和原理,synchronized与Lock的区别,synchronized锁升级降级的原理等。
数据库方面,一般会问到MySql方面的,如何设计表、如何分库分表、分库分表键如何设计等;怎么添加索引,索引不生效怎么处理等;再进一步会问到索引的数据结构、各类索引的原理、索引之间的比较等;最后还可能会涉及到一些数据库优化的问题。
分布式方面,一般会先问一些理论层面的,比如CAP、BASE等理论。如果对分布式方面要求较高,可能还会问到一些诸如算法之类的,比如共识算法,Leader选举算法。
框架方面,一般是以Spring 系列为基础逐步展开,常见的比如IoC和AOP的作用与原理。再过度到Spring MVC,Spring Boot和Spring Cloud等。由于Spring框架中有大量的ClassLoader自定义实现,因此针对类加载过程、双亲委派等问题,也会在这个环节被提出。
关于线程池和线程隔离,如ThreadLocal的作用和原理等,基本上是必问的。
除此之外,就会涉及到大量的中间件的问题,这方面的问题设计一般是连环炮的方式。举个例子,就拿MQ来说,通常就会有这样的一些问题:
1、 用过MQ吗?用来解决什么问题?
2、用的哪个MQ?为什么选择这个?
3、MQ的引入解决现有问题后,有没有给你们系统带来新问题?
4、你们采用的MQ,怎么保证消息的顺序消费?(顺序号或者Kafka的Offset机制)
5、怎么发现消息被丢失?消息丢失后怎么处理?
6、如何保证消息发送成功?
7、如何保证消息一定会且只会被消费一次?
8、消息积压过多会有什么问题?如何避免?
9、消息中间件宕机后怎么处理?
.......
如果需要的话,再问9个问题都不在话下,而这仅仅只是一类中间件的问题。关于链路监控、APM之类的问题,就更多了,在此不一一列举,有兴趣的朋友可以加微信讨论。
之所以规模较大的公司,技术面试按等级都会分3-6轮,正是因为关于技术方面的考察点实在太多了。MQ方面的问题,问全了,没20分钟是下不来的。
好了,以上的内容是以技术面试官的视觉,总结出来的经验。
下面我们切换到候选人的视觉。
既然面试前面试官都需要有所准备,候选人在面试之前怎么也得花点时间复习复习了。我还没见到过什么都不准备,然后一路通关五六轮面试收割Offer的。
常用的一些数据结构和算法,肯定是需要准备的。比如不借助临时变量,删除一个连表中的节点等问题,不练习练习,是很少有人能在现场快速写出来的。
计算机基础、操作系统、TCP的三次和四次握手、HTTP 1.x和HTTP 2.x的区别等,这些纯理论的东西只能看书看视频,没有捷径。
现场被要求写一个算法问题,计算时间复杂度和空间复杂度,也是很常见的要求。出现频率最高的应该是在海量文件中找一个数字,要么是没重复出现过的,要么是中位数,具体就看面试官的兴趣了。
这里还有一个误区:大部分候选人不太注意,现场写的代码,不是只要求能解决问题,代码风格、注释、命名等都会被考察。至少我作为面试官的时候,会非常关注这方面。
这些基础性的东西结束后,一般会让候选人挑选一个项目来做详细剖析,如架构是怎么设计的?有没有出现过生产问题?怎么发现并解决生产问题的?Full GC问题怎么解决的?等等。
在每轮面试结束之后,一般会问候选人有没有问题需要问。很多候选人也是随口就提问,或者干脆说没有问题,这样的方式都是不太可取的。
笔者在此总结下,怎么向面试官提问。
1、如果面试过程中,被问到的问题,没回答上来或者感觉回答得不好,可以在此时跟面试官做个简单的讨论。这样可以表现出你作为候选人的学习热情和态度;
2、问一下如果能有幸加盟公司,需要做的项目是关于哪方面的,团队成员大概是什么情况;