software-engineering-interview-guide


文档摘要

id: 软件工程面试指南 title: '软件工程师面试:你需要准备的一切' description: 面试中会遇到什么,如何准备,以及如何在软件工程面试中脱颖而出 keywords: [ 软件工程师面试准备, 技术面试准备, 如何准备软件工程师面试, 软件开发人员面试, 编码面试准备, 最佳LeetCode题目, 编码面试题目, 软件工程面试题目, ] sidebarlabel: '软件工程师面试:它们是什么以及如何准备' import InDocAd from './\components/InDocAd'; 没有人有时间刷几百道LeetCode题目,好消息是,你并不需要刷那么多题就能拿到FAANG的职位!

id: 软件工程面试指南 title: '软件工程师面试:你需要准备的一切' description: 面试中会遇到什么,如何准备,以及如何在软件工程面试中脱颖而出 keywords: [ 软件工程师面试准备, 技术面试准备, 如何准备软件工程师面试, 软件开发人员面试, 编码面试准备, 最佳LeetCode题目, 编码面试题目, 软件工程面试题目, ] sidebar_label: '软件工程师面试:它们是什么以及如何准备'

import InDocAd from './_components/InDocAd';

没有人有时间刷几百道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这样的顶级科技公司时,往往会认为自己资历不够——但实际上,大多数情况下,只是缺乏好的表达方式。

如果你想学习如何写一份出色的软件工程师简历,我已经写了一篇详细的步骤指南,专门针对Google、Facebook、Amazon、Netflix、Apple等公司,还附上了实例供你参考。

了解面试形式

在软件工程师面试中,你会遇到各种不同的面试形式(从早期到后期):

1. 测验

频率:偶尔

测验旨在作为第一轮筛选,用一种简单粗暴的方式淘汰那些极其薄弱(甚至非技术型)的候选人。它们是结构化的问题,答案明确清晰,因此可以由招聘人员或非技术背景的人来完成,也可以由自动评分系统来评判。通常在面试流程的早期进行。

例子:

  • 4和5(二进制)是多少?答案:4
  • 冒泡排序的时间复杂度是多少?答案:O(n²)

2. 在线编码评估

频率:偶尔

和测验一样,在线编码评估通常也在面试流程的早期进行。面试官会给出一个算法问题,提供格式良好的输入和输出,要求候选人使用在线编码界面编写代码来解决问题。HackerRank 是最常见的在线编码评估平台。LeetCode则是练习在线编码评估中解题技巧的好帮手。不过,在HackerRank上,你通常需要编写代码从标准输入读取数据,并打印到标准输出,如果不熟悉相关API,可能会被难住。

3. 家庭作业

频率:罕见

关于是否应该用算法题来评估个人能力,一直存在很多争论,因为这些题目并不完全符合日常工作中所需的技能。家庭作业的形式就是为了弥补算法面试的不足,让候选人完成更大的项目,从而展示他们的软件设计能力。

然而,这种面试形式对候选人和公司来说都耗时更长,因此在候选人数量庞大的大公司中并不常见。这种形式更多见于初创公司和小型企业。例子:

  • 构建航班列表应用
  • 构建看板应用
  • 构建贪吃蛇游戏

4. 电话面试

频率:常见

