准备与IT巨人进行面试:我如何克服算法面试的诅咒


免责声明:


我从三岁起就没有编程过,我不了解Knuth,我不是计算机科学竞赛或体育编程锦标赛的获奖者,也没有在MIT学习。我具有计算机科学背景,并在商业开发方面拥有6年的经验。直到最近,尽管我做了几次尝试,但我仍无法超越来自FAANG的IT巨头(Facebook,Amazon,Apple,Netflix,Google等)的技术。 

但是现在一切都变了,我收到了几份要约,我想分享我的经验。这将与软件工程师在上市公司欧洲办事处的职位有关。

为什么需要这个FAANG?我的主观优势:

  1. 良好的条件;薪水高于市场;
  2. 简单的搬迁;
  3. 调试过程;
  4. 来自世界各地的才华横溢的同事。

和准备的优点,即使您没有收到报价:

  1. 旅行;
  2. 提高编写代码的速度;
  3. 能够从精神上检查程序是否有错误(凝视方法);
  4. 能够提出棘手的脚本进行测试的能力;
  5. 发现瓶颈的能力;
  6. 培训系统设计技能,包括比我所遇到的更大的技能。

我们吸引了招聘人员的注意


就我而言,LinkedIn就足够了。几年来,在没有任何特殊目的的情况下,我在个人资料中保持了一定水平的活动:我定期添加朋友并订阅公司页面。很快,第一批招聘人员开始敲门,而我与之接触的次数越多,他们提供空缺的机会就越多。甚至在最后一次迭代中,他们几个月来就写信给我,他们离开了Google,Microsoft,Amazon和Facebook,这似乎是卡特尔的阴谋。

这种方法的缺点:您永远不知道何时幸运。招聘人员可以在一周内收到有关招聘事件的新闻,以度假休假。但是在这种情况下,还有一些好处:由于紧急情况,他们很可能会与您会面并且错过面试的其中一个阶段-例如,在Amazon的情况下,可以通过技术专家在线进行。

如果您有发行版本,并且在不久的将来还不能完全满足早晨的任务,那么您可以同意几个月的准备时间。公司知道他们的面试很复杂,现在等了几个月就比失去您六个月或一年的候选人资格容易(大约这段时间之后,公司可以再次申请)。

还有另一种经常提到的方法。-在公司内找到可以推荐您的人。这将使您能够更好地计划您的培训策略。但是我不会止步于此,因为我自己还没有尝试过,我只能分享谣言,关于Google的推荐会在面试中加分,并增加招聘委员会做出积极决定的机会(最后阶段是开会讨论结果,缺席讨论,候选人被批准或被拒绝)。

面试方案


这里将通过示例简要概述不同公司的面试过程,在以下各节中,我将更详细地考虑每个部分的准备工作。步骤相似,但是顺序和数量可能有所不同。例如,Google是会议次数最多的领导者之一-多达五次面对面,然后是团队的另一次或更多次面试。


Google的面试方案(以下方案可能会因办公室和职位的不同而略有不同)

。如果双方有疑问,可以重新分配某些阶段(电话或团队)。他们的人数不会影响任何事情,这只是您在评估准备时间(如果是技术面试)需要多少时间之后需要使用的额外机会。 Google和例如Microsoft的通用方法是将经验最少(<1年)的候选人与经验丰富的候选人的流程分开。首先,可以另外进行在线评估。


Microsoft面试计划

行为问题可以作为每个面对面会话的一部分,例如Microsoft和Amazon,也可以是单独的会话。作为候选人,我更喜欢第二种方法:首先,如果面试官突然变得健谈,那么单独的行为面试不会浪费时间解决问题;其次,当您在所有技术会议后都把他放在办公室里时,这很不错-您可以轻松地切换到对话关于生活。


Amazon访谈计划

在Microsoft和Amazon,行为访谈已集成到技术会议中,这也可能是因为这些阶段通常是由未来团队的员工进行的。在那些方法不同的公司中,与未来同事的沟通是在单独的阶段进行的。例如,Google在成功完成面对面阶段后定义了一个团队。Facebook上最原始的流程-团队的选择在雇用后发生。新员工在训练营中花费了6周的时间-这些是不同团队中的测试项目,然后做出决定。


