给在Facebook上进行面试的程序员候选人的提示



去年,我花了无数小时来面试Facebook各个职位的候选人。 而且,自从现在以来,我有机会访问了甄选过程的两个方面,我想为您提供帮助-试图获得人生首次实习的学生,经验丰富的开发人员准备迁移到另一家公司,或者想要进入编程领域的人来自完全不同的专业环境。

在本文中,我想概述从在Facebook上采访程序员的经验中学到的最重要的课程。 我希望他们能阐明这一过程的某些特征,这些特征非常非常令人筋疲力尽。

格式


程序员的面试通常以对话的形式进行,持续45分钟,目的是测试您对数据结构和算法的了解。 实习生通常只需要进行一次面试即可展示其代码编写技能。 高级开发人员可能需要参加两次或三个代码编写访谈,一次或两次面试,以测试他们的系统设计技能,以及参加一次单独的会议以评估其个人素质。 在这里,我只会谈论代码采访。

最近有人问我:“如果我不能马上找到解决这个问题的办法怎么办?” 我回答:“好吧,如果正确选择了任务,那么您不应该立即找到它。” 否则,有什么意义呢? 面试的目的是了解您在编程方面的表现。 在Facebook团队中,回答此问题的信息称为信号。 面试官力求从他身上获得最大收益。 换句话说,如果我们了解您已经熟悉建议的任务,那么我们的责任就是给您另一个。

我们需要看看您如何处理困难。 如果您偶然地直接从《破解编码访谈》中背诵解决方案,那么我们对您解决问题的能力一无所知。

面试最佳实践


最好的候选人中最好的候选人成为面试的动力-他们自己进行交谈,实际上不需要公司员工将他们推向正确的方向。 通常,此类程序员一时兴起,没有外界提示,执行以下操作:

  1. 提出澄清的问题。
  2. 分析解决方案选项的优缺点
  3. 草稿代码
  4. 显示解决方案实施
  5. 测试您的解决方案

不要将主动性与仓促混淆。 积极的态度并不意味着您应该立即着急编写代码。 相反,如果您在对话的前五分钟启动代码,则可能会严重破坏印象。 进行出色工作面试的第一步是巧妙地澄清问题。

巧问问题

在做出决定之前,您需要充分了解问题。 一些周到的改进可以严重增加您的成功机会。 以下是一些示例:

  • 是否需要在没有额外内存的情况下完成此操作?
  • 我们应该关注什么输入?
  • 更重要的是性能还是低内存消耗?

这样,您可以专注于真正重要的事情,而将其他所有事情都抛诸脑后。 知道您无法思考的内容与知道需要特别注意的内容一样有价值。

不要想

候选人经常会开始自己添加某种推测(变量只能是正数,数组不能为空,所有输入数据都是安全的)。 这是一个严重的钟声。 切勿调整条件,以便您更方便地找到解决方案。 问一下

“我们是否假设所有价值观都是积极的?”

没有地方比这容易。 如果他们回答“是”,那就太好了。 无需其他检查。 如果没有,那么一个条件语句就足以保护您的代码免受任何机会。 通常,借助此类问题,您可以指示需要朝哪个方向移动。

解决方案选项

面试官非常喜欢应聘者强调几种解决方案的时间。 这表明您了解:您可以从不同的角度来处理任何任务,更重要的是,它迫使被访者在没有您直接要求的情况下告诉您。 e!

我们不能只是为您找到正确的答案。 但是,如果您提出A和B这两种选择,然后问:“您认为哪种方法在这里更合适?”,那么我们当然会选择看起来更像所需的方法。

以代码形式起草您的解决方案

在技​​术面试中,最经常需要在黑板上写字。 因此,在所需的时间和位置插入运算符将不起作用。 在开始写作之前,您应该对要做什么有个好主意。

深呼吸,开始计划代码。 它可以是草稿代码,也可以是方案,主要的事情是您知道将在其中使用哪些数据结构以及您会感兴趣的变量。 我认为没有人希望他的工作结果看起来像这样:



编写实现

在这个阶段,一切通常都停滞了,尽管它本来就应该停滞不前。 从理论上讲,解决方案的实施是最简单的。 您问了一些聪明的问题,考虑了不同的方法,然后想到了算法-剩下的就是画所有东西。 同时,不要忘记...

交流!

