作为一名软件工程师来说,能否通过技术面试对于自己的职业发展至关重要,但是求职者往往很难知道具体怎样去为面试做准备。因为不同的软件公司采用不同的方式对工程师进行评估,而在这种压力很大、同时又很重要的场合,毫无防备的前去面试似乎是最糟糕的一种状态。
幸运的一点是,这些技术面试通常可以分为两大类:特定领域知识面试和计算机科学基础知识面试。对于想走上软件工程师职业发展道路的求职者来说,了解这些评估人才的不同方法是很重要的一点,从而可以在他们最需要改进的地方采取措施进行进一步的提升。本篇文章介绍了每种面试类型可能出现的问题,以及你可以采取的准备措施。
特定领域知识面试
特定领域知识面试通常涉及到你最熟悉的技术领域的具体知识点。例如,如果你主要使用 Angular 1.x 进行前端开发,并且面试公司又有 Angular 前端,那他们就可能问你关于 Angular 控制器、指令和服务的相关内容。也就是说,你需要做好准备去建立、展示和讨论 Angular。
特定领域的面试重点关注的是你已经实际构建起来的东西,因此要想顺利通过这些面试,最好是你已经构建过相关技术的项目。你应该为自己的工作而感到自豪,不必感觉不好意思,而应该深入探讨具体项目的技术细节。项目最好是近阶段完成的,没人会愿意去听你去年写的那些代码,你自己也会对这种陈旧的项目感觉厌倦,面试效果也欠佳。
特定领域面试的另一个常见策略是看求职者能否构建一些非常棒的产品或者是排除实际存在的一些问题和故障。这通常是让求职者带回家去完成的一种测试,求职者一般有 24-48 个小时的时间来完成这些测试。例如,如果你是一名 Laravel 开发人员,并且你面试的公司恰好也使用 Laravel,那他们可能会要求你构建公司产品或者是公司定期创建的产品的微缩版本。对于这种带回家做的测试,做好投入大量工作的心理准备。准备好启动模板,不要抗拒去 Google 搜索答案,发送电子邮件寻求帮助和使用外部工具包这些做法。因为能否通过特定领域面试最重要的一个衡量标准是你能否构建出有效的产品。
计算机科学基础知识面试
计算机科学和基础编程面试明显不同于上文所探讨的特定领域面试。计算机科学和基础编程面试是为了评估你解决问题的能力,更多的是关注找到最佳解决方案的能力,而不是简单的去完成某些特定任务。因此,面试官通常也不会问关于你是谁、你过去的工作经历或者你构建过的项目方面的问题。对于计算机科学基础面试这一类型来说,面试官的工作就是评估你的原始编程能力,通常他们是通过数据结构和算法相关的问题来进行评估。
计算机科学基础面试的问题有章法可循。因为学习数据结构和算法需要大量的准备工作和长时间的学习,你需要了解你所选择的编程语言、数据结构和算法来解决问题。计算机科学基础知识面试通常可以用六种不同类型的算法来解决:
深度优先搜索算法/广度优先搜索算法
贪心算法
滑动窗口算法
分治算法
递归算法
动态规划算法
你需要研究每一种算法,可以在 Pramp 上与其他软件工程师一起练习面试和面试问题。应对面试是一门独立于软件工程师之外的技能,你可以通过练习和重复来提升自己在面试时的表现。
计算机科学基础知识面试通常遵循的那些问题结构对于求职者来说只有通过几个小时的练习和准备才能发现。即便这些知识中的一部分并不适用于日常的编程任务,但只要你坚持这样做,你就能抓住更多的面试机会,就能收到更多公司发来的 offer。如果你的目标是获得更多的工作机会,那你一定要看一下《Cracking The Coding Interview》这本书,并且查看这一免费的面试资源来进行相应的准备工作。
哪种方法适合你?
作为一名正在寻找工作的软件工程师来说,在构建产品、学习新工具和练习面试之间存在着一定程度的相互冲突。选择关注哪一点其实取决于你所寻找的工作类型,如果你想进入 Google、Twitch、亚马逊、Uber 或 Square 等大型知名科技公司工作,那你基础知识一定要过关。在这样的情况下,你是否构建过最好、最复杂的产品其实并不重要,如果你无法通过计算机科学基础知识面试,那这些大型科技公司是绝对不会雇用你的。
相比较而言,小型初创企业通常是在与时间赛跑,他们会争取快速的构建出产品、推出产品并且推向市场。因此,这些公司通常会实行特定领域面试方式,因为他们希望了解捏可以构建什么样的产品,你最拿手的技术又是什么。
如何了解公司面试类型
在进行公司面试时,与你对接的招聘人员或者公司联系人就是你最好的朋友。你可以直接向他们询问关于公司的招聘流程以及他们用于评估候选人的标准等方面的问题。对于求职者来说,了解公司在招岗位的信息是非常重要的一点,因此他们需要主动提出这方面的问题并且仔细研究招聘职位描述信息。软件工程岗位招聘通常有好几个环节,可能包括电话面试、共享桌面远程面试和现场面试环节。
如果面试环节包括共享桌面远程面试这一环节,那最有可能考察的是求职者的计算机科学基础知识。他们会提供给求职者一个需要解决的问题,面试官会在这个过程中观察求职者的操作,求职者也可以解释自己的想法。
带回家做的项目通常考察的是特定领域的具体知识,这在一些机构和初创企业的招聘中比较常见,求职者需要在 24-48 小时内有所成就,之后再对你的代码进行展示。
普通的电话面试通常了解的是求职者的态度,进行相应的沟通并了解一些背景信息、招聘人员很难通过这已通电话获得有关你能力方面的信息。
现场面试可以涵盖任何问题,但通常是整个面试过程的最后一个环节。所以到这一环节,你应该是对你面前的这个机遇以及求职公司所用的评估方式有了一个清晰的认识。
想了解各个公司使用的是哪种类型的面试,你可以通过浏览 Glassdoor、Angel.co 上的评论或者是通过 Linkedin 联系公司当前员工的方式来获知。
小结
求职者可以通过与求职公司的招聘人员和联系人员交谈,来了解大致的面试过程。如果你不熟悉数据结构和算法,可以通过 Pramp 进行练习。做好心理准备,你可能需要细数你过去的工作经历和你已经构建而成的软件。要想在软件工程领域找到一份新工作,构建过令人惊叹的产品与了解计算机课科学基础知识这两方面同等重要。
“你越是不自信,就越是需要认真地采取行动。
记住这一点,并不只是公司在面试你,同时你也在面试这个公司。面试过程中你需要去处理的问题和工作往往与你被聘用之后,在这个岗位上需要去完成的工作类似。所以,你需要思考这样几个问题:他们为你安排的挑战是你所喜欢的工作类型吗?这个公司的人好吗?他们尊重你的时间和能力吗?如果这些问题的答案都是否定的,那你可以考虑寻找别的工作机会了。了解自己的长处和短处,并且享受这个找工作的过程。面试是一个很好的认识人的方式,也可是一种学习到新技术并且了解自己需求的途径。
失败和被拒本来就是生活的一部分,所以在任何时候,都要保持积极的心态,努力争取那些你所能控制的部分,对于超出自己控制的部分不要去过多的理会。