从九百到一:我们如何雇佣罗宾·马尔费特

Adam Wathan
Robin Malfait

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

🌐 Back in May we published our first job posting to help us find a full-stack developer to join our team.

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

🌐 After receiving almost 900 applications and interviewing dozens of talented people, we're excited to finally share that Robin Malfait accepted our offer for the position and is officially part of the Tailwind Labs team as of today!

Robin 是一位来自比利时的才华横溢的开发者,并且长期以来一直是 Tailwind 社区的活跃成员。如果你是 Tailwind UI 的客户,并且曾经在我们 Discord 服务器的 #react 通道提问,那么有 90% 的可能性是他热心地回答了你的问题。他甚至还创建了一个 书签小工具 来帮助人们将 Tailwind UI 组件转换为 JSX!

🌐 Robin is a talented developer from Belgium, and has been an active member of the Tailwind community for a long time. If you're a Tailwind UI customer and have ever asked a question in the #react channel on our Discord server, there's a 90% chance he's the helpful person who answered your question. He even built a bookmarklet to help people convert Tailwind UI components to JSX!

Robin 是一位经验非常丰富的 React 开发者,他将加入我们,帮助领导我们正在开发的开源 无渲染 UI 库,这些库将成为 Tailwind UI 中官方 React 和 Vue (至少是起步阶段) 支持的基础。

🌐 Robin is a seriously experienced React developer, and is joining us to help spearhead the open-source renderless UI libraries we are working on that will be the foundation for official React and Vue (to start anyways) support in Tailwind UI.

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

🌐 We're super excited that he is finally starting with us today, and can't wait to watch his contributions enable people to build awesome UIs even faster and with more confidence. Welcome to the team dude!

接下来是我们如何招聘这个职位,以及如何从近 900 份最初的申请中筛选出最终录用 Robin 的候选人。

🌐 What follows is the story of how we went about hiring for this role, and how we narrowed down the candidates from almost 900 initial applications to finally making an offer to Robin.


招聘启事(The job posting)

在担任这个职位之前,我们只雇佣过我们已经认识并信任的 Brad,所以我们不需要发布职位或进行任何严格的申请流程。

🌐 Before this role, we had only hired Brad who we already knew and trusted, so we didn't need a job posting or any sort of rigorous application process.

我知道,如果我们想要吸引到真正优秀的候选人,我们必须写一个有吸引力的职位发布。经过大约三到四天的努力,我们最终达到了这个结果:

🌐 I knew that if we wanted to get really great candidates, we had to write a compelling job posting. After about 3-4 days of working on it, this is where we ended up:

阅读职位发布 →

以下是我在编写时关注的重点:

🌐 Here are the important things I focused on when writing it:

  • 请具体说明申请人入职后将参与的项目。
  • 请明确说明我们团队规模很小,所以每个人都要分工合作,包括客户支持。
  • 请给出我们刚刚完成的项目的具体示例,如果申请人已经在公司,他们可能会参与这些项目。
  • 详细介绍我们预计在下一个重要项目中可能遇到的具体难题,帮助申请人了解哪些专业知识对我们很有价值。
  • 分享具体的薪资和福利信息。我绝不会在不清楚薪资的情况下申请工作,那么为什么我还指望有才华的人在没有这些信息的情况下申请我们的职位呢?

我们收到了大量关于这条招聘信息的正面反馈,我对最终效果感到非常自豪。我觉得它非常以应聘者为中心,而且我认为这大大提高了我们收到的申请质量。

🌐 We got tons of positive feedback about this posting, and I'm really proud of how it turned out. I think it was very applicant-centric, and I think it made a big difference in the quality of submissions we got.

申请流程(The application process)

我们与其他公司稍有不同的一点是,我们没有要求提供简历,也没有让申请者回答一大堆问题。我们唯一要求的是一个“申请”,形式由申请者自行决定。可以是求职信、小型网站、视频、演示文稿,任何形式都可以。

🌐 One thing we did a bit differently from other companies is that we didn't ask for a resume or give applicants a big list of questions to answer. All we asked for was an "application", in whatever form the person decided. It could be a cover letter, a small website, a video, a slide deck, whatever.

我决定以这种方式征集申请,原因如下:

🌐 I decided to ask for applications this way for a few reasons:

  • 我只是觉得简历没那么重要。
  • 我想筛选那些具有某些天生营销感的人,我们是一家小公司,所以我们更需要T型人才,而不是专才
  • 我想筛选出那些能够交付成果的人,而让申请完全自由化可以充分展现一个人独立完成从无到有、从零开始打造完美产品的能力。
  • 我想找到一个能够主动谈论我们所需内容的人 - 找到一个与我们正在做的事情自然契合的人对我们来说将是一个很大的优势。
  • 我预计会收到很多申请,我觉得这样征集申请可以轻松筛选出那些用散弹枪式求职方式、对与我们合作不感兴趣的人。