电话面试是最常见的形式,每个候选人都至少会经历一次。你将与面试官通过电话或VoIP(BlueJeans/Skype/Google Hangout)交流。面试官会给你一道题目,你需要在在线协作编辑器(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工具生成自己的学习计划——它会根据你剩余的时间,为你推荐适合的编码面试学习方案。这个算法背后包含了按优先级排列的题目,还能平衡所涵盖主题的广度和深度。

练习时可用的资源

市面上有很多资源可供选择,其中不少只是为了吸引你的注意力,甚至只是为了赚钱却毫无价值。如果让我挑出最值得使用的,以下是我会搭配使用的顶级编码面试备考资源:

  1. Grokking the Coding Interview: Patterns for Coding Questions
  2. AlgoMonster
  3. 我的(免费)编码面试最佳实践指南
  4. 我的(免费)编码面试技巧指南
  5. 我的(免费)算法学习指南

AlgoMonster

除了帮助你通过练习和通俗易懂的指南掌握重要的编码面试数据结构和算法题,AlgoMonster还有一个额外的优势:它总结了常见的面试题模式,让你能灵活运用,解决以前从未见过的题目。这款产品由谷歌工程师打造,相比LeetCode那种无序刷题的方式,绝对是高质量的选择。数据结构和算法题覆盖了所有主流语言——Python、Java、C#、JavaScript、C++、Golang等等。立即加入,享受70%折扣→

Grokking the Coding Interview: Patterns for Coding Questions

Design Gurus的这门课程在推荐练习题的基础上,从题目模式的角度出发,扩展了练习方法。这也是我本人非常认同的一种学习方式,而且确实帮助我更好地应对编码面试。这门课程支持你用Java、Python、C++、JavaScript练习精选题目,还提供了这些语言的示例解答和分步可视化演示。学会理解模式,而不是死记硬背答案!立即获取终身访问权限→

我的(免费)编码面试最佳实践指南

如果你看过顶级科技公司使用的编码面试评估标准,可能会被评估项目的繁多和如何稳定展现求职信号弄得不知所措。

这份编码面试最佳实践指南总结了你在编码面试前后应该采取的可操作建议,帮你展现求职信号。

我建议你把这份指南内化,作为练习编码面试题时的辅助材料——确保从一开始就养成良好习惯,形成肌肉记忆。

我的(免费)编码面试技巧指南

有没有一种结构化的方法,能提高你找到优秀解法的概率?如何优化你的解题时间和空间复杂度?我的编码面试技巧指南教你一些处理从未见过的题目的技巧——比如问题可视化、手动解题、把问题分解成子问题等等。

我的(免费)算法学习速查表

我不确定这些能不能算得上深度指南——更像是一页纸的“学习速查表”,涵盖了最好的学习资源、最值得练习的LeetCode题目以及需要牢记的要点。不过,它们能确保你覆盖所有最重要的知识点,尤其当你时间有限的时候。因为这些笔记也曾帮助我成功拿到顶级科技公司的Offer——它们真的有效。

更多关于编码面试准备的技巧,请参阅我的完整编码面试准备指南

尝试模拟编码面试(与谷歌和Facebook工程师一起)

当着面试官的面编码,尤其是第一次经历,可能会让人紧张不已——这就是为什么实战经验如此重要。

interviewing.io 目前是市场上最好的模拟技术面试资源。它让你能预约与真正的谷歌和Facebook工程师进行模拟编码面试,虽然是匿名的。你甚至可以预约针对特定职位的面试,比如移动开发、前端开发、工程管理。更好的是,如果你想更轻松地过渡到真实的编码面试,还可以观看录制的面试视频,了解电话面试的真实情况。

此外,如果你在模拟面试中表现优异,还能解锁“职位页面”,直接预约Uber、Lyft、Quora、Asana等顶级公司的面试。我既做过面试官,也做过面试者,觉得这种体验非常棒。

准备系统设计面试

如果你是中级或高级候选人,可能会在技术面试中遇到系统设计题。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 ——我还没试过,但这是同一团队打造的“Grokking the System Design Interview”的升级版,应该也不错!在我看来,除非你是超级资深或者申请特殊职位,否则可能用不到这个。

查看其他系统设计备考指南和资源

准备行为面试

每家顶级科技公司都会至少安排一轮针对软件工程师的行为面试。通常,软件工程师的行为面试包括:

  • 分享简历上过往经历的细节
  • 提供过去的场景和行为实例,展示某些行为特质(比如冲突管理能力、数据驱动思维)
  • 分享职业抱负和未来规划

尽管这些面试看起来“软性”或不那么结构化,其实还是有结构化的方法来准备行为面试:

1. 掌握STAR格式来回答问题

STAR格式能帮你组织行为面试问题的答案。这尤其适用于需要你回顾过往经历或行为的问题。

  • 情境:分享引发任务的情境细节
  • 任务:解释你需要达成的目标或解决的问题;重点关注:
    • 范围
    • 严重程度
    • 具体的衡量标准或预期成果
  • 行动:解释你为实现目标采取了哪些行动,描述你有哪些选项,以及如何做出决策
  • 结果:描述你的行动带来的结果,以及你从中得到的收获
    阅读更多:回答行为问题的STAR格式

2. 练习软件工程师最常遇到的行为问题

请参阅面向软件工程师的最常出现的30个行为问题

如需了解更多关于行为面试准备的技巧,请参阅我撰写的完整行为面试准备指南

软件工程师录用方案的谈判

最后,你在面试前绝对需要准备的另一件事就是软件工程师的薪资谈判。在面试过程中的任何阶段,都可能谈到薪资话题。我们还提供了有关谈判策略软件工程师薪酬的深度指南。

以上就是我的全部内容——如需了解更多关于软件工程师面试准备各步骤的细节,请通过侧栏或点击下一页,深入阅读我手册中的各个主题!

免责声明
本文档采用基于机器的 AI 翻译服务进行翻译。尽管我们力求准确,但请注意,自动翻译可能存在错误或不准确之处。应以原文语言版本的文档作为权威依据。如需获取关键信息,建议使用专业的人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。


发布者: 作者: 转发
评论区 (0)
U