如何成功获得字节、淘宝、拼多多等顶尖科技公司的工作offer:真实面试经验分享与求职指导
大家好,我是一名拥有两年半工作经验的Java开发工程师,平时喜欢摸鱼、划水、写代码和开会。接下来,我将分享我的求职心得和面试经验。
在这篇文章中,我将着重分享我的感受和一些实用建议,内容主要分为两个部分:
- 面试经历:涉及白龙马云行科技、字节、淘宝、快手、百度、拼多多等多家公司的完整面试经历,包括我获得offer或者主动终止谈薪的情况。
- 经验分享:涵盖心态调整、简历优化、算法准备和面试技巧。
面试经历总结
以下是我在面试过程中所收集到的经验和问题,主要来自获得offer或主动终止谈薪阶段的公司。对于其他一些小公司或初创企业的面试问题,由于其不具备普遍性,未一一列举。
白龙马云行科技
一面
主要按照项目职责逐条提问,考察设计思路:
- 项目中的难点;
- 介绍xxl-job的实现原理;
- disruptor的使用场景;
- 生产者堆积时的解决方案;
- 服务异常时的恢复方法;
- MySQL的索引介绍;
- B+树的特性及其在MySQL中的应用;
- 线程池监控的实现方式;
- RPC服务超时处理方法;
- 异步多线程追踪的实现方式;
- Redis超时问题的排查思路与方法;
- 服务设计中的高可用性与易用性体现;
- 用户身份唯一性确认的方式;
- 对公司了解的程度;
- Integer a=200; Integer b=200,a与b的equals结果;
- 缓存雪崩、击穿、穿透的定义及其避免措施;
- 处理CPU与内存过高的情况;
- 单链表与双链表的优缺点;
- 判断单链表是否有环的算法及其时间复杂度;
- ArrayList、HashMap、TreeSet的有序性和稳定性;
- 线程池的工作原理;
- 线程池时间参数的作用;
- 项目中是否用过并行流;
- ForkJoin线程池的默认线程数;
- 新生代与老年代的特点及其使用的算法;
- 软引用与弱引用的回收时机。
二面
- 离职原因;
- 当前公司的技术氛围;
- 下一份工作的偏好;
- 未来的发展规划;
- 数组与链表的遍历效率;
- Integer常量范围为何是-128至127;
- Java的可达性分析与GC的必要性;
- ThreadLocal使用弱引用的原理;
- Redis过期数据的清理策略;
- 处理100M内存的数字文件排序。
瓴岳科技
一面
- 参与代码评审的经历;
- 令人印象深刻的好与坏的代码;
- ThreadLocal不remove的影响;
- Redis 7.0的新特性;
- Disruptor组件的介绍;
- Disruptor的底层实现及速度优势;
- Java锁的实现方式;
- AQS中线程并发时的同步队列情况;
- Netty中HTTP复用的实现;
- 项目中线程池的场景应用;
- 算法:寻找二叉树中指定节点的下一个中序遍历节点。
二面
- 生产者-消费者模式的引入原因;
- 项目中ES的使用场景;
- 新老服务迁移的过程;
- 单元测试的情况;
- 工作以来最大的收获;
- 分布式事务的介绍;
- 项目中如何保证分布式一致性;
- RocketMQ的概述;
- 算法:最小栈的实现;
- 算法:爬楼梯问题的动态规划实现。
三面
- 项目可优化的点与思考;
- 生产者-消费者模式中保证消息不丢失的策略;
- 微服务的概念;
- 消息队列的设计题。
- 算法:最长连续序列的实现。
字节
一面
- 服务的可用性监控;
- 服务故障保障的方法;
- MQ消费积压的处理方式;
- 线程池的工作机制;
- 核心线程可能被销毁吗;
- 核心线程数与最大线程数的区别;
- 阻塞队列的特性与底层实现;
- ThreadLocal的数据结构与工作原理;
- 弱引用的特性;
- ThreadLocal的key使用弱引用的原因;
- 事务的ACID特性;
- 事务隔离可能出现的问题;
- Redis的高可用性;
- Redis的主从与哨兵模式;
- 算法:判断一颗树是否为平衡二叉搜索树的实现。
二面
- 项目的具体模块设计;
- RPC中的TCP与HTTP协议区别;
- HTTP2.0的优化;
- 多路复用的介绍;
- MySQL分表的应用;
- 项目中缓存的应用;
- Redis的特性;
- Redis支持高并发的原理;
- Redis数据丢失的恢复方式;
- Redis持久化策略;
- 执行RDB操作时如何对外提供服务;
- Redis的淘汰策略;
- 算法:LRU缓存的实现。
三面
- 业务讨论;
- 系统架构的介绍;
- 市场上流行的规则引擎;
- 选择当前规则引擎的原因;
- 如何控制规则变更的风险;
- 项目可进一步优化的点;
- 算法:括号生成的问题。
淘宝
一面
- 解释==与equals的区别;
- 重写equals的方法场景;
- 深拷贝、浅拷贝与零拷贝的定义;
- Java动态代理的介绍;
- 序列化的方式与选型;
- Maven冲突的发现与解决;
- Linux查看大文件的命令;
- 大文件按行去重的实现;
- 算法:实现单例的多种方式;
- 算法:生成0到n-1中m个不同的随机数;
- 算法:字符串转long的实现。
二面
- ES的正排与倒排区别;
- ES优化查询速度的方法;
- ES节点的增加与减少;
- ES引入排序算法的方式;
- 系统如何限制TP999时间;
- HashMap在多线程下可能出现的情况;
- Hash冲突的含义;
- Cookie与session的区别;
- 禁用Cookie的情况下是否还能使用session;
- 如何实现单点登录;
- 安全性的保障措施;
- 同步、异步、阻塞与非阻塞的定义;
- 线上Java服务问题的排查;
- Git的merge与rebase的区别;
- 在没有源码的应用中如何替换数据库地址;
- 算法:约瑟夫环问题的实现。
三面
- 为什么考虑新的工作机会;
- 当前公司的工作经历;
- 最近项目的介绍;
- 项目中需要优化的点;
- 项目策略的效果评估;
- 工作期间成长较快的事情;
- 是否有搜索引擎的相关工作经验。
经验分享
心态
在求职过程中,保持良好的心态至关重要,尤其是在面试的准备阶段与实际过程中。我在去年三月份时接到字节的HR面试邀请,出于好奇我多投了一些公司,结果发现大部分只到二面便停止了,许多问题我都无法回答。此时我意识到自己的准备不足,虽然知道需要学习哪些知识,但面对浩大的内容和他人的成功经历,我感到不自信和失落。为了调整心态,我选择了短暂的旅行并制定了三个月的学习计划,同时阅读一些放松心态的书籍,比如《蛤蟆先生去看心理医生》,这让我恢复了内心的平静。
在求职过程中,我主要通过BOSS直聘投递简历,与中小公司的HR沟通时,常常听到“夏虫不可语冰”的话。特别在谈论薪资期望时,HR的反馈五花八门,有的觉得我的期望太高,有的则觉得市场行情不支持这样的薪资。然而,当我与大厂HR、猎头和主管沟通时,他们的态度则显得更加直接和正常。因此,在沟通中保持自信和冷静十分重要。
最后,如果面试没有通过,不要气馁,及时总结经验,继续投递下一家,一定能找到合适的工作。
简历
无论是校招还是社招,简历的重要性不言而喻。在我刚开始投递简历时,不少面试官表示未能看明白我所申请的岗位。为了改善这一点,我观看了许多简历指导课程,按照视频中的建议优化了自己的简历,最终HR主动要求查看我的简历,并没有出现简历筛选不过的情况。
算法
在面试中,算法题的重要性显而易见。在我的试水阶段,我坚持在LeetCode上刷题,累计刷了600多道题。刷题时,我并不盲目,而是选择了一种题型进行练习,从简单到中等难度,逐渐掌握相关技巧。此时我选择了向左程云的《程序员代码面试指南:IT名企算法与数据结构题目最优解》这本书学习。如果在学习过程中遇到问题,我会在知乎上向他请教,得到的回复细致且有帮助,这令我十分惊喜,因此我非常推荐左神的资源。若看书时感到困难,可以选择观看左神的视频,弹幕中常有类似“为何这样做”的问题,左神会分享他的思考过程,帮助理解算法。
技巧
- 练手与实践:通过面试小公司来磨练自己的面试技巧,尤其是表达能力与项目描述能力。
- 面试录音:在面试时录音,面试结束后复盘自己的回答,反思流程与重点,以及待改进的地方。面试如同戴着耳机唱歌,只有回放才能检验自己的表现。