让应聘者写一个链表实现是不好的面试做法吗?[关闭]


43

通过阅读本网站和SO,我看到了许多关于采访问题和答案的故事,这些故事都说候选人必须从头开始实现链接列表。通常,这是对候选人编程(例如编写FizzBu​​zz)进行的“技巧”练习。这个想法是,如果候选人不能做到这一点,他们就不能编程,应该几乎立即被拒绝。

但是,由于以下原因,我不禁认为这可能是一个不好的做法:

  • 诸如C#和Python之类的现代高级语言在本地广泛使用列表。仅在特殊情况下甚至可能不明智的情况下,才需要编写自己的链表对象。
  • 像C ++这样的低级语言具有带有迭代器/列表容器和对象的标准库。
  • 根据前两点,编码人员可以花很多年甚至不用考虑自己实现列表(链接,双向链接等)。自大学时代以来,有些人甚至可能还没有真正看到过这种东西。
  • 计算能力也不是几年前的因素,因此通过指针进行的效率不是(通常)曾经存在的问题。
  • 一个简单的网络搜索,例如“链表示例”,将带来大量代码示例,这些代码示例只能被记住并吐出来,而不能真正表明申请人的真正能力。

我应该说,使用链表引发对候选人的问题解决能力/批判性思维能力的开放式提问/讨论最有可能是一种非常好的面试习惯。面试官可以通过任何方式真正看到申请人的身分,以及他们认为如何从中受益。

我认为对于在台式机或Web应用程序上工作的程序员来说,这种“无链表代码,无工作”的二进制方法有点过时了。这也可能非常有害;如果一个候选人不记得如何正确地处理列表的开头,那么他本来就是一个出色的编码人员和同事,但却迷失了自己。有什么想法吗?

编辑:有很多(好)评论表明这是一个要问的好还是坏的问题,取决于工作的上下文。我完全同意,所以让我改一下这个问题:对于许多编码工作,实现链接列表是常见的面试问题,类似于FizzBu​​zz之类的问题或编写用于计算阶乘的递归函数的问题。这个问题是否具有足够的实用性,可以普遍用于全面评估编程候选人?还是应该问一个不好的问题,除了“高级开发人员,嵌入式链表团队”职位以外?


11
这是做什么用的 这是什么类型的工作?它在哪个域中?
Thomas Owens

1
我看到了您的修改,但仍然-这是什么类型的工作?这是实习吗?入门级工作?中级职位?您是否想聘请程序员,工程师或科学家?这是哪个域?他们是否会因为某种原因而需要滚动自己的算法或数据结构?
Thomas Owens

3
“ C#(...)本机广泛使用列表”和“通过指针来提高效率已不再是以前的问题”:您确实知道这些本机列表不是链接列表,而是基于数组的列表?由于缓存,阵列的性能往往更好。实际上,IIRC直到.NET框架都没有链表,直到2.0。我很确定那里的大多数C#程序都不使用链表。
亚历克斯十布林克

1
@AlextenBrink有趣的是,我认为这意味着链表知识对C#的重要性甚至更低。当我可以使用语言中内置的更好的结构时,为什么还要自己实现一个数据结构(可能存在错误)?
joshin4colours 2012年

我想到的问题是“为什么甚至考虑使用几乎在所有情况下都比另一个数据结构逊色的数据结构”?对于大多数操作,链接列表比基于数组的列表要慢。链表唯一有用的是在固定时间内删除,但是很少有需要这样做的情况。请注意,我并不是在讨论面试问题是否是一个很好的数据结构:我不知道所涉及的概念可能是一个很好的测试。
亚历克斯(Alex)10 Brink 2012年

Answers:


52

如果回答问题可以告诉您您想了解的候选人信息,那么这是一个很好的面试问题。如果没有告诉您,这是一个不好的问题。

像FizzBu​​zz这样的简单问题确实有特定的目的。如果候选人无法编写FizzBu​​zz,则他们根本无法编写代码,您可以尽早结束面试。我认为实施链表的难度稍高一些,但是它通常可以引发有关数据结构的对话,这将揭示很多内容。

