我失败了FizzBu​​zz,您会雇用我吗?[关闭]


27

我是一名拥有CS学位的开发人员,并且具有将近3年的使用多种语言进行开发的工作经验。

今天,我接受了一次采访,总体来说进行得很好,我为大多数问题做好了准备,并为任何事情做好了准备。在面试结束时,他们给了我一个编程问题……一个像FizzBu​​zz的问题(没有打印出数字部分)。我相信我犯了太多错误,因此“失败”了。所有的希望都对我失去了吗?

这是我的代码:

  void FizzBuzz()
  {
    for(int i = 0; i <= 100; i++)
    {
      bool isThree = i % 3;
      bool isFive = i % 5;

     if (isThree)
     {
         print "Fizz\n";
     }
     else if(isFive)
     {
         print "Buzz\n";
     }
     else
     {
         print "FizzBuzz\n";
     }
  }
 }

如您所见,我搞砸了应该具有语法i%3 == 0;的布尔值;如果我没记错的话,我还用isThree && isFive放置了else而不是elseif。我感到非常紧张,但这并不是错过一个简单问题的借口。

因此,问题是,相对于其他因素(例如经验和个性),能够在现场生成工作代码有多重要?例如,上面的代码会破坏交易吗?


31
我认为您使用模运算符的事实已经足够好
Ryathal

9
当数字既不是3也不是5的倍数时,您也不会打印出数字。您没有在发布此问题时也没有提到这一事实也会令人非常怀疑。
whatsisname 2012年

13
谁能代表您的面试官回答这个问题?
pdr 2012年

5
相切建议-做项目欧拉问题1-10,您将处理许多标准类型的问题,这些问题将作为“您可以编程-编写此代码”

20
我不认为我会雇用未能写FizzBu​​zz的人,但是恕我直言,您未能在白板上完美地编写语法,这是另外一回事。
萧伯纳

Answers:


44

FizzBu​​zz的要点是表明您实际上知道如何编程,而不是表明您已经记住了要求使用该语言编写的所有更好的语法规则(尽管这很重要,如果他们想知道自己的编程经验如何,您使用的语言)。

如果您在面试环境中感到压力很大,并且可以表明您了解自己所犯的错误,那么我就说您通过了。


同意,不是要暗示我是在记住答案。就是说我觉得自己是一个能力很强的程序员,但是觉得只遇到一个编程问题而不是做得不好,这确实反映了我的能力。他们也没有对这个问题说任何话。直到上车开始开车回家,我才意识到自己的错误。那是OMG的原因!!反应。
ja_programmer 2012年

他们是否首先给您FizzBu​​zz问题?如果他们没有立即结束采访,您就通过了。访谈者除了考虑简单的编码测试外,还考虑其他因素。好的雇主希望那些知道如何认真思考和解决问题的人。
罗伯特·哈维

他们大部分时间都在询问我有关履历的问题,询问我使用过的各种技术以及如何使用它们。然后他们问我编程问题。然后他们问我有关我自己的问题。然后我问了几个问题,我握住他们的手离开了。
ja_programmer 2012年

4
当不再有雇用您的兴趣时,优秀的面试官将终止面试,如果您未通过测试,应在FizzBu​​zz之后立即发生。这并不意味着他们仍然会聘用您,而是意味着您不会失去面试机会。
罗伯特·哈维

4
@RobertHarvey-并不是每个人都会在那之后切断采访。我和最近的候选人在FizzBu​​zz上失败了,我继续了面试,试图看看他是否可以挽救事情。换句话说,由于面试的压力,我愿意答应错过练习。

26

我采访过的大多数人由于次要语法或略微偏离逻辑而使代码练习部分失败,最终成为了更好的选择。

对我来说,弄清逻辑的核心思想(您所做的事情)并将其从代码角度转换为体面而简洁的东西(我认为您大多数情况下这样做)对我来说,比使它绝对完美更重要。

我购买IDE是因为它的语法检查而不是为其雇用开发人员,您会在第一次调试时就意识到其他错误。

您从最初的要求直接进行了第一次尝试,而没有做任何可怕的事情。在许多环境中,这比没有反馈的情况下的完善更有价值。如果雇主对您错过的细节挂了电话,那可能仍然是环境的信号。

如果任务是打印数字的变体,那么缺少细节可能会有点糟糕,但是如果我不喜欢您,那么就没有足够的分量来改变我的决定。