Facebook面试方案

非技术筛选


第一步是与招聘人员交谈。通常这是一个简短的电话,描述招聘人员提供的空缺职位或面试团队,并找出您的兴趣和动力。可能没有特定的空缺,这完全取决于聘请给定公司的过程(请参阅“面试计划”)。舞台似乎很简单,但是您不应该在这里放松。他们可能会问一些简短的技术问题,例如,以2的幂数估算字符数(Google)。否则,他们可能会发现体验不够相关,或者您作为候选人并不十分感兴趣(这是Facebook的做法)。 

准备算法面试


对我来说,技术筛选是最经常成为我提出整个培训计划之前的最后一个阶段。
当然,他们向我发送了材料进行审查,并建议我在Hackerrank / Leetcode进行练习。但是他们从来没有说过必须解决至少100-200个问题,而这正是最终使我进入成功的决赛的数字。
肉眼可以看出,这是在存在工作和另一种生活的情况下,两个月定期解决问题。您可以尝试为此休假并更快地应对,但随后将为全职阶段做准备,您仍然必须按照平时的时间表交朋友。

我准备使用Leetcode,由于以下几个原因,我的选择是这样的: 

  • 大量的任务;
  • 他们大多数都具有良好的测试覆盖率;
  • 方便按频率和公司进行有偿细分(也有免费选择);
  • 活跃的社区-您可以了解有关培训方法和近期采访的信息。

Leetcode当然具有一些缺点:

  • 几乎不可能添加您的任务或测试用例-因此信息开始过时了;
  • 对运行时间和内存的估计不准确-可能因开始而异;
  • 与体育编程任务相比,条件不够清晰;
  • 并非总是惯用的功能接口。

最后两点是有好处的,因为您有时必须在面试中面对此类问题,并且需要为它们做好准备。Leetcode似乎无法应付落在它上面的信息流,但目前它仍然是同类中最好的工具。他的力量也在社区中投票赞成问题,决定和发现错误。

对我来说,任务很适合早上上班前。早餐后,我设置了一个计时器并解决了一些中级任务。计时器很重要,因为它有助于创建战斗环境。我根据难度级别留出时间:简单的20分钟,中等的40分钟,困难的60分钟。我选择的主要是中级任务,因为很少执行复杂的任务。如果一段时间后任务没有完成,我会研究解决方案,将其添加到列表中,过一会儿再返回。我尝试首先研究单词的方法并尝试对其进行编码。该解决方案可以在网站上查看-来自任务的作者或评论员,Tushar Roy的视频也有帮助,他举例说明得很清楚。几乎所有任务的分析都可以在GeeksForGeeks上找到,但是有很多错误。

最通用的方法是按频率对所有任务进行排序,并开始按降序解决它们。
如果您以前不了解计算机科学,则应该首先学习基础课程,但不要迷失方向。尽管计算机科学知识或阅读《破解编码面试》一书都不会起这种作用,但它们对于起步非常有用。一开始我有大学课程,塞奇威克课程(第一第二)和提到的McDowell书-所有这些甚至都无法帮助我通过电话采访。首先,决策模式必须在您的指尖,以便候选人可以快速查看和应用它们。为此,您不仅需要阅读任务的分析,还需要首先想出(或记住),如果不起作用,请在分析之后再自己编写一次。建议在时间限制和很好的测试覆盖范围内执行此操作,如Leetcode上那样,这是课程或书籍未提供的。其次,计算机科学课程通常不讨论解决方案的实际方法,例如两个指针或“野兔和乌龟”。 

您可以连续解决这些相同的问题,而要根据主题或模式来解决。但是这里最主要的是不要参与其中,也不要在一天内解决整个话题。否则,似乎一切都已经清楚了,从这种明确的方法开始的几天里,只会有空虚的空虚。我让话题“安顿下来”,并检查了一段时间后我在剩余任务中学到了什么。

技巧和窍门


