字节跳动后端开发面经 · 2024 秋招
岗位:后端开发工程师(抖音电商)
背景:985 硕士,Go 语言为主,2 段实习经历
结果:OC,年薪 45w+(Base + 期权)
时间线:8.15 投递 → 8.20 一面 → 9.5 五面 → 9.12 OC
字节面试风格
字节后端面试的特点是:算法难度大、轮次多、项目深挖狠。
- 算法占比 60%:每轮至少 1 道 hard 或 medium-hard
- 项目深挖 25%:不只是问"你做了什么",而是问"为什么这样做"、“如果量级翻 10 倍怎么办”
- 系统设计 15%:中后期轮次出现,侧重高并发场景
一面(8.20):基础 + 算法
面试官:抖音电商某交易服务负责人
时长:65 分钟
算法题 1:最长递增子序列(LIS)
LeetCode 300:最长递增子序列。要求 (O(n \log n)) 解法。
我的思路:
def lengthOfLIS(nums):
tails = []
for num in nums:
# 二分查找,找到第一个 >= num 的位置
left, right = 0, len(tails)
while left < right:
mid = (left + right) // 2
if tails[mid] < num:
left = mid + 1
else:
right = mid
if left == len(tails):
tails.append(num)
else:
tails[left] = num
return len(tails)
追问:
- “如果要求返回实际的子序列怎么改?” → 用
prev数组记录前驱节点 - “如果要严格递减呢?” → 反转或调整比较符号
- “如果有 10^7 的数据量,tails 数组最大多长?” → 最长递增,最坏全递增,(O(n)) 空间
算法题 2:跳跃游戏 II
LeetCode 45:跳到末尾的最少跳跃次数。
我直接写了贪心:维护当前跳跃能到达的最远位置。
def jump(nums):
n = len(nums)
if n <= 1:
return 0
jumps, curr_end, farthest = 0, 0, 0
for i in range(n - 1):
farthest = max(farthest, i + nums[i])
if i == curr_end:
jumps += 1
curr_end = farthest
return jumps
追问:“这个贪心为什么是对的?” → 在每一步能到达的范围内,选择下一步能跳最远的位置。
Go 语言基础(15 分钟)
- GMP 模型:Goroutine、M(OS 线程)、P(逻辑处理器)的关系
- Channel 底层:有锁(hmutex)、循环数组、sendq/recvq 等待队列
- Context 源码:如何传递超时和取消信号
- Go 的 GC:三色标记 + 混合写屏障
二面(8.25):项目深挖 + 算法
面试官:抖音电商核心交易链路负责人
时长:75 分钟
项目深挖(30 分钟)
我实习做的是电商商品服务,面试官从这个切入点开始连环追问:
“商品详情页 QPS 多少?怎么算的?瓶颈在哪?”
- 实际 QPS 约 2 万,通过压测得出
- 瓶颈:Redis 缓存读取 + 反序列化
“缓存和数据库不一致怎么处理?”
- 先更新数据库,再删缓存(Cache-Aside)
- 追问"删缓存失败怎么办?" → 消息队列异步重试
“如果要求强一致性呢?”
- 分布式锁 + 双删策略;或用 Read-Through 把一致性交给缓存层
“你的服务依赖了 5 个下游,怎么保证稳定性?”
- 熔断(Hystrix)、限流(令牌桶)、降级(返回兜底数据)、超时控制
“如果下游全部挂了,你的服务还能提供什么?”
- 本地缓存兜底 + 返回简化版数据(如只返回商品名称和价格)
算法题:加油站问题变体
LeetCode 134 变体:每个加油站有油量
gas[i],到下一站消耗cost[i]。求所有可能的起点(不止一个)。
我分析了总油量不足时无解,否则确定的起点唯一。面试官说变体要求所有可能的起点。
思路:将问题转化为环形数组上的差分数组,找到所有累积和不跌破 0 的位置。用前缀和 + 单调队列优化。
因为时间紧,我写了 (O(n^2)) 的暴力,面试官表示理解但希望有更好的方案,讨论了几分钟思路。
三面(8.29):算法 + 系统设计
面试官:抖音电商架构组
时长:80 分钟
算法题:最佳买卖股票时机含冷冻期
LeetCode 309:卖出后有一天冷冻期,不能买入。
状态机 DP:
def maxProfit(prices):
if not prices:
return 0
n = len(prices)
# hold[i]: 第 i 天持有股票的最大利润
# sold[i]: 第 i 天刚卖出股票的最大利润
# rest[i]: 第 i 天处于冷冻期或不操作的最大利润
hold, sold, rest = -prices[0], 0, 0
for i in range(1, n):
prev_hold, prev_sold, prev_rest = hold, sold, rest
hold = max(prev_hold, prev_rest - prices[i])
sold = prev_hold + prices[i]
rest = max(prev_rest, prev_sold)
return max(sold, rest)
追问:“这个状态机可以压缩到 O(1) 空间吗?” → 可以,当天状态只依赖前一天。
系统设计:电商秒杀系统
要求设计一个支持 10 万人同时抢购 1000 件商品秒杀的系统。
我的回答框架:
- 流量分层:CDN → Nginx 限流 → 网关鉴权 → 服务层
- 库存扣减:Redis Lua 原子脚本预扣库存
- 异步下单:Redis 扣减成功进入 Kafka 队列,消费者异步创建订单
- 防超卖:数据库唯一索引做最后一层防线
- 读写分离:热点商品信息多级缓存
追问:
- “如果用户拍了 1000 件但没付款,怎么回流库存?” → 订单超时关闭 + 定时任务回滚库存
- “怎么防止机器人脚本?” → 请求签名 + 验证码 + 设备指纹
- “秒杀 URL 怎么防止提前泄露?” → 动态生成 + 时间窗口校验
四面(9.2):跨部门交叉面
面试官:抖音视频推荐服务后端负责人
时长:70 分钟
算法题:区间重叠合并 + 区间覆盖
先做了经典的合并区间(LeetCode 56),然后延伸:
“如何判断一组区间是否能完全覆盖 [0, T]?”
贪心:按起始位置排序,维护当前能覆盖到的最右端点。
def canCover(intervals, T):
if not intervals:
return False
intervals.sort(key=lambda x: x[0])
covered = 0
i = 0
while covered < T:
max_reach = covered
# 找所有起点 <= covered 的区间,选最远右端点
while i < len(intervals) and intervals[i][0] <= covered:
max_reach = max(max_reach, intervals[i][1])
i += 1
if max_reach == covered:
return False # 无法继续前进
covered = max_reach
return True
系统设计:Feed 流系统
设计抖音这样的短视频推荐系统后端。
我按照召回 → 粗排 → 精排 → 重排的漏斗架构来回答,面试官重点追问了:
- “如何快速判断用户已经看过的视频?” → Bloom Filter(快速去重) + Redis Set(精确确认)
- “如果一个视频突然爆火,怎么实时推给更多人?” → 热点探测 + 写扩散到活跃用户 inbox
- “冷启动用户怎么推荐?” → 基于注册信息的内容召回 + 热门兜底
五面(9.5):HR 面
时长:30 分钟
- 为什么选择字节?对抖音电商有什么了解?
- 职业规划:技术深度 vs 广度
- 现在的 offer 情况,期望薪资
- 反问:团队技术栈、新人培养机制
HR 面比较轻松,但有一个陷阱问题:
“你有其他 offer 吗?如果字节和阿里同时给你 offer,你怎么选?”
我的回答:先肯定字节技术氛围和产品影响力,再提到会根据业务方向和团队匹配度综合决策。避免直接说"肯定选字节"这种没有信息量的回答。
复盘与建议
字节后端面试通关密码
| 维度 | 权重 | 准备要点 |
|---|---|---|
| 算法 | 50% | LeetCode Hot 100 + 精选 200 题,hard 题必须会 |
| 项目 | 25% | 不能只讲功能,要讲技术决策和 trade-off |
| 基础 | 15% | Go 语言底层、MySQL 索引、Redis 原理、网络协议 |
| 系统设计 | 10% | 高并发场景、缓存策略、一致性方案 |
高频追问准备清单
- 你项目中的 QPS/TPS 是多少?压测数据?
- 缓存一致性怎么保证?
- 服务挂了怎么兜底?
- 如果数据量翻 10 倍,哪里会最先成为瓶颈?
- 你的技术选型为什么选 A 不选 B?
- 这个项目最大的难点是什么?你怎么解决的?
字节风格与其他公司对比
| 公司 | 面试侧重 | 与字节对比 |
|---|---|---|
| 字节 | 算法重 + 项目挖得深 | — |
| 阿里 | 项目深度 + 架构思维 | 项目追问类似,算法难度降低 |
| 腾讯 | 基础扎实 + 开放性问题 | 算法难度相近,项目深度略低 |
| 美团 | 工程实践 + 业务理解 | 更看重业务场景分析能力 |
祝你面试顺利!字节跳动的技术面确实硬核,但只要算法扎实、项目经得起深挖,offer 是水到渠成的。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。