没有人有时间去做成百上千道LeetCode题目,好消息是你实际上并不需要做那么多题目就能够在FAANG公司找到工作!
我曾经在Grab工作,这是东南亚的一家共享出行公司,但我对工作感到沮丧,想要进入FAANG公司,但我不确定如何做到。经过几个月的研究、学习和练习,我面试了11家公司,最终获得了来自旧金山湾区顶级科技公司的9份工作offer,包括Facebook、Google、Airbnb、Palantir、Dropbox、Lyft以及一些初创公司。这是一个繁琐的过程,我不想再经历了。我经历了那个过程,但有了这个指南,你就不必再经历了。
本指南将为你提供关于如何准备软件工程师面试的顶级建议的快速概述 - 包括技术和非技术面试环节。在相关的情况下,你可以通过访问本概述文章中的链接或网站左侧边栏深入了解更多细节。
如何准备软件工程师面试:
- 最大化入选机会
- 弄清楚面试形式
- 选择一门编程语言
- 锻炼计算机科学基础知识
- 练习编程面试
- 为系统设计面试做准备(适用于中/高级别)
- 为行为面试做准备
- 谈判工作报价包
最大化入选机会
你是否仍然在一些或所有顶级科技公司中有被筛选的困难?你的简历可能是个问题。
在像FAANG / MANGA这样的主要科技公司中,你的简历是被筛选的最重要的入口。在被筛选后,你过去的成就相对于你的编程面试技能来说变得不那么重要 - 我们知道,编程技能是可以系统地学习的。因此,能够充分描述你过去的成就,以通过筛选阶段,非常重要。
不幸的是,即使是我认识的最合格的候选人,也不知道如何写一份好的简历,从而未能入选。事实是,当我们中的许多人没有被像FAANG / MANGA这样的顶级科技公司筛选时,我们倾向于认为自己不够资格 - 但在大多数情况下,可能只是缺乏良好的表述。
如果你想学习如何写一份好的软件工程师简历,我在这里写了一份逐步指南,涵盖了为像谷歌、Facebook、亚马逊、Netflix、苹果等公司准备简历的过程,并提供了参考示例。
1. 了解面试格式
在软件工程师面试中,你可能会遇到各种不同的面试格式(从早期到晚期):
1.1. 测验
频率:偶尔
测验旨在作为第一道筛选关,是一种快速而粗糙的方法,用于筛选出极度弱(甚至非技术性)的候选人。它们是有结构的问题,并且有清晰的答案,这使得它们可以由招聘人员/非技术人员或自动评分器进行评估。通常在面试过程的早期阶段进行。
示例:
- 4 & 5的二进制是多少?答案:4
- 冒泡排序的时间复杂度是多少?答案:O(n2)
1.2. 在线编程评估
频率:偶尔
类似于测验,在线编程评估通常在面试过程的早期进行。给出一个算法问题,带有格式良好的输入和输出,候选人被要求在在线编程界面中编写代码来解决问题。HackerRank是进行在线编程评估的非常常见的平台。LeetCode是练习在线编程评估中问题解决方面的好方法。然而,在HackerRank上,你通常需要编写代码来从stdin读取并打印到stdout,如果候选人不熟悉API,可能会让他们感到困惑。
1.3. 家庭作业
频率:罕见
人们对是否询问算法问题是评估个人能力的好方法进行了大量辩论,因为这些问题并不是工作中最需要的技能。家庭作业是一种旨在解决算法面试不足的格式,它让候选人参与到更大的项目中,从而展示他们的软件设计技能。
然而,这种面试格式会花费更多的时间,对候选人和公司来说都是如此,因此在候选人数量较多的大公司中不太常见。这种格式在初创公司和小公司中更为常见。
示例:
- 构建一个航班列表应用
- 构建一个看板应用
- 构建一个贪吃蛇游戏
1.4. 电话面试
频率:普遍
电话面试是最常见的格式,每个候选人在面试中至少会遇到一次。你将被要求与面试官进行电话或VoIP(BlueJeans/Skype/Google Hangout)通话。你将会被给出一个问题,并且你需要在在线协作编辑器(CoderPad/CodePen/Google Docs)上解决这个问题。
通常情况下,即使编辑器支持执行代码,你也不允许执行代码。因此,不要依赖它来验证你解决方案的正确性。根据你申请的职位不同,格式会略有不同。许多公司喜欢使用CoderPad进行协作代码编辑。CoderPad支持程序的运行,因此可能会要求你修复你的代码,以便能够运行。对于前端面试,许多公司喜欢使用CodePen,因此熟悉这类基于Web的编码环境的用户界面将是值得的。
在你进行电话面试之前,也要查看编程面试的最佳实践,了解在电话面试之前的要做和不要做。
1.5. 现场面试
频率:几乎总是
如果你已经到了这个阶段,恭喜你!这通常是做出录取决定之前的最后阶段。进入现场面试阶段的候选人将被要求在办公室进行面对面的面试。如果你是海外候选人,公司甚至可能会安排你飞到当地,并为你的住宿支付费用!
现场面试阶段通常包括多轮(编程、系统设计、行为)面试,预计会持续几个小时。由于你在现场,可能会被要求与面试官进行白板练习,通常是解决一个算法问题或一个系统设计问题。你可能还需要携带自己的笔记本电脑,在现场解决一个项目/解决一个编码问题。
对于小型(非上市)公司的现场面试,大多数公司将允许(并偏好)你使用自己的笔记本电脑。因此,提前准备你的开发环境非常重要。
如果公司提供午餐,你可能还会与员工一起进行午餐会话,你可以在会话中了解更多关于公司文化的信息。
2. 学习和练习编程面试
下一步,也是最重要的一步是在你选择的编程语言中练习解决算法问题。虽然《Cracking the Coding Interview》是一个很好的资源,但我更喜欢通过实际解决问题来学习。
有许多平台可以用于这个目的 - 如LeetCode、HackerRank和CodeForces。根据我的个人经验,LeetCode问题最适合面试准备,而HackerRank和CodeForces更适合竞技编程。
然而,LeetCode有成千上万的问题,要知道从哪里开始,或者如何组织你的练习,可能会令人生畏。我在这里提供了推荐的准备计划和结构化资源:
2.1 编程面试学习计划
为编程面试准备的推荐时间段是3个月(每周11小时,即每天2-3小时),以便更全面地准备。我分享了我的3个月学习计划,其中提供了一周一周的编程面试主题列表,以及应该按优先顺序逐个解决的资源和练习问题。我还将很快添加推荐的1个月和1周学习计划内容。
如果你准备时间少于3个月,你可以使用由我构建的Grind 75工具生成自己的学习计划,该工具根据你剩余的时间生成推荐的编程面试学习计划。它背后的算法包括问题按优先级排名以及覆盖的主题广度和深度的平衡。
2.2 练习中使用的资源
在市场上,有很多资源竞争你的注意力,其中很多只是为了你的钱而不提供任何价值。如果我必须优先考虑 - 这些是我会同时使用的顶级编程面试准备资源:
- 《Cracking the Coding Interview》:编程问题的模式
- AlgoMonster
- 我的(免费)编程面试最佳实践指南
- 我的(免费)编程面试技术指南
- 我的(免费)算法学习指南
3. AlgoMonster
除了通过练习和易于理解的指南帮助你掌握重要的编程面试数据结构和算法问题外,AlgoMonster还具有合成常见面试问题模式的额外优势,你可以将其应用于解决你以前从未遇到过的任何其他问题。由Google工程师制作,与LeetCode的不受结构约束相比,这绝对是一个质量平台。所有常见的编程语言都涵盖了数据结构和算法问题 - 包括Python、Java、C#、JavaScript、C++、Golang等。立即加入,享受70%的折扣 →
3.1 Grokking the Coding Interview: Patterns for Coding Questions
这个由Design Gurus推出的课程扩展了推荐练习问题上的问题,但是从问题模式的角度来练习,这是我也同意的一种方法,我个人也用它来提高编程面试水平。该课程允许你在Java、Python、C++、JavaScript中练习选定的问题,并提供这些语言的示例解决方案以及逐步可视化。学习和理解模式,而不是死记答案!立即获得终身访问权 →
3.2 我的(免费)编程面试最佳实践指南
如果你已经阅读过顶级科技公司使用的编程面试评估标准,你可能会对评估项目的数量以及如何始终展示录用行为感到不知所措。
这份编程面试最佳实践指南综合了在编程面试中展示录用信号的行动建议。
我建议在练习编程面试问题时将这个指南内化并使用作为辅助工具 - 以确保你从一开始就养成良好的面试习惯和肌肉记忆。
3.3 我的(免费)编程面试技术指南
是否有一种结构化方法可以增加你找到编程面试问题良好解决方案的机会?如何优化你的方法的时间和空间复杂度?我的编程面试技术指南教你一些处理你以前从未遇到过的问题的技术 - 比如问题可视化、手动解决、将问题分解成子问题等。
3.4 我的(免费)算法学习速查表
我不确定这些是否符合深入指南的标准 - 它们更像是"学习速查表"的一页纸,列出了最佳学习资源、最佳LeetCode练习问题和需要记住的事项。然而,它们确保你涵盖了所有最重要的方面,特别是当你没有时间时。因为这些也是帮助我拿到顶级科技公司offer的笔记 - 它们绝对有效。
更多关于编程面试准备的提示,请参阅我的完整编程面试准备指南。
3.5 尝试模拟编程面试(与Google和Facebook工程师)
在面试官面前编码可能是一种令人紧张的经历,特别是如果你以前从未这样做过 - 这就是为什么获得实践经验如此重要的原因。
interviewing.io目前是市场上最好的模拟技术面试资源。它允许你预约与真实的Google和Facebook工程师进行模拟编程面试,尽管是匿名的。你甚至可以为特定角色(如移动、前端、工程管理)预约面试。更好的是 - 如果你想更轻松地过渡到真实世界的编程面试 - 你可以观看录制的面试,看看电话面试是什么样子的。
此外,如果你在模拟面试中表现良好,你将能够解锁"工作页面",从而可以直接预约顶级公司如Uber、Lyft、Quora、Asana等的面试。我既是面试官也是面试者,发现interviewing.io的体验非常好。
4. 准备系统设计面试
如果你是一名中级或高级候选人,你可能期望在技术面试中遇到系统设计问题。它们在LeetCode上没有得到充分的覆盖,而且好的资源仍然很难找到。
系统设计面试的目标是评估候选人设计涉及多个组件的真实软件系统的能力。
利用最佳的系统设计面试准备资源
一些最佳的系统设计面试准备资源包括:
-
ByteByteGo - 这是由Alex Xu开发的新的系统设计课程,他是《系统设计面试》系列书籍的作者,这些书在亚马逊上畅销。该课程涵盖了系统设计基础知识,然后深入讲解了超过10个常见产品的设计(例如,设计YouTube、Facebook新闻源等)和多个大数据和存储系统的设计(例如,设计聊天系统)。对于每个深入讲解,概念都有解释,并使用了综合性的图表,使其对任何高级别的人都很容易理解。
-
"Grokking the System Design Interview" by Design Gurus - 这可能是互联网上最著名的系统设计面试课程,与大多数其他课程的不同之处在于,它完全基于文本,这对于更喜欢阅读而不是观看视频的人(比如我自己!)是非常棒的。它包含了流行的系统设计问题的仓库,以及系统设计基础知识的词汇表。我个人已经完成了这个课程,并推荐许多其他人使用它。强烈推荐!
-
"System Design Interview Course" by Exponent - 该课程涵盖了系统设计基础知识,并具有大量流行系统设计问题的视频模拟面试。一些问题有文本答案以及数据库模式和API的参考(我觉得这很有帮助)。虽然订阅价格可能对于仅仅涵盖系统设计面试内容的课程来说有点昂贵,但他们还提供质量很高的数据结构、算法和行为面试的技术内容。一站式平台的便利性,覆盖了技术面试准备的所有方面,非常诱人。
-
"Grokking the Advanced System Design Interview" by Design Gurus - 我还没有尝试过这个,但它是由创建《系统设计面试课程》的同一团队制作的,所以应该很不错!在我看来,除非你是非常高级的候选人或者是专业职位,否则你可能不需要这个。
5. 准备行为面试
每家顶级科技公司都至少有一轮软件工程师的行为面试。通常,软件工程师的行为面试包括:分享简历上过往经历的细节,提供过去展示某些行为属性的情况和行为示例(例如,冲突管理、数据驱动)分享抱负和职业规划。
尽管这些面试看起来"空洞"或者没有结构,但实际上有一种结构化的方法可以为行为面试做准备:
-
了解STAR格式来回答问题
STAR格式帮助你组织回答行为问题。这最适用于需要叙述过去经历或行为的问题。
- 情境(Situation):分享引发任务的情况的详细信息
- 任务(Task):解释你需要实现的目标或你需要解决的问题;侧重于范围、严重程度、具体的基准/结果要求
- 行动(Action):解释你为实现目标所做的事情,描述你的选择和决策过程
- 结果(Results):描述你行动的结果以及你学到了什么
- 阅读更多:行为问题的STAR格式回答方式
-
练习软件工程师最常见的行为问题
参考软件工程师最常见的30个行为问题
有关更多行为面试准备的提示,请参阅我的完整行为面试准备指南。
6. 为软件工程师的职位报价包进行协商
最后,在面试之前,你绝对需要准备的是对软件工程师的薪资谈判。在面试过程的任何时候,关于薪资的谈话都可能出现。我们还有关于谈判策略和软件工程师薪酬的深入指南。
这就是我所能提供的一切 - 对于软件工程师面试准备过程的每个步骤的更多细节,请通过侧边栏或导航到下一页中的每个主题进行深入了解!
参考
https://www.techinterviewhandbook.org/software-engineering-interview-guide/