尽管我认为申请流程相当令人生畏,但我们还是收到了超过 100 份申请,其中显然花费了大量时间来为我们的帖子制作非常具体的图标,当然也包括 Robin 的申请:

🌐 Even with what I think was a fairly intimidating application process, we got well over 100 applications where there was clearly a lot of time spent crafting something very specific for our posting, including Robin's of course:

阅读 Robin 的申请 →

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

🌐 Some people did some really out there and creative things in their applications (one person even made an interactive game!) but Robin's stood out to us for a few reasons:

  • 视觉设计很棒。我们是一家非常注重设计的公司,所以有良好的设计品味对我们来说非常重要。
  • 他学习编程和加入 Laravel 社区的故事告诉我,即使我们素未谋面,我们之间也有着丰富的共同点。
  • 他冒险分享了一些关于组件设计的强烈观点,这些观点与我们很快要做的一些工作非常相关,我同意他的看法,甚至还学到了一些东西。
  • 他分享了一个他自己编写的非常有趣的开源库,尽管它非常不为人知,但仍然有非常周到和完整的文档,并且呈现得非常有条理。很明显,即使在编写 Markdown 文件时,他也会考虑视觉设计。
  • 他分享了很多他想与我们合作的项目的具体想法,其中很多都是我早就跃跃欲试的事情。
  • 他把“GitHub”的“H”大写了 (我他妈的真讨厌有人不这样做)

Robin's 是大约 40-50 个中,从内容角度来说真正突出的一家。

🌐 Robin's was one of maybe 40-50 that really stood out from a content perspective.

筛选应用(Filtering the applications)

处理将近900份求职申请是一项很大的工作。超过一半的申请我们能够立即舍弃,因为他们只是提供了LinkedIn个人主页的链接或一份通用的简历,但筛选剩下的申请真的很困难。

🌐 Dealing with almost 900 job applications is a lot of work. Over half of them we were able to discard immediately because they just provided a link to their LinkedIn profile or a generic resume, but filtering through the rest was really tough.

我以前从未以这种方式雇佣过任何人,一开始我真的觉得我们需要与每一个提交了优质申请的人见面并面试。然而,随着申请源源不断地涌入,我意识到这根本不现实,我们必须对其进行某种限制。

🌐 I've never hired anyone this way before, and at first I really felt like we needed to meet with and interview everyone who submitted a quality application. As the applications poured in though, I realized this was just not practical, and that we had to put some sort of cap on it.

我决定尽我所能对优秀的申请进行排序,然后直接挑出前20名开始处理。这意味着有很多很棒的人我们无法面试,甚至可能遗漏了绝对最优秀的申请者,但现实是我们只能投入有限的时间,我必须相信在大约20份最优秀的申请中,肯定会有多个人是我们完全不会后悔雇用的,即使有可能绝对最好的人在其他30份申请中。

🌐 I decided to sort the good applications as best I could, then just slice off the top 20 and start there. It meant there were lots of great people we wouldn't talk to and that maybe we even missed out on the absolute best applicant, but the reality is that we only have so much time we can dedicate to this, and I had to believe that out of the ~20 best applications, there would certainly be multiple people we wouldn't regret hiring at all, even if there was a chance that the absolute best person was somewhere in the other 30.

面试流程(The interview process)

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

🌐 We started by scheduling video interviews with the top ~20 applicants, which took about 3 weeks to get through.

这些是 30-45 分钟的通话,我们进行了相当随意的讨论,讨论了几个主题:

🌐 These were 30-45 minute calls where we had a pretty casual conversation about a few topics:

  • 此人最近在做什么,以及他们认为自己的优势在哪里
  • 他们为什么申请这份工作,以及他们对这个职位的哪些方面感兴趣?
  • 我们公司未来一年左右的计划是什么,以及我们将深入研究的几个项目
  • 回答任何关于工作或我们公司的问题

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

🌐 This was a great way just to get to know the people who applied and get a gut sense for who stood out the most. We really enjoyed meeting with every single person we talked to, but made the hard decision to filter down again to about 10 people for the next phase.

带回家的项目(Take-home project)

申请流程的下一步是一个家庭作业项目,申请者需要使用 Vue 或 React 构建 Steve 创建的设计。我们估计这个项目大约需要 4-8 小时完成。

🌐 The next step in the application process was a take-home project, where the applicant had to build out a design Steve had created using either Vue or React. We estimated it to be about a 4-8 hour project.

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

🌐 We provided a zip file containing all of the instructions, the design as a Figma file, and a walk-through video of a working implementation outlining any behavior that was hard to capture in Figma.

在 GitHub 上查看可带回家的项目 →

我们努力给出非常清晰的指示,并确保指出我们希望人们将时间集中在哪里,以及我们不希望他们过度思考或花费太多时间的字段。

🌐 We tried to give very clear instructions, and made sure to point out where we wanted people to focus their time, and what areas we didn't want them to overthink or spend too much time on.

