良好的面试编程项目


26

我正在寻找一些小型编程项目,这些项目可以给潜在的员工评估他们的编程能力。这些将是刚毕业的程序员。我正在寻找需要花几个小时才能完成的项目,他们会在面试后通过电子邮件将答案发送回去。

一个示例是采用这段文本并返回按字母顺序排列的唯一单词列表。在每个单词之后,请告诉我该单词出现了多少次,以及该单词在什么样的情感中出现了。

有人有什么好的建议吗?


ACM编程竞赛问题。您可以在此处找到这些问题的档案。
whatsisname 2011年

1
这些编程难题网站对您来说会很有趣吗?programmers.stackexchange.com/questions/756/programming-puzzles/...
grokus

Answers:


43

我很早就得出结论,一个人在短时间内无法做的任何事情都可以告诉我有关该人的任何有用信息。但是每个优秀的候选人都已经写了个人项目,这些项目可以告诉您很多信息。因此,我用“给我一段令您感到骄傲并乐于为您加盖您的名字的代码”代替了具体的挑战。

他们选择的项目比任何一个小时的任务都多。然后,您可以花一个小时讨论它,以了解更多信息。


4
我记得在一家公司进行面试并得到了相当简单的功能(15-20行),并被问到“这是做什么的?” 我告诉他们,然后问“有人错了吗?”。有人告诉我,他们采访的大多数人都无法回答。也许这是一个快速的选择(我不知道有人会读无法编写的代码,但也许我只是没有遇到错误的人)。
TMN

4
@TMN-哦,我们也做了一些。但是我遇到了会读不好的人
pdr

@TMN自学成才,我花了大量时间在早期阅读代码,以至于在阅读方面比编写方面好得多。它可以而且确实发生,它需要时间和实践来提高写作技巧。
吉米·霍法

27

我对这种令人讨厌的胡扯感到厌倦。我去过一些地方,要求我提供代码示例,将它们撕开,然后让我从他们的系统中解释示例代码,这些示例代码似乎是由2岁的小孩子编写的。我被要求实施晦涩的排序算法,网络服务,GUI,数据结构(总是树或链表)。关于面试官的想法的各种烦人的烦恼问题都是编程中最重要的部分。

最后,这几乎没有用。评估员工的最佳方法是雇用他30天,并查看他做得如何。花费所有时间来开发测试,这不会告诉您某人日常工作的任何事情。


8
编码一个简单的算法,例如所描述的一个bigtang,至少不是“头脑轻松”。能够做类似的事情应该是甚至接受面试的前提(这是在我的公司)。这对于筛选出在纸面上看起来不错的候选人非常有用。我想做的最后一件事是花几个小时去采访一个不能编写函数来判断字符串是否是回文的人。您会惊讶于无法进行bigtang考试的顶级学校的CS博士数量。简而言之,能够完成这样的测试是必要的,但还不够。
Jer

+1 @Jer。上次我为一名程序员进行面试时,八分之六的候选人无法完成最基本的任务(即使使用Google和SO)。我不可能让它们靠近我的真实代码库五分钟,更不用说30天了。
朱莉娅·海沃德

2
@JuliaHayward:我希望任何人都可以通过访问Web /文档来完成项目。当有人错误地假设记住了各种分类技术或任何对日常工作绩效至关重要的错误假设时,就会出现一个问题,当有人开始向您扔时髦术语并模糊您的分类算法,无法访问互联网时,问题就会浮出水面。
Satanicpuppy

12

允许某人自己做一个实际的项目并不一定意味着是他们自己做。

每个人都较早到达接受采访(至少应该如此)。我们有一个“等待时”工作表供他们使用,直到我们准备好看到它们为止。它有八(8)个问题,这些问题用我们主要使用的语言测试申请人的知识。

我们并不是在寻找万事大吉的答案,因为任何人都可以使用面前的计算机来正确解决问题。我们正在寻找过程,他们甚至尝试尝试问题,如何找到答案。

当我们进入面试时,我们会与他们一起讨论并回答他们可能遇到的任何问题,这也可能导致他们获得正确的答案。它还使我们可以问他们如何得到他们想出的答案。

我们发现,这与先前的工作相结合是筛选候选人的最佳方法。

更新2016/06/15

我们在雇用开发人员的过程中已发生了重大变化。

阶段1:15分钟的电话采访,我们问了7个问题。前两个是“您从事的最有趣的事情是什么?” (不必与编程相关)和“您在业余时间会为娱乐编写什么代码?”。

阶段2:一个小型项目,他们可以自己完成。然后,我们与他们进行屏幕共享,他们向我们展示他们的作品。在屏幕共享期间,我们还让他们对他们的项目进行两项更改,然后观察他们的工作并使其正常工作。

阶段3:亲自面试。

这个过程使我们能够立即确定文化是否适合(阶段1)。如果他们能完成工作并实际发言(阶段2)。最后,确保它们的值符合我们的期望(阶段3)。


1
这真是太棒了。我喜欢!
davidhaskins 2011年

3
尽管我参加过很多采访,但都变成了琐事。小心不要陷入系统特定的这一点,而要深入了解它们。尤其是如果声称他们有才能或兴趣的话。结果是我不想为他们工作,而且我确定这是相互的。
约翰·尼古拉斯

“是的,允许某人在自己的时间上做一个实际的项目并不一定意味着是他们在做。”-没错,但是我还没有遇到一个勇于接受采访并敢于质疑他们所没有的代码的人没有写。如果发生这种情况,他们将无法通过面试和试用期,但我可能会重新考虑自己的做法。
pdr

@约翰。同意,不可能是“哦,您在那儿忘记了逗号”。正如我提到的,这是要了解方法的方式以及他们是否理解语言。如果他们知道他们的东西肯定会转移到更大的东西上。
RDL

