
早在五月份,我们发布了 我们的第一条招聘信息,以帮助我们寻找一位全栈开发者加入我们的团队。
¥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% 的可能性就是那个乐于助人的人,他会解答你的问题。他甚至构建了一个 bookmarklet 来帮助人们将 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.
我们非常高兴他今天终于加入我们,并迫不及待地希望看到他的贡献能够帮助人们更快、更自信地构建出色的 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)
¥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:
-
请具体说明申请人入职后将参与的项目。
¥Be specific about the projects the applicant would be working on after they started
-
请明确说明我们团队规模很小,所以每个人都要分工合作,包括客户支持。
¥Be clear that we are a small team, so everyone has to do a bit of everything, including customer support
-
请给出我们刚刚完成的项目的具体示例,如果申请人已经在公司,他们可能会参与这些项目。
¥Give concrete examples of projects we just finished that the applicant would have worked on if they were already at the company
-
详细介绍我们预计在下一个重要项目中可能遇到的具体难题,帮助申请人了解哪些专业知识对我们很有价值。
¥Go into detail about specific hard problems we expect to run into on the next major upcoming project, to help the applicant understand the sort of expertise that would be valuable to us
-
分享具体的薪资和福利信息。我绝不会在没有明确薪资的情况下申请工作,所以,我凭什么指望那些有才华的人会在没有薪资的情况下申请我们的职位呢?
¥Share concrete salary and benefit information. I would never apply for a job without a clear understanding of the salary, so why should I expect talented people to apply for our posting without 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)
¥The application process
我们与其他公司略有不同的一点是,我们没有要求求职者提供简历,也没有给他们一大堆问题。我们只要求一个 "application",具体形式由用户决定。它可以是求职信、小型网站、视频、幻灯片等等。
¥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:
-
我只是觉得简历没那么重要。
¥I just don't think resumes are that important
-
我想筛选出具有一定营销敏感性的人。我们公司规模很小,所以我们更需要 T 形 类型的人才,而不是专家。
¥I wanted to filter for people with some inherent marketing sensibilities, we're a tiny company so we need T-shaped people more than we need specialists
-
我想筛选出那些能够交付成果的人,而让申请完全自由化可以充分展现一个人独立完成从无到有、从零开始打造完美产品的能力。
¥I wanted to filter for people who can ship things, and making the application completely free-form tells you a lot about someone's ability to take something from nothing to polished product on their own
-
我想找到一个能够主动谈论我们所需内容的人 - 找到一个与我们正在做的事情自然契合的人对我们来说将是一个很大的优势。
¥I wanted to find someone who talked about the stuff we were looking for without being prompted for it — finding someone who was naturally well-aligned with what we are trying to do would be a big advantage for us
-
我预计会收到很多申请,我觉得这样征集申请可以轻松筛选出那些用散弹枪式求职方式、对与我们合作不感兴趣的人。
¥I expected a lot of applications, and I thought asking for applications this way would make it easy to filter people out who were using a shotgun approach to job-searching and not specifically interested in working with us
尽管我认为申请流程相当令人生畏,但我们还是收到了超过 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 的作品因以下几个原因脱颖而出:
¥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:
-
视觉设计很棒。我们是一家非常注重设计的公司,因此拥有良好的设计品味对我们至关重要。
¥The visual design was great. We're a very design-focused company, so having good taste in design is really important to us.
-
他学习编程和加入 Laravel 社区的故事告诉我,即使我们素未谋面,我们之间也有着丰富的共同点。
¥His story about learning to program and getting into the Laravel community told me we had a rich shared history, even if we had never met.
-
他抓住机会,分享了一些关于组件设计的强烈见解,这些见解与我们即将开展的一些工作息息相关,我非常赞同他的观点,甚至还学到了一些东西。
¥He took a chance and shared some strong opinions he had about component design that were extremely relevant to some work we'll be doing very soon, and I agreed with what he was saying and even learned a few things.
-
他分享了他编写的一款非常有趣的 开源库,尽管这款软件名不见经传,但它仍然拥有经过深思熟虑的完整文档,并且结构清晰。很明显,即使在编写 Markdown 文件时,他也考虑了视觉设计。
¥He shared a super interesting open-source library he authored, which despite being very unknown, still had very well thought-out and complete documentation that was presented in a very well-structured way. It was clear he thinks about visual design even when authoring a markdown file.
-
他分享了很多他想与我们合作的项目的具体想法,其中很多都是我早就跃跃欲试的事情。
¥He shared lots of concrete ideas for projects he'd like to work on with us, and a lot of them were things I was already excited about doing.
-
他把 "GitHub" 中的 "H" 首字母大写(我真讨厌人们不这样做)。
¥He capitalized the "H" in "GitHub" (holy shit I hate when people don't do that).
Robin 是大约 40-50 名从内容角度真正脱颖而出的成员之一。
¥Robin's was one of maybe 40-50 that really stood out from a content perspective.
筛选应用(Filtering the applications)
¥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)
¥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:
-
此人最近在做什么,以及他们认为自己的优势在哪里
¥What the person had been working on recently, and where they think their strengths are
-
他们为什么申请这份工作,以及他们对这个职位的哪些方面感兴趣?
¥Why they applied for the job, and what about the role was interesting to them
-
我们公司未来一年左右的计划是什么,以及我们将深入研究的几个项目
¥What we as a company are going to be doing over the next year or so, and digging into a few projects in detail
-
回答任何关于工作或我们公司的问题
¥Answering any questions the person had about the job or our company
这是一个很好的机会,可以让我了解申请人,并直观地了解谁最突出。我们非常高兴与每一位交流过的人见面,但最终还是做出了一个艰难的决定,将下一阶段的人数再次缩减到大约 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)
¥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.
¥See the take-home project on 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)
¥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 made sure whatever we were pairing on was something completely new, that I had no prior experience with
-
我让候选人建议了一些我们结对合作的事情,然后从他们的清单中挑选了一项。
¥I let the candidate suggest a few things for us to pair on, and picked something from their list
我绝对不想在自己知道所有答案的情况下进行结对,我只是观察候选人是否能理解我已经知道的东西。这绝对不能代表真实的工作,我认为它根本用不了。
¥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:
-
从零开始构建日期选择器
¥Building a date picker from scratch
-
学习 XState
¥Learning XState
-
使用 Vue 3 Composition API 构建模态对话框
¥Building a modal dialog with the 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 的课程中,我们决定用 Svelte(一个我们之前都没用过的框架)从头构建一个 SVG 图表库(这是我们之前都没做过的事情)。这是 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)
¥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.
想要讨论这篇文章吗?Discuss this on GitHub →
¥Want to talk about this post? Discuss this on GitHub →