我们来了,看到了,我们进行了编码练习

看似简单的编码练习如何揭示有关工程候选人的很多信息

多年来,我们要求数百名软件开发人员候选人完成以下练习:

用您选择的语言编写代码,该代码将字符串和任意移位作为输入,并返回使用基本 Caesar Cipher 编码的字符串

这种传统始于我们在工作板上做广告的时候,需要在做手机屏幕之前有效地识别合法候选人。 后来,我们在电话屏幕之后但在邀请某人面试之前使用了它。 尽管问题很简单,但它为候选人的编码风格和能力提供了很好的见识。

我们来看一些事情:

  • 候选人是否积极接受任务? (真实的故事—我们有一位候选人指责我们做这项工作是欺骗他去做“自由工作”并拒绝做这项工作)
  • 候选人是否提出澄清问题? 沟通情况如何?
  • 候选人是否正确解决了问题?
  • 解决方案可以处理边缘情况吗? (常见的漏边情况是处理从“ z”到“ a”的移位,但是较大的移位(例如52)会导致错误)。
  • 方法和变量的名称是否明确?
  • 候选人是否记录了任何假设?
  • 候选人有提供测试吗? 如果是这样,他们写得好吗,是否真的进行了测试?

以下是我们在Ruby中收到的解决方案,它显示出了希望。

此提交是正确的,可以正确处理许多极端情况,并使用了非常适合该任务的Ruby方法String#tr https://apidock.com/ruby/String/tr。

“代码气味”

在马丁·福勒(Martin Fowler)的博客中,“ 代码气味是一种表面指示,通常与系统中的更深层问题相对应”。

在评估提交内容时,我们将寻找某些可能被认为是代码异味的问题。

我们经常看到的一种结构是手动枚举字母,例如(来自真实提交):
alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

这不仅写起来很繁琐,而且跳过字母,颠倒字母也很容易测试。 与其使用人工枚举,我们更希望候选人利用他们选择的编程语言的内置功能。 在红宝石中,这可能是:( ('a'..'z').to_a + ('A'..'Z').to_a 。 在python中, list(string.ascii_lowercase + string.ascii_uppercase)

另一个常见的构造是使用幻数。 以下是来自Ruby的真实提交:

此提交显示了魔术数字的大量使用

如果要验证此代码,则需要提取ASCII表以提醒自己64、91、65、96、97和123分别对应什么。 我更希望看到’A’.ord超过95。 精通 读者会注意到,该示例也无法正确处理较大的移位,并且可以受益于模运算符的使用)。

“奖励积分”

另一方面,我们会发现有些东西我应该放在奖金类别中,这不是必需的,但值得赞赏。 一些例子:

  • 候选人是否意识到解密只是“负加密”,并添加了利用这一事实的解密方法?
  • 候选人是否对要支持的字符,如何处理数字等做出合理的假设?
  • 候选人是否为代码选择了良好的传递机制? (信不信由你,我们偶尔会在Word,智能引号等中提交内容)。

代码演练

如果我们决定继续进行面试,我们将打印出候选人的解决方案,并与他们进行实时审查。 代码演练通常对于了解更多有关候选人的信息非常有帮助。 我们可以评估以下内容:

  • 他们如何清楚地解释他们的工作?
  • 他们对建设性批评有多大反应?
  • 如果我们解释一个替代解决方案,那么他们的效果如何?
  • 我们是否确信他们确实提出了这个解决方案(而不是仅仅复制他们在网上找到的内容,也许是不完全了解)?

发送反馈

另一方面,如果我们根据解决方案排除了候选对象(但仍然认为他们已经做出了合理的努力),即使没有明确要求,我们也会尽力发送有关代码示例的建设性反馈。 尽管此后续行动有时会默默地返回,但收到感谢的答复并不罕见,我们认为这是做正确的事情的一部分。

关于这一点,这是我在此博客上的第一篇文章,感谢您的反馈!