3个月编程面试训练营 三个月——真的吗?第0周——你应该使用哪种编程语言?第1周——复习你最喜欢的编程语言的基础知识 第2周和第3周——数据结构和算法 第4周和第5周——练习简单的数据结构和算法问题 第6、7、8周——练习更复杂的编程面试问题 第9周和第10周——系统设计面试 第11周——操作系统和并发概念:第12周——面向对象设计面试:文化契合度面试 结论 资源

2025-06-05

3个月编程面试训练营

三个月——真的吗?

第 0 周 — 您应该使用哪种编程语言?

第 1 周 — 复习你最喜欢的编程语言的基础知识

第 2 周和第 3 周 —— 数据结构和算法

第 4 周和第 5 周 — 练习简单的数据结构和算法挑战

第 6、7、8 周 — 练习更复杂的编码面试问题

第 9 周和第 10 周 —— 系统设计面试

第 11 周 - 操作系统和并发概念:

第 12 周 — 面向对象设计面试:

文化契合度面试

结论

资源

最初发表于此处

(背景信息:我曾面试过 Facebook 和微软的数百名软件工程师候选人。我自己也曾在没有准备的情况下失败过几次编码面试。)

我最初写这篇文章是为了回答 Quora 上关于软件工程面试路线图的一个问题。后来,答案变得太长了,我觉得有必要单独写一篇博文。

三个月——真的吗?

让我们先把这个问题解决掉。经常有人问我:如果你是从零开始(比如说,你过去几年都没参加过面试),那么应该怎样安排时间才能顺利通过编程面试呢?

我认为三个月是一个合理的时间框架。没错,就是三个月。除此之外,如果你有一段时间没面试了,至少也要抽出4到6周的时间来准备。如果你在过去12个月左右参加过面试,那么你大概可以节省4到6周的时间。

现在进入正题。以下是 Facebook、谷歌、微软等“大型科技”公司软件工程面试的五个主要部分:

  1. 编码面试(重点关注解决问题、数据结构和算法)。
  2. 操作系统和并发概念
  3. 系统设计面试。
  4. 面向对象设计面试
  5. 文化契合度面试

与任何其他需要持续努力的长期目标(例如准备跑马拉松)一样,遵循某种结构至关重要,因为它会鼓励您在动力可能减弱的日子里坚持下去。

为了帮助你,我制定了一个为期12周的准备计划,你可以按照这个计划来准备你的下一次编程面试。在这12周里,你将以结构化的方式学习上面提到的所有主题。让我们开始吧。

第 0 周 — 您应该使用哪种编程语言?

选择一门编程语言,然后坚持下去。我经常被问到:如果我懂不止一门语言会怎么样?比如,Python 更好,还是 Java 更好?

答案当然是,最适合你编程面试的编程语言是你最熟悉的语言。大多数公司/面试官并不在意,只要你能证明自己精通任何一种主流编程语言就行。

在一些最糟糕的情况下,我见过有人在面试过程中决定“切换”到另一种编程语言。这不仅会让人很失望,还会浪费时间。千万不要这样做。尽早选定一种语言,并坚持下去。

第 1 周 — 复习你最喜欢的编程语言的基础知识

温习一下你选择的编程语言。即使你用的是你喜欢的语言,在日常工作中编写代码时,你也会忘记很多东西。我见过一些人很难记住这些事情,比如:

  • 如何读取/写入文件
  • 如何从控制台读取输入
  • 如何分割字符串
  • 字符串长度是函数还是属性(答案:这并不重要,但仍然会对你产生不良影响)
  • 如何声明和使用二维数组
  • 在 C/C++ 中,如何处理以空字符结尾的字符串

有一次,我看到一位应聘者一头雾水,想不起如何判断一个数字是正数还是负数。(我肯定他们心里清楚——他们只是脑子一团乱麻)。

你花在回忆所选编程语言细节上的时间和精力,与其花在实际解决问题上,不如花在展示你的解决问题能力上。这才是面试官想要看到的。

有些公司,比如 Lyft 和 Salesforce,要求你在笔记本电脑上解决问题。你需要编写完整的程序并通过给定的测试用例。在这种情况下,你可能需要:

  • 处理命令行参数
  • 解析 CSV 或文本文件