[编辑]正如Alex所指出的,它也具有反应和镇静方面。就个人而言,在尝试实际练习之前,我试图通过尝试使受访者对他们的经验有所了解,但有些人可能选择将两者结合起来,以消除这些障碍。我每隔一段时间就会遇到一个只有教科书知识的人,他们在理论和背景问题上一路过关斩将,但认真地迷上了从实践开始的地方。有些人甚至不知道从哪里开始。

这些人正是我要通过此练习淘汰的对象。

因此,除非您花了20分钟让面试官弄清要求,否则我认为您的解决方案或多或少是您的第一次尝试,可能随着您的进行了一些更正。如果您在5分钟内得到了上述认可,那么您可以证明自己可以满足我的标准。


2
比尔,我只想感谢您的详细反馈。很高兴得到其他一些观点。在如此简单的事情上犯错误,并且知道自己比这更好,这真令人沮丧。
ja_programmer 2012年

1
让我确认比尔刚才说的话。这种测试的主要目的是查看人们在压力下的反应。在这些条件下工作时,您不应被视为完美的程序员。您只需要...工作。真。只是希望您尽力保持镇定并尽可能地面对问题。那正是你所做的。
AlexBottoni

不仅不打印数字,还是无法识别在15个数字中您不打印Fizz或Buzz而是FizzBu​​zz。它不能很好地解决问题。imo何时打印“ FizzBu​​zz”是此难题的最重要元素。
Pieter B

我没有使用这个特定的示例,因为许多合同公司都有候选人记住它,但是根据我的经验,在这些练习中犯“ oh duh”错误的人通常会成为更好的同事。他的逻辑是从正确的地方开始的,没有很多多余的废话,那很好。他错过了您在第一次编译中会看到的东西。我宁愿让他们在15分钟内犯错3次,然后比花30分钟开始的家伙好。
2012年

@Bill-您看到此问题的什么样的答案?我只是不明白,那些没有上过编程课的人怎么可能至少不了解我所说的那么多。我写道,可能在一分钟到一分半钟之内,花费这么长时间的唯一原因是因为我同时在白板上讲话和写字。
ja_programmer

15

如果我没有其他事情要继续,上面的代码可能对我来说是一个麻烦。如果他们遵循Microsoft的面试方式,那么向您提出此问题的人可能会阻止您-通常就是全部。

让我感到困惑的是,面试官没有问您有关此代码的问题。一个好的面试官已经看到了足够多的自己的代码,以知道人们会犯错误,尤其是在急事中。他们通常会说:“现在,您发现这段代码有什么问题吗?” “不?好,让我们测试一下”。您提出了一些结果集,然后通过函数运行它。然后您说:“哦,该死,这没用。” “好吧,您将如何解决它……”等等。如果您在那个对话框中幸存下来,那么它实际上会给人留下深刻的印象,并表现出批判性思考,提出测试用例以及调试自己的代码的能力。

另请注意,他们通常不寻找“工作代码”。谁生产的还是第一次尝试?但是在逻辑上正确进行错误处理和良好的测试集是一个不错的目标。

此外,这可能会让您感到惊讶,但您正在与许多甚至无法开始使用fizzbuzz的人竞争。我们倾向于假设其他人都在睡眠中遍历b +树。...但实际上,他们甚至无法找出3和5的倍数,而无法使用模运算符。您可能会比其他候选人做的更好而感到惊讶。

我的建议是,只需将其清除即可。我最近在大型软件公司(微软,亚马逊等)进行了采访,这是我第一次经历如此全面的采访过程。在一次Microsoft现场采访中,我愚弄了自己,主要是因为神经,而且,我只是不知道该期待什么,或者他们到底在寻找什么。我提出了一条最短路径问题,但只是为了解决一些非常简单的问题。我从错误的栈尾弹出值,忘记了一个int atoi(char* value)实现int val = value[i] - '0';会给我这个字符的整数值,以及其他一些愚蠢的错误。我大部分时间都对这次采访感到满意,但仍然理解为什么我没有收到录取通知书。我必须意识到,这与其说是对我能力的反映,不如说是我需要不断尝试直到能够掌握自己的神经的指标。最终,我在面试中遇到了更棘手的问题,找到了我梦dream以求的工作。对于大多数实际上知道自己在做什么的人来说,这实际上是要弄清楚面试官想要什么,对自己有信心并将其给予他们。需要一段时间


