技术职位面试并不可怕

Avatar of Jacob Schatz
Jacob Schatz

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费积分!

Jacob Schatz (@jakecodes) 是 GitLab 的一名员工工程师,他很乐意分享他对技术职位面试的看法和面试过程。技术面试经常被提及,对于一些人来说可能是一个敏感话题,因此值得注意的是,本文表达了 Jacob 的个人观点,不一定代表其雇主的观点。

您是否是一位感到恐惧、疲惫、悲伤或失望的面试者?我非常希望能改变这种刻板印象。

我相信人们可以获得良好的面试体验,同时我也能找到合适的候选人。 **这两件事可以同时发生!**在您的面试过程结束后,在一个理想的世界里,无论结果如何,您都应该对自己的表现和面试过程感到满意。您可能会因为没有得到工作而感到难过,或者因为即将开始新工作而感到兴奋,但无论哪种情况,您都应该明白其中的原因。

在 GitLab,我非常早地就开始负责招聘工作,因此,我已经看过数千份简历。当我刚加入时,我被要求招聘并组建一支前端开发人员团队。我是第 29 位员工(我们现在有 500 多名员工),而且我是第一个前端开发人员,所以我们团队没有招聘流程。我们逐渐建立了一个流程。

本文的目标是面向面试者和面试官。对于面试者来说,我希望您了解理想的面试应该是什么样的。面试不应该令人感到害怕或压力重重。这是一个您可以遵循的指南,帮助您为创造完美的面试做出贡献。如果您是面试官,也许您已经完善了您的面试流程。这是我关于如何在理想世界中进行面试的观点。面试形式多种多样,本文侧重于对所有经验级别的开发人员进行面试。多年来,我坚持一些很棒的流程,本文将带您一睹这个流程的幕后,展示候选人双方。

在我开始之前,重要的是要记住, **每个人都是人**,而人并不完美。没有完美的开发人员。像对待普通人一样对待每个人。看到有些人正在做的事情让人感到敬佩是可以的,但崇拜他人是不合适的。才能既是天生具备的,也是后天习得的,您也可以习得才能。您的面试官和您都不完美。面试不应该以完美为中心。以下是面试 **应该** 的样子。

我寻找候选人的五件事

GitLab 的价值观涵盖了很多很棒的观点,您应该阅读一下。这与那些观点有一些相似之处。

作为面试官,在保持高效、积极地倾听的同时,我只能同时专注于少数几件事。但我确实有五件特定的事情想要专注于。

  1. 这个人是否“头脑清醒”?
  2. 这个人是否具备这个职位所需的技能水平?
  3. 这个人能否在这个职位上独立完成工作?
  4. 这个人沟通能力强吗?他们会与团队进行良好沟通吗?
  5. 这个人如何处理正面和负面反馈?

当然,我还会寻找其他东西,但如果您可以满足我提出的这五件事,那么您就很有可能得到您想要的工作。

忘记紧张吧。我永远不会因此而对您有什么看法。我知道您可能会紧张,这完全没有问题。很少有情况是紧张会成为一个令人衰弱的因素,在这种情况下,我只会要求您重新安排时间。只是别挂我电话!

认识到会有偏见

我们已经在 GitLab 进行过关于偏见的培训。从培训中我学到的一件事是,每个人都会有偏见,无论您是否认为自己有偏见。有一段时间,我曾经想过要像某些乐团那样进行盲选面试。我们从未实施过(而且实施起来很困难),但这就是为什么我总是会记录下问题清单,以及在每次面试中我想涵盖的内容摘要。每次面试都有一个我可以遵循的脚本。一切尽可能地重复和相似。随着面试的进行,我就能判断出我是否可以提出更难的问题。更难的问题并非是为了淘汰候选人,而是为了评估候选人的能力。如果您能回答我的难题,那就意味着您已经积累了丰富的经验和知识。重要的是,您必须知道我必须以某种形式问一些琐事问题, **但我不会根据琐事问题来评估候选人。** 这关乎了解您对 JavaScript 知识和编程的深入程度。

话虽如此,但仍然有一个琐事问题没有人答对过。我会继续问这个问题,我相信总有一天,有人会答对。琐事问题很有趣,因为我是一个狂热的 JavaScript 迷。我非常喜欢讨论 JavaScript 的所有来龙去脉。我想要找到能够成为我的编码伙伴的人。 **招聘人员是为了找到可以与之共事的人**,而不是为您工作的人。

我想要知道您在技术上很稳固

这可能是人们最害怕的部分。面试中我们问诸如“为什么井盖是圆的?”之类问题的那一部分。事实是,一些公司可能会问来自 LeetCode 的中等或难题,而另一些公司则可能永远不会问任何技术问题。