我们给每位候选人大约两周的时间来完成项目,以确保他们有机会在不打扰他们的情况下将其安排到自己的日程安排中。

🌐 We gave each candidate about two weeks to complete the project, just to make sure they had the opportunity to fit it into their schedule without it being disruptive.

我们收到的所有提交都非常棒,但我们再次限制了下一阶段的候选人,这次只剩下 6 人。

🌐 All of the submissions we got back were great, but again we forced ourselves to limit the candidates for the next phase, this time down to 6 people.

我们非常喜欢 Robin 的提交的一个原因是,他花了很多时间通过代码中的注释引导我们理解他的解决方案。对于常规的生产代码来说,我会说这绝对有些过度,但作为求职申请的一部分,我认为能够深入了解他实际如何思考自己编写的代码是非常有帮助的。他还花了很多时间描述某些问题的替代解决方案,以及他为什么没有采用那些方法,这也非常有益。

🌐 One thing we really loved about Robin's submission was that he spent a lot of time guiding us through his solution with comments in the code. For regular production code I would say it was definitely overkill, but as part of a job application I thought it was extremely helpful to get a behind-the-scenes look into how he actually thinks about the code he is writing. He also spent a lot of time describing alternate solutions to certain problems and why he didn't go with those approaches, which was very beneficial as well.

配对会话(Pairing session)

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

🌐 The final step in the application process was a two-hour pair programming session with me.

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

🌐 When pairing as part of an interview process like this, there's a really high risk of the inherent power dynamic coloring how the whole thing goes. I really wanted to avoid that as much as possible, so I did two things:

  • 我确保我们结对合作的事情都是全新的,是我之前没有经验的。
  • 我让候选人建议了一些我们结对合作的事情,然后从他们的清单中挑选了一项。

我完全不想与某个我已知所有答案的项目搭档,而只是看候选人能否自己找到我已经知道的东西。这完全不能代表真实的工作情况,我认为这根本没有任何用处。

🌐 I absolutely didn't want to pair on something where I knew all the answers and I was just watching to see if the candidate could figure out something I already knew. That is absolutely not representative of real work and I don't think it would've been useful at all.

相反,通过选择一个我们都没有丰富经验的问题,我们可以将权力动态放在一边(至少尽可能地),专注于一起学习新知识,看看我们如何互相帮助摆脱困境。

🌐 Instead, by choosing a problem that neither of us had significant experience with, we got to put the power dynamic aside (as much as possible at least), and just focus on learning something new together, and seeing how we helped each other get unstuck.

我参与合作的部分作品包括:

🌐 Some of the things I paired on included:

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

我非常享受这个过程,并且为我们如何将其组合在一起感到非常自豪。这绝对是面试过程中最有收获的部分,也让我非常有信心我们找对了合适的人来担任这个职位。

🌐 I really enjoyed this process and am very proud of how we put it together. It was definitely the most informative part of the interview process and really gave me a ton of confidence that we were offering the job to the right person.

在 Robin 的这次会议上,我们决定从零开始构建一个 SVG 图表库(这是我们中任何一方以前都没做过的事情),并使用 Svelte(这是我们中任何一方以前都没用过的框架)。这是 Robin 的主意,他竟然有勇气在面试环境下同时解决两个全新的问题,这让我非常佩服。我们在这个项目上一起搭档得非常愉快,在整个过程中,从未觉得谁领先于谁或者需要赶上对方的步伐。我们之间的化学反应非常好,整个过程既充满活力又高效,让我想起了职业生涯中一些最出色的搭档合作时光,这非常令人难以置信,因为我们以前从未合作过,而且他当时还在接受工作评估。

🌐 For Robin's session, we decided to build an SVG charting library from scratch (something neither of us had ever done before), in Svelte (a framework neither of us had ever used before). This was Robin's idea, and that he had the courage to tackle two completely new problems at the same time in an interview context really impressed me. We had a great time pairing together on this, and not once in the session did it ever feel like either of us was ahead of the other person or trying to catch them up on something. We had really great chemistry and it felt very energizing and productive, and reminded me of some of the best pairing sessions I've had in my career, which is pretty incredible given we'd never worked together before, and that he was being evaluated for a job.

优惠活动(Making the offer)

整个过程大约花了一个半月,最后我们在几位候选人之间真的是难以抉择。实际上,我们雇佣其中任何一个人都不会后悔,但我在面试和与Robin配对的经历稍微突出一些,我真的很兴奋能够向他提供这个职位。我们知道他将非常适合这个团队,我迫不及待想在接下来的几个月里和他一起解决一些棘手的问题。

🌐 This whole process took about 1.5 months, and at the end we had a very hard time choosing between the top few candidates. Realistically we could've hired any of them and not regretted it, but my experience interviewing and pairing with Robin stood out just a bit more and I was really excited to be able to offer him the role. We know he's going to be an amazing fit for the team, and I can't wait to dig in to some hard problems with him in the coming months.

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

TailwindCSS 中文网 - 粤ICP备13048890号