今天是2021年的3月6日,过去的一周里我陆续面了四家公司,踩了一些坑,也收获了宝贵的经验,所以在此趁热纪录下我对面试这件事的感想。
面试准备
作为软件工程师,面试要准备的东西还真是不少,在我看来主要分为四个大部分:算法与数据结构,八股文,项目经验的结构化,职业规划。
算法与数据结构
以前没怎么刷算法题的时候,觉得算法是锦上添花的东西,实际工作中,其实也用不着自己去写什么算法,学会使用工具类库和中间件就行了。但是当我刷够了百来题的时候,我才明白算法题究竟意味着什么。在我来看,刷算法题有以下好处:
1、培养对时空复杂度的敏感
很多算法题都不止一个解法,最容易想到的暴力解法,往往不是最优的解法,什么是最优解法?一定是时空复杂度最小的解法。时空复杂度分为时间复杂度和空间复杂度,时间复杂度小,就意味着更高效,空间复杂度小,就意味着占用更少的资源。工作中,时刻注意时空复杂度,有利于我们写出更优质的代码。
2、增加思考维度,提高解决问题的能力
在一般工作中,我们一般用穷举思维解决问题,但在刷算法题的过程中,光有穷举思维是肯定不够的,经常会用到递归,动态规划这样的解法,这些解法要求我们学会拆分问题,归纳共性,并且学会举一反三,这些解决问题的思维,在工作中一定是大有裨益的。
3、代码设计能力
面对一道题,有解题思路,和能写出代码真正解决问题,是两个概念。脑子是靠不住的,只有双手靠得住,脑子很容易就能学会,但是手学会了才算是真的学会了。Practice makes perfect!
刷算法题是痛苦的,但也是满足的,痛苦在于每次看到别人优秀的解法时,都觉得自己是个废物;满足在于,我每刷一道题,就离他们更近了一步;我也许不需要像那些人一样随手就能写出高质量的代码,尽显优雅,但我也有从锻炼中获取经验的权利;当我刷够一百道题的时候,我的对比对象就已经不是别人了,而是自己,我只需要比昨天的自己厉害就行了。再说了,很多优秀的解法都是先辈熬秃了头才想出来的,我们想不出来很正常,太阳底下没有新鲜事,大家都是站在巨人的肩膀上前行的,只不过有些人比我们更早爬上了肩膀。
八股文
JVM调优,Mysql事物,MQ不丢失,Redis双写一致性,熔断降级,微服务注册中心,分布式事务,分布式锁......这些耳熟能详的问题,那些耳熟能详的答案,都是业界的最佳实践。企业为什么要考察这些?因为现在已经没有技术壁垒了,很多公司里的架构大差不差,所以这些问题才会被频繁问起,这是一个好事,技术同质化会让我们更加专注于解决实际的业务问题。
项目经验的结构化和深度
这部分在我看来是最重要的部分,很多面试官都喜欢就简历上的项目经历进行盘问,追问项目细节,如果在项目上有足够亮眼的经验,是面试环节里最加分的一项。比做出来一道困难级别的算法题还要加分。
1、结构化
所谓结构化,就是把经验都总结成概念,比如简述一个模块的架构,要从设计思路去说,而不是先做什么后做什么,要明白为什么这么做,与其他方案取舍的参考是什么?以现在最热门的微服务来讲,服务设计的重点就在于如何确保两点:清晰的领域划分+对共性的提炼和抽象设计
2、深度
八股文的实际应用场景,如果项目中有,就结合项目举例来说,如果没有遇到过,可以预设场景,把背过的八股文结合进去,给面试官一种融会贯通的感觉,会加分。
职业规划
技术人员的发展方向有很多。
纯业务类,有ToB业务领域和ToC业务领域,ToB业务领域的需求更迭快,对代码的可读性、维护性以及扩展性要求很高,并且业务逻辑复杂,QPS通常不会太高。ToC业务领域的需求更迭慢,对代码的稳定性和时空复杂度要求很高,业务逻辑相对简单,QPS往往会非常高,也会有更多网络安全隐患。
非业务类,则分为架构师和内部效率平台的建设,还有算法和大数据等偏研究型的方向。内部效率平台,一般大公司里都有专门的部门,负责统一管理开发和运维环境,服务公司内部员工。架构师和偏研究性的岗位我了解也不多。不做赘述。
搞清楚自己要做什么,就能更好的筛选自己面试所需要准备的内容,总不能什么都要求自己会,什么都会其实也就是什么都不会,而且其实面试中有些问题答不上来是没有关系的。每个人都有会和不会的地方,在工作中,我们只需要做好自己会的部分就行了,面试中,我们也要如实回答。只有当我们心里清楚自己“会什么”,我们才能自信满满的说“我不会”什么,在面试官面前,这种自信是能加分的。
面试策略
面试面试,当面考试,对心理和精神都是很大的消耗,所以最好不要安排的太密集,一来没时间复盘,查漏补缺;二来精神上的消耗来不及补充,会导致表现变差。
循序渐进,把最想去的公司安排到最后,在前面铺垫几次面试先找找感觉,面试过程中的自信感也很重要,如果手上有offer了,再去面试下一家的时候会有底气的多。
稳住心态,根据我的经验,当有公司在流程中,但是没给确定结果的这段时间内,心态是最不稳的时候;心里忐忑不安,也无心复习,我的建议是假装自己已经被拒绝了,降低期待值,学习的状态不能落下,要继续查漏补缺,像明天会更好那样期待着,像明天不会更好那样努力;如果面试了好几个公司,走完了流程,都还是没有offer,这时候要做的事情反而简单了,就是查漏补缺,闭嘴低头学习。
入职时间别透露太早!和HR最终面的时候,一定要给自己点时间休息调整,还有就是不能停止找工作的脚步,或许还有更好的!黄金年龄找工作也就那么几次,每次都要慎重一些才好!
最后希望大家都能如愿以偿,找到称心的工作~
面试技巧
脉络!脉络!脉络!
面试官抛出的问题里,一定会有一个关键字,比如HashMap,索引,事务;抓住关键字之后,一定要先从整体上讲一下自己的理解,可以展示出自己的归纳理解能力,这一点很加分。毕竟短短半小时到一小时,想要展示出自己优势的一面,光靠问和答是很低效的,而且很没有主动性。比如面试官问到HashMap的底层数据结构时,可以先回答查找和插入的时间复杂度是多少,然后再说数组加链表是如何保证这个时间复杂度的,为什么用这个数据结构,再引出1.8的红黑树,再引出其他优化,进一步提到ConcurrentHashMap。我不赞同网上一些“兜着说”的言论,我倾向于肚子里有多少货,就拿出来讲清楚了,又效率,又能让面试官有一种被反客为主的惊喜感,毕竟面试官也很累的,能少问几个问题当然舒适。
主动!主动!主动!
面试前,先问一下此次面试考察的范围,侧重什么,提前在心里盘一盘;然后在自我介绍中,顺带主动讲出自己的优势与劣势,以及自己的职业规划,会帮助面试官更快了解你;如果我是面试官,一个候选人告诉我他的劣势是什么,我会认为他自我认知清晰且足够自信,并且不会在他劣势的方面问太多问题,节省时间;
项目!项目!项目!
在自我介绍中,提到某个项目的时候,一定要讲明这个项目中自己的职能,以及在项目中技术的深度如何,曾经做过哪些优化,项目成果如何。可以的话先写一份文字稿出来好好对镜子练一下,因为从描述方式以及描述内容,面试官就能大概判断出你在项目里的地位,以及你做的深度到什么程度,所以描述项目的话语一定要慎重再慎重!项目架构图要信手拈来;对项目中用到的技术要多看几遍,看深一些;熟知项目中的重大事故以及排查过程;熟知项目中的技术难点以及解决方案;熟知项目中曾经发生过的优化场景和优化方式;等等等等,对项目一定要深挖,吃透。在项目经历上与面试官的问答交流,是最能体现一个人综合能力的部分,面试的时候,也最看重这个部分,所以务必着重项目!