面试官为什么要提出相关的名单问题?

2021-03-30 00:17:16

几年后,我在研究软件历史上进行了谈话,使用“链接的列表面试问题”作为示例主题。由于将人们推荐给视频,而不是仅仅是写博客文章,我在这里再现了这个问题。

那么,为什么采访者喜欢提出相关的列表问题?如果你问人,你通常得到两个答案之一:

这些答案是矛盾的:如果你想知道有人知道CS基本面,你不想给他们一个问题,他们可以欺骗他们的方式,如果你想测试推理能力,你不想给一个他们已经在CS中看到的问题。两个矛盾的答案告诉我有一些历史涉及的。我的猜测是最初的人问了一个非常好的原因的问题,然后随着时间的推移忘记了原因,并提出了Hoc理由。我以前见过这一点。那么人们何时开始询问LL问题,他们的原因是什么?

第一步是弄清楚人们开始询问问题时。我总是尝试的第一件事就是采访。人们只记录他们关心的内容,所以回忆是最富有的文化背景。真的,面试的最大挑战是找到人们。我假设在90年代首次提出了问题。从Twitter上那时有足够的人,我很幸运能够有一个很好的推特接下来,所以我直接问:

您是否在90次初期进行了编程访谈或采访他人的其他'如果是这样,问题是什么样的?

- 2019年5月29日的希尔勒(@Hillelogram)

然后我跟进了DMS。我听到的是我的意见:对他们来说,联系的列表问题已经完成了“因为他们总是被完成”。我不得不前进,所以在1970年和1980年设置了我的新目标日期。

我们去之前,找到人的越难。如果您于1970年毕业,立即获得了您的第一个编程工作,那么您现在就是73。您可以完全断开与编程场景完全断开连接。幸运的是,芝加哥ACM章歪斜围绕老年人,大量的与会者在那个年龄段。根据他们的回忆,LL问题开始于70年代后期到80年代中期。

他们无法告诉我为什么:人们的记忆会在四十年前对面试问题进行模糊。目击者账户很棒,但到目前为止只花了我。

接下来建立时间的背景:人们试图做什么以及为什么。这意味着检查文化伪影或主要来源。

主要来源:直接连接到手头主题的信息。示例:Reddit Convos。代码样本。 kubernetes教程。与那里的人进行采访。

二级来源:其他人产生的信息分析主要来源。例子:霍普尔纸。关于软件历史的书籍。这个帖子。 1

大多数人可以消费次要来源更容易。主要来源是凌乱的,矛盾的和不完整的,而次要来源可以通过和呈现和呈现。但我们希望杂乱和矛盾的信息。必要性的二级来源必须过度简化,并失去细微差别。 2个二级来源对于学习历史来说很好,但对历史差不多。我们需要使用主要来源。

一些主要来源比其他主要来源更容易进入。像计算机历史博物馆这样的东西将在研究这方面是一个巨大的帮助,但我并不是在全国范围内飞过读链接的名单。一些主要来源比其他主要来源更有用。如果我可以在1980年的面试书上掌握我的手,那将立即结束我的搜索。在实践中,这不太可能,但在你找到一个的机会上,这仍然值得黑天鹅席卷。在这种情况下,没有运气,也不是ACM数字图书馆的浏览器的浏览器件。

接下来:寻找人们谈论工作流程的记录,看看他们说的话。这些讨论中的大多数都发生了,但我知道至少有两个他们可能已经存档的地方。放置一个:公告板系统,该系统首次出现在1978年左右。两个:Usenet在1980年之后提出。我预计从Usenet获取更多信息,更大,更好地保存,但是BBSes正在吸引他们以前的呼吁。这些都不是过去计算世界的完美代表性,就像黑客新闻如何不是现在的良好代表。 3那是YA的主要来源!

我找不到任何BBS档案馆; Usenet它是! Internet Archive在82和86之间的职业汇票中有2,000个Net.jobs帖子。虽然没有人谈论面试过程,但永久关闭该划线。

有了这个,我想出的任何答案都将基于我解释主要来源。我找到了研究这种历史的最佳方式是使用一种形式的科学方法:收集证据,制定一个假设,然后根据该假设预测其他历史证据。招聘帖子有什么模式吗?