我同意代码对我来说也是一个破坏交易的地方(我曾在某些负责审查代码的负责人职位)。我希望他们能问我一些编程问题,并在需要时采取我认为是解决问题的“传统”方法。就像您提到的“看到此代码有什么问题”一样,我会立即得到提示。我没想到FizzBu​​zz,并认为这是速度的锻炼。我def很紧张,前一天晚上没有睡很多。很高兴听到您获得理想的工作。虐待继续采访以获得我的!
ja_programmer 2012年

@ja_programmer很好,fizzbuzz是一种速度练习。您应该在不到2分钟的时间内完成。他们不是在测试您的问题解决能力,而是在测试您的快速编写简单代码的能力。我还被问到“您认为此代码有任何问题吗?” 当代码完全正确并且他们只是在试图衡量我的信心或让我生气时-还没有决定。
乔纳森·亨森

好点,他们可以说,如果是正确的话。但是,我确实认为在这种情况下,我需要在头部正确打上“可能会遇到此代码的问题”。如果我像普通人一样经历了一个简单的测试用例,我会发现我的逻辑是错误的。另外,关于您的问题,我将同时介绍两者;)
ja_programmer 2012年

2
为+1 No? Well let's test it。我要求候选人在面试中写下嘶嘶声。我也让他们写一个单元测试。有时他们的嗡嗡声失败,但是他们的单元测试检测到了这一点,导致他们进行了解决-很好。被拒绝的人是编写失败的解决方案然后编写无法检测到此问题的测试的人。我问他们,您对这项测试满意吗?
Qwerky

12

我不得不说不,但这不是出于您给出的原因,而是您将FizzBu​​zz部分放在最后。通过代码的工作方式,它将永远不会在您期望的时候打印FizzBu​​zz。正如Lee所说,它将为每个被3或5整除的值打印它。

但主要的一点是您可以从中学到东西。我喜欢您在这里问如何做得更好的事实。确保您做一些代码难题并研究常见的面试问题。另外,也许尝试自己安排时间或做其他会增加压力的事情,以便您可以模仿在面试中会得到的感觉。如果您真的想把采访从公园里赶出去,请为采访做准备,准备和做更多的准备。


3
它将打印FizzBu​​zz每当i不被3整除或5

1
是的,我知道。我真的不知道我在想什么。
ja_programmer 2012年

@Lee对不起,您是对的,我的意思是,当他想要时,它永远不会打印。
David Peterman

1
@mattnz不,但是我确实希望拥有3年经验的人能够编写一个有效的if语句,即使他们弄错了,也能够准确地告诉我他们出了错。(对OP没有冒犯,只是想尽可能地诚实)
David Peterman 2012年

6
@mattnz:我不必担心错误和编译,而不必担心程序逻辑完全错误。我可以忍受isThree = i%3错误,但是“ else print FizzBu​​zz”部分对我来说很致命。我可能会给受访者一些微调,以查看他们是否可以解决该问题,但如果不能解决,那将是一个大问题。
Misko

9

不。FizzBu​​zz的要点是看您是否能够算出涵盖所有情况的基本条件逻辑。与某些人的看法相反,FizzBu​​zz与模运算符无关,它了解三元运算或布尔操作数。这是有条件的简单练习,但您失败了。

问题的结构使得所有看起来“优雅”的代码都无法涵盖至少一种情况。

可接受的答案:

if div3 print fizz
if div5 print buzz
if !div3 && !div5 print x


if div3 {
    print fizz;
    if div5 {
        print buzz;
    }
} else {
    if div5 {
        print buzz;
    } else {
        print x;
    }
}

2
您的第二个示例太令人困惑了。
布赖恩

7

我给人们在白板上要做的琐碎的编程问题。最终的代码是否没有错误根本不是决定点。相反,我关心代码编写过程中表现出的许多行为。它是交互式的,在它正在发生的过程中,我正在学习有关候选人的大量知识。

在采访中,我将在“测试”白板上进行更详细的介绍:备份(白板)代码的合法方法?

当然,您的面试官可能与我不同。但是,您完全有可能在制作代码时花了我很小的一部分时间就接受了我的采访,并且完全有可能因相同的代码而失败。


1
感谢您的链接。这是一个很好的阅读。这是几年前我在面试准备班上听到的所有事情。希望在上一次面试之前能听取您的建议。我没有被问到任何问题,但是我也没有得到任何信息。好吧,也许有点,但是我认为大部分都含糊了。我会谨记您的建议,并在以后的一次(希望很快)面试中使用它。谢谢!!
ja_programmer 2012年

4

