早在五月份,我们发布了我们的第一个招聘职位,以帮助我们找到一名全栈开发人员加入我们的团队。
在收到近 900 份申请并面试了数十位才华横溢的人之后,我们很高兴终于宣布 Robin Malfait 接受了我们职位的聘用,并从今天起正式成为 Tailwind Labs 团队的一员!

Robin 是一位来自比利时的才华横溢的开发人员,并且长期以来一直是 Tailwind 社区的活跃成员。如果您是 Tailwind UI 的客户,并且曾在我们 Discord 服务器上的 #react
频道中提出过问题,那么他有 90% 的可能性是那位乐于助人并回答您问题的人。他甚至构建了一个 书签小程序,以帮助人们将 Tailwind UI 组件转换为 JSX!
Robin 是一位经验丰富的 React 开发人员,他的加入将帮助我们领导开源的 无渲染 UI 库 的开发,这将成为 Tailwind UI 中官方 React 和 Vue (首先从这两个开始) 支持的基础。
我们非常高兴他终于在今天开始与我们共事,并且迫不及待地想看到他的贡献如何使人们能够更快、更自信地构建出色的 UI。欢迎加入团队,伙计!
接下来是关于我们如何招聘这个职位的故事,以及我们如何从最初近 900 份申请中筛选候选人,最终向 Robin 发出聘用通知。
招聘启事
在这个职位之前,我们只聘请了 Brad,我们已经认识并信任他,因此我们不需要招聘启事或任何严格的申请流程。
我知道,如果我们想要找到真正优秀的候选人,我们必须撰写一份引人注目的招聘启事。在花了大约 3-4 天的时间进行编写后,最终我们得到了这份启事
以下是我在撰写时关注的重点
- 具体说明申请人入职后将从事的项目
- 明确说明我们是一个小团队,所以每个人都必须做各种各样的事情,包括客户支持
- 给出我们刚刚完成的项目的具体示例,申请人如果已经在公司,本可以参与这些项目
- 详细介绍我们预计在下一个即将到来的主要项目中遇到的具体难题,以帮助申请人了解对我们有价值的专业知识类型
- 分享具体的薪资和福利信息。如果对薪资没有明确的了解,我永远不会申请工作,那么我为什么要期望有才华的人在不了解薪资的情况下申请我们的职位呢?
我们收到了大量关于这份招聘启事的积极反馈,我为它的成果感到非常自豪。我认为它非常以申请人为中心,并且我认为这对我们收到的申请质量产生了很大的影响。
申请流程
我们与其他公司略有不同的一件事是我们没有要求提供简历,也没有给申请人列出一大堆问题要回答。我们所要求的只是“申请”,形式不限,由申请人自行决定。可以是求职信、小型网站、视频、幻灯片演示文稿,等等。
我决定以这种方式要求申请,原因如下
- 我只是认为简历没有那么重要
- 我想筛选出一些具有内在营销意识的人,我们是一家小型公司,所以我们更需要 T 型 人才,而不是专家
- 我想筛选出能够交付成果的人,而让申请完全自由的形式可以很好地体现一个人将事物从无到有打造成成熟产品的能力
- 我想找到那些在没有提示的情况下谈论我们正在寻找的东西的人——找到一个在本质上与我们试图做的事情高度契合的人对我们来说将是一个巨大的优势
- 我预计会收到大量的申请,并且我认为以这种方式要求申请可以很容易地筛选掉那些采用广撒网方式求职,而不是特别有兴趣与我们合作的人
即使我认为申请流程相当令人生畏,我们仍然收到了超过 100 份申请,其中显然花费了大量时间为我们的职位精心制作了一些非常具体的内容,包括 Robin 的申请,当然。
有些人确实在他们的申请中做了一些非常出格和有创意的事情(有人甚至制作了一个互动游戏!),但 Robin 的申请因以下几个原因而脱颖而出
- 视觉设计很棒。我们是一家非常注重设计的公司,因此具有良好的设计品味对我们来说非常重要。
- 他关于学习编程和进入 Laravel 社区的故事告诉我,即使我们从未见过面,我们也拥有丰富的共同历史。
- 他冒险分享了他对组件设计的一些强烈看法,这些看法与我们很快就要做的一些工作极其相关,我同意他所说的,甚至学到了一些东西。
- 他分享了一个超级有趣的 开源库,这是他创作的,尽管非常默默无闻,但仍然具有非常周全和完整的文档,并且以结构非常良好的方式呈现。很明显,即使在编写 markdown 文件时,他也会考虑视觉设计。
- 他分享了很多关于他想与我们合作的项目的具体想法,其中很多也是我已经很兴奋要做的事情。
- 他将 “GitHub” 中的 “H” 大写了(天哪,我讨厌人们不这样做)。
Robin 的申请是从内容角度来看真正脱颖而出的 40-50 份申请之一。
筛选申请
处理近 900 份职位申请是一项繁重的工作。超过一半的申请我们可以立即丢弃,因为他们只是提供了他们 LinkedIn 个人资料的链接或一份通用简历,但是筛选其余的申请真的很难。
我以前从未以这种方式聘请过任何人,起初我真的觉得我们需要与提交高质量申请的每个人见面并面试。但是随着申请如潮水般涌来,我意识到这根本不现实,我们必须对面试人数设置某种上限。
我决定尽可能地对优秀的申请进行排序,然后只截取前 20 名并从那里开始。这意味着有很多优秀的人我们不会与他们交谈,甚至可能错过了绝对最好的申请人,但现实是我们只能投入这么多时间在这件事上,我不得不相信,在约 20 份最佳申请中,肯定会有多位我们聘请后不会后悔的人,即使有可能绝对最好的人在其他 30 份申请中。
面试流程
我们首先安排了与前 20 名左右的申请人进行视频面试,这花了大约 3 周的时间才完成。
这些是 30-45 分钟的通话,我们在其中就以下几个主题进行了相当随意的对话
- 这个人最近一直在做什么,以及他们认为自己的优势在哪里
- 他们为什么要申请这份工作,以及这个职位对他们有什么吸引力
- 我们公司在未来一年左右要做什么,并深入探讨几个项目
- 回答这个人对工作或我们公司的任何问题
这是一种很好的方式,可以了解申请人,并对谁最突出有一个直观的认识。我们真的很享受与我们交谈的每个人会面,但我们做出了艰难的决定,再次筛选到大约 10 人进入下一阶段。
居家项目
申请流程的下一步是一个居家项目,申请人必须使用 Vue 或 React 构建 Steve 创建的设计。我们估计这是一个大约 4-8 小时的项目。
我们提供了一个 zip 文件,其中包含所有说明、Figma 文件格式的设计,以及一个工作实现的演示视频,其中概述了 Figma 中难以捕捉的任何行为。
我们试图给出非常清晰的说明,并确保指出我们希望人们将时间集中在哪里,以及我们不希望他们过度思考或花费太多时间的领域。
我们给了每位候选人大约两周的时间来完成该项目,只是为了确保他们有机会将其纳入他们的日程安排,而不会造成干扰。
我们收到的所有提交的作品都很棒,但我们再次强迫自己限制下一阶段的候选人数量,这次减少到 6 人。
我们非常喜欢 Robin 提交的作品的一点是,他花了很多时间通过代码中的注释来指导我们了解他的解决方案。对于常规生产代码,我会说这绝对是过度的,但是作为求职申请的一部分,我认为这对于了解他实际上是如何思考他正在编写的代码非常有帮助。他还花了很多时间描述某些问题的替代解决方案以及他为什么没有采用这些方法,这也非常有益。
结对编程环节
申请流程的最后一步是与我进行两个小时的结对编程环节。
当像这样在面试过程中进行结对编程时,固有权力动态很有可能会影响整个过程的走向。我真的想尽可能避免这种情况,所以我做了两件事
- 我确保我们结对编程的内容是全新的,我以前没有任何经验
- 我让候选人提出一些我们可以结对编程的内容,并从他们的列表中选择了一些
我绝对不想在一些我知道所有答案的事情上进行结对编程,而我只是看着候选人是否可以弄清楚我已经知道的东西。这绝对不能代表实际工作,我认为这根本没有用。
相反,通过选择一个我们俩都没有太多经验的问题,我们可以尽可能地将权力动态放在一边,而只是专注于一起学习新东西,并看看我们如何互相帮助摆脱困境。
我结对编程的一些内容包括
- 从头开始构建日期选择器
- 学习 XState
- 使用 Vue 3 Composition API 构建模态对话框
我真的很喜欢这个过程,并且为我们如何将其组合在一起感到非常自豪。这绝对是面试过程中信息量最大的一部分,并且真的让我对我们向合适的人提供这份工作充满信心。
对于 Robin 的环节,我们决定从头开始构建一个 SVG 图表库(我们俩以前都从未做过),使用 Svelte (一个我们俩都从未用过的框架)。这是 Robin 的想法,他有勇气在面试环境中同时解决两个全新的问题,这真的让我印象深刻。我们一起结对编程非常愉快,而且在整个环节中,从来没有感觉到我们中的任何一个人领先于另一个人,或者试图让另一个人赶上。我们之间有非常好的化学反应,感觉非常充满活力和富有成效,这让我想起了我职业生涯中经历过的一些最好的结对编程环节,考虑到我们以前从未合作过,而且他正在接受工作评估,这真是太不可思议了。
发出聘用通知
整个过程大约花费了 1.5 个月,最后我们在前几名候选人之间做选择时非常困难。实际上,我们可以聘请他们中的任何一位而不会后悔,但是我与 Robin 面试和结对编程的经历稍微突出了一些,我真的很高兴能够向他提供这个职位。我们知道他将非常适合团队,并且我迫不及待地想在未来几个月与他一起深入研究一些难题。
想讨论这篇文章吗? 在 GitHub 上讨论 →