当然,你也可以直接用谷歌搜索这些,但那样会浪费时间在必要但无法让你脱颖而出的琐碎任务上。

第 2 周和第 3 周 —— 数据结构和算法

开始复习计算机科学的概念,比如数据结构和算法。你知道,那些你本科时学过但之后再也没看过的概念——实际上在编程面试中非常有用。以下是一些相关资源:

对于数据结构,请访问编码面试的数据结构

对于算法,请访问编码面试算法

记得复习以下主题:

  • 复杂性分析(又名 BigO)
  • 数组
  • 堆栈
  • 队列
  • 链表
  • 树木
  • 尝试(它们实际上是树,但最好还是单独调用它们)。
  • 图(BFS 和 DFS)
  • 哈希表
  • 排序
  • 搜索

第 4 周和第 5 周 — 练习简单的数据结构和算法挑战

当你熟悉(或重新熟悉)数据结构时,开始练习与这些数据结构和算法相关的相对简单的编程问题。大型科技公司的面试通常不会问这些问题。

这类问题通常被用作热身练习。电话面试中也很常见。然而,练习这些编程面试题可以帮助你内化数据结构,并帮助你应对几周后要练习的更难的问题。

通过以下问题来提高你的数组技能:

  • 从数组中删除偶数
  • 合并两个排序数组
  • 数组中第一个不重复整数
  • 查找数组中的第二个最大值

通过以下问题来复习你的链表概念:

  • 计算链表的长度
  • 在单链表中搜索
  • 反转链接列表
  • 查找链表的中间值

通过以下问题来提高你的 Stack/Queue 技能:

  • 对 Stack 中的值进行排序
  • 创建堆栈,其中 min() 在 O(1) 中返回最小值
  • 使用一个数组实现两个堆栈

练习树问题,例如:

  • 在二叉搜索树中查找最小值
  • 查找二叉树的高度
  • 在二叉搜索树中查找第 k 个最大值

练习图表问题:

  • 实现广度优先搜索
  • 实现深度优先搜索
  • 检测图表中的循环

练习基本的 Trie 问题:

  • Trie 中的单词总数
  • 查找存储在 Trie 中的所有单词

练习基本堆问题:

  • 查找列表中的 k 个最小元素
  • 找出数组中最大的k个元素

第 6、7、8 周 — 练习更复杂的编码面试问题

现在您已经练习了几个星期的更简单的问题,现在是时候认真起来并开始练习在编码面试中更有可能被问到的更难的问题了。

对于练习和自动化挑战以及交互式解决方案,请参阅《Grokking the Coding Interview: Patterns for Coding Questions》

解决这些问题时,请记住以下一些准则:

  1. 现在是时候开始计时了。理想情况下,你解决任何一道题目的时间都不应该超过 20 到 30 分钟。(这可能无法立即适用于所有题目。)
  2. 如果你没能在规定时间内解决问题,也不要灰心。即使花了几个小时,也要坚持解决,不要去看答案。这会帮助你建立自信,相信自己能够解决问题,这样你以后就能专注于更快地解决问题。
  3. 开始思考每个解决方案的运行时和内存复杂度。你需要在实际面试中清楚地表达这些复杂性,所以最好现在就开始。

以下是一些需要考虑的示例问题:

  • 实现二分查找
  • 找到两个链表的交点
  • 反转句子中的单词
  • 检查两棵二叉树是否相同
  • 克隆(深度复制)有向图
  • 寻找 Boggle 游戏的解决方案
  • 确定数组中是否有三个整数的总和等于给定值。

你需要在这里学习 2-3 周。如果经常遇到障碍或卡壳,也不用担心——一段时间后你就会掌握窍门。相信我,最初几天看起来不可能的问题,练习过后就会变得容易。为了避免编程面试中常见的错误,你可以访问:如何在 45 分钟的编程面试中避免犯错

第 9 周和第 10 周 —— 系统设计面试

系统设计面试如今已成为软件工程面试流程中不可或缺的一部分——尤其是在申请高级职位时。这些面试对你的“录用级别”有着重大的影响。

