前言
前段时间陆续面试了一些大中小公司,踩了不少坑,挂了很多,同时也有不少感悟和收获。这里想把那段经历记录一下,如果能对亲们有所帮助就再好不过了。
面试的过程其实也是一个自我认识和学习的过程,即便暂时没打算跳槽,隔段时间出去面一面对自己还是有些好处的:不仅可以评估一下自己在市场的价值和竞争力,同时也能了解一些新技术、更新一下自己的技术栈。
而且在一个地方待久了,可能不自觉的就会陷入到一种「舒适区」,久而久之,就像温水里的青蛙,万一哪天被“优化”了可能会不知所措。
本文主要从「项目」和「技术」两个方面进行总结,除此之外还有一些比较开放式的问题。
元旦过了,“金三银四”还会远吗?春节后有想法的亲们,可以嗨起来了!
项目
有人说:三年一道坎。
对于工作三年左右的伙伴们来说,「项目经历」可谓重中之重,可以说比具体的技术点更重要。
技术点其实大同小异,有些临时刷刷题就能了解个大概。但项目经历往往难以临时编造,如果不是自己真实做过的项目、或者没有充分的准备,一旦面试官问得稍微深入很可能 hold 不住,面试扣分不少、甚至可能直接挂掉。
因此不少面试官喜欢从项目入手,抽丝剥茧、步步深入,通过项目把技术点串起来考察。
不同人的项目千差万别,但还是有一些共同亮点的:比如高并发场景,复杂的架构设计,JVM 调优及问题排查等。
这些亮点有的话固然更好,但如果平时 CRUD 居多、没太多的亮点,其实也不必太慌,技术亮点不多的话,可以多思考一些业务上的亮点,比如:
-
业务模型比较复杂
-
对业务整体的架构设计很熟悉
-
业务模块拆分比较合理
-
自己在业务中做过哪些扩展和优化?
-
业务数据的上下游流转是怎样的?
-
遇到过什么问题,如何解决的?
-
等等
这些其实也是亮点,可以让面试官看到你平时对业务有自己的思考和理解,而不是只关注自己的那一块,不只是写代码的机器。
其实面试官对你的项目是一无所知的,他的印象仅仅停留在你简历上描述的那些文字(而且有些面试官可能是被临时拉过来的,别问我为什么知道🐶)。面试官通常的开场白就是让你自我介绍,其实这也是一个考察语言组织能力和口头表达能力的地方。
技术
我们面的毕竟是技术岗,技术本身的重要性不言而喻。
技术面试中,最重要的可以说是「技术体系」。也就是你不仅要有技术的深度和广度,更要能把它们串起来,其实有不少技术点是相通或相似的,如果面试中能够触类旁通、举一反三,是一个很好的加分项。比如:
-
Redis 的 AOF 和 MySQL 的 bin log
-
Spring 中的 BeanDefinition 和 JVM 中类的元信息
-
布隆过滤器和 HashMap
-
等等
技术的积累虽然主要在平时,但刷刷面试题还是很有必要的,有不少其实就是所谓的“八股文”。这里主要列出本人面试过程中真实遇到的一些面试题,仅供参考。
Java
线程池
-
核心参数有哪些?
-
任务执行流程
-
任务拒绝策略
锁
-
synchronized 锁升级过程
-
ReentrantLock
-
实现原理(AQS)
-
公平锁如何实现?
-
volatile 特性
-
HashMap
-
HashMap & ConcurrentHashMap 实现原理
-
ConcurrentHashMap 如何实现线程安全
MySQL
-
索引
-
分类?使用场景?
-
InnoDB 索引的结构(B+树),为什么不用 B 树?
-
如何查看索引的使用情况?Explain 关注哪些字段?
-
-
事务
-
隔离级别
-
RC/RR 的实现原理
-
Redis
-
常用数据结构
-
zset 实现原理
-
hash 扩容过程
-
-
常见缓存问题
-
缓存穿透、缓存击穿、缓存雪崩、热点 key
-
如何解决上述问题?
-
-
持久化:RDB、AOF,二者区别
-
Redis 为什么快?线程模型是怎样的?
-
内存满了怎么办?淘汰策略有哪些?
-
使用什么集群框架?
Spring
-
IoC、AOP 实现
-
事务传播特性、失效场景
-
JDK & CGLib 区别
-
Spring Boot 启动原理
Dubbo
-
Dubbo 架构
-
负载均衡算法、容错策略、灰度测试
-
SPI 机制
-
RPC 调用过程
-
RPC & HTTP
-
二者区别与联系
-
为什么 Spring Cloud 使用 HTTP 而非 RPC?
-
JVM
-
运行时内存划分
-
垃圾收集算法
-
一个对象的内存分配过程?
-
CMS 收集器
-
收集过程
-
哪个过程会有 STW?
-
如何处理内存碎片问题?
-
-
G1 收集器特点
-
GC Roots 有哪些?
-
JVM 常用参数配置有哪些?
-
内存占用过多,如何排查?
RocketMQ
-
整体架构
-
如何保证消息的可靠性?
-
如何实现顺序消息?
-
消费者接口幂等设计
-
事务消息实现
分布式
-
分布式锁
-
Redis 如何实现?命令?
-
ZooKeeper 如何实现?
-
获取锁失败时如何处理?
-
-
分布式事务
-
2PC:缺点?
-
3PC:解决了 2PC 什么问题?
-
TCC:缺点?
-
最终一致性:MQ 实现流程
-
实现框架(Seata)
-
其他
除了上面的「项目」和「技术」,可能还会问到一些其他问题,比如场景设计与分析、算法,还可能有一些比较开放的问题,下面介绍下我所遇到的。
场景设计&分析
-
秒杀场景设计
比较典型的场景设计,电商类的公司很可能会问到,网上有很多案例和文章分析,这里不再赘述。
-
分布式锁设计
这个应该不是热门,本人也就遇到过一次,不过那一次被搞得有点懵,可能更多的是考察思路,大家可以多思考一下。
-
JVM 问题排查:线上 JVM 内存、CPU 飙升,如何去排查?
主要涉及一些常用的 Linux 命令和 JDK 自带工具,比如 top、jstack、jmap 等,以及阿里的开源工具 Arthas 等。
虽然在实际情况中我们可能很少有机会接触(小小开发通常没权限,还是要运维大佬支持),但这些工具还是要了解的,可以在本地跑个 Demo 去验证,以免到时候答不上来。
-
容灾处理
假如线上所有机器(包括服务器、数据库、缓存服务器)全部宕机,如何处理?
PS: 这些场景设计和分析的问题,通常比较综合,一般是考察对一个场景的整体设计,或者分析和解决问题的思路。
算法
-
爬楼梯
-
二叉树遍历
PS: 算法问题遇到的不是很多,有些考察算法可能就是单纯的面试流程。当然,字节这类的公司除外,想去的话肯定还是要刷很多算法的。
相比之下,大部分公司更注重「项目深度」和「技术体系」,或者给出一些实际的场景,考察分析和解决问题的经验和思路。
开放问题
这些问题比较开放,没有固定的答案,可能就是面试官想看下你的临场发挥吧。遇到的几个问题如下:
-
有没有带过人?经历是怎样的?
-
如果你作为 PM,如何从整体协调一个项目?
-
如果你在团队推行 DDD,你会怎么做?
-
你有什么缺点?优点?
-
未来三年的职业规划?
-
在公司主要有哪些成长?
-
上级、同事对你的评价?
-
最近在看什么书?
末了
面试流程
我所接触的面试大部分是「三轮技术面 + HR 面」的形式,也有一些是两轮技术面,不同公司可能不太一样。一面一般是电话面初筛,后面二三轮技术面和 HR 面通常在一起。这样其实也挺好,跑一趟就行了。
心态
面试的心态也很重要。其实你跟面试官之间是平等的,面试的过程是让他对你更加了解,而不是他对你的考核。
我刚开始面的时候,由于好久没面试,再加上本来就不太爱说话,刚开始紧张的不行,后来面了几次之后才逐渐有点感觉。如果较长时间没面试,可以先面一两家练练手、找找感觉。
当然,整个面试时间也不建议拖得太久,否则整个过程会比较累,最好还是一鼓作气。
啰里啰嗦一堆,其实面试还是挺看运气的,如果跟面试官聊得比较投机,对你的评分自然也不错。
最后,预祝想跳槽的亲们一路绿灯!
最新2021整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法以及最新的简历模板等学习资料,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友扫描下方二维码免费获取:暗号:【CSDN】
看完三件事❤️
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
-
点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
-
关注公众号 『 java烂猪皮 』,不定期分享原创知识。
-
同时可以期待后续文章ing🚀
-
.关注后回复【666】扫码即可获取学习资料包