如果我对此进行了评估,那么我将寻找以下内容:

  1. 候选人在继续实施之前是否会尝试对需求有清楚的了解?候选人是否想解决我的问题或在其编程工具箱中使用其宠物工具?候选人如何解决问题?
  2. 候选人是否能熟练使用至少一种编程语言?
  3. 候选人是否掌握布尔逻辑?
  4. 候选人将如何确保其解决方案的质量?
  5. 候选人如何回应有关其代码的反馈?

-

关于#1很难说。您的问题表明您的问题不包括“打印号”部分,而您的解决方案实际上并不包括该部分。我别无选择,只好信守诺言,但实际上,如果这是经典的FizzBu​​zz问题,其中包括打印任何一个都不可除的数字,那么听起来您在完全理解要求之前就跳到了一个解决方案,这将是一个标记。

我会给您#2和#3的部分信用。您知道使用模运算符,并且具有工作解决方案的结构,但是错过了两者的一部分。

听起来您没有做#4,这会使您感到沮丧。将来,我建议您退后一步,在完成之前先查看您的解决方案。我还将(没有提示)逐步完成几个针对您的解决方案的单元测试,这些测试将迅速证明您的问题所在。

他们没有给您机会#5,这很不幸。但是关键是我不希望有人认为他们编写的每一行代码都是纯金,无法加以改进,而是希望有人愿意接受有关其解决方案的反馈并参与有关其方法的对话。

-

因此,如果我仅就此进行评估,我将投票“不雇用”。诸如此类的事情是在衡量表演艺术而不是编程能力,但是掌握它仍然可以帮助您的事业。因此,我对未来技术面试的建议是:

  1. 面试之前,应尽量少使用外部资源,进行一些这类冷训练。不是要记住解决方案,而是要确保您对首选语言感到满意

  2. 提出有关问题的问题以验证您的假设。

  3. 在宣布您的解决方案完成之前,请从白板上退后一步,看一看,并逐步介绍几个简单的单元测试用例。


尽管我同意将其作为基本面试目标,但这并不是嘶哑的重点。Fizzbuzz仅衡量一件事和一件事。您可以快速正确地编写简单的代码吗?通常,访问员希望在2分钟内完成此问题。我知道,这还不是全部,但这是问题的目的所在。
乔纳森·亨森

1
fizzBu​​zz的重点在于面试官希望达到的目标。如果我要使用fizzBu​​zz或类似的练习,这就是我想要的。
JohnMcG 2012年

1
当然,任何面试问题都是面试者想要用来评估他们感兴趣的事物的任何事物。我的观点是,FizzBu​​zz对于评估除“他/她能否快速编写正确的代码?”以外的其他问题而言是一个非常糟糕的问题。衡量批判性思维技能在技术上并不具有足够的挑战性。如果有人认真地迷上了这个问题,您是否还希望他们加入您的团队?这就好比雇用无法进行基本演算的工程师。尽管每个人都想确保工程师了解他的基本演算,但他这样做确实是不可商议的。
乔纳森·亨森

2

在不允许他们获得解决方案反馈的能力的情况下要求某人解决问题是一个有问题的方法,因为不允许他们进行改进。

所有这些测试告诉我们,您没有展示出非常好的“头顶”问题解决能力。

这可能是决定是否雇用您的因素之一,但对我而言,绝对不是唯一的因素。

如果他们为您提供了单元测试或执行环境,那么您犯的错误就不太可能被原谅了。


1
有时间和地方可以提高自己的能力,但是面试不是。
RokL 2012年

您是否暗示招聘人员不应该在乎应聘者的自我完善能力?
guillaume31 2012年

1
在超过一个小时的时间范围内改善自己。对招聘者而言并不重要。
whatsisname 2012年

我确实认为,考虑到问题有多容易,即使我承受压力,我也不应该犯任何错误。话虽这么说,但我确实认为,如果面试官稍微推挤候选人,这样的问题就有理由“改善”。甚至说出一些简单的话:“您认为您可以完全改善吗?” 会给应聘者一些不正确的提示,否则他/她可以做得更好。我没有这样的评论。
ja_programmer 2012年

@whatsisname:我认为这对招聘者来说很重要,但不是您可能认为的那样。如果应聘者被拒绝,招聘人员需要反馈以了解原因,以便他将来可以向公司提出更好的应聘者,并指导该应聘者如何使其成为将来更强大的应聘者。我认为那里有互惠互利的空间。
alroc 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.