我在您的技能集中寻找什么

经验比我能问的任何技术面试问题都更有说服力。例如,如果我正在招聘前端工程职位,而有人告诉我他们构建了自己的 很棒的东西,我们可以讨论一下,那太棒了。我可能仍然需要在之后给他们一些问题,或者他们提供的演示可能已经回答了我的所有问题(虽然不太可能,但有可能)。但是,如果我们可以一起浏览您非常自豪的代码,那很棒。

如果您能告诉我您为另一家公司构建的东西,我可以查看您的代码,或者您可以充分解释一下,这将很有帮助。您遇到了哪些挑战?您是如何处理 10,000 条评论的?您是如何处理移动设备的?您遇到了哪些挑战?我举个例子:您构建了 GitLab 的评论系统。对于评论系统来说,一个有趣的挑战是如何处理加载用户以显示 @下拉菜单,用于提及其他用户。事实证明,该下拉菜单的 JSON 负载可能非常大,在页面加载时加载它会导致页面加载速度明显变慢。但是,在用户第一次按下 @键时加载这些数据也很慢,因为负载可能超过 10 MB。我们希望用户拥有无缝体验,不会意识到数据需要时间加载。因此,一个好的方法是描述您考虑过的一些方法,例如

  1. 在评论框首次出现在视窗中时加载数据。
  2. 在用户第一次将鼠标悬停在 textarea上时加载数据。
  3. 在用户开始滚动并达到足够速度时加载数据。

最后一个并不是一个无聊的解决方案,但这是我在面试中听到有人提过的方案。

我可能会问一些关于算法和数据结构的问题

嘿,面试官,您是否正在招聘营销网站的员工?不要问他们最难的算法和数据结构问题。是的,算法和数据结构在所有事物中都扮演着重要的角色,但更重要的是候选人是否了解响应式设计,也许还有动画和性能。既然我们谈到性能,他们应该了解 大 O 符号。他们应该知道什么会导致重绘。看看 Firefox 监控,并将其与 Salesforce 进行比较。Firefox 网站的所有内容都更加流畅。为什么它更流畅?为什么 Salesforce 网站如此笨重和缓慢?调整它们的大小… 哦,我的天!大 O 符号可能有助于您解释某些部分,但能够解释整个情况非常重要。

关于大 O 符号的简要说明,因为我提到了它。

大O表示法是一种描述代码在最坏情况下运行时间和/或占用内存空间的方式。我认为学习大O表示法非常棒,它有助于日常编程。你可以并且应该学习它,这可能需要大约一个小时。一个小时后,无论你是否完成,你都很有可能准备好应对面试官提出的任何关于大O表示法的合理问题。

大O表示法不是你需要专门去学习的课程。这里有一些文章可以在一小时内解释它。

好的,回到面试中的算法和数据结构。

由于这些类型的问题可能会出现,所以提前做一些功课是值得的。在准备询问算法和数据结构的面试时,有两个典型的黄金标准。

还有很多其他推荐用于算法和数据结构、代码量很大的面试的资源,但与其记忆世界上所有的例子(这不会解决任何问题),不如学习如何解决这些问题。

正如我上面所说,前端工程师应该为了自己的健康而学习大O表示法,因为它对你有益,就像吃麦片一样。**面试官不应该问太多关于算法和数据结构的问题,除非这份工作需要对它们有深入的了解。** 如果我设计一个前端框架,比如 Vue,那么优化DOM差异算法或者至少理解你正在使用的算法的实现就很重要。但这是否意味着我会从 CTCI 中提出七个额外的难题?不。你在测试理解,而不是记忆。当人们解决这些问题(当我问他们的时候),我希望看到他们思考了这个问题,并且我们一起解决它,而不是仅仅看到他们得到了正确的答案。这一切都是为了弄清楚当你得到这份工作后,你作为一个工程师能够做什么,而不是你昨天记住了什么。一个了解算法的人在实现算法方面会比那些需要在工作中学习算法的人更出色。

你是否正在雇佣某人来构建一个依赖管理系统?这个人需要了解很多关于算法和数据结构的知识。

这是频谱的两个极端,但在我看来,不是每个人都需要知道如何从头开始编写 红黑树——但每个人都应该理解大O表示法。但是,学习典型的算法和数据结构将显著提高你作为软件开发人员的技能。

当我问算法和数据结构问题时,我会问以下几个问题。

  • 什么是链表,你能用 JavaScript 展示如何用数组和不用数组实现一个链表吗?
  • BFSDFS 之间的区别是什么?你能实现其中一个吗?

答错这些问题不会让任何人失去资格。记住,我不会用琐事来评判人们。

你头脑清醒吗?

在面试中,我还寻找很多软技能。这是我判断你是否“头脑清醒”的方式。