请记住,没有一个面试问题可以告诉您所有您想知道的事情。您确实需要准备好一组问题。你应该问的顺序从最简单到最困难的问题,所以你可以找到的限制什么的候选人知道。如果您问了一个问题并被他们钉住,您仍然不知道他们还在做什么或不知道。


关于您的编辑:

这个问题是否具有足够的实用性,可以普遍用于全面评估编程候选人?还是应该问一个不好的问题,除了“高级开发人员,嵌入式链表团队”职位以外?

我认为这是一个很好的通用问题,几乎可以用于评估任何编程候选人。它只需要成为更多问题的一部分。对于许多职位类型来说,这将是一个很好的破冰者(即使候选人无法从头开始实现一个链表,也许他们可以解释他们之前使用过的列表以及关键功能是什么),或者有关“高级开发人员,嵌入式链接列表小组”职位的一系列更高级的问题。


19
您的第一段是故事的一半。另一半是:如果被问到这个问题使应聘者想为您工作,那么这是一个很好的面试问题。如果它使候选人希望对您的工作,这是一个坏的问题。
ruakh 2012年

5
您无法找到候选人应有的知识的极限,因为您无法断言您认为“复杂”和“基本”的事物以相同的顺序适用于候选人。LinkedList可能是大学教授的程序员的基本知识,但是自学成才的程序员很可能不必编写一个。毕竟,只要有需要,他都可能写了“ LinkedList <string> ...”。这是否意味着他的知识被钉在“ linkedList”级别下?他可能是更复杂学科的专家,并且可以在5分钟内在Google中学习法律知识。
西尔维德拉格(Sylverdrag)2012年

1
@Sylverdrag这就是为什么我说您需要多个问题的原因。一旦发现他们对链接列表的了解有限,请转到另一个主题。
比尔蜥蜴2012年

@ruakh肯定是其中一部分。如果在面试中我被问到的每一个问题都是关于CRUD应用程序的平凡方面的(即,我认为我在那家公司不能学到任何新知识),那么这并不会激发我在那工作。
比尔蜥蜴2012年

34

我之所以错过了工作,纯粹是因为我的脑子被这样的简单难题所困扰。在其他采访中,我也对此类难题做了出色的研究-我知道如何在无压力的环境中实现链表。我从来没有和我一起工作过的人抱怨过我的能力,所以也许我不应该以为我错过了工作,我应该以为他们错过了我。

是的,我认为这充其量是个有问题的做法,但我确实理解。我还考虑了将其置于高压状态而不是问题的错,而是发问者的可能性。

就个人而言,我更喜欢问关于候选人已经解决的问题的开放式问题,如果可能的话,最近要解决,并涵盖编码和流程问题。如果他们可以带来代码示例,那就太好了。


他们需要问一些问题,无论是困惑还是其他。任何问题都可能导致该人空白。
2012年

2
@pdr-“如果他们可以带来代码示例,那就太好了。” 如果他们编写了他们带来的代码示例,那将是无价的。
robrambusch'1

4
如果某人在链表实现上的想法空白,而他们又一点提示也无法解决或轻易感到沮丧,那么我认为那是我不介意错过的人。
Bill K

1
@pdr-“如果不能,您认为自己会得到这份工作多久?” -只要您遭受任何人力资源管理,都需要解雇他们。然后,还有重新启动候选搜索的额外费用。此外,您将面试的下一个人可能已经成为整个部门的技术关键,因此固有的机会成本。但是,现在当然不可用,因为雇用了错误的人,他们找到了另一份工作。
robrambusch 2012年

1
@robrambusch:他表现出出色的解决问题的能力,并且很好地谈论了课堂结构。但是他没有写代码。关于在面试中编写代码的主题,是的,这很有用,但我坚持认为,与您讨论已解决的问题相比,一个小时内可以给您更多的了解,而不仅仅是给您一个人为的问题。小时解决。
pdr 2012年

25

必须定义编程作业类型。如果您从事开发编译器和算法的业务,则应该对此类问题提出疑问。如果您使用的是业务线类型的应用程序,并且您希望候选人进行CRUD应用程序,那么可能对概念的了解(无需编写程序)就足够了。如今,在LOB类型的应用程序中专门完成工作所需的不同技术知识已取代对整洁算法的需求。


