@所有人
就是今晚面经分享的主人公,之前他相继拿下京东和美团技术专家offer,最终选择美团,职级对标阿里p7
1.自我介绍?
大家好,本人参加工作6年多了,坐标北京,普通本科,加入架构班2年多了,之前在一家小的互联网公司工作
去年在石杉老师指导下跳槽,去了阿里某个事业群。由于我自身的原因,想离职,所以找老师聊了聊,老师亲自给我指导跳槽的规划,所以这次主要分享这次面试的一些小的经验和感悟,希望对大家有一丢丢的帮助。
2. 面试了哪些公司?
我面试的职级是技术专家,也就是对标阿里p7,美团t3-1的职级,薪资70,面试情况如下:
美团4个部门 (全部通过)
京东云 (通过)
京东数科 (通过)
快手 (技术三面完事,没有通过)
字节2个部门 (技术三面完事,没有通过)
腾讯 (技术三面完事,没有通过)
贝壳 (通过)
神策数据 (通过)
okcoin (通过)
跟谁学 (没有通过)
3.面试准备
1.基础知识:数据结构+算法、java集合并发、JVM、网络、锁等。
2.常见中间件:缓存Redis、消息队列Mq、网络Netty、数据库Mysql+Es+Hbase等、框架(Dubbo、Spring cloud、Spring等)
3.项目经验:整体架构图、依赖服务关系、团队人数、项目难点、QPS、你负责哪些、哪些最有挑战、你是怎么解决的、你怎么理解你的业务、以后的规划等等
4.个人规划:离职原因、职业规划、你的优点、你的缺点、你的绩效、你和同事关系、你找下一份工作的方向、你为什么应聘我们公司,你是怎么考虑的、你了解我们的业务吗等等
备注:我准备面试主要是架构班课程 + 儒猿技术专栏 + 石杉老师面试突击(一般公司的一面几乎都能覆盖到) + 其他书籍。算法主要是字符串、数组、链表、树这些问的比较多,刷LeetCode就行。
简历方面,找老师指导,老师会亲自教你怎么改简历,每个人情况不同,需要定制
4面试技巧
1.一般基础面试的时候,问的技术栈比较杂,大概就是上面列举的,但是可能大家对于某些有深入了解过,如果问到你擅长的技术栈,你可以多回答一下,如果不是很擅长,就简单的回答一下,每轮面试的时候时间是有限的,尽量把时间都回答在你擅长的技术栈上。
2.面试的时候,如果有的问题可以画图来讲解,一定要画图来讲解,这样比较容易理解,视频面试也可以共享屏幕画图
3.有的面试官是看你简历,擅长哪里,就会有针对性的问你擅长的技术栈,但是有的面试官是不看简历的,只问他自己感兴趣或者他擅长的技术栈。
如果是这样的面试官,最好在自己回答的时候,引导到你擅长的技术栈去。如果问到你不太确定的问题,千万不要随便瞎编回答,你最好先说这个问题我不太了解,然后讲讲自己的想法和思路。
如果你瞎编回答,面试官可能会认为,如果工作中你有不确定的事情,你自己做决定了,会出问题的。
4.大家放好心态,有的面试感觉挺好的,但是就是没过,有的感觉面的不好的,还过了,可能这就是缘分和运气,所以放好心态
5.关于算法:面试大厂一般都会写2~3道算法题,现场面试就是手写,视频面试大部分是牛客网。有的同学对算法有心理恐惧,其实不用太担心,大部分大厂的社招,算法都不会太难,除了类似字节的公司比较难点,可以每天积累一点,把LeetCode上那些热门高频的算法题刷一遍其实就差不多了
另外假如你在牛客网写算法的时候,你写完之后,可以不提交(万一报错了呢),直接和面试官说你的思路,除非面试官一定让你提交。
我之前面试的时候,有个面试官让写个布隆过滤器,我没有写出来,面试官说那我给你换一个吧。所以大家面试的时候如果感觉没什么思路,你可以主动和面试官说一下,没有准备好这类算法,可以要求换一个。
6.我个人感觉开放性设计之类的题比较难回答,之前有个公司问设计一个通用的限流器,你怎么设计?我就把我的想法说了一下,然后又有公司问了这个问题,我又把我的想法说了一下,就没有过。后来我也反思了,我感觉可能没有达到面试官想要的点上
如果大家遇见这样的面试题,可以先简单的说说想法,然后和面试官沟通了解,最后能理解到面试官想要的是哪个点。就算你说了很多,我感觉如果没有达到面试官想要的点上,效果应该不是太好。
例如你项目的高可用、高并发、降级等怎么做的?你如果回答说我们系统没有这么高的并发或者没有做降级之类的。面试官几乎立刻就会问,如果要做,你会怎么做?所以说这类问题,大家还是根据自己的项目,自己多反问一下自己。
7.HR面试还是要注意一下的,离职原因、个人规划啥的,尽可能说的圆满一点(其实离职无非就是薪资、加班、不开心之类的,但是HR想听的就是假话,这点大家最好也多注意一下)
5.面试过程
1.技术一面:基础知识+中间件+一点项目,这些问的比较多
2.技术二面:中间件+项目+一点职业规划,你的leader
3.技术三面:中间件+项目+一点个人规划,你的部门leader或者其他部门交叉面试
4.HRBP面试:主要就是个人规划问题
5.HR面试:个人规划+薪资等问题
备注:这里我想强调一点就是二面以后的面试,因为一面问的问题都是一些基础知识,有些东西都是固定的,变化不大。
二面以后我感觉最重要的就是之前说的why、how、what和嗅探机制,大家可以看看我去年面上阿里后写的面经(下面链接),面试的时候眼睛要睁大、放光,表示你很在意这次面试,给面试官留下好的印象,你leader决定你的薪资呦。
https://sourl.cn/kgAAiN
此外,项目里的技术+业务要通透,面试官会变了法的问你。如果有些开放题,感觉难的话,你也要思考,然后说说你的想法,说的不好也要说,哪个面试官喜欢轻言放弃的人呢,对不。
6.面试总结:
我面的公司有点多,加上时间一长,有点忘了,我这里列举一下,我记忆比较深或者频率比较高的面试题。一般都会以连环炮的形式发问,如果你能一直回答,面试官往往会一直深挖下去。
1.java hashMap和redis map的rehash有什么区别?
Java hashMap rehash基于高低位链表,当前节点数组下标元素rehash不变或+旧的容量,存在线程安全问题和fail-fast
redis字典中包含两个哈希表和trehashidx,当标识为-1代表未进行rehash,rehash过程是ht[0]表数据迁移到ht[1],整个hash的过程是渐进式rehash分多次执行完成防止因为某个槽key太多停止服务,在rehash的过程中删除,查找,更新等操作会在两个哈希表执行
2.java的线程池你们是怎么用的?原理是什么?怎么设置参数?有哪些状态?用了线程池有哪些问题?你们怎么解决的?Future是干嘛的?
线程池工作原理,老师架构课画图讲过,下面这张图,边画边跟面试官讲
线程池状态:初始状态-->可运行状态-->运行状态-->休眠状态-->终止状态 ; 线程池问题:无界队列OOM(使用有界队列和备忘录),过饱问题:增加消费者或自定义拒绝策略降低消费者速率 ; future:对runnable或callable的执行结果处理
3.Java 的锁怎么实现的?有哪些?HashMap key可以为null,为什么ConcurrentHashMap key 不可以为null ?非公平锁怎么实现的?AQS每个Node里的节点状态是干嘛用的?
锁的实现基于aqs,常用ReentrantLock ReentrantReadWriteLock ; ConcurrentHashMap不能为null原因,无法去判断到底是key不存在还是value为null; 非公平锁基于cas实现 ;节点状态 CANCELLED:已取消调度 SIGNAL:唤醒后继节点 CONDITION:等待其他线程调用condition.signal()从等待队列到同步队列中获取锁 PROPAGATE:共享模式 前继节点不仅会唤醒后续节点
4.Synchronized volatile 的作用?原理?怎么用?什么时候用?
synchronized原理图
volatile原理图
volatile常用场景优雅停机 注册中心服务实例心跳可见等,建议大家看下老师面试突击第三季并发部分内容,对上面这些关键字均有硬件级别的讲解
5.jvm结构?你们jvm的参数是怎么设置的?gc情况怎么样?怎么调优?我们项目的机器差不多每3天一次fullgc,GC已经不能再调优了,这个问题你有啥好的想法吗?
jvm结构:堆 虚拟机栈 本地虚拟机栈 程序计数器 元空间 ;参数设置新生代3G 1:1:8 老年代:1G ,gc情况大概几分钟到几十分钟一次minor gc 每次大概3-5ms左右,几小时一次full gc 每次不超过1s
jvm调优:策略:1.对象预留在新生代 2.大对象直接进入老年代 3.设置合理的对象年龄阀值; 3天full gc一次不能优化,当时没回答好说了一下升级为zgc,zgc推荐看一下美团技术团队分享文章
https://mp.weixin.qq.com/s/ag5u2EPObx7bZr7hkcrOTg
ps:CMS和G1问的比较多,大家面试准备的时候多看看
6.给你个sql,你说一下怎么创建索引?索引结构?联合索引为什么用要存储主键id,存主键id的内存地址不行吗?索引计划有哪些指标,你关注哪些指标?你了解mysql哪些锁?都是干嘛的?什么操作会有锁?需要注意什么?
根据具体的sql来创建索引,联合索引最左原则(字段不超过5个),索引个数5个以内 ; 索引结构:b+树叶子节点存储数据页 ; 如果存储地址值需要二次寻址 ;执行计划指标:select_type type 可能使用的索引 优化器实际使用索引等,主要关注连接类型type,索引使用情况和extra中内容 ; mysql锁:全局锁 表锁(显示锁和元数据锁MDL) 临界锁(间隙锁+行锁),锁注意事项主要还是死锁学会通过show engine innodb status来分析死锁案例
这里推荐大家看下儒猿技术窝的mysql专栏,里面有很详细的讲解
7.redis你了解哪些?你工作什么场景用?底层数据结构有哪些?分布式锁怎么用?有哪些问题?你们怎么解决的?数据一致性你们怎么做的?分布式事务了解不?你们用过没?你们怎么用的?用了之后有啥问题?你们怎么解决的?redis如何可以动态扩容和缩容?如果你来设计,你怎么设计?
redis 数据结构类型 内存淘汰策略 过期策略 持久化rdb和aof 主从集群(哨兵高可用) 复制和redisCluster这些建议大家看一下《redis设计与实现》 ; 分布式锁:原生set nx ex+lua(get+del)或redisson hash结构支持可重入 或redLock或优化版本加上栅栏验证token ;数据库和缓存一致性推荐大家看一下老师早期出的亿级流量;分布式事务这里就直接引用老师gitee上的文章了
https://gitee.com/shishan100/Java-Interview-Advanced/blob/master/docs/distributed-system/distributed-transaction.md
8.MQ你们用的啥?什么业务场景使用?你是怎么考虑用MQ的?原理你知道多少?MQ有哪些问题需要注意?
这个老师讲的面试题突击第一季的时候讲了mq的连环炮。大家可以看一下。
9.你做过哪些项目?哪些是你主R的项目?对你技术挑战最的项目是哪个?挑战是啥?你是怎么解决的?你项目中哪些做得比较好?还有哪些可以优化?如果你现在负责一个项目,你要怎么推动实施?
这个就要根据个人情况来定,根据自己的项目和经历,把自己做的系统和业务弄透,然后再结合自己的项目多反问一下上面的问题。
10.面试官问,2020年6月18号,晚上18:00点,浏览器输入了jd.com,你把整个过程给我画个图,越详细越好
这个图取决你的薪资,这个是面试官原话
我的理解:这个问题,大家一看可能就是一道网络题,dns啊,加上一些网络包的层层封装,之前面试突击老师也讲过,但是这里有个日期就是6月18号,这个时间有点特殊,可能就会要考虑我们后端的一些东西,比如架构的东西,你就可以说一下,这个首页你要做你怎么做的,是不是用缓存啊,网关怎么走的啊,用什么缓存啊,用不用CDN啊,大家尽可能去发挥自己的架构能力,我就是按照这个思路回答的。
11.要做一个项目,全世界的人聊天app,现在一期只实现发送文字聊天,朋友列表,朋友圈,你给我画一下整个架构图。机器如何部署?
我的理解:聊天大概就是IM,获取朋友圈或者朋友列表,可以用http业务系统的架构来做,这里可能就是IM架构怎么设计,业务系统怎么设计,大概就是画一下这两个系统怎么设计,机器部署的话,因为是全世界,可能需要多机房部署,数据同步之类也要说说。我是按照这个思路回答的。
12.设计一个通用限流器,10、100、1000、10w、1000w的qps可以随意配置,误差率在99%
我的理解:在qps小于一定阈值的时候,可以用全局计数器来作为全局限流,如果qps高于一个阈值,就分配到每个机器上,本地做限流,定期汇报,然后重新分配。我大概就是按照这个思路讲的,限流算法大家也可以学习一下,比如令牌桶、计数器、滑动串口等,也可以参考一下sentinel的设计和架构。
13.设计一个点赞、评论系统,你怎么考虑?
我的理解:如果要求数据实时性比较高的话,可以通过一些flink实时计算来进行统计,如果实时性要求不高,可以本地缓存一下,定期更新,大概就是按照这个思路回答的。
14.现在有一个需求,本来不是你们组负责,但是由于一些其他原因,这个功能要由你们组来负责,你是怎么考虑的?
其实这个问题我感觉不太好回答,当时我是这么回答的,作为一下参考,我说如果这个需求比较急的话,我们可以先做,如果以后有关于这个需求的更新迭代,可以慢慢移植到其他组,自己做业务闭环,好维护。
15.MQ延迟队列你知道多少?你能设计一下吗?你能设计一个支持事务的MQ的功能吗?
这个大家可以参考一下rocketmq的说一下延迟队列是怎么做的。事务的话可以参考一下kafka是怎么设计的。
16.我们组内用一个新的技术组件,但是其他部门没有在使用,如果要推广,你有啥想法?
当时我是这么回答的,作为一下参考,可以把我的新技术组件写个好点的wiki,然后分享一下,看看那个部门需要这个功能,然后一个一个的部门的推。
17.你下一份工作你有什么预期?你对加班的看法?
这个你参考一下你面试的业务和公司,最好说自己的预期和你面试的公司业务和技术匹配度高一些,你面试的是订单组,你说你预期希望做财务系统,这个就不太好了。加班的看法,我感觉最好是说适当加班没有问题,先拿offer再说,拿到offer综合评估加班的情况。
备注:可能大家都能感觉到了,如果问你技术或者项目问题,如果你说不太了解或者说没有做过,那么下面就接着会问,如果是你,你怎么设计怎么解决?大部分都是这个套路,所以大家要多学习基础的原理,项目要搞透。
以上就是我今天的面试分享,最后再次感谢石杉老师,让我两年从一个小型互联网公司跳槽拿到大厂技术专家,同时也感谢儒猿技术窝平台,聚集了一批志同道合爱学习的小伙伴,分享交流技术。大家一起加油,希望每个儒猿群小伙伴都能拿到自己想要的offer
问:源码要怎么阅读
答:用老师的话讲,抓大放小,要先打基础
问:我有一个问题,技术与业务,哪个的提升,对于自己的帮助和职业生涯是比较大的
答:都重要,面试问技术,工作搞业务