严格地说,这意味着你能做出明智的决定,但对我来说,这远不止于此。头脑清醒的人会做出明智的决定。拥有与我不同的观点是好的,但我们应该同意一些知识标准。例如,我们都应该同意,用绝对定位来布局整个博客是一个坏主意。这不是明智的决定。

但我可能会创建一个这样的场景来检查这些技能。

让我们进入 CodePen 并创建一个静态博客主页。我们需要一个导航菜单,还需要一个用于标题和文章的地方,然后在底部让我们添加一些评论和页脚。

然后我会引导你了解创建导航的不同方式以及每种方式的优缺点。对于我雇用的许多前端开发人员来说,我想知道他们是否了解一些核心 JavaScript,因此我可能会要求他们使用纯 JavaScript 添加一些小功能。

当框架为你做所有事情时,你就不需要自己做任何事情。我想知道你是否了解全貌。

“头脑清醒”是一种委婉的说法,说明你很有条理。这不是一个详尽的清单,但这些是我注意到的类型。

  • 你照顾好自己
  • 你说话专业(这比大多数人知道的更有影响力)
    • 不要透露过多的个人信息
    • 简洁地回答问题
    • 花时间思考
    • 如果你不知道,就说“我不知道”
    • 自信,但不要自负,即使你没有
  • 你完成你开始的事情
  • 你诚实
  • 你能说“不”
  • 你知道你想要什么,并且你想帮助其他人得到他们想要的东西
  • 你会不同意甚至争论,但知道什么时候该放手
  • 你能够在面试中有效地沟通
    • 这场对话轻松还是令人疲惫?
    • 你英语流利吗?口音完全没问题!
    • 你理解正在讨论的概念吗?
  • 你是一个善良的人。

关于最后一点:善良并不意味着你是一个软弱的人。善良是挑战他人和给予反馈的重要组成部分。

我希望看到你独立自主

现在看起来很明显,但我确信——在 GitLab 工作之后——独立自主是面试官应该在招聘每个人时都寻求的品质。独立自主在你公司中的角色中起着很大的作用。

例如,为了达到极端,想想一个 GM,他们可能是团队中接受外部指导最少的人。每个人都有责任,但 GM 必须经常擅长很多事情,包括(但不限于)营销、销售和管理。所有这些都会根据团队规模而改变。他们的角色可能是最模糊的。他们是**非常**独立自主的。一个高级开发人员(在我看来)应该能够承担整个大型功能并正确地实现它。

这并不是说开发人员在过程中不应该沟通。他们**应该**提出问题,并与其他人合作,找到最佳前进方向。

审查面试者的代码可能很有趣(以一种好的方式),因为我们知道可以从他们那里期待什么。我们依靠他们来指导经验不足的开发人员。初级开发人员也应该独立自主,但可能不会单独承担大型项目。初级开发人员通常在小块工作中表现出色。例如,对于初级开发人员来说,承担高级开发人员在大型项目中执行的小任务可能是一件好事。高级开发人员还可以指导初级开发人员,并帮助他们朝着正确的方向发展,帮助他们变得更加独立自主,这对双方来说都是好事——对经理来说也是好事,因为他们可以将更多工作委托给高级开发人员。

如果你是一个前端开发人员,并且在你职业生涯的这个时候需要手把手指导,那完全没问题,每个人都经历过。或者,如果你正在申请很多地方,但没有得到任何回应,并且非常沮丧:我建议你在申请之前变得更加独立自主。我建议你变得更加独立自主并获得你想要的工作的一种方法是:忘记代码示例、小型购物车应用程序及其同类产品,因为它们在面试中效果不佳。为某人构建一个完整的应用程序,并且以低价或免费的方式完成。找到一个教会、犹太教堂、无家可归者收容所或你附近的人,并主动为他们制作一个网站。

请记住,免费客户通常是最糟糕的客户。当你能够说你已经为几个客户完成了一些工作时,它将是值得的。为了获得加分,请在几篇博客文章中记录你的工作。这些内容在简历上看起来很棒,会让你从其他人中脱颖而出。我知道任何人都可以通过 Wix 或其他网站建设平台轻松获得一个网站,但没有什么比一个很棒的定制设计网站更好了。我认为我在获得第一份编程工作之前制作了大约 10 个网站。我可以写一本书来记录那些时期的疯狂故事。

沟通和反馈是关键

这是另一个看起来很明显,但很难做好的要点。沟通在 GitLab 手册 中有详细记录,所以我不会赘述,只是说我遵循 GitLab 的价值观,并且我们正在寻找其他也希望遵循这些价值观的人。积极和消极的反馈也在 GitLab 手册中得到了很好的记录,所以在这里我不会赘述。

面试的后续流程