学习分布式系统概念,如 Cap 定理、一致性、分区、负载平衡等。

观看课程“Grokking the System Design Interview”以获得更多设计面试练习。

作为系统设计面试的一部分,你需要设计一个“网络规模”的服务。面试官希望评估你描述可扩展服务各个部分的能力,例如:

  • 网络服务器如何实现负载平衡?
  • 数据库如何共享?
  • 大文件如何存储?
  • 如何设置网络以实现冗余和最大吞吐量?

你需要练习如下问题:

  • 设计 Instagram
  • 设计 Facebook 新闻推送
  • 设计优步

以下是一些有关系统设计的有用文章:

第 11 周 - 操作系统和并发概念:

如今,即使是“廉价”的笔记本电脑和手机也拥有多核处理器。无论你构建的是移动应用还是 Web 规模的服务,理解线程、锁、同步等概念都将大有裨益。

就像系统设计面试题一样,多线程和并发面试题也有助于评估你的水平。初级工程师可能会比较难应对这些问题(并且需要在工作中学习更多)。而相对资深的工程师应该在这类问题上表现得更好,因为他们负责编写大量利用多核/多线程的代码。访问“编程面试中的并发”页面,帮助你做好准备。

第 12 周 — 面向对象设计面试:

有些公司会问这样的问题:

  • 设计一台 ATM
  • 设计一部电梯
  • 设计停车系统

在面向对象设计问题中,面试官会考察你对软件设计模式的理解,以及将需求转化为易于理解的类的能力。你会花费大量时间来解释各种组件、它们的接口以及不同组件如何通过接口进行交互。

要了解有关软件设计模式的面向对象编程的一些最佳实践,请参阅软件设计模式:软件开发人员的最佳实践

文化契合度面试

很多人认为这部分面试无关紧要,但有时它却是最重要的。原因很简单:如果你态度端正,就能学到新技能,所以在编程或系统设计面试中出现的小瑕疵很容易被忽略。然而,如果一个人对产品漠不关心,或者看起来不像个团队合作者,即使他是一位优秀的黑客,也可能不值得聘用。

还有一本很著名的书,叫做《拒绝混蛋规则》。公司尽量避免聘用那些可能造成负面影响的人——这样做的长期成本可能非常高昂。公司也不想聘用对产品没有热情的工程师。文化契合度面试就是为了淘汰这类人。

文化契合面试的一些基本规则是:

  1. 展现对产品的兴趣,并展现对产品的理解。(我曾经遇到过一位候选人,他告诉我 Facebook 销售 AWS(存储/计算)等云服务。他甚至使用过其中一项。Facebook 确实收购了 Parse.com 并让它运营了一段时间,但云基础设施从来都不是 Facebook 的主要/核心业务。)

  2. 准备好描述你与队友或经理发生过冲突的场景,以及你是如何解决的。如果你已经做了几年软件工程师,请不要说你从未发生过冲突。

  3. 谈谈你想在公司实现什么目标

  4. 谈谈你作为工程师最近取得的一些/最重要的成就

  5. 谈论您遇到的一些特别疯狂/困难的错误。

结论

准备编程面试需要花费大量的时间和精力,但如果这能让你脱颖而出,证明你已经准备好胜任一份复杂的工作,那就值得了。我发现,始终牢记最终目标的价值很有帮助——在这种情况下,就是获得一份高薪软件工作所带来的个人满足感和经济回报。

资源

供您参考,以下是我在整篇文章中提到的软件工程面试资源的综合列表:

  1. 理解编码面试:编码问题的模式
  2. 编码面试的数据结构
  3. 理解系统设计面试
  4. 编码面试中的并发性
  5. 软件设计模式:软件开发人员的最佳实践
  6. 编码面试算法

我很想知道您是否有任何反馈。如果您有任何问题或反馈,请联系fahim@educative.io 。

文章来源:https://dev.to/fahimulhaq/3-month-coding-interview-bootcamp-5gpl
PREV
破解亚马逊系统设计面试:热门问题及答案
NEXT
如何正确使用 index.js 文件