我应该为失败的面试编码练习给出答案吗?[关闭]


14

我们有一个高级面试候选人未能通过FizzBu​​zz问题1 2的细微差别。
我的意思是说,确实完全没有通过这个问题-甚至还没有结束。
我甚至执教他通过对考虑使用一个循环,并且35真的值得考虑作为特殊情况。

他吹了它。

出于质量检查的目的,我向三个队友提出了相同的确切问题。给了他们5分钟;然后回来收集他们的伪代码。 他们所有人都钉上了钉子,之前从未见过这个问题。两个人问the俩是什么...

在另一种逻辑练习中,应聘者对他选择使用的语言(C#)中的某些可用功能有所了解。因此,这似乎并不是他从未编写过任何代码。但是他的逻辑仍然很烂。

我的问题是我是否应该给他解答逻辑问题的答案。

他知道自己炸死了他们,并在随后的采访中承认了这一点。
另一方面,他从未要求答案或我期望看到什么。

我知道可以使用编码练习来设置失败的候选人(再次,请参见上方的第二个链接)。而且我真的尽力帮助他回答问题的核心。但这是一名高级候选人,坦率地说,即使考虑了面试抖动,Fizz-Buzz也很容易做到。

我觉得我应该给他看一种解决问题的方法,以便他至少可以从经验中学习。但是,他没有再问。

处理这种情况的正确方法是什么?


1 好的,这不是指向实际FizzBu​​zz问题的链接,但这是围绕FizzBu​​zz进行的很好的P.SE讨论,并涉及该问题的各个方面。

2 为了澄清起见,这是我问的Fizz-Buzz的细微差别,这是来自Euler项目的第一个问题。替代印刷Fizz | 对数字求和的嗡嗡声和您有相同的基本问题。
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Write a function that finds the sum of all the multiples of 3 or 5 below 1000.

3 这个问题比我预期的引起了更多关注,我感谢所有答复。后来的一些答案确实已经成为我问题的核心,因此我将允许社区在分配“ the”答案之前进行审查和投票。

4 我根据当时的社区投票选择了“ the”答案。而且我认为Yannis的答案适合与新开发人员进行访谈。我认为,关注于缺乏寻求答案的集体回应也很明显。


34
放松自己,继续美好的一天。就我而言,在“高级”上使FizzBu​​zz失败是故意和恶意地浪费我的时间。
史蒂文·埃弗斯

6
我最近采访了我所在地区的几个职位,要求提供代码的职位告诉我,他们很难找到可以通过自己的“ FizzBu​​zz”式测试的高级候选人。在每种情况下,我的反应都是“你不能认真”。显然,有很多可怕的程序员伪装成高级人,甚至还没有亲密。
乔尔·埃瑟顿

6
@JoelEtherton-这里也是一样。我到处都在推手机屏幕。如果您申请成为使用C#的高级会员,并且不能告诉我们值类型和引用类型之间的区别,那么您就不会得到面试。
Telastyn 2012年

3
@ 0A0D领导团队与成为优秀开发人员是另一种技能。我已经看到了团队领导者,他们也是糟糕的开发人员。
Kyralessa 2012年

4
@JoelEtherton,别惊讶。我认为“ 200名申请者中有199名无法编码”只是夸张,直到我真正开始帮助筛选和面试候选人。多年(指定)的经验无所谓。职位名称无关紧要。不管他们是否知道,大多数申请人的确确实是初级。
安东尼·佩格拉姆

Answers:


15

我的大部分面试都是在寻找实习职位的学生中进行的,大多数情况下,他们搞错了简单的(?)练习。我想要一种简单友好的方式来传达他们的错误,而我的想法很简单:我自己解决了练习,并在完成练习后向他们展示了我的解决方案。

我与候选人进行了很多非常有趣且富有启发性的讨论,这些讨论开始于比较我们解决同一问题的不同方法。过了一会儿,我什至可以预料到一些错误,只是通过检查候选人正在哪所学校就读(有些“教授”是……白痴)。而且,在少数情况下候选人无法提出任何解决方案的情况下,我已经为他们提供了下一个解决方案。


说得通; 我最近正在寻找一份新工作,我发现当我对他们的问题给出错误的答案(或稍微“不切实际的答案”)时,大多数面试官都做了同样的事情。这是一个非常好的做法。主要是因为它打开了候选人(例如我)的面,并使面试本身从两侧都更具吸引力。但是,当然,我们正在讨论C ++中的模板,RAII和多线程。问题是你对不能解决嘶嘶声的人说什么?
加尼2012年

11
@RitwikG老实说,如果应聘者正在面试某个编程职位并且不能应付嘶嘶声,我可能会……发笑(嘿,我从未说过我是一名优秀的面试官;)。就是说,几个月前,我在与代码中变成极其琐碎的OBOE的斗争中损失了大约几天的时间。我们都有自己的休息时间,我不会真正专注于候选人弄乱一项练习,我可能会很快转到下一项。如果他们也失败了下一个,我可能会感谢他们的时间和前进。
扬尼斯

1
@YannisRizos这可能是一个很好的方法。人们总是有机会在面试中表现不佳,或者以某种方式避免了工作中的模运算(尽管至少可以说这不是一个好兆头)。以我的经验,即使要求担任高级职位,许多申请人被要求写任何简单的简历(以他们选择的任何一种语言)都感到沮丧。现在,我觉得完全不可能自圆其说。
Daniel B

这也是对该过程的一些很好的洞察力。候选人很紧张,这是可以理解的,我非常愿意为此提供一些津贴。当他最终开始讨论解决方案的尝试时,这只是令人费解的,并创造了他错过的边界条件。

15

给出答案

我要说的是,如果候选人对问的兴趣不足,我不会浪费我的呼吸,但是@Yannis_Rizos回答要好得多。

面试非常快。我知道在面试后的几天里我经常会检查事情。

无法编写FizzBu​​zz Classic的人

我想象一个很大的症结在于意识到%运算符。您希望有人可以考虑比较(myInt / 3) == (myDouble / 3.0)但也许会承受面试的压力……FizzBu​​zz Classic仍然采用蛮力方法,将其归类为最容易解决的算法问题。作为提示,您是否尝试过要求人们仅对“ Fizz”进行半信用编码,或者以后再添加“ Buzz”作为增强功能?

我认为您问题的最终答案是,很难找到优秀的候选人。

一般面试问题

我经常发现,让求职者描述他们兴奋的最后一个编程项目更容易,也更有效率。我在这个问题上取得了100%的成功,这意味着那些热衷于编程项目并可以回答有关该项目的技术问题的人才是伟大的员工,而不能做到的人却不是。这具有使候选人放心并鼓励开放式讨论的良好副作用。有了这个问题,候选人实际上将告诉您他们最适合的人选。

也许在智囊团中,算法问题也是必要的,但是我放弃了它们,转而使用“最喜欢的项目”问题。

FizzBu​​zz的总和(儿子)

您的面试问题不等同于FizzBu​​zz:

如果列出所有低于10的自然数,这些自然数是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。编写一个函数,求出3或5的所有倍数的总和。低于1000。

如果FizzBu​​zz Classic强迫您进行n次迭代(以打印出每个数字或Fizz / Buzz),则您的问题可以通过n / 5 + n / 3 + n / 15次迭代来解决,甚至可以不进行迭代-直接固定-点计算是可能的。下面的程序比较了这三种方法:

public static void main(String[] args) {
  long n = Long.valueOf(args[0]).longValue();
  long sum = 0;
  long ms = System.currentTimeMillis();
  // Brute force method  Performance: cn
  for (long i = 1; i <= n; i++) {
    if ((i % 3) == 0) { sum += i;
    } else if ((i % 5) == 0) { sum += i; }
  }
  System.out.print("Brute force sum:    " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
  ms = System.currentTimeMillis();

  // Second solution: iterate through only numbers we are
  // interested in.  Performance: c * (n/3 + n/5 + n/15)
  // We counted multiples of 15 twice, so subtract one of them
  sum = countSum(n, 3) + countSum(n, 5) - countSum(n, 15);
  System.out.print("Only multiples sum: " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
  ms = System.currentTimeMillis();

  // Third solution: Use high school algebra.  Performance: c
  sum = sumSeries(n, 3) + sumSeries(n, 5) - sumSeries(n, 15);
  System.out.print("Sum of series:      " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
}

// Iteravely sum all multiples of skip
private static long countSum(long n, long skip) {
  long skipTotal = skip;
  long grandTotal = 0;
  while (skipTotal <= n) {
    grandTotal += skipTotal; skipTotal += skip;
  }
  return grandTotal;
}

// Thanks to @Caleb for pointing this out!  High school algebra
// tells us that the sum of a series is: (n * (a1 + an)) / 2
// where a1 is the first term and an is the nth term.  E.g. The
// sum of a series of 3 is: (n/3 * (3 + n - (n % 3))) / 2
// Since we are thinking about performance here, we'll shift
// right one instead of dividing by 2 for style points.  ;-D
private static long sumSeries(long n, long skip) {
  return (n/skip * (skip + n - (n % skip))) >> 1;
}

输出(FizzBu​​zz的总和<1000):

$JDK_HOME/bin/java FizzBuzzNot 999
Brute force sum:    233168 time: 0
Only multiples sum: 233168 time: 0
Sum of series:      233168 time: 0

使用较大的n进行性能比较:

$JDK_HOME/bin/java FizzBuzzNot 1000000000
Brute force sum:    233333334166666668 time: 4744
Only multiples sum: 233333334166666668 time: 818
Sum of series:      233333334166666668 time: 0

注意那些否定了这一点的人

提出此问题的解决方案的目的是表明,尽管FizzBu​​zz的总和的蛮力解决方案与FizzBu​​zz Classic相似,但仍存在针对Sum问题的更好的解决方案,这使它成为根本不同的问题。如果您不记得某个序列和的正确公式,或者不知道以3或5步进时,FizzBu​​zz的总和将非常棘手。

如果通过将序列分成两半,反转一半并将它们配对来重新推导一个序列总和的公式,则会得到(n + 1)(n / 2),这会使您陷入混乱就整数除法和截断的余数而言。此公式的(n(a1 + an))/ 2版本对于所有n值的简单答案绝对至关重要。


3
可以直接计算得出(Ruby): t = { |i| (i * (i+1)) / 2 }; fizzbuzz = { |n| 3 * t((n-1)/3) + 5 * t((n-1)/5) }
kevin cline 2012年


1
@ GlenH7是的,我删除了我的评论,因为它是嗡嗡声。Glen值得为他的分析提供支持,即使它根本无法回答问题:D(此外,我之前完全进行了编码并尝试了自己的解决方案)
Andres F.

2
您正在寻找一个级数的和,假设该级数的模数= 0,则可以使用公式n / 2 *(m + nm)。其中,m =模数,n =系列中的元素数(aka floor(x / m)。在那之后很容易,S(3)+ S(5)-S(3 * 5)[所以有些数字–不要再计算两次]
jmoreno,2012年

3
您可能遇到问题的原因之一是,您对某些数字进行了两次计数(这些数字可被15整除)。有关示例程序,请参见ideone.com/clone/oNWrhJ
jmoreno,2012年

8

我觉得我应该给他看一种解决问题的方法,以便他至少可以从经验中学习。但是,他没有再问。处理这种情况的正确方法是什么?

我不在乎面试的级别,甚至不在乎“ FizzBu​​zz”级别的问题还是高级问题。如果您要求应聘者解决问题,而他们却不能,但是甚至不费心去问您正确的答案,那么他们就不值得您花时间。在世界上,你怎么能如此懒惰?!

即使您完全以程序员的身份感到恶臭,并且只是试图以水牛的方式进入工作岗位,为什么您至少不那么务实以至于无法立即获得正确的答案,以便下次面试时就知道呢?

所以不,您不应该“给出”答案,但是您应该期望候选人在失败后坚持听到正确的答案。如果他们不这样做,那么这在我的书中是一个巨大的危险信号。

如果某人在初级开发人员面试中吹嘘FizzBu​​zz是因为他们不记得模数运算符并且没有它就无法使自己继续前进,但是一旦您解释了正确的答案,他们就会对重新制作它充满热情,或至少与您讨论正确的代码,那几乎与正确回答它一样好。


1
为什么?您可以稍后在Google上找到答案。FizzBu​​zz非常受欢迎。老实说,如果有人不知道模数除法,我会很担心。
布赖恩

我会以他想出一些东西而不是模运算符来称赞他,但他甚至没有做到这一点。我认为您有一个重点,就是关注他未能寻求答案。您的观察结果与面试中遇到的其他挑战一致。

我对FizzBu​​zz真的很固执...但这是正确的答案。如果候选人不要求答案,请不要给他们。
James P. Wright

@ JamesP.Wright-我在某种程度上同意这一观点,在接受采访时,我有点尴尬地将其用作主要编码问题。它被认为是可笑容易,我甚至有一个警告开头就不要过度读的问题。我的跟进工作也应该很容易,然后我进行了第三次,让他展示出更高水平的开发/设计技能。我们从来没有到了第三个问题....

1
@ 0A0D,FizzBu​​zz中涉及的“数学”只是检查给定变量是否可被3和/或5整除。实际上,您编写的每个应用程序中都存在该数学级别。甚至像我这样的“业务开发人员”,也只是反复使用这种水平的数学来实施相同类型的项目。GlenH7,我什至不知道在FizzBu​​zz中使用递归是否会给我留下深刻印象或使我感到恐惧...。
格雷厄姆

4

在预屏期间,我在与面试官通话时打了嘶嘶声。即使每个人都没有听说过,您也应该能够在一个学期的课程学习结束后,但一定要在获得“高级”身份后,才能够凑在一起。

无法做到这一点真的没有任何恢复。这是您为了避免万一,需要摆脱的那些必要的麻烦之一。

我想说的是,作为预告片交付是有意义的,这样您就不会浪费每个人的时间将他们带到现场进行采访。


对于我们的预屏,我们要求提供一些示例代码。该代码具有一些中级到高级C#语言功能,因此我真的希望他能在一两分钟内解决逻辑问题。

7
当提供的示例代码与面试中证明的知识不匹配时,我的大脑立即对示例代码产生怀疑。
Graham

@Graham:雇用他六个月作为临时工。–
Brian

@ 0A0D遗憾的是,我从未在允许这种灵活性的地方工作过。如果要发布的职位是全职工作,那就是我们所能提供的全部。
格雷厄姆(Graham)

3
在那种情况下没有围栏。如果他的“样本代码”显示出很强的知识,并且他不能编写fizzbuzz,请拿出样本并询问具体细节。如果他不能支持,那么该是我最喜欢的台词了:“我们还有一些候选人要审核,我们会尽快回复您。”
迈克尔·布朗

4

我什至还指导他考虑使用循环,而3和5作为特殊情况确实值得考虑。

知道认为FizzBu​​zz式问题的“正确”答案是什么会很有趣。在我所坐的位置,写给您问题的信的好(C语言)是:

int f(void) {
    // sum the multiples of 3 and of 5 and subtract multiples of 15 so we don't count them twice
    return ((1000/3)/2)*(999+3) + ((1000/5)/2)*(995+5) - ((1000/15)/2)*(990+15);
}

更好的一个可能是:

当您可以直接计算时,为什么还要编写一个程序来执行此操作呢?

关键是,给猫皮剥皮的方法不止一种,而且有问题的候选人没有立即开始编写for循环和mod运算符,这并不意味着他很愚蠢。如果您想知道候选人的知识,请讨论问题-找出他的想法。如果他被卡住或感到困惑,请找出原因和原因。他可能会带您采用您从未考虑过的方法。

我的问题是我是否应该给他解答逻辑问题的答案。

作为面试官,这不是向候选人教授课程的地方。如果他们真的不知道如何编写代码,那么绝对不必通过沉迷于他们不知道的多少来使他们感到尴尬。如果他们有足够的兴趣要问,那么请务必分享。否则,请完成面试,感谢他们的宝贵时间,然后转到下一位候选人。


+1为最后一段的扎实答案。您的观点很好,我应该说“一个”答案而不是“该”答案。有几种解决特定问题的方法。至于discuss the problem,在面试中该要素还提出了其他问题。遗憾的是,该候选人……在回信中还不够。我没有将这方面的内容添加到原始问题中,因为我确实在努力保持P.SE准则中的“良好主观”。

1
“这不是向候选人教授课程的地方”-我不同意。一个好的程序员总是在学习。如果他们通过对学习新事物表示感谢来回应您的课程,则表明他们是一个优秀的程序员。如果他们不理会您的课程,那么他们很可能是一个卑鄙的程序员。
nbv4 2012年

如果我是您的面试官,并且您给了我类似的答案,我会将您推荐给需要代数老师的学区。FizzBu​​zz旨在展示编程的基本知识,以便面试官可以继续研究使您与其他基本不错的程序员区分开的问题。您的答案很聪明,但它们并不能证明您了解循环,模块化算术等知识,从而使面试可以在知道代数的人也知道编程的前提下继续进行(错误),或者只是握手并继续前进(更有可能)。
user1172763 2014年

@ user1172763就是这一点-与FizzBu​​zz不同,可以通过一次计算来回答OP的面试问题。因此,如果要看候选人是否可以编写循环,那将是一个糟糕的选择。假设您要问的是特定的(未说明的)原因,就不能期望候选人选择一个更慢,更冗长的解决方案。的确,面试官很容易成为一个“技巧”问题,以查看候选人是否注意到循环是完全不必要的。阅读您的想法不是应聘者的责任。
Caleb 2014年

2

您的“问题”是您是一个善解人意的人,因此很难看到有人为您知道答案的问题而苦苦挣扎(如果您进行可用性研究,这也是一个问题)。从作为采访者的职责的角度来看,您没有任何义务教被采访者如何编程或解决问题,或解决您所提出的问题。

当您指导受访者时,并不是这样,他们才能获得正确的答案。这样一来,您就可以看到他们是否真的不能解决问题,或者只是因为一个或两个错误或误解而陷入困境。

因此,如果您想在事后给被访者解决方案,那么您纯粹是在为自己做。总的来说,我宁愿利用这段时间让受访者尝试另一个问题。但是,一个不能回答FizzBu​​zz的“高级”程序员可能不在名单之列。如果您决定提供解决方案,请确保您不会欺骗自己,认为面试比以前做得更好(如果您发现自己在想,“他无法解决问题,但是当我解释时,他就很好理解了”),您处在危险的道路上)。

是的,我曾经是一名受访者,他的头顶不动,甚至无法尝试解决面试问题。这只是意味着我需要学习更多知识才能从事该领域的工作。


2

获得正确答案不是该测试的重要部分。您要衡量的是某人解决问题的方法,他们如何解决问题,在此过程中提出的任何创意或有趣的东西;这种东西。即使他们得到了错误的答案,他们仍然可以通过这些标准来生存。

好的,不知道mod运算符是不可原谅的,按照我给该候选人的度量,这似乎仍然是一笔勾销,但我不认为为该候选人给出正确的答案是有道理的效益。

这取决于您个人的意见。您是否想提供面试反馈以帮助应聘者在以后的面试中做得更好(这样将来的面试官就不必遭受您刚刚经历的苦难)?如果是这样,请按照我上面概述的术语来表达您的反馈意见:告诉他们这不仅是正确的答案,而且他们如何工作才能得出答案是至关重要的因素。


对于+1的注释,how they work to arrive at the answer is a critical factor. 虽然我期望使用模数运算符,但这仅是因为这就是要解决的方式。我很乐意看到任何其他解决问题的方法,而又不会产生明显的边界条件错误(请参阅有关递归方法的各种评论……)。

2

我觉得我应该给他看一种解决问题的方法,以便他至少可以从经验中学习。但是,他没有再问。处理这种情况的正确方法是什么?

我的看法是,没有任何情况可以处理。假设您已经拒绝了他的申请,那么候选人(显然)没有兴趣就不必担心自己了。

的确,即使他确实提出要求,您也不他一个解释。而且,如果您与人力资源人员讨论此事,他们可能会建议您,出于法律原因,不建议与候选人进一步讨论。


还值得注意的是,根据您的要求,FizzBu​​zz问题具有不同的“最佳”答案。如果您要求“最简单”的解决方案和“最高效”的解决方案,则最佳答案会截然不同。如果您不清楚问题的提出方式,这可能会使您的判断不公正。(另一方面,优秀/有经验的候选人将有远见,在开始编写代码之前先澄清一下……)


2

要回答您的问题,不,我不会给出答案。如果该人想成为一名更好的软件工程师,他们将找到答案。如果您给他们答复,您是在抢他们这个机会。

更相关的问题是,什么时候可以称自己为高级开发人员?这在组织和国家之间有所不同。例如,我曾与一家软件公司合作,该公司有5年的高级经验。没有强调体验的质量,只有时间的长度。

在我们提出一个对所有软件工程师进行分类的标准之前,无论他们的语言是什么,我们都需要由个人来决定他们的技能水平。我们将继续听到“高级工程师”没有通过最基本的技能测试。

几个星期前,有人问了一个问题:“你什么时候应该称自己为高级开发人员”。我还写了一篇有关该主题的博客文章


您会修改您的博客链接吗?
安德烈·

@André链接已更新。
Chuck Conway
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.