2
@RDL,我们的大多数面试过程都是为了让我们正在寻找的开发人员好玩,而其余的人则陷入困境。您知道优秀的开发人员如何抗拒挑战。
pdr

4

您可能想看看Jon Jagger出色的Cyber​​-Dojo

这是一个基于Web的集成环境,旨在进行“ 测试驱动开发”的有计划的实践并了解团队动态。它具有许多小型编程任务(kata任务),并且支持从Python和Ruby到Java和C ++的多种语言。

与为生产力而设计的IDE不同,它没有代码完成,语法突出显示或自动重构的功能,因此您可以了解没有这些功能的受访者可以做什么。

最好的事情是,做完kata之后,您可以回头查看每个kata的红色/绿色进度(如果他们不做TDD * 8',也许就不行)。每个编译/测试都将所做的更改与测试结果一起提交到git存储库。

我认为将其用于面试编码测试不仅可以告诉您很多候选人解决​​问题的能力,而且还可以告诉他们解决问题的方法以及在不受外部因素约束的情况下使用的过程,只需选择一个适合于您希望候选人花时间的时间。

如果您想要自己的Cyber​​Dojo服务器,则可以在github上找到整个项目,甚至从那里链接有Turnkey Linux设备虚拟机,这意味着如果您已经安装了VMware PlayerVirtualBox,则可以在其中运行几分钟下载设备!


3

我只接受过一次这样做的公司的采访。他们给出了一个6或7个问题的问题单。说明是要提供一种解决每个问题的方法。

任务之一是认识到您可以重用代码。问题可以使用其他解决方案中的代码。它也不是顺序的。例如,可以使用问题5所使用的方法来编写问题3。

我建议尝试这样的事情。

至于问题呢?在Euler项目站点上的一些起始问题很好。

如果您想了解他们如何将一个项目组合在一起,也可以尝试一个简单的游戏。

或者,如果您不想提出任何建议,请他们从最终项目中以一些代码发送给您。


3

为了要求人们完成一个项目,您应该记住一组要评估的特定技能,并设计项目以测试这些技能。

一个示例是采用这段文本并返回按字母顺序排列的唯一单词列表。在每个单词之后,请告诉我该单词出现了多少次,以及该单词在什么样的情感中出现了。

您在寻找什么问题?有多少种方法可以解决该问题,每种方法对编写答案的人有什么帮助?有效回答该问题所展示的技能是否与对您的业务最重要的技能相同?

我不想要这些问题的答案;我只是希望您在对一组候选人进行处理之前考虑一下答案。如果您知道自己在寻找什么技能,那么创建一个问题来寻找这些技能并不难。如果您使用别人的问题而没有完全理解要评估的内容(如果有的话),那实际上就是在自欺欺人,浪费了每个人的时间。


很抱歉浪费您的时间。
bigtang 2011年

1
@bigtang,一点也不。抱歉,如果上述说法大跌眼镜-我可以看到它可能如何-但我的目标是根据您在新员工中寻找的技能为创建自己的项目创建案例。您几乎可以用任何东西来做一个小项目,但是要使您和受访者都值得做一个项目,要求应该由您最重视的技能来驱动。
Caleb

完全删除了第一句话(相应地,如果您不够聪明,无法自己完成一个不错的项目,那么您是否认为自己足够聪明,可以评估候选人的意见?”)。真的没有添加任何内容吗?值,而且确实有点贵。–
Michael Durrant

0

一个示例是采用这段文本并返回按字母顺序排列的唯一单词列表。在每个单词之后,请告诉我该单词出现了多少次,以及该单词在什么样的情感中出现了。

他们会用什么语言写?如果他们来自一所专注于C的学校,那将不会像教授Python / Perl / Ruby等的人那样写,甚至不是Java或C#。尽管如此,这是一个很好的小测试。

我实际上在面试中建议了一些简单的方法。没有技巧问题。我在这上面与TMN在一起。给他们几个执行基本任务并询问他们做什么的功能(阅读其他人的代码)。然后给他们一些基本任务(<20行),用他们选择的语言编写。对于入门级来说,这足以知道他们是否可以编码(在入门级位置)。加上面试和GPA,应该使您对需要了解的东西有个好主意。


1
我认为语言不是很严格,甚至可以用伪代码来完成。主要思想是查看假定员工是否“进入”并显示出解决问题的良好迹象。
乔纳斯·拜斯特伦(JonasByström)2012年

坦白说,任何带有split()和数组/列表(带有push / append)的语言都将使这个问题变得微不足道。允许C程序员“假设” split()和list,并且它变得微不足道:-)
ChuckCottrill 2014年

-1

让他们使用该语言的设计范例,为您正在使用的任何语言实现Conway的生命游戏

Java或C#Conway的生活游戏应面向对象,LISP或F#可以运行,等等。


2
您要给他们多长时间才能完成此任务?
工作

我花了大约4个小时来完成它的整个OO实现,但是现在我已经完成了十几次了。如果您想了解他们的想法和想法(以及他们是否编写可测试的代码),请给他们更少的时间。如果亲自进行,请给他们45分钟的时间,看看他们能走多远以及为什么选择他们走的路。您希望他们提前知道这些问题之一,这样他们才不会完全迷失方向,甚至鼓励他们自己尝试。它揭示了很多关于程序员的知识。
乔治·斯托克

8
让考生写康威的《人生游戏》测试他们最近在大学学习,写作或研究这个问题。您会聘请@George Stocker,因为他已经写了十几遍了。《生命游戏》与任何现实世界的开发工作之间的关联度如何?
ChuckCottrill 2014年
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.