当前位置: 首页 > news >正文

翻译: 硅谷软件工程师面试:准备所需的一切

没有人有时间去做成百上千道LeetCode题目,好消息是你实际上并不需要做那么多题目就能够在FAANG公司找到工作!

我曾经在Grab工作,这是东南亚的一家共享出行公司,但我对工作感到沮丧,想要进入FAANG公司,但我不确定如何做到。经过几个月的研究、学习和练习,我面试了11家公司,最终获得了来自旧金山湾区顶级科技公司的9份工作offer,包括Facebook、Google、Airbnb、Palantir、Dropbox、Lyft以及一些初创公司。这是一个繁琐的过程,我不想再经历了。我经历了那个过程,但有了这个指南,你就不必再经历了。

本指南将为你提供关于如何准备软件工程师面试的顶级建议的快速概述 - 包括技术和非技术面试环节。在相关的情况下,你可以通过访问本概述文章中的链接或网站左侧边栏深入了解更多细节。

如何准备软件工程师面试:

  1. 最大化入选机会
  2. 弄清楚面试形式
  3. 选择一门编程语言
  4. 锻炼计算机科学基础知识
  5. 练习编程面试
  6. 为系统设计面试做准备(适用于中/高级别)
  7. 为行为面试做准备
  8. 谈判工作报价包
    在这里插入图片描述

最大化入选机会

你是否仍然在一些或所有顶级科技公司中有被筛选的困难?你的简历可能是个问题。

在像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上没有得到充分的覆盖,而且好的资源仍然很难找到。

系统设计面试的目标是评估候选人设计涉及多个组件的真实软件系统的能力。

利用最佳的系统设计面试准备资源

一些最佳的系统设计面试准备资源包括:

  1. ByteByteGo - 这是由Alex Xu开发的新的系统设计课程,他是《系统设计面试》系列书籍的作者,这些书在亚马逊上畅销。该课程涵盖了系统设计基础知识,然后深入讲解了超过10个常见产品的设计(例如,设计YouTube、Facebook新闻源等)和多个大数据和存储系统的设计(例如,设计聊天系统)。对于每个深入讲解,概念都有解释,并使用了综合性的图表,使其对任何高级别的人都很容易理解。

  2. “Grokking the System Design Interview” by Design Gurus - 这可能是互联网上最著名的系统设计面试课程,与大多数其他课程的不同之处在于,它完全基于文本,这对于更喜欢阅读而不是观看视频的人(比如我自己!)是非常棒的。它包含了流行的系统设计问题的仓库,以及系统设计基础知识的词汇表。我个人已经完成了这个课程,并推荐许多其他人使用它。强烈推荐!

  3. “System Design Interview Course” by Exponent - 该课程涵盖了系统设计基础知识,并具有大量流行系统设计问题的视频模拟面试。一些问题有文本答案以及数据库模式和API的参考(我觉得这很有帮助)。虽然订阅价格可能对于仅仅涵盖系统设计面试内容的课程来说有点昂贵,但他们还提供质量很高的数据结构、算法和行为面试的技术内容。一站式平台的便利性,覆盖了技术面试准备的所有方面,非常诱人。

  4. “Grokking the Advanced System Design Interview” by Design Gurus - 我还没有尝试过这个,但它是由创建《系统设计面试课程》的同一团队制作的,所以应该很不错!在我看来,除非你是非常高级的候选人或者是专业职位,否则你可能不需要这个。

在这里查看其他系统设计准备指南和资源。

5. 准备行为面试

每家顶级科技公司都至少有一轮软件工程师的行为面试。通常,软件工程师的行为面试包括:分享简历上过往经历的细节,提供过去展示某些行为属性的情况和行为示例(例如,冲突管理、数据驱动)分享抱负和职业规划。

尽管这些面试看起来“空洞”或者没有结构,但实际上有一种结构化的方法可以为行为面试做准备:

  1. 了解STAR格式来回答问题
    STAR格式帮助你组织回答行为问题。这最适用于需要叙述过去经历或行为的问题。

    • 情境(Situation):分享引发任务的情况的详细信息
    • 任务(Task):解释你需要实现的目标或你需要解决的问题;侧重于范围、严重程度、具体的基准/结果要求
    • 行动(Action):解释你为实现目标所做的事情,描述你的选择和决策过程
    • 结果(Results):描述你行动的结果以及你学到了什么
    • :行为问题的STAR格式回答方式
  2. 练习软件工程师最常见的行为问题
    参考软件工程师最常见的30个行为问题

有关更多行为面试准备的提示,请参阅我的完整行为面试准备指南。

6. 为软件工程师的职位报价包进行协商

最后,在面试之前,你绝对需要准备的是对软件工程师的薪资谈判。在面试过程的任何时候,关于薪资的谈话都可能出现。我们还有关于谈判策略和软件工程师薪酬的深入指南。

这就是我所能提供的一切 - 对于软件工程师面试准备过程的每个步骤的更多细节,请通过侧边栏或导航到下一页中的每个主题进行深入了解!

参考

https://www.techinterviewhandbook.org/software-engineering-interview-guide/

相关文章:

翻译: 硅谷软件工程师面试:准备所需的一切

没有人有时间去做成百上千道LeetCode题目,好消息是你实际上并不需要做那么多题目就能够在FAANG公司找到工作! 我曾经在Grab工作,这是东南亚的一家共享出行公司,但我对工作感到沮丧,想要进入FAANG公司,但我…...

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务,搭配RTMP高清摄像头使用,可将无人机设备的实时流推送到平台上,实现无人机视频推流直播、巡检等应用。 有用户反馈,项目现…...

