FizzBu​​zz的有效性及超越[关闭]


38

作为面试过程的一部分,如今,我们最初要求求职者进行“ FizzBu​​zz”,如今,能够正确回答FizzBu​​zz的求职者比例已急剧增加-这可能是由于其在网络上的流行。

大约一年前,作为第二个问题,我们开始提出一个与原始FizzBu​​zz非常相似的问题。该问题的设计与原始的FizzBu​​zz一样简单,还可以评估候选人的特殊能力,特别是以有意义和合乎逻辑的方式对一组“业务规则”进行排序和优先排序的能力。任意顺序。该问题的措词最初似乎有点含糊,这可能使非英语母语者难以理解,但如果可以通过认真思考解决问题-这也使应聘者有机会提出问题进行澄清,这始终是一件好事。

我们发现作为开发人员,这是一项非常重要的技能,因为软件开发通常基于功能要求,这些功能要求随时间推移没有特定的顺序,这可能会在没有明确指示的情况下对软件的其他区域施加约束和条件,并且精明的开发人员的工作至少是要调查与实施有关的潜在问题和冲突。

我们发现,通过FizzBu​​zz的应试者中有略超过65%(样本大小为38)完全失败了FizzBu​​zz v2.0,通常情况下,稍后会检测到这些应试者,但这似乎是一种很好的检测方法他们早。

我的问题不是关于FizzBu​​zz是否过时的问题,而是有关导致FizzBu​​zz v2问题失败的大量候选人的因素是什么。

  • 这个问题太含糊吗?
  • 面试环境的压力会降低批判性思考的能力,以至于无法完成如此琐碎的任务?

题:

用您喜欢的编程语言编写一个例程,该例程将字符串列表作为输入,并且对于列表中的每个字符串将执行以下操作之一:

  1. 如果字符串包含字母A,则仅打印Fizz
  2. 如果字符串包含字母B,则仅打印Buzz
  3. 如果字符串同时包含A和B,则仅打印BuzzBuzz
  4. 如果字符串不同时包含A和B,则仅打印FizzFizz
  5. 如果字符串仅包含一个A和仅一个B,则仅打印FizzBu​​zz

候选人提出的一些典型问题是:

  • 应该区分大小写吗?
  • “包含A和B”是否意味着A应该先于B
  • 如果没有达到所有要求,应该打印什么?
  • 如果可以满足多个条件怎么办?

我们发现,绝大多数成功完成问题的候选人根本不问任何问题,就像FizzBu​​zz一样。


26
让这个问题有点含糊。这样一来,您可以看到哪些潜在客户有足够的勇气要求澄清(这本身就是发展的关键)。
Thomas Eding

17
正确的答案是让潜在的开发人员告诉广管局“解决这些可怕的要求”。
柯克·布罗德赫斯特

7
自定义FizzBu​​zz是一个很好的主意,可以过滤掉用Google解决方案搜索的候选人。甚至没有必要增加难度。实际上,我怀疑最初的FizzBu​​zz是否应被星球上的所有公司逐字使用。自定义它只是公司的懒惰。他们已经意识到了这个问题(使用零编程技能对候选人进行编程),但是却无法实施测试,而这种候选人-具有良好的Google技能-不能通过?WTF?
ViliamBúr2013年

13
@GradeinarPfeffernüsse不提出任何问题的候选人如何成功完成此考试?因为需求是矛盾的,所以这是不可能的。未经澄清,此练习根本无法完成!
Andres F.

6
@MSalters您不能假设需求的作者想要特殊词汇,因为在现实世界中这不是一个合理的假设。因此,如果不提出有关明显矛盾的问题,就无法完成本练习。有人在不问问题的情况下完成了测试,只是把它弄错了。
Andres F.

Answers:


31

它有可能比FIZZBUZZ更好地进行测试,但是如果您有正确答案的概念,那么它是世界上最糟糕的测试。这些测试在面试开始时几乎没有价值。

