技术面试手册(Tech Interview Handbook)是由前 Meta 资深工程师 Yangshun 编写的开源资源,专为忙碌的软件工程师量身定制,聚焦高效准备编码面试、系统设计和行为面试。它提炼了海量信息,直击要害,帮助用户避开无效刷题陷阱,转而掌握核心模式和策略。该手册已服务超过 100 万工程师,许多人据此拿到 Google、Meta 等顶级 offer。
系统设计模式:从需求到高可用架构
系统设计面试考察候选人对大规模分布式系统的理解,通常针对中高级工程师。手册强调 “先澄清需求,再逐步构建架构” 的流程,避免盲目画图。核心观点:设计不是凭空想象,而是基于负载、延迟和容错的权衡。
步骤参数与清单:
- 需求澄清(5 分钟):明确功能、非功能需求。QPS(每秒查询数)设为初始 1000,峰值 10 万;用户数日活 1 亿。问面试官:“支持多少并发?一致性要求强一致还是最终一致?”
- 高层次设计(10 分钟):客户端→负载均衡(Nginx 或 Envoy)→应用服务器(微服务,Kubernetes 部署)→缓存(Redis,TTL 5-60 分钟,命中率目标 > 80%)→数据库(MySQL 分库分表,读写分离,主从复制延迟 < 100ms)。
- 瓶颈分析与优化:热点数据用布隆过滤器防穿透;消息队列(Kafka,分区数 = 主题数3,消费者组并行);CDN 加速静态资源,边缘缓存命中率 > 90%。容错:熔断器(Hystrix 阈值错误率 > 50%、超时 3s)、限流(令牌桶,QPS = 预计峰值1.2)。
- 数据存储:NoSQL 如 Cassandra(最终一致,CAP 中选 AP);分片键选高基数字段(如 user_id hash)。备份:RPO<1 小时,RTO<4 小时。
常见案例参数:
- URL 短链:base62 编码(8 字符支持 10^14),Redis 计数器防冲突,异步任务生成唯一 ID(雪花算法,worker_id = 机器 IP%1024)。
- Twitter:粉丝数 <1 万用内存列表,>1 万用 set@服务查询;时间线用写扇出(热门用户)+ 读合并(冷门)。
- YouTube:视频分片存储(S3),转码队列(Celery),推荐用矩阵分解(offline batch,每日运行)。
这些参数源于真实系统实践,确保方案可落地。手册建议练习 ByteByteGo 课程,结合 Grokking System Design,模拟 45 分钟全流程。
引用:手册指出,“系统设计面试评估设计真实软件系统的能力,涉及多组件交互”。
编码模式:算法挑战的模式识别
编码面试核心是模式而非孤题。手册提供按主题分类的备忘单(array、string、graph 等),优先高频如数组(High)、图(High)。观点:掌握 10 大模式,覆盖 80% LeetCode 中题。
核心编码模式与清单(优先级高→低):
- 滑动窗口(Sliding Window):固定 / 可变窗口求子串。参数:left/right 指针,条件 while (right< n && !valid) right++;收缩 while (valid && left<=right) left++。练习:Longest Substring Without Repeating (LC3),Minimum Window Substring (LC76)。
- 双指针(Two Pointers):快慢指针 / 左右夹逼。数组排序后 left=0, right=n-1,sum>target right--。时间 O (N)。练习:Two Sum II (LC167),Container With Most Water (LC11)。
- 快速 / 慢速指针(Fast & Slow):链表环检测,fast=fast.next.next, slow=slow.next,相遇后重置 slow 追 fast。练习:Linked List Cycle (LC141)。
- 合并区间(Merge Intervals):sort (start),stack 合并重叠。参数:if stack [-1].end >= interval.start, extend end。练习:Merge Intervals (LC56)。
- 循环排序(Cyclic Sort):nums [i]==i+1 位置交换。O (N) 空间 O (1)。练习:Find Missing Number (LC268)。
- BFS/DFS 拓扑(Graph):BFS 用 queue 记录 indegree=0 入队,减邻居 indegree。练习:Course Schedule (LC207)。
- 子集 / 组合(Backtracking):for 循环 + 递归,used 数组防重复。剪枝:start=i+1。练习:Subsets (LC78)。
- Top K(Heap):min-heap 大小 K,heapq.heappushpop。练习:K Closest Points (LC973)。
- 动态规划(DP):状态转移,memo 或 table。参数:dp [i][j] = max (dp [i-1][j], dp [i][j-1] + grid [i][j])。练习:Unique Paths (LC62)。
手册的 Grind 75 是 Blind 75 升级版,可自定义 75 题计划,按模式分组,每周刷 20 题。结合 AlgoMonster 数据驱动模式学习。
面试通用清单:
- 沟通:Think aloud,时间 / 空间复杂度 O 标注。
- 边界:空输入、单元素、重复、最大 / 最小值。
- 优化:Brute→优解,空间换时间(如 hashmap)。
- 测试:3-5 例目测,面试官点头再码代码。
行为策略:STAR + 公司研究
行为面试用 STAR(Situation-Task-Action-Result)框架。手册列顶级公司问题,如 “Describe a challenging bug”。策略:准备 5 故事,量化结果(“优化 20% 延迟”)。研究公司价值观,问题反问:“团队工程水平如何定义?”
落地计划(4 周):
- 周 1:系统设计 2 案例,画架构图。
- 周 2:编码模式刷 30 题(NeetCode.io)。
- 周 3:行为 5 故事 + 模拟 mock。
- 周 4:全流程练习,复盘。
这些模式非理论,而是可参数化工具,提升胜率。无论 FAANG 还是初创,都适用。
资料来源:
(正文约 1250 字)