个人情况
- 学历:二本
- 工作年限:2 年半
- 面试结果:拿到了字节、拼多多、美团、滴滴、欧科云链....等公司的offer
面试准备
复习
你信我,真学习还得看书,看书能让你的知识体系更加健全。
当然,平时也可以看一些大佬的文章扩充一下知识库。
我看过的 Java 相关的书单如下:
- Java:《Java 并发编程的艺术》、《Java 并发编程实战》
- JVM:《深入理解 Java 虚拟机》第三版、《深入 Java 虚拟机:JVM G1GC 的算法与实现》、《新一代垃圾回收器 ZGC 设计与实现》、美团技术团队相关 JVM 的文章、R 大相关 JVM 文章
- MySQL:《MySQL 技术内幕:InnoDB 存储引擎》、《高性能 MySQL》、《MySQL 实战 45 讲》、《从根儿上理解 MySQL》、《从零开始带你成为 MySQL 实战优化高手》
- Redis:《Redis 设计与实现》、《Redis 开发与运维》、水滴与银弹Redis 系列文章
- Kafka:半兽人博客、《Apache Kafka 实战》
- Zookeeper:《从 Paxos 到 Zookeeper:分布式一致性原理与实践》
- 架构:《凤凰架构》、《领域驱动设计:软件核心复杂性应对之道》
还有一个点是,看书的时候可以尝试记一下笔记,这样效率会高一些,不至于看完就忘记了。
上面提到的书籍和文章,开源部分的后台回复“书籍”自取就行,我整理的部分思维导图也在里面,有兴趣也可以看一看。
没有开源的书籍,我建议可以支持一下原创,去买一下实体书或者对应的课程。
算法
算法的话,没有那么多高超的技巧,LeetCode 前 200 道反复刷就行了,应付社招绰绰有余。
我只刷了 170 道题,面了十几个大公司,大多的算法题都是原题。
刚开始刷的时候会很痛苦,坚持几天,没有思路的就看答案,看完答案继续写代码,写不出代码继续看答案,反反复复坚持下来算法就搞定了。
简历
简历的话,从大学毕业到现在,我一直用的是超级简历:https://www.wondercv.com/ ,我感觉挺好用的。
至于怎么写简历,我也不是专家,不说些花里花哨的,直接给一个我的简历模板吧,仅供参考。
提一个点,你写的简历就是划了一个知识范围,然后让面试官从题库里面选题,如果你自己划的知识点你都不清楚,那你面试肯定没有把握的。所以,一定要对你简历上面的每一字负责,要对你在简历上写的每一个技术点都熟悉。
面试过程
自我介绍
自我介绍是简历的精简,不需要说一些没意义的事情,面试官也不关注你喜不喜欢打篮球,爱不爱唱歌,你只需要把你做过的最牛逼的事情,解决过的最复杂的问题讲出来就行了。
举个例子:
面试官你好,我叫 CoderW,19 年毕业于哈佛大学。
从毕业到现在一直从事后台研发相关工作。
19 年-22 年在谷歌中间件团队,主要负责 xx 中间件的设计与开发,在这期间,完成了对 xxx 进行改造和优化,整体性能提升了 80%;
22 年去了微软电商团队,负责微软电商体系的设计,两年的时间,完成了微软电商从 0 到 1 的搭建过程。上线至今,日活量达到了 10 亿,系统平均 QPS 达到 1W。
这一次应聘的是贵公司中间件团队的资深专家岗位,在业务方向和技术栈方面,我个人认为我的匹配度还是比较高的,非常希望能够加入贵公司,一起打造 xx 系统。谢谢!
技术讨论
自我介绍完之后,一般就是技术讨论环节,这个环节一般 30 到 50 分钟,是整个面试最重要的一个环节。
1. 不卑不亢
记住,这个环节是技术讨论环节,不是问答环节。一场好的技术讨论一定是有来有回,而不是单方面的你问我答。
在尊重面试官的前提上,可以对面试官的一些结论提出质疑和探讨,在我看来,敢于提出自己的不同看法是一个加分项。
如果遇到不尊重你,甚至侮辱你的面试官,我建议你直接把简历要回来,大家都是打工人,有什么好装的?
2. 真诚以待
有些面试官喜欢问一些比较冷门的知识来验证候选人的技术深度,这是一个很正常的事情,你也不需要太过于紧张,真诚一点,会就是会,不会就是不会,没什么关系。
千万不要自作聪明强行去编造,真诚永远是第一要义!
3. 深入发散
如果聊到你熟悉的一个知识点,你一定要好好把握,可以尝试着深入和发散,让面试官慢慢的进入你的节奏。
举个例子,聊到 Kafka 零拷贝的时候。
- 深入:你可以继续深入,聊一下 sendfile+DMA Scatter/Gather。
- 发散:深入后再发散,聊一下为什么 RocketMQ 写日志用到了零拷贝,但是 Kafka 写日志的时候不用零拷贝。
深入是展现你对技术的了解程度,发散是展示你的视野宽度。
回答完一个问题之后,可以小小的总结一下,这样不至于你一个人在那里讲的云里雾里,让面试官都找不到你想要表达的重点了。
编程环节
如果你的工作年限不是太长,技术讨论环节过后一般会有一个编程环节(这个环节也有可能会放到技术讨论之前)。
编程题分为两种,一种是算法题,一种是语言技巧题。
算法题可能大家都能理解,像什么“两个线程交叉打印 A 和 B”、“手写单例模式”、“手写一个简单工厂设计模式”就属于语言技巧题。
算法题上面提过了,狂刷就行;语言技巧题也就那几个,背一下就好。
反问环节
个人认为,反问环节没啥用,根本就不能改变整个面试结果。
所以我一般就固定两个问题:
- 我面试的这个岗位需要用到哪些技术栈?
- 我面试的这个岗位的最大挑战是什么
面经
面经奉上,不是很全,希望有帮忙。
顺丰
- HashMap,扩容过程,怎么解决哈希冲突?
- 聊了一篇之前写过的 MySQL 的一篇博客,讲讲 MySQL 慢 SQL 优化思路?解决流程,应该从哪些方面考虑?
- APM,怎么监控,原理是什么?Java Agent 了解过吗?
- G1,最大的特点,标记位图,卡表卡页,SATB。
- 介绍 TiDB,什么是分布式数据库?和 MySQL 比优缺点是什么?
- 怎么做数据冷热分离?怎么做分库分表?为什么要用 ES?
- 分布式事务几种实现方式,讲讲本地消息表、尽最大努力通知、TCC。你们选用的是什么?AT 有什么问题?
- 报表 DSL 优化,享元模式优化过程,优化效果怎么样?
- 单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?
- 现在负责的系统分为几个模块?如何划分?怎么治理?
- MQ 使用场景有哪些?在项目中具体哪些地方用到了?
- MQ 消息发送不在 MySQL 事务中如何保证一致性?
- Kafka 四个选举,Controller 选举、Partition leader 选举、GroupCoordinator 选举、消费组协调器选举。整体设计问题,使用场景,流量规划怎么做的?
- 缓存使用的具体场景,一致性问题,缓存使用常见问题有哪些?
- 熔断和降级的区别,具体使用场景有哪些?
- QPS 和 TPS 的区别是什么?你们系统的最大 QPS 是多少?QPS 大了会有什么问题,怎么解决?
- 如何设计一个 RPC 框架?需要考虑哪些点?
- 有没有关注新技术?log4j2 问题关注没有?能简单介绍一下吗?
总结:面试难度偏低,总监面基本是聊一下场景设计问题,面试体验很好,总监特别尊重人,强烈好评。待遇还行。
拼多多
- 介绍自己做过的最满意的一个项目
- 介绍 TiDB、RocksDb、levelDB、LSM 树、SSTable。
- XXL-Job 二次分片怎么做的?有些什么问题?怎么去优化的?
- HashMap 的位操作,HashSet 的 contains 方法复杂度是多少,红黑树简单讲一下?
- byte[] a = new byte[10 * 1024]内存分配过程?多大的对象直接进入老年代?通过什么参数配置?
- 介绍 TLAB,PLAB,CAS 分配。
- 为什么要指针压缩,为什么能指针压缩?原理是什么?
- 类加载过程?类隔离了解过吗?
- 多态和重载的底层实现原理,字节码层面的了解过吗?
- Springboot 自动装配,SPI 原理讲一下?
- 拦截器和过滤器的区别?使用场景?
- Spring 事务实现原理,Spring 的 ACID 如何实现的?如果让你用 JDBC 实现事务怎么实现?
- MySQL 的锁,表级锁是哪一层的锁?行锁是哪一层的锁?
- MySQL 索引?B+树?主键索引每一个节点的大小?一个 page 多大?如果一条数据大于 16KB 怎么存?text 最多存多少数据?行溢出问题?数据存储格式有哪些?溢出页如何管理?
- Redis ssd,Redis 内存空间优化的点,embstr 和 row、intset、ziplist。
- Kafka 的服务端的物理存储架构是什么?零拷贝,mmap,sendfile、DMA gather。
- 你做的方案怎么让别人信服?要考虑哪些点?你是怎么做的?有哪些你觉得可以改进的地方?
- 如果系统流量突然上升 10 倍,怎么处理?100 倍呢?
- 白板编程:单例模式,为什么要加 volatile
- 白板编程:用栈实现一个线程安全、高效的队列
- 白板编程:二叉树两个节点的距离
总结:一面难度较高,会一直追问问到你不会为止,后几轮的面试偏业务和设计,比较轻松。待遇拉满。
美团
- 多少个服务,多少台机器?K8S,怎么做到隔离?
- 服务之间的数据一致性怎么做?业务上怎么保证?
- TCC?二阶段提交,三阶段提交?
- Synchronized,偏向锁聊了很久聊到了源码,升级过程,Synchronized 的 JVM 源码?(面试官对 JVM 很感兴趣)
- 安全点,安全点的作用?一些 JVM 源码(之前的文章写过,面试官和感兴趣)
- 垃圾回收算法;PS+PO,CMS 为什么要用标记清除算法?CMS 的前身,R 大的文章。
- ZGC,聊到了彭寒成的《新一代垃圾回收器 ZGC 设计与实现》和美团技术团队的文章。
- G1,聊到了中村成洋的《深入 Java 虚拟机:JVM G1GC 的算法与实现》。
- 写屏障和读屏障的区别是什么?
- JMV 优化过程,效果。为什么要升级垃圾收集器?
- 介绍一下 Spring IOC,注解和 XML 两种方式有什么区别?后置处理器,扩展点有什么用?在项目中有用到过吗?
- MySQL 的 binlog、redo log、undo log 写入过程?刷盘机制和参数设置。MVCC 机制了解吗?
- 遇到的死锁问题?唯一键冲突导致的死锁问题,MySQL 为什么要这么设计?隐式锁是什么了解吗?
- 还了解 MySQL 的哪些锁?间隙锁、临检锁.....
- ZK 的选举过程是怎么样的?如果选举过程中网络故障怎么办?ZAB 和 RAFT 的最大区别是什么?
- Redis 用的 Gossip 协议有哪些具体消息?谣言传播,为什么要去中心化?有哪些优缺点?
- Redis 分布式锁和 ZK 分布式锁的比较。AP 和 CP,CAP 理论讲一下?
- Kafka 的优势是什么?RocketMQ 延迟队列怎么做的?如果让你优化你会怎么做?Kafka 能实现延迟队列吗?
- Kafka 能保证数据一条都不丢失吗?为什么?业务上丢数据了怎么办?
- 白板编程:顺时针打印矩阵
总结:美团的面试官很喜欢问并发编程和 JVM,一面一直在聊这些东西,后几轮的面试偏业务和场景问题,比较轻松。
面试官很尊重人,还加了面试官的微信,后来面试官还给我打电话要我去美团,因为有其他选择了就拒掉了,祝好!
字节
略
总结:算法难度拉满,一轮一道算法,因为面的是 GO 岗位,对基础要求比较高,没有问太多 Java 的知识点。待遇不错。
58 集团
- MySQL 迁移到 TiDB 做了哪些工作,自增主键,数据量多大?
- TiDB 的性能问题,做了哪些调研?TP90、TP95 是多少。
- TiDB 上线步骤是怎么样?怎么做到数据不丢失?怎么保证可靠性?
- XXL-Job 怎么封装的?任务跑失败了怎么办?
- DAG 是如何实现的?二次分片怎么做的?
- Redis 使用场景、缓存什么数据?怎么保证数据一致性?
- 还了解 Redis 哪些知识、Redis 的优势、CP 还是 AP?CAP 理论。
- Redis 存储数据需要注意哪些问题?热 key 问题、大 key 问题怎么处理?
- Redis 分布式锁、红锁。红锁有什么问题?
- 介绍 SpringBean 创建过程、AOP 实现原理?
- BeanFactory 和 FactoryBean 的区别?
- Spring 是怎么解决循环依赖的?Spring 解决构造方法注入的循环依赖了吗?解决多例下的循环依赖了吗?
- 动态代理,JDK 动态代理和 CGlib 动态代理的区别?Spring 是如何选用的?怎么配置?
- 如何做降级的?如何做限流?
- 负载均衡算法有哪些?自适应负载均衡怎么做的?有什么问题?怎么优化的?
- Java 的集合都有哪些,都有什么特点?
- HashMap、ConcurrentHashMap 的区别?扩容过程是怎么样的?
- 介绍 AQS、CountDownLatch、Semaphore、volatile、synchronized
- 线程池、自定义线程池、自定义拒绝策略有了解过吗?什么场景用?
总结:面的是风控部门,老牌公司了,面试难度较低,钱也给的少。
滴滴
- 进程和线程的区别是什么?进程之间怎么通信的?线程之间呢?
- HTTPS 和 HTTP 对比;CA 数字证书;对称加密非对称加密过程?
- 常见的加密算法有哪些?
- MySQL 测试,TiDB 测试,如何做到平滑迁移?如何保证数据不丢失?
- 任务调用中心怎么做的?负载均衡?怎么收集执行器的 CPU 和内存使用情况?任务分片是怎么做的?
- 任务幂等性改造?ZK 怎么部署的,几台机器,挂了一台怎么办?
- ZAB 协议,ZK 选举过程,ZXID 的结构是怎么样的?ZXID 有什么用?
- Redis 的 String 底层结构,hash 底层结构,rehash 过程是怎么样的?
- Redis 的 AOF 和 RDB 区别,能配合使用吗?热 key 问题和大 key 问题怎么解决?
- Kafka 的 log,index,稀疏索引。零拷贝,mmap,sendfile、DMA gather
- Kafka rebalance 策略,具体过程。GroupCoordinator 选举、消费组协调器选举过程?kafka 默认 topic 干什么用的?
- Spring 的循环依赖怎么解决的,为什么需要加个三级缓存,二级不行么?
- Springboot 有什么特点,了解 springboot 的自动装配原理么?
- 写了一道 LeetCode 原题,交换链表节点。
总结:面的是网约车部门,主要语言是 GO,面试体验不错,面试官比较尊重人,钱给的还行。
欧科云链
- QUIC/HTTP3 了解吗?
- 用笔画 MySQL 一条记录的入库过程,写日志过程,日志两阶段提交?
- JVM 调优过程?怎么发现 JVM 的问题的?怎么做预警处理?
- Minor GC 与 Full GC 的触发机制是什么?
- Eden 和 Survivor 比例可以调整么,参数是什么?还用到了哪些参数?
- 介绍 TiDB 和 MySQL 的迁移过程?遇到了些什么问题?怎么解决的?
- 了解 RocksDb 吗?levelDB、LSM 树、SSTable?
- Paxos 算法了解吗?介绍 RAFT 和 ZAB,以及它们之间的区别?会有脑裂问题吗?为什么?
- Kafka 消息的写入过程简单介绍一下,Kafka 为什么这么快?
- Kafka 几种选举过程简单介绍一下?
- Kafka 高水位了解过吗?为什么 Kafka 需要 Leader Epoch?
- Netty 用到过吗?讲讲 reactor。Netty 的空轮询 bug 有了解吗?
- 讲讲 BIO、NIO、AIO 的区别?
- Dubbo 的服务发现是怎么做的?
- Redis 的几种数据结构,底层分别是怎么做的?用 Redis 缓存什么数据?怎么更新数据?怎么淘汰数据?
- 缓存和数据库一致性问题怎么解决?为什么要删缓存而不是更新缓存?删缓存删失败了怎么办?
- 有一个包含 100 亿个 URL 的大文件,假设每个 URL 占用 64B,请找出其中所有重复的 URL。
- 给了一张纸,上面有一段并发的代码,问执行结果是什么,考的是 volatile。
总结:面的是数字货币交易系统,去现场面的试,画了很多架构图。面试体验很好,还加了面试官的微信。待遇不错,而且可以居家办公。
京东
- 介绍一下你做的项目?
总结:这个面试官放了我两次鸽子,后面突然打电话过来,我匆匆忙忙接电话,介绍完项目之后,他随便问了几个问题就结束了,整个过程不超过 10 分钟。可能是因为我不是东哥的兄弟?
结果
说一下结果吧,除了京东,其余的都拿到了口头 offer。
至于为什么没有面阿里和腾讯,因为那个时候阿里和腾讯在进行财年清算,锁 HC 了,也就没有面了。
至于为什么字节的面试题没写,懂得都懂,可以私下交流。
最后,祝大家都能成为 offer 收割机!
作者介绍:某大厂后端工程师,公众号【CoderW】,玩过前端,搞过Java、Python和C++,现在在深圳写Golang。一个热爱生活、喜欢满仓炒股、梦想是宇宙中心买房的打工人。