如果应聘者“正确地”回答了这个问题而没有提出问题,那么您将面临一个问题,即应聘者会选择错误的程序员类型-他无法识别模棱两可的要求,或者无法理解大多数人无法编写明确的要求。程序在各个方面是否在技术上都完美无所谓,很可能他是那种会提供“我不在乎您想要的不是您想要的东西”软件的人。

这里的测试部分是规则的优先级顺序。您不指定它。输入“ ABC”可以打印Fizz,Buzz,BuzzBuzz或FizzBu​​zz-其中任何一种都是正确的

我要接受的候选人是(大多数)正确的候选人,但提出了很多问题,理想情况下,在白板上做了很多“蹒跚”。

例如,我将通过给您一系列示例文本并询问您希望打印的内容以及原因来探索我对这些要求的理解。-关于“ ABC”示例输入的讨论应该为您带来一些有用的网站。

就像FIZZBUZZ一样,此测试的结果仅与您对如何获得结果的观察结果一样好-结果无关紧要。

我会稍作调整-只是为了使其更有趣-将“仅”删除。在上面的行中进行了介绍(“打印以下内容之一”),并查看有多少人对此提出疑问。如果候选人错过了“唯一”,而您有时间,请指出来看看会发生什么。如果他处理“ only”,则将其从需求中删除并让他们更改代码。


16
在我看来,OP似乎正在为此测试做太多事情。FizzBu​​zz旨在作为一项快速测试,以显示应试者至少可以编写一些代码。这似乎是在试图做到这一点,并且还在试图研究候选人如何设计具有模糊需求的过程。
jk。

6
+1表示“这些测试一开始在面试中的价值很小。” 如果可以,我可以再次为其+1,“该程序在各个方面在技术上是否完美都没有关系,很可能他是那种会提供软件的人,“我不在乎它与您无关想要的,那就是您要的”。”
Shivan Dragon 2013年

7
大家发现这些测试没用的人都在尝试对它们做太多... FizzBu​​zz及其对应者的存在仅出于一个目的:淘汰90%根本不知道如何编程的申请人。
罗伯特·哈维

@RobertHarvey:除了有些人可以编程之外,由于某种原因,在某一时刻使用FizzBu​​zz会有困难。(我自己就是其中之一)。
James P. Wright

3
@ JamesP.Wright错误否定对于受访者而不是访问者是一个问题。只要误报的数量足够少,像FizzBu​​zz这样的测试对面试官就很有用。
jk。

27

您的要求中的“仅”一词在所有问题中都产生矛盾。

因此,您的问题会测试在压力下收集的需求,您确定要测试这种技能组合吗?

如果您想测试需求收集,我建议将其中一个问题弄不清楚。如果要替换FizzBu​​zz,请消除歧义。

只能根据特定领域的知识来确定业务规则的优先级-除非您为自己的工作提供一些简单的上下文信息(也许它们是可以兑换成各种价值的优惠券),否则开发人员没有基础做出自己的决定。

但是,要求某人要求澄清,如果这样做有很大的不良后果的风险,那也许不是衡量他们认识知识极限的最佳方法。他们可能会认为,猜测和弄错的方法比指出您在写作要求上不称职,或者如果面试官都不是开发人员(被标记为态度不好)更安全。


6
您是否真的想聘请一个不清楚澄清要求的人,因为他/她害怕通过提问来惹恼某人?
汉斯·彼得·斯特尔2013年

2
@hstoerr,也许不是,但是面试是一个相当压力的情况。
A. Gilfrin 2013年

3
@hstoerr:问题是,没有正确的答案,但是肯定有错误的答案-无论面试官不喜欢什么。您希望被采访者提出问题,另一个可能希望他们进行判断,而另一个可能根本看不出任何歧义,并且将问题视为无法理解简单的说明。从有人被告知答案是“绝大多数”给出的,不问问题却仍以同样方式回答的人的观点来看。然后,您会得到帮助的人,在帮助下得到它的人以及没有帮助的人。
jmoreno 2013年

16

