小红书秋招 PE(产品工程师)一面
- 轮次
- 一面
- 结果
- 已挂
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 请做一下自我介绍。
- 为什么要做这个项目?要解决的问题在业务中大约占多少比例?
- 这个比例在你看来算高还是低?为什么?
- 上线后指标从多少变成了多少?是如何观测的?
- 技术方案是怎么演进的?过程中为什么做了关键的加法/减法(例如引入或移除某个模块)?
- 为什么选用当前的核心算法/技术?它的边界与局限在哪里?
- 能否用多种方法做级联/分层检测?不同层各自解决什么问题?
- 这个项目里,产品、mentor、你分别扮演什么角色?关键决策由谁拍板?
- 把问题比例压到极致,对业务意味着什么?你的北极星指标是什么?
- Redis 为什么快?
- SDS(简单动态字符串)相比 C 字符串做了哪些优化?
- 跳表的查找/插入/删除为什么是 O(log n)?Redis 是用什么语言实现的?
- 如何用 Redis 实现分布式锁?解锁要怎么做?
- 了解 RocketMQ 或内部 MQ 的架构吗?
- Kafka 的架构是怎样的?broker、topic、partition、consumer group 之间是什么关系?
- 你日常开发中如何使用 AI?AI Coding 大致占多少?
- 什么样的技术方案对 AI 更友好?
- 项目规约和个人 code style 冲突时怎么处理?团队有没有形成 AI Native 的研发规范?
- LRU 一般用在哪些场景?你还知道哪些页面置换算法?
- 能讲一下虚拟内存吗?
- 手写一个 LRU Cache。为什么必须用双向链表,而不是单链表?
- 为什么选择本科毕业直接工作,而不是读研?
- 你怎么看全栈工程师,或者说”产品工程师”这个角色?
《参考解析》
项目类问题按产品口径准备:这类岗位不会只问「你用了什么技术」,而是问「这件事值不值得做」。回答结构建议是:业务问题是什么(谁在痛、痛在哪一步)→ 问题覆盖面怎么量化(日均发生量 / 影响用户数与工单量的占比,口径要说得出来)→ 方案怎么演进(第一版做了什么、为什么后面加或减了某个模块,加减的判断依据是什么)→ 结果怎么观测(指标定义、埋点位置、灰度对照、观测周期,最好有前后对照数字)。北极星指标要选与业务价值直接挂钩的那个,而不是技术侧的过程量。若指标确实是估算的,就直说是估算并给出推算方式,别硬报一个精确数——面试官一追问口径就会露馅。
Redis 为什么快、SDS 与跳表:Redis 快是几条合起来的:纯内存操作、单线程处理命令避免了锁与上下文切换、IO 多路复用(epoll)让一个线程管理大量连接、协议与数据结构都为常见场景做了优化,另外还有精细的编码优化(小对象用 listpack/intset 等紧凑编码省内存与指针跳转)。SDS 相对 C 字符串的改进:头部记录 len 与 alloc,取长度 O(1);二进制安全,内容里可以有 \0;预分配与惰性释放减少内存重分配次数;拼接前检查容量避免缓冲区溢出。跳表是「多层索引 + 有序链表」,每层以概率 1/4 提升,查找从最高层开始逐层下降,期望层数为 O(log n),插入删除只需改局部指针且不触发树那样的旋转或再平衡,实现简单、范围查询友好,适合 ZSet 这种需要按 score 排序又频繁增删的场景。
Redis 实现分布式锁:加锁用 SET key value NX PX <ttl> 一条命令完成「不存在才设置 + 过期时间」,value 放一个全局唯一标识(如 UUID + 线程标识),防止误删别人的锁;不要用 SETNX 加 EXPIRE 两步写法,中间崩溃就成了死锁。解锁必须校验持有者并保证原子性,标准做法是 Lua 脚本:先比对 value 是否等于自己,是才 DEL。TTL 是安全兜底,但业务执行时间可能超过 TTL,这时要引入看门狗续期(后台线程按 TTL/3 周期续),续期也要校验锁还是自己的。更严格的场景用 Redlock 或直接上 ZooKeeper / etcd 的临时顺序节点。最后要能说出这套方案的固有局限:主从切换时锁可能丢失,所以对安全性要求极高的场景不能只靠单点 Redis 锁,得配合数据库唯一约束或状态机做最终兜底。
消息队列架构,RocketMQ 与 Kafka 对照讲:Kafka 里 broker 是服务节点,topic 是逻辑消息流,partition 是物理分片也是并行与顺序的单位(同一 partition 内有序,跨 partition 无序),consumer group 是消费分组,组内每个 partition 只被一个消费者消费,以此实现「组内负载均衡、组间广播」;副本机制靠 ISR 与 leader/follower 保证可靠。RocketMQ 的模型类似但组件名不同:NameServer 做路由注册与发现,Broker 分 Master/Slave,topic 下分 MessageQueue,消费组内的消费者按队列做负载均衡;它额外提供事务消息、定时/延迟消息、消息轨迹、顺序消息等更偏业务的能力。选型时把差异落到需求上:吞吐量与堆积能力看 Kafka,事务消息与延迟消息、业务侧可控性看 RocketMQ;延时、顺序、重复消费、消息回溯这几项是常被追问的接口契约细节。
手写 LRU Cache 与双向链表:LRU 的标准实现是哈希表 + 双向链表:哈希表存 key 到链表节点,链表头部是最近使用、尾部是最久未用;get 命中后把节点摘下来插到头部,put 时若 key 存在则更新并提前,不存在则插到头部,容量超了删尾节点并同步删哈希表里的 key,两个操作都要求 O(1)。必须用双向链表是因为删除节点需要 O(1) 拿到它的前驱与后继:单链表只有 next,删除一个已知节点要么从头遍历找前驱(退化成 O(n)),要么用「偷梁换柱」式的删除技巧——但那要求节点本身不被外部持有,和哈希表直接引用节点的用法冲突。手写时注意几个易错点:哨兵头尾节点可以消掉大量边界判断;put 已有 key 时要返回值是否替换;哈希表和链表的删除顺序都要覆盖;扩展追问常见有「实现带过期时间的 LRU」「LFU 怎么设计」「这些页面置换算法的区别」——顺带把 FIFO、Clock、LFU、OPT 的差别准备一句。
AI Native 的研发协作与反问:这类问题没有标准答案,考察的是你有没有形成可复述的方法。可以按「什么样的方案对 AI 友好」来组织:接口边界清晰、单文件职责单一、类型与契约显式、有可运行的测试与文档,AI 才好改也不容易改错;规约与个人风格冲突时,先按团队规约走,确有改进意见就提 PR 讨论,而不是让 AI 生成的风格各自为政。团队层面的 AI Native 规范通常包含:提示词与 Skill 的沉淀位置、AI 生成代码的 Review 与门禁、敏感信息与数据边界、工具与模型选型、以及文档产物在哪个阶段产出。反问环节建议问团队当前的产品指标与角色分工、新人上手路径,别只问「用什么技术栈」。