从900到1:我们是如何聘请Robin Malfait的

Adam Wathan
Robin Malfait

回到五月,我们发布了我们的第一份招聘信息,以帮助我们寻找全栈开发者加入我们的团队。

在接收到近900份申请并面试了数十位优秀人才后,我们很高兴地分享,Robin Malfait接受了我们的职位邀请,并从今天开始正式成为Tailwind Labs团队的一员!

Robin是一位来自比利时的优秀开发者,长期以来一直是Tailwind社区的活跃成员。如果你是Tailwind UI的用户,并曾在我们Discord服务器的#react频道提问过,那么他有90%的可能性就是回答你问题的那位热心人士。他甚至制作了一个 bookmarklet,帮助人们将Tailwind UI组件转换为JSX!

Robin是一位非常有经验的React开发者,正在加入我们,帮助领导我们正在开发的开源 无渲染UI库,这些将成为Tailwind UI中官方React和Vue支持(暂时而言)的基础。

我们非常激动他今天终于加入我们,迫不及待想要看到他的贡献将如何让人们更快、更有信心地构建出色的用户界面。欢迎加入团队,伙计!

接下来是我们如何进行这个职位的招聘,以及我们如何从接近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上讨论 →

Get all of our updates directly to your inbox.
Sign up for our newsletter.