最近的一些Java面试小结
前言
前段时间陆续面试了一些大中小公司,踩了不少坑,挂了很多,同时也有不少感悟和收获。这里想把那段经历记录一下,如果能对亲们有所帮助就再好不过了。
面试的过程其实也是一个自我认识和学习的过程,即便暂时没打算跳槽,隔段时间出去面一面对自己还是有些好处的:不仅可以评估一下自己在市场的价值和竞争力,同时也能了解一些新技术、更新一下自己的技术栈。
而且在一个地方待久了,可能不自觉的就会陷入到一种「舒适区」,久而久之,就像温水里的青蛙,万一哪天被“优化”了可能会不知所措。
本文主要从「项目」和「技术」两个方面进行总结,除此之外还有一些比较开放式的问题。
元旦过了,“金三银四”还会远吗?春节后有想法的亲们,可以嗨起来了!
项目
有人说:三年一道坎。
对于工作三年左右的伙伴们来说,「项目经历」可谓重中之重,可以说比具体的技术点更重要。
技术点其实大同小异,有些临时刷刷题就能了解个大概。但项目经历往往难以临时编造,如果不是自己真实做过的项目、或者没有充分的准备,一旦面试官问得稍微深入很可能 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 面通常在一起。这样其实也挺好,跑一趟就行了。
心态
面试的心态也很重要。其实你跟面试官之间是平等的,面试的过程是让他对你更加了解,而不是他对你的考核。
我刚开始面的时候,由于好久没面试,再加上本来就不太爱说话,刚开始紧张的不行,后来面了几次之后才逐渐有点感觉。如果较长时间没面试,可以先面一两家练练手、找找感觉。
当然,整个面试时间也不建议拖得太久,否则整个过程会比较累,最好还是一鼓作气。
啰里啰嗦一堆,其实面试还是挺看运气的,如果跟面试官聊得比较投机,对你的评分自然也不错。
最后,预祝想跳槽的亲们一路绿灯!
— 【 THE END 】— 本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取! 3T技术资源大放送!包括但不限于:Java、C/C++,Linux,Python,大数据,人工智能等等。在公众号内回复「1024」,即可免费获取!!