我们发现,绝大多数成功完成问题的候选人根本不问任何问题,就像FizzBu​​zz一样。

由于需求含糊,无法不提出问题就无法正确完成v2.0。


2
+1…就目前而言,要求是相互矛盾的,因此至少必须指定某种抢七。
康拉德·鲁道夫

4
有趣的是,规则确实给人一种秩序感(从一般情况到特殊情况),我几乎本能地决定以相反的顺序来做。如果我在这样的测试中,我不会感到模棱两可,而是会遵循我的直觉。
Codism 2013年

4
@Codism不幸的是,您作为程序员的本能可能与用户想要的完全相反。
Stefan

@Stefan:在很大程度上,澄清是没有止境的。每个人都基于经验,常识等一系列因素在某些时候停止推理。即使您现在可以阐明要求,您如何保证它们明天不会改变?因此,对我而言,按原始要求,是的,这足够明智,我将在五分钟内实施。
Codism 2013年

1
@KonradRudolph:除非您选择解释“以下内容之一”的意思,否则这无关紧要。考虑一下,我实际上可以认为这是一个可以接受的答案。您甚至不需要编写其他代码,这只是一项测试,看是否可以执行其他任何一项。毕竟,对于一个解决方案而言,实际上并没有一个商业案例可以解决,这是一个面试问题,最终没有标准反向字符串问题有用。
jmoreno 2013年

4

如果要消除任何歧义,可以将要求更改为:

用您喜欢的编程语言编写一个例程,该例程将字符串列表作为输入,并对列表中的每个字符串执行以下操作:

  1. 如果字符串包含字符“ $”且不包含“?”,则打印“ Fizz”。
  2. 如果字符串包含字符“?”,则打印“ Buzz” 并且不包含“ $”。
  3. 如果字符串仅包含一个“ $”和一个包含“?”,则打印“ FizzBu​​zz”。
  4. 如果字符串恰好包含一个“ $”和多个“?”,则打印“ BuzzBuzz”。
  5. 如果字符串恰好包含一个“?”,则打印“ BuzzBuzz” 以及多个“ $”。
  6. 如果字符串不包含“ $”并且不包含“?”,则打印“ FizzFizz”。

3

这个问题太含糊吗?

是的,这个问题太含糊了,无法澄清。但是,还有一条附加规则说,在应用多个规则的情况下,您的程序应选择最具体的东西,应消除歧义。

面试环境的压力会降低批判性思考的能力,以至于无法完成如此琐碎的任务?

更有可能表明候选人“塞满”了FizzBu​​zz:是否施加压力,该程序非常简单。

我认为修改后的FizzBu​​zz与原始FizzBu​​zz不具有可比性,因为它的理想解决方案有所不同:尽管if-then-else仍然可以接受一系列方法,但我认为基于表的解决方案更适合此问题:

static string[,] FB = new string[3,3] {
    {"FizzFizz", "Buzz", "Buzz"}
,   {"Fizz", "FizzBuzz", "BuzzBuzz"}
,   {"Fizz", "BuzzBuzz", "BuzzBuzz"}
};
static string FizzBuzz(string str) {
    return FB[
        Math.Min(str.Count(c => c == 'a'), 2)
    ,   Math.Min(str.Count(c => c == 'b'), 2)
    ];
}

问题空间的大小为3x3,不是2x2,因此与原始FizzBu​​zz相比,它更容易映射到表格。实际上,我发现难以理解原始FizzBu​​zz问题的基于表的解决方案

private static string[] FB = new[] {"{0}", "Fizz", "Buzz", "BizzBuzz"};
public static void Main() {
    for (var i = 1 ; i <= 100 ; i++) {
        Console.WriteLine(FB[(i%5==0?2:0)+(i%3==0?1:0)], i);
    }
}

2

这里有两件事:

  1. 是的,我认为大多数人只是在搜索“嗡嗡声”时发出嗡嗡声,然后在尝试扩展它时迷迷糊糊
  2. 检出:http : //dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html 它很好地解释了如何使用适当的抽象来解决嘶嘶声。

