当前位置: 首页 > 科技观察

为什么今天的编码面试仍然如此糟糕?

时间:2023-03-12 09:26:09 科技观察

作为候选人,最重要的是要记住,45分钟的编码面试并不能准确评估您是否能胜任这份工作。高假阴性率意味着你永远不应该因为被拒绝而感到难过。拒绝通常只是意味着你需要更多的练习来证明你在一个人工的、时间紧迫的环境中已经拥有的技术能力。“我们90%的工程师都在使用你编写的软件,但你不能在白板上实现反转二叉树的实现,所以你被拒绝了!”Homebrew创始人MaxHowell于2015年在推特上抱怨谷歌的编码面试,获得了10,000多个赞,并引发了热议。但直到2019年至今,coding面试依然占据着互联网面试的重要位置,一直被吐槽,从未动摇过。这篇文章的作者,一位前编码面试拒绝候选人,后来成为Facebook编码面试官,在这篇文章中分享了这种视角的变化,提供了为什么编码面试很重要的深入分析以及一些改进的想法。你很紧张。电话面试即将开始。这可能是您今年获得理想工作的唯一机会。这一切都归结为一件事——您有45分钟的时间来证明您的问题解决能力和编码能力。电话突然响了。你拿起电话,只听见心跳的声音。在简短的寒暄之后,面试官将第一个问题粘贴到您共享的编码环境中并开始解释问题。你的大脑一片空白。你太紧张了,在巨大的压力下你无法清晰地思考。你一直看着你的手表。5分钟过去了。安静。你知道面试官一直在等你说些什么。你试图用你的思想打破沉默,但它只会扰乱你的思维过程。你又看了看手表。20分钟过去了。你惊慌失措,在你不知不觉中,面试官说是时候了,你有机会问他们问题。你的情绪低落。你没有机会进入下一阶段。但是你还是问了几个心不在焉的问题。通话结束,几天后您收到一封拒绝邮件。理性地说,我知道我已经足够好了。但是在经历了几次这个可怕的过程之后,我开始失去信心。我可以告诉自己,我比大多数人都知道如何编码。多年来,我一直在构建网站和应用程序,其中一些已被数千人使用。我以优异的成绩获得了牛津大学的计算机科学学位。但在情感上,一连串拒绝的痛苦仍然困扰着我。我将这种痛苦转化为在编程面试中表现出色的决心。我买了一块白板,一些马克笔,还有一本《程序员面试金典(Cracking the Coding Interview)》的书。几周后,我完成了书中的所有主题。对于每一个问题,我都把代码写在白板上,说出自己的思考过程,然后把代码输入到笔记本电脑的IDE中。我写了一些测试用例来保证我的解决方案有效。我还阅读了书后的参考答案。对于我犯的每一个错误,从小的语法错误到算法使用错误,我都会记录下来。在开始下一个问题之前,我会检查所有错误。下一轮面试很顺利。我收到了多个邀请,并决定加入一家伦敦科技初创公司——Improbable。在Improbable工作一年后,出于各种原因,我决定另谋高就。我不得不再次进行编码面试,但距离上次培训已经有一段时间了,所以我需要更多练习。我对LeetCode和HackerRank问题重复了相同的过程。LeetCodePremiumSubscription提供了一个庞大的题库,里面的题是按照问的公司分类的,按照出题频率排序的。这种方式很棒,我可以专注于最常见的问题。经过这一轮面试,我拿到了Facebook的offer。我已经在Facebook工作两年多了,发现自己在电话的另一端面试其他候选人。我经常看到无法克服紧张情绪并犯下与我相同的错误的候选人。我知道这并不能代表他们作为软件工程师的能力,也不是他们未来工作表现的特别好的指标。那我们为什么还要这样做呢?对我来说,我工作做得好与否不会因为我学习并通过编码面试而改变。但我能够学习并通过编码面试的事实证明我具备这份工作所需的原始技能。如果某人可以通过编码面试,那么他们很有可能具备在工作中取得成功的技术技能——他们将成为一名优秀的员工。如果某人没有通过编码面试,他们仍然有很大的机会成为一名优秀的雇员。让我们进一步分析一下。从本质上讲,面试是一种从求职者身上提取信号的方法,可以预测他们是否会在工作中取得成功。与任何涉及分类的预测任务一样,预测有时是正确的,有时是错误的。当你与候选人相处的时间有限时,你能提取的信号就会受到限制,你的评估就会不那么准确,你就会犯更多的错误。当你错误地认为某人是一名优秀的员工时,这是误报。当您错误地认为某人是坏员工时,这就是假阴性。事实上,对于公司来说,误报比漏报更严重。雇错人的成本非常高,新员工最初对公司来说是净损失,因为他们必须经历昂贵的入职期,他们不仅没有生产力,而且占用了其他人的时间,同时还得得到报酬。如果你必须在入职期后解雇应聘者,你将永远无法收回这笔费用。如果由于该国的就业法而难以裁员,成本也会飙升。另一方面,拒绝好的候选人的成本非常低。随着优秀候选人数量的增加,拒绝优秀候选人的成本变得更低。在任何二元分类任务中,都存在误报率和漏报率。您可以更改分类阈值,即某人预测阳性而不是阴性的阈值,以优化这些比率。在这种情况下,误报率是:(你雇用的不合格候选人的数量)/(你雇用的人数),误报率是:(你拒绝的合格候选人数)/(你拒绝的人数))当你提高门槛(招聘要求)时,你以增加假阴性率为代价降低了误报率。这意味着拥有大量申请人并在新员工身上花费大量资金的公司更有可能提高他们的标准。该系统通常适用于公司,这就是它没有太大变化的原因。但这对个别候选人来说效果不佳。一个候选人只是一大群申请人中的一员,运气在这个系统中变得很重要。由于面试表现与工作表现并不完全相关,因此公司经常会拒绝比他们雇用的更适合工作的候选人。编码面试尤其如此。花更多时间解决传统编码问题的候选人可能有优势,他们在现实世界中解决实际问题的经验较少。查看Homebrew创始人MaxHowell的这条推文:如何改进系统?面试的目的是从应聘者身上提取足够的信号来预测他们是否适合这份工作。如果你有完全准确的预测,你可以聘用所有能胜任这份工作的人,这对公司和候选人来说都是完美的。一种几乎完全准确的方法是为求职者提供一份固定期限的工作,如果他们成功了,则为他们提供一份永久性工作。这就是实习,加长版的面试。问题在于,这对公司来说是一项风险投资。这就是为什么实习机会也依赖于编码面试。实际上,公司从候选人那里获取信号的时间和资源有限。候选人通常只有有限的面试时间。在这些时间限制内,公司希望收集作为软件工程师取得成功所必需的几个关键信号。作为面试官,我希望看到应聘者具备数据结构和算法的基础知识。通过讨论替代方法和权衡取舍,他们可以利用这些知识提出问题的算法解决方案。我想看到他们用编程语言编写他们的解决方案,解释时间和空间的复杂性,遍历他们的代码并对其进行测试。因此,如果您只有45分钟,这种常见的编码面试形式确实有意义。改进编码面试话虽如此,白板是不必要的。如果你从来没有在白板上编码过,你会觉得有点奇怪和分心。因此,如果应聘者更喜欢使用键盘,公司应该让他们使用。您不想拒绝候选人,因为他们不喜欢在白板上编码。作为面试官需要改进的另一件事是选择问题。最好不要选择数学或计算等狭窄领域的问题,以及需要大量创造性思维或特定领域知识才能解决的问题。理想情况下,候选人应该能够逻辑推理并逐步迭代以得出最佳解决方案。您不想拒绝候选人,因为他们在45分钟的面试中没有答案。最后,让应聘者放心很重要。当您的思想处于竞争和压力之下时,很难保持逻辑和条理。就他们最喜欢的过去项目进行一些简短的采访,可以很好地平息应聘者的紧张情绪。您不想拒绝候选人,因为他们发现时间紧迫并且编码压力太大而无法达到他们的水平。但除此之外,如果不放开时间限制,就很难提高面试信号的准确性。获得更多信号有些公司会要求应聘者将任务带回家以消除时间压力,并会想象一个更复杂的编码问题以提供更多信号。一些公司会经历多个面试阶段以收集更多信号,因此希望应聘者请几天假去面试。一些公司进行更广泛的面试并测试更多实用技能,例如浏览大型代码库或构建与某些公共API交互的React前端。虽然这些方法为公司提供了更好的信号来向优秀的候选人提供更多的报价,但它们也占用了候选人的大量时间,这可能会使面试体验不那么愉快。问题是,如果一个候选人同时向多家公司提出申请,那根本行不通,每家公司都有极其耗时的面试过程。面试即服务的一种解决方案是统一多家公司的编码面试流程。独立编码面试服务可以比任何一家公司多花5-10倍的时间面试候选人,让他们更清楚地了解候选人的技术能力,降低误报率,同时保持较低的误报率。这将为候选人提供更高效、更愉快的体验,因为他们可以避免在多家公司重复相同的面试过程,避免依赖运气。这释放了公司资源以专注于最终的非技术面试,例如团队和文化契合面试。像Triplebyte这样的公司已经在尝试这样做。但他们似乎更多地将其用于筛选,而不是完全取代技术面试。我认为用更准确、统一和独立的版本取代大公司自己的技术面试流程的主要挑战是获得他们对该流程的信任,同时允许在评估特定技术技能和申请人水平方面进行定制。最后的想法作为候选人,要记住的最重要的事情是:45分钟的编程面试并不能准确评估你是否会胜任这份工作。高假阴性率意味着你永远不应该因为被拒绝而感到难过。拒绝通常只是意味着你需要更多的练习来证明你在一个人工的、时间紧迫的环境中已经拥有的技术能力。