因为 GitLab 面试了大量的候选人,我们遵循一个通用的流程,以便于轻松地重复它。我不会详细说明我们的面试流程,因为它在不断地演变。但是,一般来说,这是我遵循的流程。

介绍一下你自己

你会被问到一个著名的问句,类似于“介绍一下你自己”、“说说你最近在做什么”,或者“谈谈你在[公司名称]的经历”。当我问这个问题时,我试图找到你申请的职位和你过去所做工作的联系。提前找到共同点是件好事。

例如,作为一名 GitLab 的员工,如果我个人申请加入一家FAANG公司担任前端工程师,我相信 GitLab 和那家公司都在努力提高页面加载速度。也许我注意到在我加入 GitLab 时,一个页面上有 26K 个事件监听器,而我能够将它减少到 0,将加载时间减少 50%,降至 200ms 的速度。我相信这将是与谈话相关的内容。

因此,作为面试者,我可能会说这样的话:

“你好!我是一名 GitLab 的前端工程师,我已经在这里工作了 3.5 年,在这期间我做了很多重大改进,我最喜欢的一些工作领域是性能、UX 设计实施和架构设计。

你不想在这个时候进入太多细节,但最好给面试官一些事实来处理。当我问这个问题,而有人开始用 10 分钟的时间详细描述他们整个职业生涯时,这是令人沮丧的。

是什么让你决定申请我们公司的职位?

面试官可能会问:“是什么让你决定申请我们公司的职位?”希望你对在这家公司工作感到兴奋——否则,为什么要费心申请呢?

由于某种原因,这个问题往往会让候选人过度兴奋,他们最终会把我们公司的名字搞混。这是完全正常的行为,尤其是在你的公司听起来像另一家公司的时候。

我在这个时候想看到的是,你是仅仅在寻找一份工作,还是真的渴望与我们合作。我们希望招聘那些真正想要与我们合作的人。这时我也能看出一个人是否了解我们公司。例如,有些人喜欢我们的价值观,读过它们,并希望在一家拥有这些价值观的公司工作。有些人希望解决我们正在解决的重大问题。有些人看过我们团队的演讲和文章,并渴望与像他们一样聪明的人一起工作。

你有什么问题要问我的吗?

最后,我喜欢问候选人是否有问题要问我。这是面试中很重要的一部分,你应该事先认真思考一下。你的目标是让我回答:“哇哦,好问题!”一方面,我确实想回答你提出的任何问题,所以不要害羞。另一方面,我还在试图评估你对这份工作的兴趣,所以像“呃,我不知道”这样的回答通常会让人很沮丧,因为它表明你可能已经走神了,或者这份工作对你来说并不有趣。这会留下不愉快的余味。

查询你的面试官,了解他们。提前这样做可能是一次令人大开眼界的练习。你可能会发现他们的客户获取策略,这可能会导致很多其他有趣的问题。如果该公司是一家创业公司,他们是否计划被收购,或者他们想上市?当你有一个清晰、经过深思熟虑的问题时,它会让你听起来很专业,这又是我的重要清单中的一项。

如果你想不出任何问题要问,那么你真的想要这份工作吗?如果面试官有个人网站,去看看,如果没有其他事情可问,你可以问他们关于他们在网站上发表的漫画。

但我建议

  1. 询问你普遍感兴趣的面试问题。 在面试之前考虑一下,因为一个真正有见地的问题通常会大大提高你的候选资格。
  2. 你,作为候选人,在公司中寻找什么? 面试官需要向你证明什么才能让你接受这份工作?
  3. 这些人像你一样头脑清醒吗? 你知道,这是双向的。
  4. 这看起来像是一份有趣的工作吗? 你甚至想要一份有趣的工作吗?
  5. 你会向谁汇报工作? 你跟他们谈过吗?你在面试过程中有机会跟他们谈话吗?
  6. 你是代表不足的人群吗? 比如,你是替换某人还是填补一个新职位?有多少人会做你正在做的事情?其他代表不足的人应该寻找什么迹象?什么迹象表明这对你是个好环境?

在此时不要问关于薪酬或福利的问题;这些事情可以在你见到我这样的人之前(而且很可能也应该)由招聘人员在介绍电话中进行。

结论

面试不像编程,它不是一门精确的科学。你试图证明你对与一家公司合作的前景感到兴奋。你希望向面试官和自己证明这一点。希望你想要一份有趣的工作。这份指南不是一个要遵循的剧本,而是一些松散的想法,可以帮助你进入面试官的思维模式,并附带了一些针对其他面试官的技巧。也许我指出了你以前可能不知道的事情。

记住,理论上,面试不应该是一个可怕的过程,而更像是一个寻找志同道合的伙伴来一起工作的过程。