kubuntu23.10安装sdl2及附加库和 sfml2.5.1

2024年3月28号,四,晚上kubuntu23.10下安装了sdl2的如下,没有安装gfx。 sudo apt install libsdl2-dev sudo apt install libsdl2-image-dev sudo apt install libsdl2-ttf-dev sudo apt install libsdl2-mixer-dev sudo apt install libsdl2…...

Centos JDK1.8 下载安装

https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 一 RPM包安装 rpm -ivh jdk-8u391-linux-x64.rpm /etc/profile export JAVA_HOME/usr/java/jdk1.8.0-x64 export PATH$JAVA_HOME/bin:$PATHsource /etc/profile二 tar.gz 包手动…...

iOS开发进阶(十四):xcodebuild 命令应用详解

文章目录 一、前言二、xcodebuild 命令汇总三、xcodebuild 可选命令四、exportOptionsPlist文件内容配置说明五、项目实操六、拓展阅读 一、前言 关于iOS组包,详参博文《ReactNative进阶(三十四):Jenkins 流水线 组包 iOS 应用包…...

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时,我们假定您已经具备了相应Android应用开发经验,使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…...

构建第一个JS应用(FA模型)

创建JS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发(本文以应用开发为例,Atomic Service对…...

物联网学习2、MQTT 发布/订阅模式介绍

MQTT 发布/订阅模式 发布订阅模式(Publish-Subscribe Pattern)是一种消息传递模式,它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦,使得两者不需要建立直接的联系也不…...

docker--部署 (超详版) (五)

环境准备:docker,mysql,redis,镜像,nginx 把虚拟机打开,连接xshell,参考博客: https://blog.csdn.net/m0_74229802/article/details/136965820?spm1001.2014.3001.5501 一&#x…...

谷粒商城——通过接口幂等性防止重复提交订单

如果用户向后端服务提交多次相同订单的提交服务,那么后端应该只生成一条订单记录。 有一些操作天然是幂等的,如查询操作和删除操作等。 幂等性实现 1.token机制(仅这个方法适用于订单的重复提交) 后端先生成1个令牌将其记录在R…...

谈谈MVCC机制

在MySQL中,MVCC(多版本并发控制)是InnoDB存储引擎使用的并发控制机制。它提供对数据的并发访问,并确保多用户环境中数据的一致性和隔离性。 InnoDB通过“Undo log”存储每条记录的多个版本,提供历史记录供读取&#x…...

Linux之用户账号、用户组和与账号有关的系统文件

目录 一、基本介绍 1.用户和用户组 2.UID和GID 二、 账户管理 1.查看用户的UID和GID 2.添加账户 3.删除账号 4.修改账号 5.账户口令 三、分组管理 1.新增用户组 2.删除用户组 3.修改用户组 4.用户组切换 四、与账号有关的系统文件 1./etc/passwd 2./etc/shado…...

mac 安装 pip,如果你的电脑已经有 python3

文章目录 如果没装 如果你的电脑已经有 python3. 安装 pip 执行以下命令, 输入 python3 -m ensurepip --upgrade ,按下Enter就大功告成了! 安装后查看版本: pip3 -V 如果没装 先安装 python,建议使用 homebrew。 …...

java 枚举

枚举的格式 枚举是一种特殊的类 枚举类的最开始必须罗列所有类型 枚举类提供了一些父类的方法 values() :获取所有的的枚举对象,是一个数组 public enum A {A1, A2, A3;String name;A() {this.name "default";}String getName() {return name;}void setName(Strin…...

Java学习之类和对象、内存底层

目录 表格结构和类结构 表格的动作和类的方法 与面向过程的区别 具体实现 对象和类的详解 类的定义 属性(field 成员变量) 方法 示例--编写简单的学生类 简单内存分析(理解面向对象) 构造方法(构造器 constructor) 声明格式: 四…...

递归遍历目录结构和树状展现

在D盘下创建文件夹“电影”,在文件夹“电影”下创建“华语”、“好莱坞”,在文件夹“华语”下创建文件“人民的名义.mp4”、“天安门传奇.mp4”、“程序员统治世界.mp4”,在文件夹“好莱坞”下创建文件“国王的演讲.mp4”、“速度与激情8.mp4…...

【C++的奇迹之旅(二)】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例

文章目录 📝前言🌠 C关键字(C98)🌉 命名空间🌠命名空间定义🌉命名空间使用 🌠命名空间的使用有三种方式:🌉加命名空间名称及作用域限定符🌠使用using将命名空间中某个成员…...

如何通过针对iOS的动态分析技术绕过反调试机制

在这篇文章中,我们将跟大家介绍和分析一种针对iOS的新型安全研究技术,该技术能够让iOS应用程序的调试过程更加轻松,并解决那些可能会延缓我们步伐的阻碍。 如果你要对一个采用了反调试技术的iOS应用程序或二进制文件进行调试的话,…...

33.Python从入门到精通—Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别

33.从入门到精通:Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别 Python3 正则表达式re.match函数re.search方法re.match与re.search的区别 Python3 正则表达式 在 Python3 中,可以使用 re 模块来进行正则表达式的匹配和处理…...

便携式气象站是什么

TH-BQX5便携式气象站是一种用于应对突发天气灾害和紧急情况的便携式气象监测设备。它通常包括气温、湿度、气压、风速、风向和降水量等关键气象要素的测量功能,能够快速准确地记录这些气象参数。此外,一些高级的便携式气象站还具备预警功能,当…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"&#xff0…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...