在五月,我们发布了 我们的第一份招聘信息,以帮助我们寻找全栈开发者加入我们的团队。
经过将近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的申请在几个方面让我们印象深刻:
- 视觉设计很棒。我们是一家非常注重设计的公司,因此,对设计的良好品味对我们来说非常重要。
- 他讲述了学习编程和加入Laravel社区的故事,让我感到我们有着丰富的共同历史,尽管我们从未见过面。
- 他大胆地分享了一些关于组件设计的强烈意见,这些意见与我们即将开展的工作高度相关,我对于他所说的观点表示赞同,甚至获益良多。
- 他分享了一个非常有趣的开源库,尽管鲜为人知,但文档经过深思熟虑且编写得结构非常清晰。很明显,他在编写markdown文件时也考虑了视觉设计。
- 他分享了很多具体的项目想法,我对其中许多项目已经感到兴奋。
- 他在“GitHub”中的“H”大写了(天呐,我真讨厌人们不这样做)。
Robin的申请是大约40-50份完全突出于内容的申请之一。
筛选申请
处理近900份工作申请是一项艰巨的工作。我们能够立即淘汰超过一半的申请,因为他们只是提供了LinkedIn个人资料链接或一份普通的简历,但筛选出剩下的申请真的很困难。
我从未以这种方式雇佣过任何人,刚开始我真的觉得我们需要与所有提交优质申请的人会面并进行面试。然而,随着申请的涌入,我意识到这是不实际的,因此我们必须设置一些限制。
我决定尽可能将合格的申请进行排序,然后从中切削出前20个,作为我们的起点。这意味着有很多优秀的人我们不会与之交谈,也许我们甚至错过了绝对最优秀的申请者,但现实是,我们只能投入有限的时间在这件事情上,我必须相信在大约20个最好的申请中,肯定会有多个我们不会后悔雇佣的人,即使有可能绝对最优秀的人在另外30人中。
面试流程
我们首先与约20名顶尖申请者安排了视频面试,这耗费了约三周的时间。
这些面试是30-45分钟的通话,我们Casual地讨论了几个主题:
- 该申请者最近在做的事情,以及他们认为自己的优势所在
- 他们为什么申请这份工作,以及这项角色对他们的吸引之处
- 作为公司我们在接下来一年左右将做的事情,并详细讨论一些项目
- 回答任何申请者关于工作或公司的问题
这是一种很好的方式,可以让我们了解申请者,并对谁最突出有个直观的判断。我们与每一个人交谈时都非常愉快,但最终还是做出了艰难的决定,筛选出约10人进入下一阶段。
带回家项目
申请流程的下一步是一个带回家的项目,申请者必须使用Vue或React构建Steve创建的设计。我们估计这是一个4-8小时的项目。
我们提供了一个zip文件,里面包含了所有指令、作为Figma文件的设计,以及一个描述难以在Figma中捕捉行为的工作实现的演示视频。
我们尽量给出非常明确的指示,并确保强调出我们希望申请者集中时间的地方,以及哪些领域我们不希望他们过度思考或花费太多时间。
我们给每位候选人大约两周的时间来完成项目,确保他们有机会将其适应到自己的时间表中,而不会造成干扰。
我们收到的所有提交都很棒,但我们再次强迫自己将候选人缩减到下一阶段,这次缩减到6人。
我们非常喜欢Robin的提交,因为他花了大量时间通过代码中的注释引导我们理解他的解决方案。对于常规的生产代码,我会说这绝对是多余的,但作为一次求职申请,它让我得以深入了解他实际是如何思考自己所写的代码。他还花了很多时间描述某些问题的替代解决方案,以及他为何没有选择这些方法,这一点也非常有益。
配对环节
申请流程的最后一步是与我进行两小时的配对编程环节。
在这样的面试过程中,固有的权力动态极易影响整个过程。我特别想尽量避免这一点,因此我做了两件事:
- 确保我们一起配对的内容是完全新的,我在此之前没有经验
- 让我选择一些候选人建议我们一起进行配对的内容,并挑选他们清单中的一个项目
我绝对不想一起配对一个我知道所有答案的项目,仅仅是旁观候选人是否能够想出我已经知道的解决方案。这根本不能代表真实的工作,我认为也毫无用处。
相反,通过选择一个我们都没有重大经验的问题,我们能够尽量撇开权力动态的影响,专注于一起学习新事物,并观察我们如何帮助彼此摆脱困境。
一些我参与配对的项目包括:
- 从头开始构建一个日期选择器
- 学习XState
- 用Vue 3组合API构建模态对话框
我非常喜欢这个过程,并对我们是如何组织这一切感到自豪。这绝对是面试过程中信息量最大的一部分,并给了我巨大的信心,确保我们将职位提供给了合适的人。
在Robin的环节中,我们决定从头开始构建一个SVG图表库(这是我们都从未做过的事情),使用Svelte(我们都从未使用过的框架)。这是Robin的主意,而他在面试背景下勇敢地同时解决两个全新问题,令我印象深刻。我们在这个过程中相处得很愉快,整个环节中没有一次感觉到任何一方处于高于对方的地位。我们之间的化学反应非常好,感觉非常有活力和高效,让我想起了我职业生涯中一些最好的配对环节,这实在是令人难以置信,因为我们之前从未一起工作过,而他正在被评估一个职位。
发出邀请
整个过程大约持续了1.5个月,最后我们在顶尖候选人之间很难选择。实际上,我们本可以雇佣他们中的任何一位而毫不后悔,但我与Robin的面试和配对体验显得略为突出,我非常兴奋能够向他提供这个职位。我们知道他将会是团队的绝佳契合,我迫不及待想与他一起深入探讨未来几个月的一些难题。
想讨论这篇文章吗? 在GitHub上讨论 →