FizzBuzz 中的冒险
程序员在面试过程中的测试并不少见。在过去的几年里,我向初级开发人员提出了一个快速的面试前问题,看看他们想出了什么样的东西。
由于我不想为任何开发人员设置比绝对需要更长的任务,我选择为他们设置一个非常简单的任务。俗称“FizzBuzz”,这个任务如下。
"编写一个程序,打印从1到100的数字。但是对于3的倍数打印“Fizz”而不是数字,对于5的倍数打印“Buzz”。对于同时是3和5的倍数的数字打印“FizzBuzz“。”
对此的预期输出将是这样的。
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz
此任务特别重要,因为它显示了循环、if语句、模运算符和打印输出的知识。模数运算符特别重要,因为并不是每个人在开发的第一周都会遇到这个问题。
我至少在面试前一周设置这个任务,所以他们通常有很多时间来处理它。初级开发人员需要大约30分钟才能完成此任务。我也没有规定任务应该使用什么语言,所以我得到了各种各样的JavaScript和PHP响应,尽管JavaScript似乎很流行,所以这通常是选择的语言。
我想我会在帖子中发布对这个任务的一些回应,以展示我得到的不同回应,尽管我绝对不会说出名字。
编写的第一个示例以提示询问用户应该数到多少开始。这是一个很好的接触,它甚至在努力中表现出一点个性。好消息是这会产生正确的结果。
var num = prompt("Enter a number and see the result in the bottom right window :) "); for (i = 1; i <= num; i++) { if (i % 15 == 0) { document.write("FizzBuzz"); document.write("
"); } else if (i % 3 == 0) { document.write("Fizz"); document.write("
"); } else if (i % 5 == 0) { document.write("Buzz"); document.write("
"); } else { document.write(i); document.write("
"); } }
接下来可能是我见过的最奇怪的提交。值得庆幸的是,它确实产生了正确的结果,但是两个DOCTYPE标签,甚至最后的结束DOCTYPE确实使这一点脱颖而出。当我问应聘者他们是如何在一起时,他们说他们“不知道”。我可以预期初级程序员不会无所不知,但是这里的候选人方法有一些非常狂热的东西。他们显然是从某个地方复制和粘贴了其中的大部分内容。
TEST
Javacsript FizzBuzzFIZZBUZZ
也许我见过的最短的提交是这个。它产生正确的结果,尽管您需要在控制台输出中搜索它。这让我们讨论一下既可以工作又可读的代码。这花了我一些时间来真正解析正在发生的事情。
for(let i=0;i<100;) console.log( ( ++i%3 ? '' : 'Fizz' ) + ( i%5 ? '' : 'Buzz' ) || i )
下一个是解决这个问题的非常教科书式的方法,结果产生了正确的输出。也许有点太多了,因为当我在面试中询问它是如何工作的时,他们无法真正告诉我。这表明他们只是从某个地方复制了测试。
这是一种创建数组,然后使用正确的文本项推送数组中的项的方法。它产生了正确的结果,但有点难以清楚地看到发生了什么。它还使用将输出注入控制台的方法。
let array = []; for (let i=1; i <=100; i++) { array.push(i) } let newArray = array.map(num => { return (num % 15 === 0) ? 'FizzBuzz' : ( (num % 3 === 0) ? 'Fizz' : ( (num % 5 === 0) ? 'Buzz' : num)) }) console.log(newArray)
最后,对于面试回复,我们有以下内容,这实际上会产生错误的结果。前15个数字是正确的,但随后这个过程会出现一些问题,并在不应该有的时候添加Fizz和Buzz。很明显已经做出了努力,但最终的输出有点混乱。
for (let i = 1; i<= 100; i++){ if (i % 3 == 0){ document.write("Fizz!" + "
") } if (i % 5 == 0){ document.write("Buzz!" + "
"); } if ((i % 3 == 0) && (i % 5 == 0)){ document.write("Fizzbuzz!" + "
"); } else{ if (i % 3 && i % 5){ document.write(i + "
"); } } }
最后,为了好玩,我最近从KevlinHenney的一次演讲中看到了这个例子。它是一个本质上使用随机种子生成FizzBuzz结构的Python脚本。这很有趣,因为您通常不会期望以这种方式使用随机数。不过,它确实有效,不知何故。
import random for i in range(0, 100): if not i % 15: random.seed(1178741599) print [i+1, "Fizz", "Buzz", "FizzBuzz"][random.randint(0,3)]
最终,问题是设置这种面试前测试是否有用?我认为它有优点,尽管它与潜在候选人的原始编码能力无关,而且肯定不会阻止任何人接受面试。对我来说,测试的目的是引发一场关于他们写了什么以及他们是如何写的对话。由此产生的关于代码的对话以及他们在解释自己方面的能力是其中最重要的部分。一个好的候选人应该能够清楚地解释他们做了什么才能得到他们交出的结果。谈论编码任务也只是面试过程的一部分,因为招聘新开发人员还有很多其他事情。