关于通过白板面试的最佳建议

50 阅读8分钟

白板式面试在科技行业无处不在。对于那些没有这种乐趣的人来说,白板面试是要求候选人在面试时在白板、纸或电脑上解决技术问题的做法。这种环境会让人感觉像一个压力锅,甚至会让最有能力的工程师崩溃。

在这篇文章中,我打算把我收到的关于通过白板面试的最佳建议传递给大家。请注意,我不打算讨论白板面试的公平性或有效性,因为,作为被面试者,我们目前不得不面对它们。

建议:沟通!

我收到的、可以传授给你的最好的技术面试建议是:沟通、沟通、沟通!这似乎是反常的。这似乎是一个反传统的建议,但我希望能够向你证明,这实际上是在面试前准备的最重要的技能。

注意:当我在本文的其余部分讨论例子时,它们会有一个软件工程的倾斜,因为这是我最熟悉的领域。尽管有这种倾向,你可以将这些技能应用于任何白板式的面试。

沟通是什么意思?

假设你在面试中,面试官向你抛出一个白板问题。你会走到白板前,狂热地开始解决问题吗?

不会!这往往是每个人都会遇到的问题。

这往往是每个人的本能,但这绝对不是正确的方法。即使你认为你理解了这个问题,你也应该在前进之前采取一些非常重要的步骤。

首先,重述问题

你明白他们要求你做什么吗?证明这一点。为他们重述问题并寻求确认。实际上,你可能会惊讶地发现你并不完全理解他们的要求--也许这个问题与你过去完成的一个练习题相似,但不一样。用久经考验的fizz-buzz例子,你可以把问题重述如下。

"所以我想向你重述这个问题,以确保我明白你在寻找什么。我的函数的唯一参数将是一个整数。我的函数的唯一输出将是一个递增数组,从数字1开始到输入数字结束。如果一个数字是3的倍数,输出将是fizz 。如果一个数字是5的倍数,输出将是buzz 。然而,如果输出是3和5的倍数,输出将是fizzbuzz 。我的理解是否正确?"

面试者应该给你肯定,或者,你的理解是不正确的,他们会帮助你理解。在任何情况下,重述问题都不会对你造成伤害--它表明你能清楚地表达一个问题,并在讨论时给你时间仔细思考一下。此外,以这种方式开始讨论将有助于平息一些在试图解决实际挑战时可能出现的紧张情绪。

询问边缘案例

现在还不是对解决方案进行编码的时候。思考一下输入和预期输出,想想问题的潜在边缘情况。问一下这些问题。在许多情况下,面试官甚至没有想过边缘案例,他们会编造一些东西。这很好--这表明你善于分析,并会努力工作,试图防止错误(这往往是由于边缘情况而出现的)。 让我们用fizz-buzz的例子。在成功重述问题后,询问边缘案例的有效方式如下。

"现在我确认了对问题的理解,我想问一些潜在的边缘情况。有没有可能输入的是数字以外的类型?如果是这样,这个函数应该怎么做?输入可以是0或负数吗?同样,如果是这样,该函数应该做什么?"

询问测试案例

这是免费的,你应该利用这个机会。简单地问一下,是否有任何测试案例是该函数应该通过的。你的面试官可能期待你问这个问题,所以这可能是必要的。但也有可能面试官没有料到这个问题,会想 "啊,这个候选人知道测试!"

编写伪代码并询问是否有意义

同样,你实际上并不想开始用一种实际的语言写代码。你会发现自己被试图记住语言的方法或其他特异功能所限制,而不是试图想出正确的逻辑。相反,让你的面试官知道你将从写伪代码开始,以后再填入实际的代码。(巧合的是,这也是一种写实际代码的合理方式)。重点来了:你可以问面试官你的伪代码是否有意义。他们有可能是那种不想 "给你提示 "的人,但也有可能他们对你的思维方式更感兴趣,想和你讨论你的伪代码。当我面试候选人时,我对后者更感兴趣--我们很少在真空中真正开发软件。

