我个人的筹备面试经验 25.12-26.4
我是 25 年 12 月开始筹备的,今年 3 月 5 号投递的第一份简历,4.16 offer。
我筹备分四个方向:八股文、项目、算法、技术。
一、项目、八股
我想先说我的理解——项目和八股文最好不要分开准备。
最理想的情况是:项目本身就有很多能聊的点。简历上写了一条「做了 XX 优化」,面试官顺着这条往下问——为什么要做这个优化?用到了什么原理?具体是怎么落地的?这么做的好处是什么?
好多八股文的题型不就是这个样子么?
为什么会出现 XX 问题?哪些场景/工具下会出现 XX 问题?用什么方式能解决?每种方案各有什么优劣?我们怎么衡量?怎么预防 XX 问题?实践中,是怎么用 XX 工具解决 XX 问题的?
举个例子
假设简历上有这么一条:
针对 XX 订单查询接口高峰期响应慢的问题,引入 XX 自定义线程池异步处理非核心逻辑,接口 P99 从 800ms 降到 200ms。
(这里只是举个例子,代表简历上这一条是有关线程池的优化)
那面试官顺着你这一条能问出很多东西——
- 基础:为什么不直接 new Thread()?→ 创建/销毁成本、无法复用、不可管控
- 参数:核心线程数、最大线程数、队列、拒绝策略你怎么定的?依据是什么?
- 场景判断:你这是 CPU 密集还是 IO 密集?怎么判断的?有没有压测数据支撑?
- 队列选型:用的哪种队列?为什么不用无界队列?
- 拒绝策略:选了哪个?业务上能不能丢请求?丢了怎么补偿?
- 监控:线程池打满你怎么发现?有没有埋点和告警?
- 踩坑:用线程池踩过什么坑?
能聊到的八股,已经覆盖了咱们单独去背诵线程池的大部分八股——而且每一个点都和项目有绑定,能说出自己的思考。
如果是面试官孤立地问线程池的八股 不依据项目去问 情况就很难受——因为就算 100% 答对了 也不算亮点,答错了 可能就会扣分。
二、算法
筹备目标是这样:
第一种情况:遇到之前写过的算法题
(HOT100、HOT150、剑指 offer 这样的)
应该要做到下面三点:
- 要能够清晰地说出来这道题的思路,逻辑要严密(很多时候去解释之前写过的算法,可能会有逻辑跳跃,没彻底解释清楚为什么就得出结论了)
- 语言要流畅(说话不结巴)
- 然后 Bugfree 地解出来(边界情况什么的要考虑清楚)
第二种情况:遇到没写过的算法题
- 分析题意,然后一步一步地去分析思考,在分析思考的过程中,也要把自己的思路说出来。
- 如果思考卡顿超过三四分钟(明显想不出来了),去请求面试官的帮助,要让他给点思路帮助解决这个问题(如果能清晰地说出自己卡在哪,然后面试官给出提示,然后领悟,解出题,我认为挺加分,能体现出表达、沟通、协作能力)。
练习方法
所以说,我准备算法的方法是:写算法题,先要和 AI 对话,把题的链接发给它,然后跟它聊这个题的思路。
得先能说服 AI,让它认可思路和逻辑推导,以及预期的实现方式。
如果把 AI 说服了,就可以开始写代码。
在这个过程中,如果有思维漏洞或者卡住的地方,要问 AI,或者让 AI 把思路不严谨的地方挑出来。
最后代码抠出来了,要让 AI 挑一下刺——「有没有考虑好边界情况」「变量名命名这样合适吗」「如果这个地方数据规模大了之后会不会有问题」等等。
我下面写一个示例 prompt(也可以自己用 AI 生成一个):
你现在是一个严格的算法面试官,帮我训练这道题。
题目:【粘贴题目链接或题目描述】
请严格遵守以下规则:
【第一阶段:思路对线】
1. 在我"说服你"之前,绝对不要给我任何解题思路、提示或代码。
2. 我会先口述我的思路,包括:
- 我对题意的理解
- 我选择的算法和原因
- 我的实现步骤(伪代码级别)
- 时间 / 空间复杂度的预估
3. 你要做的:
- 针对我推理中【逻辑跳跃】【边界没想清】【复杂度估算错误】
【伪代码描述模糊】的地方,逐个反问,让我自己补全
- 只要还有任何一处我没说圆,就继续追问,不要因为我大体说对了
就放过细节
- 直到我的思路足以支撑写出 bug-free 的代码,才让我开始编码
【第二阶段:代码 review】
4. 我写完代码后,你从以下角度挑刺:
- 边界情况(空输入、单元素、极值、整数溢出等)是否处理全?
- 变量命名清不清楚?有没有歧义?
- 时间 / 空间复杂度是不是最优?
- 有没有更简洁或更优雅的写法?
5. 挑刺时也用反问的方式,不要直接给答案。
比如:"如果输入是空数组你这段代码会怎么样?"
【其他要求】
- 整体语气模拟真实面试官:冷静、犀利,但不带情绪否定
- 如果我寻求帮助,你可以给一个【最小提示】,
不要直接说答案
- 我说"开始"之后我们进入流程
刷多少合适
我自己写了393道 如果方法得当的话且有举一反三的能力 把HOT100写熟悉就行 这个看个人
三、技术
比如 MySQL、Redis、消息队列、JVM、JUC 这些。
可以先打开黑马程序员、尚硅谷的视频 看一看他们每个章节标题就行,再找一找常见的八股文看看一般都考些什么,最后就可以打开对话框和 AI 开始聊了。
比如说 Redis 就可以问——
Redis 是干什么的?为什么要有 Redis?Redis 存在的必要性是什么?Redis 是通过什么提升增删改查效率的?Redis 底层数据结构有哪些?为什么要有这些数据结构?这些数据结构对于优化效率的帮助体现在哪?用 Redis 可能会出现哪些问题?为什么会出现这些问题?出现了这些问题我怎么解决......
可以一直问下去。
我的学习顺序
- 先彻底理解这个技术本身的出现是为了满足什么需求(以及为什么会出现这个需求)
- 理解这个技术是怎么用的,还有哪些性质
- 理解这个技术的底层原理
- 这个技术的这些特性是由哪些底层原理决定的
举个例子:学习 Redis
第一. 为什么会需要 Redis
- 数据原本存在哪?→ MySQL。
- MySQL 有什么问题?→ 磁盘 IO 慢、单机 QPS 有上限、热点数据被反复查。
- 为什么磁盘慢?→ 机械寻道 / SSD 也比内存慢一个数量级;为什么内存就快?
- 那能不能直接把数据放内存?→ 用本地缓存(Caffeine、Guava Cache,再退一步直接用 HashMap)行不行?→ 单实例确实够用,但有几个绕不过去的问题:多实例之间数据不共享、容量受限于单机堆内存、服务一重启就丢、一个实例更新了别的实例感知不到。
- 为什么是 Redis 而不是别的?→ 它不只是 KV,还提供丰富数据结构 + 持久化 + 主从 + 哨兵 + 集群 + 原子操作,生态最成熟,基本就是默认选择。
- 哪些业务场景「非 Redis 不可」?→ 高并发读、计数器、分布式锁、排行榜、Session 共享、限流、去重、延迟队列、消息广播。
第二. 怎么用 + 有哪些特性
Redis 有几种数据类型?每种类型对应什么经典场景?
- String → 缓存对象、计数器、分布式锁、限流令牌桶
- Hash → 存对象字段、购物车
- List → 消息队列、最新动态列表
- Set → 去重、交并差(共同好友、标签)
- ZSet → 排行榜、延迟队列、按时间窗口
- Bitmap → 签到、用户在线状态
- Geo → 附近的人
- Stream → 消息队列(替代 List 方案)
第三. 底层原理
- 单线程为什么不慢?→ 基于内存 + IO 多路复用(epoll)+ 避免锁竞争 + 高效数据结构。
- 每种数据类型底层是什么?→ String 是 SDS(动态字符串),List 是 quicklist + listpack,Hash 是 listpack/dict,Set 是 intset/listpack/dict,ZSet 是 listpack/跳表 + 字典。
- 为什么 ZSet 选跳表不选红黑树?→ 实现简单、范围查询友好、内存连续性好。
- 持久化?→ RDB(快照、fork 子进程、二进制紧凑)vs AOF(命令日志、三种刷盘策略)vs 混合持久化。
- Cluster?→ 16384 槽 + CRC16 + gossip + 重定向。
第四.这个技术的这些特性是由哪些底层原理决定的
- 为什么 INCR 是原子的?→ 单线程模型决定的。
- 为什么 Hash 小的时候特别省内存?→ 用 listpack 紧凑存储,超过阈值才升级为 dict。
- 为什么 Redis 重启可能丢数据?→ AOF 默认 everysec、RDB 是间隔快照、主从是异步复制。
- 为什么会有缓存穿透 / 击穿 / 雪崩?→ 缓存「key 不存在 / 单热点失效 / 批量同时失效」分别对应三种现象,解决方案(空值缓存 + 布隆过滤器 / 互斥锁 + 逻辑过期 / 随机 TTL + 多级缓存 + 熔断)也都从机制推得出。
- 为什么会有双写一致性问题?→ 缓存和 DB 是两套存储 + 网络延迟 + 并发,所以才有「先删缓存还是先更 DB / 延迟双删 / canal 监听 binlog」几种方案。
总体来说就这些
用AI提高效率很重要 绝大部分的学习过程都用AI来做 没什么毛病 我百分之八十五以上的学习时间都是在AI对话框里面度过的
当然这只是我个人的看法,不一定都得这样
然后心态很重要 拥有良好的心态就是胜利
#我的求职进度条#