大声说出来。 如果我根本不知道您在想什么,很难带您到达需要的地方。 如果您将您带到错误的地方,我会介入。 如果您朝着正确的方向前进,我很可能不会打倒您。

但是,必须作出警告:个人面试的风格决定了很多事情。 有人在决策过程中进行更积极的干预,有人更喜欢远离。

测试中

奇怪的是,这一步骤经常被忽略。 我要说,在我面试的开发人员中,有98%的开发人员应该更加注意检查他们的决定。

在面试开始时,通常会给候选人和任务一起提供测试选项。 解决方案的工作完成后,他们将通过相应的测试运行代码。 但是有一个问题:我们为您提供最原始的测试选项。 通常,它不会影响临界情况,也无法根据需要检查代码。 使用这些参数,您的算法可以提供所需的输出;使用其他参数,则可能无法提供。

在技​​术面试中炫耀的最简单方法是编写测试。 越多越好。 越努力越好。 越全面,越好。 在大多数情况下,这可以让您在我指出错误之前捕获错误。 这样的事情对你有利。

如果您不知道该怎么办该怎么办


同样,如果您被赋予任务但又无法立即找到解决方案,该怎么办?
分阶段进行。 请记住:也许这个任务在您看来与您之前完成的任务相似。 我在访谈中提出的许多任务都是基本任务,在研究算法和数据结构的任何课程中都会分解这些基本任务,但是会有颠覆性。

如果什么都没想到,请不要惊慌。 一切都很好。 不必担心立即找到最有效的解决方案-从最简单的解决方案开始。 然后,将其作为起点,请思考:这里的瓶颈是什么? 最需要优化的是什么? 如何进行优化?

利用数据结构来减少系统缺陷。 当您需要提高算法效率时,通常(尽管并非总是如此)可以抢救数据结构。 它们中的每一个都有其优点和缺点(哈希表是数据搜索的速度,二进制搜索树正在对它们进行排序等等)。 当您由于一个或另一个数据结构的强度而设法解决某些瓶颈时,将获得最佳解决方案。

好吧,例如,您有一个任务:

给定建议,计算字母表中每个字母出现的次数。

如果使用穷举搜索方法,则必须依次计算每个字母,然后将数据汇总为最终结果。 该方法的低效率在于需要存储和搜索信息:我们保存收到的每个字母的数据,然后将其提取以形成总结果。 如果查看可用的数据结构,您会发现其中一种在我们需要的方式中脱颖而出:

  • 二叉搜索树
  • 数组
  • 哈希表
  • AVL树
  • 叠放

哈希表最有效地存储和检索数据。 如果您使用它,则无需分析提案26次-一次就足够了。

寻找线索


通常会在编程任务中引入一些线索,从而为更方便的解决方案开辟道路。 通常这是一件小事,这是一种不寻常的情况,由于这种情况,您可以比其他初始情况更有效地执行操作。 检查您的任务中是否有类似的内容。

比方说:

给定两个整数类型的排序数组,A和B; 假设A可以容纳B中的所有元素;并且A可以合并B中的所有元素。 数组中已初始化元素的数量分别为m和n。

该任务直接取自《如何破解编码面试》一书。 注意到一个线索? 我们可能只给两个合并数组,但没有:在我们的场景中,一个完全放在另一个数组中。 这就是我在说的。 如果您注意到这样的保留,请注意它们不是偶然包含的。

在这里,自由空间使您有机会优化合并过程。 完整的解决方案可以在这里查看。

寻求帮助


有时候,您经历了所有步骤,但始终处于死胡同。 在这种情况下,您只需要联系面试官寻求帮助。

从我们静默坐着十分钟的事实来看,任何人都不会变得更容易。 如果您真的不知道该怎么办,寻求线索将是最好的出路。 我们每个人都不时需要提示。 一切都决定了您将如何使用它。

总结


技术面试是与我们从毕业和大学入学中学到的相同的标准化考试。 任务在细节上有所不同,但是基本概念和解决方案策略或多或少仍然是标准的。

许多候选人对简单的事情不屑一顾:他们考虑自己的条件,不发表思想思路,对自己的决定进行不充分的测试。 所有这些错误都可以纠正,“绝对不能”可以变成“错误”。 使用我在本文中介绍的系统,您将处于良好状态。

Source: https://habr.com/ru/post/zh-CN473018/


All Articles