换句话说,在最坏的情况下,面试官会告诉你继续,而不会真正提供反馈。在最好的情况下,面试官可能真的会指出你的伪代码中的逻辑缺陷,这将使你在过渡到实际代码时得到一些严重的好处。

超级奖励:如果你的伪代码看起来不错,但你最终难以将其转化为实际代码,那么你现在实际上已经赢得了很多分数当然,在一些精英公司,他们不会接受除了功能代码以外的任何东西,但仅仅是能够通过伪代码进行推理,对于许多伟大的公司来说已经足够了。

为了保持我们的fizz-buzz例子,让我们假设我们想出了以下的伪代码。我们最终会用javascript写代码,但在这一点上几乎不重要。

function fizzBuzz(n) {
  // If n is not a number or not an integer greater than zero, return null
  // create empty array to store output
  // Loop through numbers from 1 to n
  // If number modulo 3 is zero, add 'fizz' to output array
  // Else If number modulo 5 is zero, add 'buzz' to output array
  // Else If number modulo 3 is zero and number modulo 5 is zero, add 'fizzbuzz' to array
  // Else add the number to the array
  // return output array
}

在这一点上,你可能会意识到,你永远不会到达第三个else-if 语句。另外,当你和面试官确认你的伪代码时,他们可能会免费提供给你(说真的)。在这种情况下,你可以重写你的伪代码,确保你先检查第三个条件。

function fizzBuzz(n) {
  // If n is not a number or not an integer greater than zero, return null
  // create empty array to store output
  // Loop through numbers from 1 to n
  // If number modulo 3 is zero and number modulo 5 is zero, add 'fizzbuzz' to array
  // Else If number modulo 3 is zero, add 'fizz' to output array
  // Else If number modulo 5 is zero, add 'buzz' to output array
  // Else add the number to the array
  // return output array
}

写出实际的代码并询问它是否看起来不错

最后开始写代码你现在应该把你的伪代码转换成实际代码。你甚至不需要去掉注释。在这一点上,你只需要为你的语言插入适当的代码。如果你忘记了一些语法或方法名称,你应该能够向面试官询问这些信息,而不需要太多麻烦。如果他们给你带来麻烦,你就说你暂时把它当作伪代码。

function fizzBuzz(n) {
  if (isNaN(n) || !Number.isInteger(n) || n < 1) return null;

  let output = [];

  for (let i = 1; i <= n; i++) {
    if (i % 3 === 0 && i % 5 === 0) {
      output.push('fizzbuzz');
    } else if (i % 3 === 0) {
      output.push('fizz');
    } else if (i % 5 === 0) {
      output.push('buzz');
    } else {
      output.push(i);
    }
  }

  return output;
}

在这一点上,不要犹豫,问你的解决方案是否好看!如果不好看,他们可能会给你提供一些建议。如果不好,他们可能会提供一些提示来改进它。所有这些沟通都会为你加分--如果你愿意客观地讨论如何改进你的工作,你会显得很有条理,也更容易与之合作。

陷入困境?求助!

如果你在工作中遇到困难,寻求一些帮助并不违法。只要用对话的方式来表达。比如说。

"我在这里有点卡住了,你有什么提示可以让我往正确的方向走吗?"答案可能是 "没有,我想看看你是否能自己解决这个问题",但也很可能是 "是的",并提供一个有用的提示。

奖金:在面试前进行沟通

在面试之前,你应该有一个人力资源或面试的联络点。你是否好奇面试中是否会有编码部分?问他们吧!此外,你可以询问是否有什么特别需要准备的东西。他们很可能会给你提示,比如指定他们会用什么语言提问,问题的数量,问题的风格(例如,开发一个算法与找到错误)。他们可能会告诉你,你是坐在电脑前还是站在白板前--这些都是非常有用的信息,你可以用来练习,或者至少在心理上有所准备。

我们都是人

最重要的是,记住我们都是人。你的面试官曾经处于你的位置,了解技术面试的压力。你的面试官可能已经看到了相当多的候选人在挥汗如雨,但可能很少有公开以对话方式讨论问题的人。如果你能做到这一点,你就会有很好的状态。