技术面试手册(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字)