你好,我是yes。
上周末写文提到有一位读者朋友拿到了有赞阿里 offer 来感谢的事儿,他说主要是看我、艾总、安琪拉的文章,哈哈夹在两阿里P7之中的我瑟瑟发抖。
今天他在艾总的公众号上分享了他近两个月的面经,再结合这两个月有挺多人来找我说面试老被挂的情况,来谈谈面试的几个关键点。这几点要是掌握了之后,基本上运气不要太差,面试都是 ok 的。
你负责的项目
看了下他百世、光云、来未来、大搜车、婚礼纪、银泰、有赞、阿里的关于项目的面试题,我总结一下大致包含以下几个方面:
-
介绍下你最复杂的项目
-
画下项目的业务架构图
-
画下项目数据流的流向
-
多少个节点?
-
项目 qps、数据量
以上几个点需要重点把握,身为项目开发你理应了解项目整体架构与数据流向,还有项目的峰值qps、平均qps、tps等,如果你不了解,侧面反映你在现公司是边缘人物,或者没有自己主动去争取、去了解、去为了项目优化而做努力,没有总览全局,谈何优化。
还会问:
-
为什么项目是这个架构
-
说下你项目中比较优秀的点、最有成就感的点
-
说下你项目线上遇到的问题、如何解决、其中最大挑战是啥、有什么思考?
以上几个点主要考察你是否有自我思考,是否深入研究或者质疑过当前的设计(而不是逆来顺受)。负责的项目是否太过简单,平平无奇?是否有排查线上问题的经验,排的思路是否清晰,事后是否有总结复盘等。
还会问:
-
如果流量激增100倍,你认为你们这个系统哪里最先出现瓶颈?如何解决?
-
或者问你负责的某个模块流量激增100倍,你该如何设计?
以上还是考察你是否有仔细思考过项目的架构,或者你自己的设计,看你是否能 hold 住更大的挑战,也算随机应变的能力。
还会问:
-
项目中MQ应用场景
-
项目中设计模式的使用
-
项目中的开放封闭原则和自定义bean实现
-
项目中秒单模块的优化
以上这几点是你诱惑面试官问你的。虽说没看过这位读者的简历,但是从多家公司都问的情况不难推测,简历里面肯定写的利用MQ干啥了,利用设计模式优化了什么模块、秒单模块等。
所以刻意准备几个点,写在简历上,诱导面试官问,就像秒杀,你简历写了负责一次秒杀活动,你觉得面试官会不会问?
即使这个秒杀活动不是你负责的,但是你为了在简历上写这点,去充分准备了,去请教负责的同事、查阅各种资料,搞清其中的复杂点,能 hold 住面试官的连环问,那这个活动不就是你自己做的?
好好准备准备,你真实做没做过不重要,你把所有原理和细节够能说出来就能证明你自己了,所以简历得准备几个点,比较容易体现你比较牛皮的点,给面试官挖坑,让他跳。
关于项目,上面说到的都准备了,就很稳,如果上面的题目你还答不出来,趁面试前好好理一理,理完之后找几个公司,练练手,然后再去你心仪的公司面试,因为有时候你自己说,和面试官问你的时候,回答出来的答案是不一样的,所以需要实战一下。
数据库
主要是 MySQL,这个和项目一样,必问。
第一大类:
-
MySQL索引实现原理,为什么这么快
-
索引数据结构,为什么不用B树、红黑树之类的
-
数据库事务ACID是如何实现的
-
MySQL的架构图
-
MySQL是如何排序的,排序算法
-
between and 和 in 的区别
-
如何预防死锁,OS如何做的?MySQL如何做的
-
同样一条查询语句,有时候快有时候慢,什么原因导致的?
这类属于原理类问题,这个系列我在更新中-四本书、一个专栏,揉成这篇MySQL,现在还属于总览阶段,也就是粗略的把关键知识点先过一遍,然后之后详细深入。出发点是想先连成面,再各个击破。
第二类:
-
线上SQL调优经验,调优的惯用思路
-
线上MySQL CPU报警了,如何快速锁定问题并且解决?
这是实战问题了,如果你没调优过 SQL,没有处理过线上的 SQL 问题,可以去网上找些例子,这个是一定要准备的。
你也可以自己根据当前项目的表结构,自己给自己提一个复杂的查询需求,自己写写 SQL ,然后一步步优化,这不就是线上调优吗?
一般的调优就是为了用上索引,有一些排序需要的内存过大,得用到磁盘,有些关联的表太多,有些buffer配置过小等等,都是调优的方面,还有业务调优的,就是把这个需求砍了,不是产品要啥就做啥,需要评估实现难度的。
第三类:
- 设计一个商品类目的数据库存储,查询的时间复杂度说一下。如何做优化?
这种属于数据库设计类问题了,如果你没有设计过数据库,可以自己写一个开源项目,或者跟着写一个开源项目来练练手。
或者还是自己根据当前项目的表结构,假设来了一个新需求,需要加新的功能模块,需要加表,你自己思考下看如何设计?
消息队列
-
MQ选型,为什么用这个MQ
-
业务上如何保证消息不丢失?
-
业务上如何保证消息不重复?
-
业务上如何处理消息堆积?
-
业务上如何保持消息有序性?
-
消息写入失败这么办?
-
RocketMQ 为什么那么快?
-
事务消息
-
让你设计一个MQ你如何设计?
读者遇到的就是这几个题,MQ不外乎也就这几个题,那这几个题呢,很巧我都写了,看我写的这几篇,够了。
Redis
-
Redis 挂了怎么解决?
-
分布式锁,为什么使用Redisson?
-
redis 持久化
-
Redis 为什么那么快?
-
如何保证 本地缓存 和 redis 还有mysql 的数据一致性
-
redis 的缓存穿透如何解决?
-
布隆过滤器 如何实现的?
-
项目中redis用来做什么了?
-
热 key 的问题处理。
关于缓存基本上不外乎问的都是以上几点,注重点放在分布式锁的实现和问题,缓存一致性,本地缓存兜底等操作,其他类似 redis 的一些实现机制,单线程的执行情况,想详细了解的话,建议看书之后再看下源码。
我之前分享过黄老师的基于 Redis 3.0的有中文注释的源码,公众号后台回复 redis 即可获得。
Java基础
-
线程池问题
-
线程OOM排查
-
GC
-
HashMap、ConcurrentHashMap
-
锁
差不多就是以上几点,关于线程池的,看我这篇就差不多了:
锁的话,看这几篇:
GC,看这几篇:
笔试
-
实现一个多叉树,遍历打印
-
手写单例
-
实现一个双向链表的insert,find,delete的方法
看了下,好像就两家公司要求笔试,不过这方面还是得准备的,基本题目的还是得刷,比如剑指offer的。
其他问题
-
spring、springboot
-
dubbo + zk
从上面面经来看,spring 和 dubbo 问的不是很多,就个别几个问题,不过平时还是得认真准备,主要看你简历突出哪些点,你突出 spring 肯定问你 spring。
-
分布式事务,这个之前写过, 分布式事务,一网打尽
-
常见限流的算法,这个也写过, 阿里云二面:你对限流了解多少?
-
DDD,我看了下几乎每一家都问了,之后我写一篇。
-
平日如何学习的,这个基本上也是每家必问。
还是很多零散的问题,我就不贴了,这种贴不完的。抓住上面的主线,关键点:项目、数据库、消息队列、缓存、框架。
社招基本上关注这些点,还有一些设计类题,像之前有读者问我如何设计虚拟券、短链系统,等等。
主线如果抓住了、掌握了,面试就是玩儿。
对了,这位读者三年经验。
最后
看了面经有感,粗略地写了这篇,希望对那些面试经常被挂的同学有所帮助,找到主线去学就完事儿啦!
捋下来,好多面试问题我的文章都写到了,之后再把没写到的填充上去,嘿嘿。
我还有个面试交流群,交流面经,有兴趣的可以加我微信,备注面试,我拉你进群。
我的一对一解答服务持续开放,不走知识星球直接私聊我。
详细面经可以看艾总的这篇
欢迎关注我的公众号【yes的练级攻略】,更多硬核文章等你来读。
从一点点到亿点点,我们下篇见。
本文分享自微信公众号 - yes的练级攻略(yes_java)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。