大逼哥の面试低语
序:编程和架构能力需要长久的积累,而当你准备开启一段新的工作,骑驴找马面试时往往有些捉襟见肘,也许背了八股文但面试时还是经常被问得一脸尴尬,恨不得用脚趾在地上扣个哈尔的移动城堡.本文将会完整的讲述所需要的准备和面试时重要的点如何应答-^读完加上充分的准备,几乎可以拿下一线到准一线城市15K左右的职位(20K以上大佬看看笑一笑就完了)
写在前面
1.明确自己是求职者的身份,再面试过程中要有必要的尊重,比如面试官进办公室起身示意,听完面试官的提问再开始回答,但也不要失了工程师的气节,在面试中觉得自己真的拿不下这个职位,就大大方方的出门左拐
面试前的准备
1.第一步往往是不被重视,或者说很多人不想去做的-->工作内容交接,很多人往往是拿到offer才开始准备交接,草草了事.事实上提前梳理工作内容,能够帮你回忆整个项目接手模块的架构和业务流程,避免遇到一些文科题目突然翻车,所以提前准备一些还是好处多多的
2.简历的更新是极其重要的一个环节,因为技术面试官拿到简历的第一印象就是他对你的第一印象,而往往大多数工程师的简历都大同小异,所以简历写的简洁明了尤为重要,以下有几个注意点↓
1.简历中要明确标注自己目前的在职状态和期望薪资,薪资不要写面议或者区间,给别人一种你不自信的感觉
2.简历上的工作经历,不要太多(频繁跳槽的同学们可以对老的几个工作经历(尤其是外包经历)进行合并,懂的都懂),
简历上的项目,也不要太多,每个公司挑一两个有代表性的项目就可以,重复的套壳项目不要写
3.凡是写在简历上技术栈,都要求最起码会用,切忌为了华丽写一些形如Docker,K8s等花里胡哨的东西,因为你如
果不会用,扮猪吃老虎遇到刚好会的技术面试官,那会大打折扣,直接见光死.也不要出现 精通Java,熟悉
spring cloud全家桶这种脑血栓字眼(cloud的组件有30多种,别以为会个feign,boot就叫全家桶).
如果真想来点不一样,建议写Elassandra,Hazelcast一类,当然,先看一看,知道是个啥
4.如果是电商类项目,最好是写某一模块,比如OMS,WMS,供应链一类的,面试讲流程也比较好闭环,切忌
写图书管理系统,电商秒杀,办公室OA,一看就是培训仔标配,懂的都懂
3.海投选手拿到面试邀请之后,先企查查/看准网看看公司情况,有些比较大的公司面试分享会有面试题(虽然都差不多,也不一定在一个项目组),比较小的公司,可以看看公司主营的是什么方面的业务,比如电商/物联网/社交/金融,猛攻对应的某一个模块业务就可以
面试进行时
1.离面试约定时间早到个10-30分钟为佳,迟到极其不好,但是面试官往往比较忙,你提前到没准人家开会,你在门口杵着也很囧
2.当你到了面试地点并且签完到,HR拿着你的简历去找面试官,面试官在开会,或者随便找了个开发过来面试,基本上可以确定,这个职位已经有候选人了,这种面试很敷衍,没有结果也没有学习的意义,可以直接问他要是今天不方便面试就改天(因为有候选,HR基本会同意让你直接走)
3.当面试官已经进屋,大概要审视一下是否是旗鼓相当的对手,原则上来说,当你遇到一位40+,工作经验丰富的老师傅,不要过多的讲spring一类的底层和业务,言多必失,可以转战新技术,容器化(docker和k8s),接过话语权,总之让他只能回答嗯就完事了.如果是个比较年轻的负责人,这个时候可以去画一些流程图,整体的服务器架构,以及其中的技术选型迭代,这个往往比较受年轻工程师的青睐.举个例子,比如原有的转单系统用的数据库是mysql,而考虑到写入速率IO瓶颈,你在学习了MongoDB以后,把项目的这一部分切到MongoDB.原有的服务部署在Tomcat,考虑到项目维护,改用了Docker等等,年轻的工程师大多对新技术有谜一般的热爱,透露出这一点,你很容易拉近距离
4.面试时一定不要只顾自己说自己的,如入无人之境,如果有做过面试官的同学就会对这一点有深切体会.自己会的问题,一定要描述清楚,可以和面试官说稍等一下,整理一下语言再慢慢说.自己不会的问题,一定不要一个闷棍给面试官敲回去,直接说我不会.解决方案和架构类的,你一定要有能解决场景问题的方案,比如问你Mysql的优化,你拿不准,可以说自己负责的模块都是Nosql,MongoDB如何去做的分片,索引优化,redis的主从(可能有点何不食肉糜的感觉,但本人确实只用Nosql),总之原则上,不要让不能死的聊天死掉(比如数据模型到DB层),而有些问题,你不会是可以跳过的,比如JVM优化层面的.虽然JVM几乎是15K左右面试必问的问题,但其实JVM的调优需要完整的监控和运维能力支持,这个方面不会的可以说一点基础的原理八股文,减少GC次数和每次GC的时间,粗略的说一下自己是如何设置JVM参数,怎么个原则(可以结合Dockerfile拟定参数),让面试官知道,你是知道有这么回事就行了
5.国际惯例,开场会让你介绍自己的项目,这里2分钟,挑重点,你要描述的点,从项目蓝图,需求评审,业务流程这几个点去介绍.如果给自己加了后端负责人这样的BUFF,就需要双周计划排期,过任务池,和如何从自己的角度去影响提升整个团队,这一点非常重要且加分.具体的业务流程根据简历自己去答,重点要说的是后面这些和团队有关的↓
双周计划排期:其实这个是周一早上例会做的事,具体可以拆成上周进度复盘,delay模块卡住的点协调,
本周进度和开发安排.同时,可以每次轮流安排一名开发学习一个新的中间件技术,为期1周,然后周五下午做一个组内分享,产品和负责人(当然就是自己啦)在组内分享的时候去过任务池
6.需要掌握的知识点(大同小异):
1. 垃圾回收算法,这里知道基础的标记复制清除就行了,深层次的也可以看一看
2. 类加载机制,这里要注意的是双亲委派,很多问自己写的类和jvm的类,这个看一下就行
3. ArrayList和LinkedList区别,这里注意不要想当然觉得array查询快,链表增删快,要考虑尾插等情况,找篇博客看一看
4. HashMap,老生常谈了,几乎都会问的是高并发的问题,这里要掌握1.8后的resize()造成的死锁和并发情况,
找篇博客八股文看一看,还有就是扩容,这个一定要注意设定参数的初始容量是多少,是2的指数次幂.8以后转红黑树
也有可能会问到,不过能知道基础的二叉树基本就够了,泊松分布混个眼熟
5. OOM,这个问题要结合服务器整体去答,如何利用docker+nginx去做服务高可用,灰度发布的时候如何去监控
(A,B容器运行,A先挂起新版本,如果没有问题,在B容器顶起来,如果有问题切断A容器,B容器单顶),如何看服务器
排查,百度几个命令,在版本切换出现OOM如何去定位,从增量依赖->增量代码,这里可以举例子,建议甩锅阿里的
fastjson,这个有oom的可能(我是这么干的),总之,让面试官觉得你有线上定位问题的能力
6. ORM框架选型,原则上只用mysql无脑mybatis,如果有mongo,es,就要考虑spring data,没什么好说的
7. MVC原理,这个用过SSM都知道,如果培训直接用的boot,还是要看一下,核心控制器流程
8. IOC AOP,老样子,八股文,IOC要结合bean生命周期,这个必须背,很重要,AOP就看一下Boot的全局异常配置
和日志配置,足够了
9. 线程池,这里主要指的是ThreadPoolExcutor,要掌握几个参数,如何在项目中重写配置,coresize跟紧机器
核心数(要考虑机器是计算型还是IO型,反正动态读取不会出问题),最大设定根据项目异步任务来,拒绝策略用默认
10. Volatile和ThreadLocal两个关键字,一个加载主存,一个是线程副本,后者把他想象成一个Map,key是线
程id,value是值,就能理解线程不可见了
11. Mysql的两种引擎,读写分离
12. Nosql->Redis和MongoDB,es等,想装一手的可以拽Elassandra,Hazelcast,量力而行,Redis数据结构
基本上都是String,可以结合json去做orm,有信心的可以搞一手环形hash,bitmap,mongo要做好父子级抽象,
索引设置
13. MQ,这里建议说一说rabbit,kafka,rocket,主要从吞吐量,事务这一块,侧重吞吐,因为事务聊深了很烦,
建议这里选型用rabbit,因为kafka和rocket吞吐量虽然高,但是程序峰值几乎完全达不到,而且nginx的负载也
达不到,很多公司往往都是一套rabbit集群,然后多个项目组共享,便于排查问题
14. Boot启动顺序,这个要注意自己定义配置,稍微看看
15. 如何设计一个秒杀程序,这个在阿里系外包(天猫事业部)几乎经常问到,要搞清楚是手慢无(早先单的必抢得到),
这种用redisson锁,还有一种是随机性的,你早了未必抢得到,每个人有一个概率,这个可以用nginx直接抛掉80%的
请求,返回未抢到,剩下的进redis原子扣减后订单信息推mq慢慢入DB,前端的控件和埋点也要有
写在结尾:以上套路只针对面试临时抱佛脚,编程需要长久的积累,文中觉得不妥的地方可以指出来共同探讨,祝大家都能找到钱多活少的萝卜坑