顶级技术积累,独家面试资源,超靠谱团队
Senior @ Meta
UCSD博士毕业,前Pinterest senior MLE。在CVPR、ECCV等顶级学术会议上以第一作者身份发表过十余篇论文。研究方向集中在可解释的人工智能和鲁棒模型架构的研究。对MLE的面试技巧和得分点了如指掌,培训了团队内的数十名新同事。
Luke P
Senior @ 谷歌
前谷歌高级软件开发工程师,精通分布式系统、云计算和大规模数据处理。在顶级技术会议KubeCon和Google Cloud Next上发表多篇技术报告。专注于提升系统的可扩展性和可靠性。在Github上发布了System Design面试手册,收获上千 🌟
3-1 @ Tiktok
前TikTok工程老兵,擅长大规模互联网应用的开发与优化,专注于提升应用的性能、用户体验和平台安全性。在分布式系统、微服务架构和实时数据处理领域有深厚的技术积累。专做Amazon和Meta的SDE面试辅助,一年内曾拿下超过30个 L5 offer。
Karat 面经|Karat 题库|SDE面试真题|面试辅助
求职辅助服务,是关于时间和品质的较量。咨询 Alpha 小助手,获取最专业的Tech求职辅助。
Karat 的面试整体是一种 structured but friendly 的感觉,节奏明确,也讲逻辑。整个面试差不多持续一个小时,分成三大块:10 分钟的自我介绍,20 分钟的 system/infra 场景问答,最后是 30 分钟的 coding。
刚开始那 10 分钟其实挺轻松,面试官让我先简单介绍一下自己,比如说:“Tell me a bit about your background and recent projects”。我就大概讲了一下最近在做的项目、技术栈,还有一些自己感兴趣的方向。这个阶段更多是拉近距离,面试官主要是 warm-up,不会特别刁钻。
接下来是比较硬核的部分,就是 5 道 system design or infrastructure related questions。和传统那种画系统架构图不太一样,这一部分是需要快速反应的现场分析题。比如有一道题问我:“A web service is running slow — what are the possible reasons and how would you troubleshoot it?” 考的是 end-to-end latency analysis 的能力,需要考虑 network、I/O、DB、cache、thread pool、甚至 upstream 的依赖。
还有一道题是关于升级一个视频分享系统来处理将来不断增加的流量,而且要“within a limited budget”。我就讲了几方面的考量,比如 CDN 的优化、是否可以做 transcoding offload、冷热数据分离,等等。整个问答环节其实更多是看你 how you think, 而不是你说的答案多完美。用他们的话说就是 We care more about your reasoning process than the solution itself.
接着就进入 coding 环节了,这一部分一共两道题,面试官提醒我:“You’ll need to talk through your approach before you code — otherwise we won’t count it.” 所以别一激动就直接写代码,这点非常重要。
第一道题是:
实现一个函数 List<String> mergeAndSortLogs(List<String> logA, List<String> logB),
每个 log 都是形如 "2023-06-01 12:30:45 GET /api/user" 的字符串,要求把两个日志列表按时间顺序合并并返回。
这个题比较偏向实用场景,其实逻辑不复杂。我的思路是先用 SimpleDateFormat 把字符串解析成带时间戳的结构,然后做一个类似归并排序的两指针 merge。面试官让我用一组具体的例子讲一下流程,比如两个 log 列表分别从早到晚如何交叉合并,处理完之后再把结构转换回字符串返回。我讲得还算顺畅,然后写代码也比较快,最后加了一个小 helper function 解析 log 字符串,跑通了测试用例,面试官表示满意。
第二道题是:
实现一个函数 List<String> autocomplete(String prefix, List<String> wordList),
给一个前缀和一个单词列表,返回所有以该前缀开头的单词,要求结果按字典序排列,最多返回前 5 个。
这个题一看就是那种基础的搜索题,我当时第一反应是直接用 stream filter + sort,但是考虑到要控制前 5 个,可能不如直接遍历来的灵活。我没急着写,先讲了两种解法:第一种是遍历找 prefix 开头的词,丢到 min-heap 或直接收集完再 sort;第二种是用 trie 做 prefix tree,但我强调在面试里其实没必要过度设计,trie 比较适合频繁 insert/query 的 use case。
面试官让我用输入例子模拟一下,比如 prefix 是 "ap",word list 是 [“apple”, “app”, “ape”, “apex”, “apply”, “apt”, “banana”],我就讲了怎么筛出前缀匹配的,最后排序并取前五个。但讲完之后时间就差不多了,我只来得及写了一部分框架,没完全跑出测试用例。面试官说:“Alright, time's up. Thanks for walking me through your thinking.”
说实话我当时感觉一般般,第一题写完了但用了不少时间,第二题虽然思路讲了但没完全写完。
不过也意识到 Karat 面试的重点其实不是题有多难,而是你表达得是不是清楚、代码是不是干净有条理。哪怕没写完,只要你能清楚地说出你的 plan 和 edge cases,分数照样有。
让我比较意外的是——两天后 HR 跟我说我通过了这轮 Karat,可以进入下一轮了。当时还是挺开心的。
总的来说,这次 Karat 面试让我学到最多的一点就是:“能讲清楚自己在做什么,比你写不写得完代码更重要。” 题目不难,但如果你不会用英语解释清楚思路,就很容易被扣分。反而如果你能把问题讲清楚、结构说完整、变量命名规范,其实是很加分的。尤其在 Karat 这种注重 remote + 可观察的面试形式中,更要重视 how you think and explain。刷题固然重要,但也别忘了练练怎么把你的思路讲出来,哪怕是最简单的例子,都要有先说后写的习惯。
