如何顺利经过编程面试

若是你是一个刚毕业的学生业生或一个职业生涯中期的工程师,那么准备接受你求之不得的工做的技术面试可能既费时又使人紧张。想象一下,人们指望你可以在现场解决一个复杂的挑战,并将其转化为无错误的代码?git

好了,不用担忧了。在这篇文章中,我将向您展现一些提示和技巧,以帮助您在技术面试中度过难关并得到下一个梦想的工做。程序员

面试以前

了解范围
让咱们面对现实吧:多年的计算机科学学习包含不少内容。若是你在没有面试重点准备的状况下复习资料,你可能会面临精力分散的问题。好消息是:许多公司都足够信息透明,可让您普遍了解面试中涉及的重点。就问招聘人员好了。github

尽早准备
你应该为本身面试准备足够的时间。做为通常准则,至少提早两周开始准备面试,特别是当你从未接受过技术面试或者好久没有作技术面试了。要作到平均天天花一到两个小时。若是你是全职工做,必定要留出足够的非工做时间进行面试。面试

为何?由于须要时间让你进入解决问题的思惟模式,并让你重温你在学校学到的计算机科学基础知识,这对于帮助你完成面试是相当重要的。一旦开始,你可能会对你须要多少CS知识感到惊讶,而且你会庆幸你尽早准备,因此你没必要急于完成。算法

当我准备在微软面试时,我开始准备两周。过后看来,我认为它在我顺利经过微软的面试中发挥了重要做用。不相信?这是另外一个例子:这家伙花了8个月的时间准备Google技术面试。这可能听起来有点极端,我不建议你走那么远,但你明白个人意思了。编程

技术书籍清单
如下是为即将到来的技术访谈准备的必读书籍清单。设计模式

Cracking the Code Interview, by Gayle Laakmann McDowell.
本书包括150个编程面试问题和答案,以及其余建议,为您提供得到顶级软件开发人员工做所需的面试准备。
cracking-the-code-interview.jpg数组

Programming Interviews Exposed, by John Mongan, et al.
这是来自亚马逊的评价:网络

  • 查看当前的求职和招聘流程,例如利用LinkedIn和其余社交网络做为招聘资源
  • 为程序员提供针对最重要的语言作准备,以便了解和提供多种语言的示例
  • 包括旨在提升您的知识的新的编程问题
  • 提供有关设计模式和排序的全新章节,包括如何处理内存约束和移动性问题

我我的对本书的见解是,除了提升您的技术技能的建议外,它还提供了关于本身营销以及如何开始工做申请流程的完整章节。 这样能够鸟瞰整个过程,这对于即将首次进入人才市场的人来讲尤为有价值。框架

programming-interviews-exposed.jpg

Elements of Programming Interviews, by Adnan Aziz, et al.
本书将技术面试问题分红不一样的章节,每章都处理CS的基本概念,如数组,列表等。

来自亚马逊的评价:

  • 因为不一样的应聘人有不一样的时间限制,EPI包括一个有几个场景的学习指南,从周末的Hackathon到学期的长期准备,并为每一个场景推荐一系列问题。
  • 全部问题都根据其难易程度进行分类,并包含许多变体,以帮助您更普遍地应用所学内容。
  • 全部问题都包括对陷入困境的读者的提示。这模拟了您在真实面试中将面临的问题。

elements-of-programming-interviews.jpg

练习!练习!练习!
如今你已经花了不少时间复习,你将在下一次技术面试中得到成功。对吗?

好吧,也许尚未。

正如许多应聘人经历的那样,可以解决复杂的技术挑战只是面试的一部分。在面试期间,您必须在指定的时间范围内同时对解决方案进行描述,推理和编程。若是你认为这听起来像是在处理多项任务,那是由于实际状况就是这样。

为了可以熟练地掌握这种能力,你须要练习。只要有可能,选择一个合理的面试问题,仔细考虑,开始白板,记下你的思考过程,并尝试将解决方案做为代码实现。在45分钟到一小时内完成全部这些工做。

此外,最好与一位具备编码背景的朋友配对,让他担任面试官。这种设置的目的是尽量地模拟面试场景,以便您了解在真正的面试中的感觉。不少人发现他们比单独解决面试挑战更加剧视这种模拟面试。此外,这种模拟面试有助于候选人减轻压力,更好地传达他们的想法,并在真实的面试中表现更好。

