从九百到一:我们是如何招聘 Robin Malfait 的

日期

早在 5 月份,我们就发布了 我们的第一个招聘职位,帮助我们找到一名全栈开发人员加入我们的团队。

在收到近 900 份申请并面试了数十位才华横溢的人之后,我们很高兴地宣布,Robin Malfait 接受了我们的职位邀请,并于今天正式加入 Tailwind Labs 团队!

Robin 是一位来自比利时的才华横溢的开发人员,并且长期以来一直是 Tailwind 社区的活跃成员。如果您是 Tailwind UI 的客户,并且曾经在我们的 Discord 服务器上的 #react 频道中提出过问题,那么他很有可能就是那个帮助您解答问题的人。他甚至还创建了一个 书签 来帮助人们将 Tailwind UI 组件转换为 JSX!

Robin 是一位经验丰富的 React 开发人员,他加入我们是为了帮助领导我们正在开发的开源 无状态 UI 库,这些库将成为 Tailwind UI 中官方 React 和 Vue 支持的基础(至少从现在开始)。

我们非常高兴他今天终于加入我们,并迫不及待地想看到他的贡献如何帮助人们更快、更自信地构建出色的 UI。欢迎加入团队,伙计!

接下来,我们将讲述我们是如何招聘这个职位,以及我们是如何从近 900 份初始申请中筛选出候选人,最终向 Robin 发出邀请的。


招聘职位

在此职位之前,我们只聘用了Brad,我们已经认识并信任他,所以我们不需要发布职位或进行任何严格的申请流程。

我知道,如果我们想要获得真正优秀的候选人,我们必须写一篇引人入胜的职位描述。经过大约 3-4 天的努力,我们最终得到了以下结果。

阅读职位描述 →

以下是我在撰写职位描述时关注的重要事项。

  • 明确说明申请人入职后将参与的项目。
  • 明确说明我们是一个小型团队,因此每个人都需要做一些事情,包括客户支持。
  • 提供我们刚刚完成的项目的具体示例,如果申请人已经加入公司,他们将参与这些项目。
  • 详细介绍我们预计在下一个主要即将到来的项目中遇到的具体难题,以帮助申请人了解对我们有价值的专业知识类型。
  • 分享具体的薪资和福利信息。我永远不会在不清楚薪资的情况下申请工作,那么为什么我会期望有才华的人在没有明确薪资的情况下申请我们的职位呢?

我们收到了大量关于这个职位描述的正面反馈,我真的很自豪它最终的结果。我认为它非常以申请人为中心,我认为它对我们收到的申请质量产生了很大影响。

申请流程

我们与其他公司略有不同的一点是,我们没有要求提供简历,也没有给申请人提供一大堆问题让他们回答。我们只要求提供“申请”,申请人可以以任何形式提交。它可以是求职信、小型网站、视频、幻灯片,任何形式都可以。

我决定以这种方式要求申请,原因有以下几点。

  • 我认为简历并不那么重要。
  • 我想筛选出具有一定营销意识的人,我们是一家小型公司,我们需要T 型人才,而不是专家。
  • 我想筛选出能够交付成果的人,让申请完全自由发挥,可以让你了解一个人从无到有,独立将事物打造成精良产品的的能力。
  • 我想找到一个在没有提示的情况下谈论我们正在寻找的东西的人——找到一个与我们正在做的事情自然契合的人,这对我们来说将是一个巨大的优势。
  • 我预计会有很多申请,我认为以这种方式征求申请会更容易筛选出那些使用“散弹枪”式求职方法,而不是真正对与我们合作感兴趣的人。

即使我认为申请流程相当具有挑战性,我们也收到了超过 100 份申请,其中明显投入了大量时间精心制作,专门针对我们的职位描述,当然也包括 Robin 的申请。

阅读 Robin 的申请 →

有些人确实在他们的申请中做了一些非常出格和有创意的事情(一个人甚至制作了一个互动游戏!),但 Robin 的申请脱颖而出,原因有几个。

  • 视觉设计很棒。我们是一家非常注重设计的公司,因此拥有良好的设计品味对我们来说非常重要。
  • 他关于学习编程和加入 Laravel 社区的经历告诉我,我们有着丰富的共同历史,即使我们从未见过面。
  • 他大胆地分享了他对组件设计的强烈观点,这些观点与我们很快将要进行的一些工作非常相关,我同意他的观点,甚至还学到了一些东西。
  • 他分享了一个非常有趣的 开源库,他亲自编写了这个库,尽管它还不为人知,但仍然拥有经过精心设计和完整的文档,并且以非常结构化的方式呈现。很明显,即使在编写 Markdown 文件时,他也考虑了视觉设计。
  • 他分享了许多关于他想与我们合作的项目的具体想法,其中很多都是我原本就非常期待做的事情。
  • 他在“GitHub”中将“H”大写(天哪,我讨厌人们不这样做)。

Robin 的申请是大约 40-50 份真正从内容角度脱颖而出的申请之一。

筛选申请