究竟。去年,我编写了一个通用的遗传排序组件,该组件还使用了一些模拟退火(以创建班级时间表),并使用了几种“高级”数据结构来使其发挥作用。我不需要编写单个代码。如果.Net框架没有我需要的内容,则可以使用C5或Power Collections。
ElGringoGrande 2012年

4
同意,我整天都在编写LOB应用程序,过去我在大学里用COBOL编写过链表实现。我可以再做一次,但是为什么呢?许多有能力的LOB开发人员可能从未编写过,也永远不需要编写。
CaffGeek

1
大致上同意,但是链接列表并不是什么稀奇古怪的东西。这是基础知识,仅比FizzBu​​zz高一级。
弗朗切斯科·德维托里

1
@FrancescoDeVittori:有时候不是这个问题吗?有人给您要解决的问题。看起来很简单,但是您之前从未做过,所以您的大脑开始竞赛,试图找到陷阱,如果您不考虑的话,这将花费您面试的费用。它不在那里,但是那会分散您解决实际问题的注意力。
pdr 2012年

@FrancescoDeVittori:您能举几个非基本面试问题的例子吗?我需要这个来自我完善。谢谢。
2012年

9

我的回答是“取决于”。如果候选人在简历中列出了C或C ++,我会问这个问题。要求实现一个链表是理解指针的一个很好的测试,这对于C或C ++程序员绝对是必不可少的。

另一方面,如果候选人不声称知道C或C ++,我不会要求他实施链表,但我会考虑提出有关此问题。从高层次解释链表的工作方式。在列表的开头添加元素的复杂性是什么?列表的尾部?在列表中间插入元素?什么时候使用列表而不是数组?这些是基础数据结构概念,恕我直言,每个程序员都应该知道。


7

我不会认为这是一个糟糕的面试问题。许多数据结构的理解和编程都是从对链表的真正理解开始的。也就是说,有一些警告:

1)是嘶嘶声类型的问题。您只是在验证一个非常基本的内容:此人是否了解链接列表。询问并继续前进。

2)链接列表面临的挑战是,非常适合显示您对链接列表概念的理解的语言(例如C)可能与他们将在工作中使用的语言不同。当然,您可以使用任何一种结构语言来展示基本的理解,但是要求候选人不使用[]来重新实现Erlang中的链接列表并不是相同的挑战,并且不会告诉您关于候选人的理解的相同信息就像要求他们在C中进行操作一样。要求他们在C中进行工作(如果工作围绕Java)也有点不足。

3)考虑到这一点以及“白板编程”的一般挑战,当问这种问题时,只要它们能够理解核心原理,我就会接受伪代码或图表。我并不是要求人们在语法和逻辑上都是完美的白板上编写代码,尤其是当他们能够然后转过身并在被要求再次查看时识别出任何逻辑问题时。YMMV。


6

在进行采访时,经常有人问我链表的实现和一些以链表为中心的算法。我解决了大多数问题,其中一些问题要求我稍微锻炼一下神经元。

如果要面试,我会采用某种链表的实现方式,而不是测试一个人在编码方面的表现如何,而是要检查一个人对细节的重视程度。任何人都可以编写一个链表,但即使是一些优秀的程序员,也会碰到这种边界情况。不要问他:Write a code for linked list in C/C++。请他用C(不是C ++)等编写通用链表。

扭转问题,并将其他条件放在链表上,您将有一个很好的问题要问。那有些人一定会犯错。


2
没有这样的东西在C通用链表
DeadMG

1
认真吗 我以为void只是那里有指针... :)我在Google上找到的“ c中的通用链表”的第一个链接是:daniweb.com/software-development/c/threads/109260,另一个是技术面试.com /… 我以为每个人都知道这一点!
c0da 2012年

我还没有测试这些代码,但是我之前有这种类型的链表,它确实可以正常工作……
c0da 2012年

即使在C#中编写通用链表也具有一个或两个“陷阱”(例如,比较类型T的元素是不明显的;即(T v1,T v2)=> {return v1 == v2;}将无法编译除非您有类约束或使用默认的等于运算符)
Steven Evers 2012年