当我准备接受某家公司的采访时,我对Leetcode的策略有所改变。通过付费订阅,您可以在那里查看流行公司的特殊任务集合,它们可以帮助您快速做好准备。许多公司都执行相同的任务,只有谷歌鼓励他们的访问者提出新的任务,他们才摆脱了这些任务。因此,从这样的选择中解决了70-80%的任务几乎可以保证成功。


使用Leetcode为单个公司选择的内容-最常见的任务会标有注释,表明面试的阶段。

我还要提及免费的在线测试集合(例如,针对亚马逊)),由社区在讨论中精心收集。那里没有很多任务,但是它们几乎与在线测试中可以捕获的任务完全一致。我强烈建议您解决这些问题,因为可能会遇到很多陷阱,这会占用您很多时间。没有人可以与您就更方便的功能界面达成一致,也无法用言语解释您想解决的其他问题,但没有时间。只是一个计时器,而不是通常的方法签名(例如,用于C ++的C数组)和不妥协的测试。要成功通过,可以通过一些测试。

技术筛选通常使用一些简单的工具进行在线代码编辑。一个非常平庸的建议可以帮助节省一些神经细胞,那就是提前练习编写代码的工具。尤其是在像Google Docs这样的琐事中,您需要习惯于手动格式化所有内容。

您可以不时阅读提示“如果您发现需要解决的问题,通知面试官”。我出于很多原因对它们持怀疑态度。首先,如果您分解了一个任务却没有记住它,那么您已经看过它就不会很明显了。此外,您总是可以提出候选人未提出的跟进意见。其次,公司在面试之前公开建议对Leetcode进行培训。如果面试官用完了您不熟悉的任务,这将很有趣。第三,即使有面试官的提示,也很难从头开始提出一些解决方案。我希望很少有人问他们,但是您不应该依靠运气。第四,如果公司真的因为您所知道的任务而感到担忧,它会激发面试官提出新的任务。

如果我想了解我准备解决多少未知的新问题,我参加了Leetcode / Codeforces的体育节目竞赛。这比实际的采访要复杂得多,因为没有人讨论解决方案并在遇到困难时得到提示。但是,如果您不花心思地操作示例,那么就没有诱惑力在现成的测试中运行代码-您可能会被罚款。 

一切似乎都是?不,只有一个小细节,从字面上看,一个问题可能会破坏整个采访。您需要深入了解标准算法在时间和存储方面的困难,而其他方面则需​​要-能够快速输出和训练以解决每个要解决的问题。掌握定理对于确定递归问题的复杂性很有用

请用英语


