面试的逻辑与应对方法
以前写过一篇《一些问题的通用解》,被我删掉了;原因是我认为该文章不够好,不够专一,操作性不太好。选择现在再写一篇专门关于技术人员面试的文章,相当于我自己的总结,也为后来者提供参考。
面试本身
这是一个企业选择你的阶段,企业邀请你参加面试的时候是你第一次选择企业的阶段,最后你拿到offer的时候就拥有了第二次选择企业的机会,最后你进入企业后的试用期是你们的磨合阶段,这时企业可以以试用不合格为理由不让你正式加入企业,而你在这个时候提出离职也不会受到太大阻力。
当然,其实我们中的绝大多数都是普通人,他们没有太多的选择机会;这是一个事实,中国确实不缺人,我也是出来之后才意识到企业的学历歧视确实严重。而我写这文章的原因之一就是希望像我一样的普通人可以获得更多的机会。当然我个人没有经历过七八面的情况,这也就意味着我的这文章也是狭隘的,有局限性的,希望各位能够理解其内核而非只看到本文的外表浅显的部分。
这个机会不多的问题的最终解是不要内卷:企业应该充分了解自己的岗位需要精通或者掌握什么方面知识或技能的人,充分了解胜任该岗位的人需要有什么特殊能力,不要苛求人过分超过这个能力;而人应该将自己份内的事情做好,明确自己的边界,做算法的做算法,搞后端的搞后端,写前端的认真研究前端,DBA就做DBA,运维就好好运维,这里的意思不是做后端的不要去涉猎前端知识,我个人推崇各方面知识都了解一些,这样可以使人与人之间的合作更加顺利,但是这样的东西不应该出现在简历里面,你把自己的工作做到极致是你的优势,但是你把别人的事作为自己优势就是在拿别人嘴里的耗子;比如一个搞后端的写自己会前端这不是在抢前端人员的饭碗吗?当然,这样的状态还是需要大家一起团结起来才能达到。
回到面试主题,面试的时间是有限的,这是我们首先需要了解的。就我目前经验来看,一场面试一般30-40分钟之间。假如时间长了面试官也憋不住尿,毕竟绝大多数美面试官都是临时拉去的公司员工。那么我们需要想办法让这个面试的时间都被我们擅长的领域占用,然后在不擅长的领域有话说,最后,要诚实,这点很重要,虽然现实要求我们不择手段逐利,但是就我个人经验来看,如果我见过一些人在一个自己不能胜任的位置,那TA可能会压力巨大,会一直失败,是一种非常糟糕的状态,会严重打击自信心。我个人有这样一个观点:人得做好了这件事才能做好那件事,你得有了成功的经验才会有这个自信去迎接做好下一件事的挑战。
目前我只有开发者的面试经验,过几年有管理岗的面试经验会回来补充。
开发者
让自己擅长的领域尽量占用更多的时间
要做到这一点你需要知道面试常问的几个问题,然后针对其中一个点花大功夫去研究,你需要在面试官问到这个问题的时候滔滔不绝,引经据典,从使用到原理到实现到思想全部掌握。这样你才可以在这个问题上一直讲,最好是可以说到面试官喊停。这点非常重要你需要一个足够出彩的点去应该你的其他的不足的地方。如果你对自己没底,这里建议熟读这几篇文章:Spring是如何处理@EnableXXXXXX注解的,以及该如何优雅得实现自己得starter?、@EnableAutoConfiguration、@ComponentScan和@Configuration,前一篇主要写Springboot的自动配置过程,后一篇主要Springboot主要写自动配置原理,这样当问及Springboot的时候你可以深入说其实现及原理,至于思想与原因得自己体会才能很好感受到。你也可以自己往自己擅长的领域讲,或者在自己擅长的领域自行深挖,比如讲Spring AOP可以延申到OpenFeign与Mybatis是如果使用代理的,再比如讲同步可以从java lock讲到jvm同步实现再讲到操作系统mutex lock。总之沾点边你就可以一直讲下去,你需要说服面试官。
自己不擅长的领域有话说
有以下几个类型:不精通的技术、解决方案、问题排查。这样的问题是需要经验的,像如果是不精通的技术你可以不知道其实现细节,但是你得知道其原理及对这个技术有一个基本认识,答的大差不差就行,你不需要在这个问题上说服面试官,但是你最好得让对方知道你有这方面经验可以很好上手,可以基本解决问题,比如zuul你得知道zuulfilter是什么;那如果是解决方案,那就更需要经验了,你可以了解市面上一些问题的解决方案,或者自己提高自己认知,比如你可以知道市面上的分布式锁的实现方案是Zookeeper或者redis;像问题排查基本上就是纯经验了,不过你可以根据自己当前的认知给出一个你自己认为可行的解决方案。不知为不知,完全不知道的问题直接说自己没有遇到过这种情况是最明智的,这样可以让你不知道的问题占用的时间最短。如果你觉得不太合适,那你可以诚实的说自己不知道,然后说如果是自己自己会如何如何解决。我在《未来简史》看到有这样理论,人分为体验自我和叙述自我,体验自我在事情经历过程中占主导,叙述自我在带逻辑性的活动中占主导,你在面试过程中让面试官的不好的体验的时间尽可能的短(就是完全不懂得东西直接说不懂),这样当对方回忆得时候它的叙事自我会自动将不好得体验忽略掉以构成一个合理的故事,同时这个理论还表示,经历的事情后半段体验是重点。
描述自己做的项目
一般面试官都会从你的项目开始入手,你可以挑你最了解的项目仔细讲讲:项目介绍(描述业务,这个系统做什么的解决了什么问题),项目技术栈(SpringCloud、redis之类的)、自己做了什么(设计系统、写的什么模块之类的)、遇到了什么问题(分布式事务、缓存击穿等等)、怎么解决的(解决方案),然后着重说说自己的贡献(做了哪些创新、做了哪些优化,做了哪些设计之类的)。这样的面试官实际上是想从项目开始问你项目技术栈最后引入到技术与技术问题上,你如果一开始就答到了这些,这样他就不好问其他问题,要是在后面如果他还有其他问题你就可以说没遇到过,不了解,这样也不至于给面试官一开始的问题就不懂的印象。总之就是往自己都优势面引导,说得越细越久越好,压榨面试官的时间。
一些面试八股文
为什么离职
这个可以从三个方面答:钱、业务、技术。
- 首先是薪资不满意,可以说说为什么觉得薪资低了,比如大环境要求(固定消费高)、做了很多贡献没提薪等等。
- 公司业务前景不太好,你得充分表示你对公司前景有要求,愿意与公司共同进步,然后说说前公司业务上的问题(夕阳产业、政策法律不支持、业绩不行),同时表示自己想办法解决过一些问题。
- 技术老旧,你得表现出自己对技术提升的渴望,也就是说你得表现出自己的上进心,然后说说前公司技术脱节与落后的部分,同时说说自己对前公司技术革新做了哪些贡献。
一些通用解决方案
分布式一致性问题
分布式一致性有一个通用的思路:如果是像zookeeper这样的独立系统,需要通过raft或者paxos算法来保证一致性,如果是我们这样的业务系统则需要引入一个外部系统来协调各个业务系统。不论是分布式锁还是分布式事务都是引入外部系统来实现的。我们只需要保证最终一致(幂等)就OK。于是假如你不知道分布式问题怎么回答,你也可以得出一个这样的答法:我不知道分布式XXX是如何实现的,但是如果是我我会引入一个外部系统如何如何实现。
提高速度问题
提速问题也有一个通用的思路:减少IO(网络IO,磁盘IO)、用更快的算法与数据结构。这样的问题一般被封装成了问题排查的问题,以查询SQL慢为例就是:我没有遇到过慢SQL的问题,但是如果是我我首先排查网络是否有问题(网络IO),再排查SQL语句问题(是否用到了B+树范围查询优势等等),排查是否使用了正确的索引(磁盘IO,减少回表)。注:Mysql、redis与MQ是Java后端必问的,也常用,最好得自己都会。