@ c0da在我看来,使用void指针的列表不是通用的,而是在任何时候都是通用的。他们可以在其中容纳任何类型的东西,甚至可以将他们想要的所有东西混合在一起-正是这对我来说不是通用的。就像object在面向对象的语言中使用基本类型一样…
戳2012年

5

在到目前为止的大约十年的专业编程生涯中(还有大约十年的业余爱好),我认为我不需要实现链表。如果有人在面试中要求我这样做,我可能会反问我是否会在工作中定期这样做。

可以肯定的是,几乎肯定有工作要做,您需要编写或多或少在无尘室中实现常用算法的实现-例如从头开始实现链表。但是对于大多数编程工作,应聘者在面试中对公司有什么具体价值?在这样的情况下,真的真的如此重要吗,以至候选人提供了一个完美的实现方案,可以正确处理极端情况,根据语言或框架的常规惯例报告故障,等等?还是您可以忽略掉它,而是专注于他们如何实际解决他们可能在10到20年内没有遇到过的问题?

当我面试目前的工作时,我对公司所使用的技术堆栈的经验很少。几年后的现在,我经常有同事来找我,不仅问关于产品,他们的实现以及他们所执行的标准的问题,而且还问关于更多一般性编程问题的问题(昨天才问我什么?这意味着在特定表的上下文中,SQL Server中默认约束中的循环依赖关系及其在我们的案例中的用法-通过它的推理,结果表明在该特定案例中没有任何涵义。我也不需要一个全新的链表实现。

提出与候选人可能被分配的工作相关的问题,并尝试了解他们对获得新知识的感觉。他们将如何弄清一些他们从未见过的晦涩语法的含义?(例如,如果您是C店,那么您可以尝试一个涉及三部曲的问题。)对于编程职位,他们是否定期阅读或为诸如Stack Overflow之类的论坛做出贡献?如果要求他们以某种编程语言或框架执行某些任务,他们几乎没有经验或没有经验(例如,如果您主要是Java商店,那么Clojure或.NET呢?),那么他们将如何解决这个问题?也许从您的错误跟踪器中取出一个真正的错误(甚至可能是一个已解决很久的错误),并询问他们一般如何解决该问题,并准备解释有问题的产品的相关部分。

如果候选人能够处理与业务案例有关的类型的问题,并且对学习新事物有良好的态度,那么这可能比能够对已知问题提供罐头答复更好地表明该职位是否适合该特定职位。有关FizzBu​​zz,链接列表或其他问题的问题。考虑到候选人与团队的融合程度,我认为您的立场很安全。


4

当然,大多数人永远都不需要实现链接列表,但是要从头开始实现它们,可能需要正确处理指针。他们的想法是,为指针形成一致的思维模型与语言能力相关,了解在某些(抽象)机器级别发生的情况以及总体上抽象的能力。

我并不是说这必然是最好的方法,而只是说存在某种关联。


4

您一开始就说他们是“大问题”,但随后您指出人们将无法做到。我糊涂了。

我是这样想的:

  • 就像您所说的那样,几乎不需要编写任何东西,因此人们很容易忘记。
  • 它们并不难编写。
  • 可以将用于编写它们的概念视为基本概念。
  • 它们的使用频率非常高(即使您不知道)。

我认为这使他们提出了很好的问题。如果您担心他们会预先学习面试,请列出清单。让他们将其写成圆形,并询问其实现的渐近运行时间。还是让他们编写另一种常见和/或快速的数据结构...二叉搜索树?队列(FIFO)?堆栈(FILO)?天真的(O(n))优先级队列?我认识的很多人都认为BST O(log n) 只是因为它是一棵树

如果你正在寻找的人谁将会在金属加工,并且需要一个数据结构坚实的基础......这些甚至可能为你想要雇用的考生太微不足道了。

当然,这是假设您想要一个具有数据结构基础/基础知识的开发人员,并且他们的职位将从这些基础结构中受益。如果您希望某人可以在几秒钟内将一个asp页面放在一起,请进行面试。关键不是要选择一个面试问题,因为其他人都会这么做,而是要选择一个可以衡量您所寻找技能的问题。就个人而言,我认为数据结构问题是好问题,还是链表问题。


在实践中不要混淆。FizzBu​​zz是一个更简单的问题,但申请人通常甚至无法开始回答。链接列表也是如此。这是编程世界的一个谜。
joshin4colours 2012年

@ joshin4colours:不,我对此问题感到困惑。OP最初说LL问题是gimme的问题,但随后列出了有关合格的开发人员为何无法通过该问题的要点。
史蒂文·埃弗斯

3

这个问题是否具有足够的实用性,可以普遍用于全面评估编程候选人?

不,绝对不是。根据它的措辞,它会告诉您的内容范围从“此候选人知道如何设计链表”到“此候选人可以用语言X编写链表”。如果您要求伪代码,它将倾向于第一个。如果您要求使用特定语言的实现,您将对他们对该语言的理解有更多了解(尤其是对于C和C ++,可以在其中处理指针,引用和结构)。

我什至可以说无法使用相同的问题评估所有候选人。您需要量身定制面试问题,以评估所需的技能。

如果该人将要编写代码,那么我考虑考虑一个算法和/或数据结构问题,只要它与该职位相关即可。我会尝试选择以前可能已经讨论过或使用过的东西。我还将专注于除上述算法和数据结构的实现以外的其他事情,例如运行时间和内存消耗(诸如big-O表示法)。这些概念不仅与创建数据结构有关,而且与选择最适合的实现方式有关(例如,例如ArrayListvs LinkedList)。


3

我认为对于常规的编程工作而言,应该不会淘汰一个候选人。但是,如果您要与真正的高级程序员或刚接触猴子编码表单多年的人打交道,那将是一个很好的选择。即使这样,它也不应该是选择程序员的基本标准。也许是一位伟大的程序员,记忆力很差,多年没有读过“链表”一词(或不记得名字了),但仍然可以做出色的应用程序。

因此,如某些人所述,如果要做的工作是需要使用链表和许多精美的算法等,那么就可以了。如果对于表格上的常规输入数据,验证并显示是一种无用且不公平的。


2

我认为这是面试问题的一个不好的例子,但出于另一个原因。链表是一个简单的概念,知道它是什么,知道如何实现它。如果此人不知道什么是链表,那么您必须解释它的工作原理,并且这样做时您会给出答案,而不会发现有关他们是否知道如何解决问题的任何信息。因此,这个问题可以简化为“您是否已经知道链表是​​什么以及它是如何工作的?”,这告诉您关于它们作为程序员的适用性没有任何用处。


2
善于记忆的人也会对热门问题进行游戏。
保罗·内森

1
如果您必须向候选人解释链表的工作原理,那么您可能不应该雇用他来进行编程...
Dima 2012年

2

编写链接列表实现是一个很好的面试问题,因为它将揭示有关候选人编码方式的很多信息:

  • 他知道API是什么吗?他可以使用别人的密码吗?他可以编写代码以便其他人使用吗?

  • 他知道链接列表是什么吗?他知道集合,数据结构,算法吗?

如果他什至不知道链表应该提供什么方法​​,您就会知道他可能从未使用过,或者知道何时使用。

  • 他如何处理这个问题?他是否首先要进行分析,先准备一个小规范并进行一些测试?还是他只是开始开心地偷东西?

  • 他会处理一些小案件吗?从链接列表中删除最后一个节点怎么办?如果有人尝试将对链表本身的引用添加到链表,然后删除整个内容,该怎么办?

  • 他会处理例外情况吗?每种编程语言都有自己的异常处理约定:在Java中,当对空列表执行getFirst()时,您会期望LinkedList抛出NoSuchElementException。其他语言可能返回undefined,-1或常量。


在面试编码练习中,除非特别要求,否则我将跳过各种边缘案例处理,错误处理等操作,超出了概念验证所必需的范围。但是,我也要明确地说,这是我正在做出的选择。在一个小时甚至几个小时的面试中,所遇到的限制与实际工作中的实际情况大不相同。
CVn 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.