面试所需的显而易见的工具是英语。研究的方法不是我们谈话的主题;我只想稍微谈谈如何在战斗条件下进行实践。事实是,仅分析任务并不能完全重现面试。因为,除其他外,您必须用英语解释您的思路,并与编写代码同时(甚至在没有代码的情况下)做到这一点。因此,理想的是找到合作伙伴。可能是正在准备面试的朋友,也可能是特殊的混血儿(以莫斯科为例),或者可能是其中一个站点上的随机人(一个两个我没有使用后一种类型的资源,但是例如,您可以在本文中阅读其工作方式

全职阶段


现在,由于冠状病毒,该阶段已联机。似乎应该没有任何区别,公司也可以省钱。但是令我惊讶的是,发现在线方式的面试似乎比较慢,而这5-10分钟常常对我来说至关重要。我希望这些公司不久将适应并给予更多时间,或者我们将再次回到全日制。

白板


还记得我是如何在第一阶段熟悉在线代码编辑工具的吗?在专职采访中,通常使用黑板代替。我买了她的家,准备全职。效果比我预期的要强。在此之前,我担心板子是一块空白板,甚至在工作中还是喜欢避免使用它。但是现在,当我习惯了它时,我发现采访非常方便:

  • 您可以毫不费力地修正该决定(与纸本相比);
  • 容易画画;
  • 方便举一个例子;
  • 与您不习惯使用的键盘相比,更快,更舒适(如果使用其他键盘,他们建议在随附的笔记本电脑上对解决方案进行编码)。

系统设计


也许这是没有“王道”的面试。应该指出的是,在此之前,我在分布式系统设计方面的经验为零。准备系统设计面试的信息比算法面试的信息少得多。事实是,发表此类问题的分析的人通常自己没有相关经验,这使情况更加复杂。不过,受算法面试模式的启发,我开始寻找类似的东西,并找到了付费课程看起来很简单而且有效……直到第一次面试,我才意识到那是非常肤浅的。我的访调员想听到的反向代理和内容交付网络都没有在那里讨论。他仅够“ C级”。一方面,这有帮助-使得获得报价成为可能,前提是所有其他部分均已完成。另一方面,它削减了提议职位的水平,因为这一阶段对于评估候选人的“资历”很重要。好吧,由于全日制课程的所有课程都进行了总结,因此最好不要在这里丢分-它们可能不足以取得积极的结果。

在进一步的培训中,我终于找到了很多免费的资源它也很短-可以在几个小时内阅读,但是每个部分都有链接,可以使材料更深。不管有多少时间,这都是一个很好的策略:您可以先进行简要概述,然后再进行详细研究。

我从github上从一封招聘人员寄给我的培训材料信中得知了这一选择。这是一个不可忘记的宝贵资源。发送的某些资源可能比像这样的文章集合更好。

行为面试


行为采访是另一种类型的采访,可以是单独的会话,也可以是其他会话。我决定为此做准备,因为有时很难提出合适的情况或回答问题,而访调员可以将栓子解释为试图隐藏某些东西。我的培训花了很少的时间,应该足够长的时间。亚马逊原则为样本根据我的经验,它是最多的,每个原则上都有2-3种情况。为什么这么多?事实是,同一个问题可以由一个面试阶段的框架内的不同面试官提出,如果一切都归结为一个项目,这并不是一件很酷的事情。或者相反,他们将提出几个问题,以相同的案例为例。为了简化答案,我还针对每种情况确定了关键要素:

  • 困难
  • 没有解决的问题(以及我得出的结论);
  • 你喜欢什么;
  • 我如何展现自我;
  • 冲突。

在不遗漏重要细节的情况下,通常很难快速为面试官概述情况。根据STAR技术对叙事的分解将有助于清晰而又顺序地说明:情境-任务-行动-结果。在这一部分中,重要的是不要滥用“我们”一词,这应该是最少的。谈论您所做的事情,不要低估您的贡献。

在这里,他们可能会问您为什么要在我们公司工作。我事先回答了这个问题,由于这个原因,我的访问员对这些论点感到满意。

如果不是全职阶段


正如我所提到的,一些公司安排了与团队面试的一个单独阶段。但这可能不是最终的。在Google欧洲办事处的职位上,接着是一个招聘委员会-一次专家会议,确定候选人是否与所选职位相匹配。当然,主要作用是由访问员的反馈来完成的。但是,现场阶段很难完全通过,这里还有其他细节发挥作用。现有员工的建议也是一个加号,招聘人员可能会要求链接到Github和Topcoder / Codeforces / Leetcode配置文件。招聘委员会距离正式阶段还很遥远,这里的拒绝百分比与全职阶段相当,在极少数情况下,他们可以安排额外的面试。

聚苯乙烯


面试之后,我为此做了很长时间的准备。我单击了诸如坚果之类的任务,迅速编写了代码,并感到热心。技术部分似乎非常容易,我完全确定了通过通话的电话:“如果我现在不打通,我不知道他们还需要什么。” 没有人比我更快乐,直到我再次滚动决定并发现错误。在接下来的48个小时里,我等待一个未曾得到的启示,我真的过去了。因此,我意识到面试官也错了,信心可以帮助。

参考文献


  1. 最常见的问题解决模式:免费复习付费课程
  2. 动态编程问题解决模式
  3. Tushar Roy的视频任务
  4. 递归算法复杂度的计算公式
  5. 对等工作面试:一次两次 
  6. 准备系统设计工作面试的资源:免费付费课程 
  7. 塞奇威克的Coursera算法课程:https//www.coursera.org/learn/algorithms-part1https://www.coursera.org/learn/algorithms-part2
  8. 亚马逊领导力原则
  9. STAR技术
  10. 有关该主题的更多信息:FAANG的求职Google的成功准备

All Articles