事实上有两个。一:很多人都为UNIX和C程序员招聘。 1在6个帖子中为C,几乎一半的帖子提到Unix。当你意识到1)这是一点令人印象深刻,这就是所有工作,而不仅仅是“低级”的工作,而且2)Unix在当时的许多其他内容竞争。二,很多人都不关心学术凭证。只有大约50%的人要求学术经验,其中许多人都有ee学位良好!这扔了一把扳手,“这是关于CS基本面!”假设。

让我们缩小一下。想象一下,您有一个链接列表,您需要将新值追加到最后。你怎么做呢?这取决于语言。

Fortran-77:您没有任何动态存储器或数据结构,因此首先是不可能的。

C:拍摄手工滚动的自定义链接列表数据结构,贯穿它直到到达最后一个节点,为新节点分配内存,并将最后一个元素设置为该新节点。

C和Pascal是最流行的语言,它们是唯一一个所需的“主流”语言,需要您手工实施链接的列表算法。 4您正在使用链接的列表算法,日内日。因此,“反转此链接列表”不是对算法知识的测试或“脚下思考”。这是一个关于你编写的c的考验

关于目的特别有趣的是与我们今天的目的完全相反。公司没有测试理论CS知识,他们正在测试与指针的实践经验。 5问题不应该是学术CS知识的每个人都会得到的东西,否则它不会测试经验。同样,在十分钟内,你不应该“通过它”。如果您知道C,并且其他问题,一个问题应该是一个很容易的东西。 LL问题非常接近这一点!

所以我有我的假设。它预测了什么?我想出的那个是“C和Pascal计划者应该比其他程序员更频繁地谈论指针操纵。”你期望越多的人讨论指针,更直接的内存操纵对他们而言。该档案有1980年代的Usenet转储一堆不同的语言。我挑选了五种语言 - Lisp,Prolog,Smalltalk,Pascal和C-并开始工作。 6.

天真的事情将是为了“指针”来到所有人。这让我这么说:

6%的Prolog Posts和8%的Smalltalk和Lisp帖子提到指针,而10%的Pascal和17%的C帖子所做的。这是一个非常强大的信号。

......哦等等,“指针”也是一个英语单词。我不能依靠自动化工具来进行紧张数据。 7如果我真的想准备一些准确的话,我必须手动通过帖子,杂草出误报。

只有3%的Prolog,SmallTalk和Lisp帖子谈到了指向记忆操作的指针,这对我来说表明它确实并不重要。帕斯卡尔下降10%至7%,C滴从17%到16.5%。

C和Pascal程序员必须自行实施链接的列表算法,而其他语言则提供库。

这不是明确的证据,即LL采访问题是Shibboleth的经验。然后,没有什么可以是明确的证据,短暂的时间机器或令人难以置信的幸运。然而,这对我来说已经足够了。

所以最后一个问题:为什么我们仍然问一个问题?我们中的许多人不再以低级语言工作,因此我们不应该预期之前有人操纵。为什么问题仍然存在缺席上下文?

这是一个很好的地方,可以在垃圾箱中汲取伟大的历史理论:正确的人在正确的时间在正确的时间可以永久改变历史过程。在这个故事中,有两个人。第一个是Joel Spolsky的面试指南。他声称一般指出的问题,特别是链接的列表,是您的“抽象思想”的基本测试:

指针需要复杂的双重间谍思维,以至于有些人不能做,这对良好的编程来说是至关重要的。通过将JavaScript片段复制到他们的网页并继续学习Perl从未了解指针,他们从未了解的“脚本JavaPs”,并且他们永远不会产生所需的质量代码。

这是您听到的所有这些着名面试问题的来源,如“在树结构中倒转链接名单”或“检测循环”。

这看起来像是对我的假设的反击。 Spolsky在2006年写道,当他正在奔跑溪时。 8 FOG CREEK使用了一个VBA和C#的混合,这两者都不需要您编写自己的LL算法。但是,他在微软开始职业生涯,从1991年至1995年工作。目前,微软从操作系统中赚取了40%的收入......正是那种能够找到相关问题的公司。