处理近 900 份工作申请是一项繁重的工作。其中超过一半的申请我们能够立即丢弃,因为他们只提供了一个指向他们 LinkedIn 个人资料的链接或一份通用简历,但筛选其余的申请确实很困难。

我以前从未以这种方式招聘过任何人,起初我确实觉得我们需要与所有提交了高质量申请的人见面并进行面试。然而,随着申请的涌入,我意识到这根本不切实际,我们必须对此进行限制。

我决定尽我所能对好的申请进行排序,然后只取前 20 名,从那里开始。这意味着会有很多优秀的人我们无法联系,也许我们甚至错过了最优秀的申请人,但现实是我们只能投入这么多时间,我不得不相信,在约 20 个最佳申请中,肯定会有 *多个* 人我们不会后悔雇佣,即使有可能最优秀的人在另外 30 个申请人中。

面试流程

我们首先安排了与前约 20 名申请人进行视频面试,这花了大约 3 周时间。

这些是 30-45 分钟的通话,我们围绕几个主题进行了相当轻松的交谈。

  • 申请人最近一直在做什么,以及他们认为自己的优势在哪里
  • 他们为什么申请这份工作,以及这份工作中哪些方面对他们来说很有趣
  • 我们公司在未来一年左右将要做什么,并详细探讨一些项目
  • 回答申请人对工作或我们公司提出的任何问题

这是一种很好的方式,可以让我们了解申请人,并直观地感受谁最突出。我们真的很享受与我们交谈的每一个人见面,但做出了艰难的决定,再次筛选到大约 10 人,进入下一阶段。

带回家项目

申请流程的下一步是带回家项目,申请人必须使用 Vue 或 React 构建 Steve 创建的设计。我们估计这大约是一个 4-8 小时的项目。

我们提供了一个压缩文件,其中包含所有说明、Figma 文件的设计以及工作实现的演示视频,概述了 Figma 中难以捕捉的任何行为。

查看 GitHub 上的带回家项目 →

我们尽力提供非常清晰的说明,并确保指出我们希望人们将时间集中在哪些地方,以及我们不希望他们过度思考或花费太多时间在哪些领域。

我们给了每位候选人大约两周的时间来完成项目,只是为了确保他们有机会将其融入自己的日程安排,而不会造成干扰。

我们收到的所有提交都非常棒,但我们再次强迫自己将下一阶段的候选人限制在 6 人。

我们非常喜欢 Robin 的提交的一点是,他在代码中用注释详细地引导我们了解他的解决方案。对于常规的生产代码,我会说这绝对是过分了,但作为求职申请的一部分,我认为这对于深入了解他实际上是如何思考他编写的代码非常有帮助。他还花了很多时间描述某些问题的替代解决方案,以及为什么他没有选择这些方法,这也很有益。

配对会议

申请流程的最后一步是与我进行为期两小时的结对编程会议。

在像这样的面试过程中进行结对编程时,存在着很高的风险,即固有的权力动态会影响整个过程。我非常想尽可能避免这种情况,所以我做了两件事

  • 我确保我们结对编程的内容是全新的,我之前没有接触过
  • 我让候选人建议一些我们可以结对编程的内容,并从他们的列表中选择了一些内容

我绝对不想结对编程一些我完全了解答案的内容,我只是在观察候选人是否能找出我已经知道的东西。这绝对不代表实际工作,我认为这毫无用处。

相反,通过选择一个我们都没有太多经验的问题,我们能够将权力动态抛在一边(至少尽可能地),专注于一起学习新东西,并观察我们如何互相帮助摆脱困境。

我结对编程的一些内容包括

  • 从头开始构建日期选择器
  • 学习 XState
  • 使用 Vue 3 组合 API 构建模态对话框

我真的很享受这个过程,并且对我们如何将它整合在一起感到非常自豪。这绝对是面试过程中最具信息量的一部分,也让我对我们向合适的人选提供工作充满了信心。

对于 Robin 的环节,我们决定从头开始构建一个 SVG 图表库(我们俩以前从未做过),使用 Svelte(我们俩以前从未使用过的框架)。这是 Robin 的主意,他敢于同时解决两个全新的问题在面试的背景下,这真的给我留下了深刻的印象。我们一起配对,度过了一段美好的时光,在整个过程中,我们都没有感觉到任何一方领先于对方,或者试图让对方赶上。我们之间有着非常好的化学反应,感觉非常充满活力和富有成效,让我想起了我职业生涯中一些最棒的配对环节,考虑到我们之前从未合作过,而且他正在接受工作评估,这真是太不可思议了。

发出录用通知

整个过程大约花了 1.5 个月,最后我们很难从前几位候选人中做出选择。实际上,我们可以雇用他们中的任何一个,都不会后悔,但我与 Robin 面试和配对的经历更突出一些,我真的很高兴能够向他提供这个职位。我们知道他将成为团队中的一名出色成员,我迫不及待地想在接下来的几个月里与他一起解决一些难题。

想谈谈这篇文章吗?在 GitHub 上讨论 →