除了他从来没有达到正确的抽象水平。他与单子最接近,但是我认为这有点太复杂了。一个简单的键/值列表,其末尾有一个简单的条件,足以用任何比BrainFuck更复杂的语言来完成。
jmoreno 2013年

2

我们发现,绝大多数成功完成问题的候选人根本不问任何问题,就像FizzBu​​zz一样。

我见过一些面试过程,这些过程鼓励程序员大声思考并提出问题以查看他们的思考过程。我更喜欢这个过程。

我通读了这个fizzbuzz v2.0,然后询问那里的#3和#5要求。我不认识其他人,但是我发现在工程领域我不需要任何歧义,因此我提出了问题。因为稍后(编码及全部)代码行,我不想发现我必须做一个假设,这是错误的。


当然,“大声思考”技术仅在您正在寻找喜欢“大声思考”的程序员时才有用。这就消除了绝大多数的程序员,并且可以说,只剩下大多数程序员比程序员更适合作为经理。毕竟,以大脑的“电”速度思考比以“机械”的谈话速度思考要快得多。
Dunk

2

避免歧义的最简单方法就是显示一些示例:

“ A”返回“ Fizz”“ aAbA”返回“ Fizz”“ B”返回“ Buzz”“ aBbB”返回“ Buzz”“ AB”返回“ FizzBu​​zz”“ ABaabb”返回“ BuzzBuzz”“”返回“ FizzFizz”“ ab ”返回“ FizzFizz”


1
一个好的候选人将从一些测试字符串和预期的输出开始,然后讨论单元测试,或者只是更正式,更明确地重写需求。然后,他们将讨论清晰的需求的重要性,以及如何解决需求错误比实现错误要贵上几个数量级。
约翰·里昂

2

与其提出矛盾/不清楚的要求,不如问他们如何处理这些情况。否则,您会让自己看起来不称职,或更糟糕的是,让称职的人处于诡balance的平衡横梁上:“我如何获得所需的答案,而不意味着这个面试问题或询问这个问题的人是愚蠢的?”

无论哪种方式,都令人讨厌。面试是一个匹配的过程,也就是说,我指的是一条2条路。直接的问题和意图的明确性比将候选人置于压力锅IMO之下更为重要。FizzBu​​zz简短有趣,是编码问题的一个很好的例子。不要直接重复使用它。遵循该模型编写类似这样的简单问题。

但是对于FFS来说,不要太聪明,而将真正的测试隐藏在另一个测试之后。只是问人们如何处理该死的问题。经验丰富的开发人员将反复处理模棱两可的要求,并很高兴告诉您他们的策略。您甚至可能学到一些东西。

并且不要以为每个人都想使用白板或手写舒适。我们中有些人从12岁起就一直在打字(非常感谢Space Quest)。我什至不能用手笔或记号笔直想。现在是20惊人的13,白板已经在做什么?当人们把笔和纸递给我并要求我进行代码测试时,很难抑制笑声。


1

我认为这是一个很好的面试问题。需求不清楚,就像现实中经常遇到的那样。您检查应聘者是否足够聪明(即使在压力下)也能意识到这一点,他/她是否不怕提出他们认为必要的问题,并能够将要求合理化。它确实告诉了他们一些编程能力,尽管您还应该提出一些更复杂的问题,包括递归和指针,因为这个问题太容易了。

但是,我确实担心“成功的”候选人不问问题。我将尝试找出它们是否意识到在某些情况下您最多可以应用其中4条规则,并且问题中没有什么可以解决这种歧义,并让他们解释如何处理这些歧义。也许您的问题不够明确,无法强迫他们提出问题,或者您应该让他们大声思考。

顺便说一句:我很奇怪您在谈论“正确的解决方案”。如果您这样说问题,则如果得到“ AB”,则可以打印“ Fizz”,“ Buzz”,“ BuzzBuzz”或“ FizzBu​​zz”中的任一个。因此恕我直言,任何没有问题的解决方案都是错误的。

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.