这是来自一个面试者的心声:
在自我导向的时间压力下解决技术挑战是一回事。 当另外一我的在场并等待你提出你的解决方案时,解决它是另外一回事。

在过去几年中,技术公司正在转向使用在线协做编码平台进行远程面试。这些工具容许公司在将他们带到现场采访以前,在线快速评估候选人的编码技能。 Codidate就是这样一种工具。

若是您要采访的公司要求您在第一轮使用此类工具,请务必事先熟悉它。此外,请确保您在安静的地方拥有可靠的互联网链接,以便不会中断访谈。

此外,复习一下简历中的内容,以便您能够提供过去项目的细节,这样您会在面试中对答如流。

面试中

目的
请记住,技术面试的目标是让您(候选人)展现您的解决问题的能力。毕竟解决问题的技能在您将来的工做表现中起着相当重要的做用。

具体而言,您须要可以分析问题,分解问题,使用结构化方法解决问题,将解决方案做为代码实施,适应需求变动,进行必要的权衡,并可以对你的选择进行合理的解释。这是一个能够在面试中使用的问题解决框架。

一样重要的是确保在整个面试过程当中与面试官保持有效的沟通。在进行分析,处理解决方案,测试代码等时要说出来,这样面试官就能够按照你的思路进行思考,让大家沟通顺畅。

分析问题
在你遇到这个问题的那一刻,颇有可能想一步到位,直接编码解决问题。请不要这样作。相反,请确保您首先彻底理解问题,它的约束、边界状况等。每当有疑问或您须要澄清时,请求面试官验证您的假设。例如,“我是否能够访问C++ STL?”或“我可使用递归来解决此问题吗?”

您还能够列举一些案例,并让面试官确认您的理解是正确的。例如,“我认为在此步骤以后数组中有3个元素。它们是a,b和c。正确吗?”

掌握了手头的问题,你就能够解决它了。

分解问题
一般你很难在一个步骤中解决问题,尤为是现实问题。一旦分解为子问题,许多看似具备挑战性的问题变得更加容易。若是您可以作到这一点,您极可能可以解决每一个子问题,并将它们组合成最终解决方案。

将解决方案变成代码
一旦您认为本身已经找到了解决方案,就应该将它做为代码组合在一块儿。您能够尝试使用您最熟悉的编程语言来实现它,许多公司都容许您选择本身的语言。但再一次,在继续以前询问面试官。

一些公司,如Facebook,但愿候选人在面试中写出无错的代码。若是您碰巧遇到这种状况,请密切注意边界状况。在提交解决方案以前,请确保您的算法适用于全部边界状况。

若是对解决方案施加时间/空间限制,请确保您也知足此类要求。若是您可以在没有任何优化的状况下提出可行的解决方案,您能够先实现基本解决方案,而后再修改它以知足时间/空间要求。

适应变化
许多候选人常犯的一个错误是,他们倾向于认为他们所须要的只是在整个一小时的面试中制定出有效的解决方案,所以他们花了太多时间研究面试官提出的第一个问题。但这一般不符合实际状况。不少时候,在候选人完成第一次挑战后,面试官将提出另外一个进一步的问题,可能与前一个问题有关,以进一步测试候选人的解决问题的能力。

例如,如下是一系列编码挑战:

  • 招聘人:实现一种算法来对对象数组进行排序。
  • 应聘者:没问题。
  • 招聘人:若是数组大小为10GB,物理内存只有4GB怎么办?
  • 应聘者:没问题。
  • 招聘人:若是数组增加超出硬盘的容量怎么办?
  • 应聘者:没问题。

请记住,在您尝试解决的问题以后可能会遇到更多挑战,所以一旦您确信您的解决方案是正确的,请准备好继续前进。 你解决的挑战越多,面试官的印象就越深入。

资源

A complete computer science study plan to become a software engineer

How to Win the Coding Interview

How to Get a Job at the Big 4 - Amazon, Facebook, Google & Microsoft

原文来自How to Ace Your Technical Interview,已经通过做者赞成。