软件工程师面试:你需要准备的一切
原文:https://www.techinterviewhandbook.org/software-engineering-interview-guide/
没有人有时间去研究成百上千的 LeetCode 问题,好消息是你不需要做那么多就能得到 FAANG 的工作!
我对自己在东南亚拼车公司 Grab 的工作感到沮丧,想打入 FAANG,但不知道该怎么做。经过几个月的研究、学习和实践,我面试了 11 家公司,并设法获得了湾区顶级科技公司的 9 份邀请——脸书、谷歌、Airbnb、Palantir、Dropbox、Lyft 和一些初创公司。这是一个乏味的过程,我再也不想经历了。我经历了这个过程,但有了这个指南,你就不必经历了。
本指南将提供一个关于如何准备软件工程师面试的顶级技巧的快速概述——包括技术性和非技术性面试。在相关的地方,您可以通过访问这篇概述文章中的链接或通过网站的左侧边栏来深入了解更多细节。
如何准备你的软件工程面试:
- 最大化你入围的机会
- 找出面试形式
- 选择一种编程语言
- 为面试提高你的计算机科学基础
- 编码面试练习
- 准备系统设计面试(针对中高级水平)
- 准备行为面试
- 谈判一揽子报价
最大化你入围的机会
你是否仍然难以进入一些或所有顶尖科技公司的候选名单?你的简历可能是个问题。
你的简历是进入 FAANG / MANGA 等大型科技公司候选名单的唯一最重要的切入点。在入围之后,你过去的成就与你的编码面试技巧相比变得明显不那么重要了——正如我们所知,这是可以有条不紊地学习的。因此,能够很好地描述你过去的成就以通过筛选阶段是非常重要的。
不幸的是,即使是我个人认识的最合格的候选人,也不知道如何写好简历,没能入围。事实是,当我们中的许多人没有进入 FAANG / MANGA 这样的顶级科技公司的候选名单时,我们往往会认为自己不够资格——但在大多数情况下,这可能只是缺乏良好的框架。
如果你想学习如何写一份好的软件工程师简历,我在这里为谷歌、脸书、亚马逊、网飞、苹果等公司写了一份关于软件工程简历准备的逐步指南,并附有例子供你参考。
找出面试形式
在你的软件工程师面试中,你可能会遇到各种各样的面试形式(从早期到后期):
1.测验
频率:偶尔
测验是第一轮筛选,是一种快速而肮脏的方式来淘汰非常弱(甚至是非技术性的)的候选人。它们是结构化的问题,有明确的答案,这使得它们可以由招聘人员/非技术人员或自动评分员来管理。它们通常在流程的早期完成。
示例:
- 什么是 4 & 5(二进制)?答案:4
- 冒泡排序的时间复杂度是多少?答案:O(n 2
2.在线编码评估
频率:偶尔
像测验一样,在线编码评估通常在过程的早期进行。给出了一个具有良好形式的输入和输出的算法问题,期望候选人在在线编码接口中编写代码来解决该问题。 HackerRank 是一个非常常见的进行在线编码评估的平台。LeetCode 是在线编码评估中解决问题的一个好方法。然而,在 HackerRank 中,通常期望您编写从 stdin 读取并打印到 stdout 的代码,如果候选人不熟悉 API,这可能会出错。
3.带回家作业
频率:罕见
关于问算法问题是否是评估个人能力的好方法,已经有过无数次辩论,因为它们并不是日常工作中最相关的技能。带回家作业是一种旨在解决算法面试缺点的形式,通过让候选人从事更大的项目,允许他们展示软件设计技能。
然而,这种面试形式会占用应聘者和公司更多的时间,因此在拥有大量应聘者的大公司中并不常见。这种形式在创业公司和小公司中更常见。例子
- 构建航班列表应用程序
- 构建看板应用程序
- 构建一个蛇游戏
4.电话屏幕面试
频率:常见
电话面试是最常见的形式,每个候选人在面试时至少会遇到一次。你将被要求通过电话或网络电话(蓝战士/Skype/谷歌视频聊天)与面试官交谈。我们会给你一个问题,你将使用在线协作编辑器(CoderPad/CodePen/Google Docs)来处理这个问题。
即使编辑器支持执行,通常也不允许执行代码。所以不要依赖它来验证你的解决方案的正确性。根据你申请的职位不同,格式会略有不同。很多公司喜欢使用 CoderPad 进行协同代码编辑。CoderPad 支持程序的运行,因此可能会要求您修改代码,以便它可以运行。对于前端面试,许多公司喜欢使用 CodePen ,这将是值得你花时间熟悉这种基于网络的编码环境的用户界面。
在你的电话筛选面试之前,看看编码面试最佳实践以及该做和不该做的事情。
5.现场
频率:几乎总是
如果你已经走到这一步,恭喜你!这通常是要约决定前的最后阶段。进入现场阶段的候选人将需要在办公室进行面对面的面试。如果你是海外候选人,公司甚至会让你飞过去,并支付你的住宿费。
现场阶段通常包括多轮(编码、系统设计、行为),预计持续几个小时。由于你在现场,你可能会被要求与面试官一起做白板练习,通常是解决算法问题或系统设计问题。也有可能你不得不带上自己的笔记本电脑,在现场做一个项目/解决一个编码问题。
对于小型(非上市)公司的现场面试,大多数会允许(也更喜欢)你使用自己的笔记本电脑。因此,提前准备好开发环境非常重要。
如果公司提供午餐,你也可以和员工共进午餐,这样你可以更多地了解公司文化。
挑选一种编程语言
完成简历后,软件工程面试的下一步很简单,不会花很长时间——决定编程语言。除非你面试的是像移动或前端这样的专家职位,那里有特定领域的语言,否则在算法编码面试中,你应该可以自由使用任何你想要的语言。
大多数时候,你心里已经有一个了——选一个你用得最多、用起来最舒服的。编写面试代码最常用的编程语言是 Python、Java、C++和 JavaScript。我不建议仅仅为了编写面试代码而学习一门全新的语言,因为需要一段时间(平均至少几周)才能熟练掌握一门语言,并在面试环境中自如运用,这本身就已经够紧张的了。我个人选择的编程语言是 Python,因为它非常简洁,而且标准库提供了函数/数据结构。
阅读更多关于编程语言的编程面试:选择一种编程语言
面试编码 的学习与练习
下一步也是最重要的一步是练习用你选择的编程语言解决算法问题。虽然破解编码面试是一个很好的资源,但我更喜欢通过实际解决问题来学习。
有许多平台可以用于此——如 LeetCode、HackerRank 和 CodeForces。从我的个人经验来看,LeetCode 问题最适合面试准备,而 HackerRank 和 CodeForces 更适合竞争性编程。
然而,LeetCode 有成千上万的问题,不知道从哪里开始,或者如何组织你的练习可能会令人畏缩。我在这里提供了建议的准备计划和结构化资源:
编码面试学习计划
对于更全面的准备,建议留出 3 个月的时间(每周 11 小时,即每天 2-3 小时)进行编码面试准备。我在这里分享了我的 3 个月学习计划,它提供了一个包含资源和练习问题的编码面试主题列表,你应该每周按照优先顺序完成。我也将很快添加关于推荐的 1 个月和 1 周学习计划的内容。
如果你有不到 3 个月的准备时间,你可以使用 Grind 75 工具(由我开发)生成你自己的学习计划,它会根据你剩下的时间为编码面试生成推荐的学习计划。其背后的算法包括按优先级对问题进行排序,以及平衡所涵盖主题的广度和深度。
练习中使用的资源
在市场上,有大量的资源争夺你的注意力,大量的资源只是争夺你的钱,但不提供任何价值。如果我必须区分优先顺序,这些是我会依次使用的顶级编码面试准备资源:
- 寻找编码面试:编码问题的模式
- 算法怪兽
- 我的(免费)编码面试最佳实践指南
- 我的(免费)编码面试技巧指南
- 我的(免费)算法学习指南
AlgoMonsterT3】
除了通过实践和易于理解的指南帮助你掌握重要的编码面试数据结构和算法问题,AlgoMonster 还有一个额外的好处,即综合种常见面试问题模式,你可以用它们来解决你以前从未遇到过的任何其他问题。与 LeetCode grinding 的非结构化性质相比,这绝对是一个高质量的平台。数据结构和算法问题涵盖了所有常见语言——Python、Java、C#、JavaScript、C++、Golang 等等。 今天加入七折优惠→
寻找编码面试:编码问题的模式
这个由设计大师设计的课程扩展了推荐练习题中的问题,但是从问题模式的角度来进行练习,这是一个我也同意的学习方法,我个人也使用这个方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。学习和理解模式,而不是背答案! 今天获得终身访问权→
我的(免费)编码面试最佳实践指南
如果你读过顶级科技公司使用的编码面试评估规则,你可能会被评估项目的数量以及如何始终如一地展示招聘行为所淹没。
这份编码面试最佳实践指南综合了在你的编码面试之前、之中和之后应该做什么的可行建议,以展示招聘信号。
我建议在你练习编写面试问题的时候,记住并使用这个指南——以确保你从一开始就培养好的习惯和肌肉记忆。
我的(免费)编码面试技巧指南
有没有一个结构化的方法可以增加你找到编码面试问题好的解决方案的几率?如何优化你的方法的时间和空间复杂度?我的《编码面试技巧指南》教你一些处理你以前从未遇到过的问题的技巧——比如问题可视化、手工解决、将问题分解成子问题等等。
我的(免费)算法研究备忘单
我不确定这些是否有资格成为一个深入的指南——它们更像是一页纸的“学习备忘单”,包含了最佳学习资源、最佳练习的 LeetCode 问题和需要记住的事情。然而,他们确保你涵盖所有最重要的理由,尤其是当你没有时间。因为这些也是帮助我获得顶级技术报价的笔记——它们绝对有效。
更多关于编码面试准备的小技巧,在这里参考我的完整编码面试准备指南。
尝试模拟编码面试(与谷歌和脸书的工程师)
在你的面试官面前编写代码可能是一个令人伤脑筋的经历,尤其是如果你以前从未做过的话——这就是获得实践经验如此重要的原因。
interview . io是目前市场上最好的模拟技术面试资源。它允许你与真正的谷歌和脸书工程师预约模拟编码面试,尽管是匿名的。你甚至可以预约特定职位的面试,比如移动、前端、工程管理。更好的是——如果你想更容易地过渡到现实世界的编码面试——你可以观看录制的面试,看看电话面试是什么样的。
此外,如果你在模拟面试中表现出色,你将能够打开“工作页面”,让你直接预约像优步、Lyft、Quora、Asana 等顶级公司的面试。我作为面试官和被面试者都使用过interview . io并发现这种体验非常棒。
准备系统设计面试
如果你是一个中级或高级水平的候选人,你可能会期望系统设计问题作为你的技术面试的一部分。它们没有被 LeetCode 充分覆盖,好的资源仍然很难获得。
系统设计面试的目标是评估候选人设计涉及多个组件的真实软件系统的技能。
利用最好的系统设计面试准备资源
一些最好的系统设计面试准备资源包括:
- ByteByteGo——这是亚马逊上的畅销书《系统设计访谈书》的作者 Alex Xu 的一门新的系统设计课程。该课程涵盖系统设计基础知识,然后深入研究 10 多个著名常见产品的设计(如设计 YouTube 、脸书 Newsfeed 等)和多个大数据和存储系统的设计(如设计聊天系统)。对于每一个深入的潜水,概念的解释和全面的图表使用,使它非常容易接近任何资历水平。
- 设计大师的“探索系统设计面试”——这可能是互联网上最著名的系统设计面试课程,它与大多数其他课程的不同之处在于,它完全是基于文本的,这对于喜欢阅读而不喜欢看视频的人(比如我自己)来说非常好!).它包含一个流行的系统设计问题库,以及一个系统设计基础术语表。我个人已经完成了这个课程,并推荐了许多其他人来使用它。强烈推荐!
- 由 Exponent 主讲的“系统设计面试课程”——该课程涵盖了系统设计的基础知识,并拥有一个包含模拟面试视频的流行系统设计问题的庞大数据库。有些问题有文本答案、数据库模式和 API 供参考(我觉得很有帮助)。虽然订阅系统设计访谈内容可能有点贵,但他们也为数据结构、算法和行为访谈提供高质量的技术内容。涵盖技术面试准备所有方面的一站式平台的便利性非常诱人。
- 设计大师们的“探索高级系统设计面试”——我没试过这个,但它是由创作“探索系统设计面试”的同一批人写的,所以应该不错!在我看来,你可能不需要这个,除非你非常资深或者想要一个专家职位。
准备行为面试
每家顶级科技公司都至少有一轮针对软件工程师的行为面试。通常,软件工程师的行为面试包括:在简历中分享以前经历的细节,提供过去情况和行为的例子,展示某些行为特征(如冲突管理、数据驱动),分享抱负和职业规划
尽管这些面试看起来“松散”或无组织,但实际上有一种结构化的方法来准备行为面试:
1.知道回答它们的星形格式
星形格式有助于你组织行为问题的答案。这最适用于需要你讲述过去经历或行为的问题。情境:分享产生任务的情境的细节任务:解释你需要实现的目标或你必须解决的问题,重点关注范围、严重性或具体基准或你必须达到的结果行动:解释你为实现目标做了什么,描述你有哪些选择以及你是如何做出决策的结果:描述你行动的结果以及你学到了什么
阅读更多:回答行为问题的星形格式
2.练习软件工程师最常见的行为问题
关于行为面试准备的更多建议,请参考我的完整行为面试准备指南这里。
谈判软件工程师报价包
最后,面试前你绝对需要准备的最后一件事是软件工程师的薪资谈判。在面试过程中的任何时候,关于薪水的话题都有可能出现。我们还有关于谈判策略和软件工程师薪酬的深度指南。
以上就是我的全部内容——关于软件工程师面试准备过程中每一步的更多细节,请通过侧边栏或导航到下一页来深入了解我的手册中的每个主题!