我怀疑Guerilla Guide在传播LL问题方面发挥了重要作用。当时在运行技术面试时几乎没有公共资源。 Guerilla Guide提供了建立工艺的良好发射点。它没有伤害斯普尔斯基是一个小型技术名人。链接的列表问题是Joel Spolsky认可的™,为什么不使用它们?

这真的在2008年起飞,当Gayle Laakmann麦克多尔发布破解编码面试时。虽然针对帮助受访者,但它也是一个巨大的面试官,现在有一个大量的彻底问题可以选择。基于McDowell的CCI对她在Apple,Microsoft和Google的体验中,再次,LL算法与其用例直接相关的所有地方。我并不让她在书中放在他们的书上,我没有惊讶,我并不让很多公司开始向他们询问他们,无论相关性如何。

具有讽刺意味的是,这也使LL为原始目的而无用的问题。如果通过要求他们撤消链接的列表,您无法测试是否有人擅长C.他们可能知道如何撤销链接的清单,因为他们需要学会通过访谈!

因此,总结了该理论:在80年代初,C程序员需求量很高。面试官使用了专门测试了C的C的问题,这意味着涉及许多指针操纵的问题。这一根深蒂固的LL问题是许多地方的文化机构,尤其是像微软和谷歌这样做的低级工作的地方。从那里,它出口到更广泛的软件世界,缺乏原始背景,人们认为是关于“测试CS基本面”或“快速思考”。

当然,这可能都是完全错误的。历史就是这样,甚至具有相同消息来源的人才可以合理地结论。尽管如此,我觉得这个问题完美地抓住了我喜欢学习历史的原因。甚至是平凡的事情,因为我们问的面试问题可以在下面有丰富的故事。它也可以访问:除了互联网之外,我不需要任何特殊工具和大量的时间。唯一花钱的是我的数字图书馆订阅。

如果你喜欢这个,我也想鼓励你这样做!找到一些始终窃听软件并查看历史的东西。并分享你的学习!当人们在最简单的事情中分享历史时,我们都丰富了。

感谢Alex Koppel的反馈。如果你喜欢这篇文章,为什么不加入我的时事通讯?我发送每周散文和博客帖子的初稿。订阅此处或阅读档案。

(这里实际上有很多细微差别,读取次要来源有很多情况很重要。但这个切线已经离开了轨道。)

源是主要的还是辅助源取决于上下文。编程教科书是关于计算机科学历史的二级来源,但是关于我们教授计算机科学的历史的主要来源。 [返回]

此外,二级来源的生产者有偏见和议程。那很好,每个人都这样做,不可能没有偏见。但我宁愿通过我自己的偏见来过滤来源而不是通过另一个人和我。 [返回]

在写这个时,我意识到我错过了第三个潜在来源:Byte杂志的早期副本。互联网归档数字化整个运行的副本;也许其中一个讨论了面试?我没有检查过。 [返回]

要清楚,这并不意味着只有C和Pascal程序员知道有关链接的列表及其属性。数据结构是因为永远的CS的一部分。我声称只有C和Pascal程序员需要定期实施LL算法,因为当代语言提供了更多的抽象。 [返回]

这给了我们另一个预测!如果公司对“CS基本面”对“CS基本面”不感兴趣,那么我们希望看到另外两个原型的“CS基本面”问题,排序算法和时间复杂性,以后发展为问题。理想情况下,他们会出现在那种知识实际上有用的地方,但我也可以看到人们出现在人们开始误解为“CS基础”并决定测试这是一个重要的测试之后。 [返回]

在审查这篇文章时,我的朋友Alex Koppel建议了另一个想法:比较相应的语言手册谈论内存操作的介绍。回想起来,这比拖网柱柱的帖子更好。当时我只是没有想到它,可能是因为我已经拖着Usenet来了解工作市场。这是一个很好的研究课程:不要在一个主要来源上定影。 [返回]

这已经破坏了软件研究! 最令人惊奇地,本文,他们在那里他们收集了Git提交消息,以便“修复”并意外包含“添加infix运算符”。 [返回] 史蒂夫·伊吉基于他在亚马逊的经历,2004年写了类似的东西。 我认为他并不像Spolsky一样有影响力,但他的其他面试建议(咬住孪晶,正绪)没有抓住。 [返回]