How we do coding assignments

Hiring is resource intensive and costly; hiring mistakes are costlier.

Gijs Nelissen
6 min readOct 30, 2017

As a product-first company hiring is critical and has to be the number one priority for everyone in the engineering team. Not just managers.

A players hire A players. B players hire C players.

In the past we used a probationary period (see ‘How we find good engineers”) where new team members were fully embedded in the team and got a chance to prove themselves in an equivalent of a one-month full-time employeeship.

The problem with this is that it takes a lot of investment: setting up accounts, introducing them to the team, explaining what the product does…All of that before you know how good they are, they just did great on the preliminary questions, and you felt a “click” during the interview.

Coding assignment

Today we’re working with a test assignment where a recruit has to check out some of our code, get started with a limited set of instructions and communicate and share her progress. Here are some pointers and tricks to think about.

A real problem

Don’t use a generic test example you found on the internet but set up an assignment with features or challenges you’re facing with your product.

We chose for the “Contact Enrichment” feature that’s been on our roadmap for a while now. The advantage is that the designs are done plus it’s a well defined task that includes backend (API) integration, styling and multiple UI interactions when accepting or dismissing the suggestions.

The assignment description:

Use-case description:

1) A user creates a contact with email set to johndoe@acmecompany.com.

2) Our contact enrichment engine pushes suggestions for specific contact details into our database. Such as:

Name: John Doe
Company: Acme 2000
Job title: CEO
Twitter: @johndoerulesacme

3) A user will see these suggestions within Prezly UI. She can decide whether she wants to accept them (one-by-one) or decline (one-by-one or all together in batch).

We want to remember the choice and not present the suggestion again.

4) You are given an API providing data automatically discovered by Prezly, user can accept or dismiss suggestions

Good luck Soldier!

Mimic your codebase

Our test assignment is an extract of our real codebase allowing the recruit to get a taste of our coding style.

Sure you will spend some days in extracting parts of your codebase, documenting it and making sure it’s simple enough to install with a few simple steps (`make install`). The upside is that all that work pays off.

Pay for their time

Before offering any person the test assignment, I highlight that we want to reimburse people for their time. Not only because we think it’s fair, but it will also make sure the person takes the job seriously and finishes it in time.

Test their comms/collaboration skills

The job starts with a simple link to a GitHub classroom assignment which will clone the repo and assign that collaborator as the admin of the repository. On purpose I keep the instructions for the work very minimal and pretty much just send them the link.

First of all we want to pay you for this assignment, so please track your hours so we can reimburse you for your work. I’d be happy to talk about compensation now if you feel we need to do that first.

We decided to use github classrooms for the test so just by following this link [classroom link] you should be able to accept the assignment.

If you run into problems, please use github issues and mention @e1himself @digitalbase (me) or @fragno92 for help.

Good luck!

Nothing about what the product does or what we expect to complete the job. Just a link. This is a great way to test the ‘figure-shit-out’-skills of the candidate.

During the process, the person might have some questions. Pay close attention, asking questions is hard.

At the end of the assignment we want the person to file a pull request which is a great way to find out about collaboration skills: is there a summary/note in the pull request? Atomic commits? What do the commit messages say?

Minimal instructions, enough freedom

We don’t provide detailed instructions on what libraries to use, how to organise the codebase or the type of tests to write.

The instructions for the job are described in a simple readme file:

The primary values for the code we look for are: simplicity, readability, maintainability. It should be easy to scan the code, and rather quickly understand what it’s doing. Pay attention to naming.

Toolset
We’re using React with Redux. It would be nice if you implement the task with Redux. But it’s not a strict requirement. If you think your solution will gain without using Redux, then do it :) See the Implementation section for goals.

Plus you can use whatever you may find appropriate to improve it, really. The codebase has been replicated as close as possible to our prod app. We’ve left comments on parts that should not be changed, the frontend readme goes more into detail. Other than that feel free to adopt whatever you want.

Only hire the best.

The bottom line of this assignment is to identify the best engineers which is critical to effectively building a tech product company.

There is a big difference between “hiring the best” and “hiring the best candidate that you’ve interviewed.”

Be extremely picky in the candidates you continue with by monitoring their progress and cut them off as soon as you see them driving off the cliff. It will save you both a lot of time.

When finishing the assignment, I ask multiple people in the engineering team to review the code separately and provide a 0–5 score answering ‘would you hire this person?’.

Using airtable to keep the ratings

The review shouldn’t take more than 45 minutes, if it takes more that almost always means the code is not simple enough. Only 10–15% of the candidates we test are considered ‘good enough’.

Not sure yet? Test their ego

Either your team is really confident which means you can continue the hiring process.

In the other case your team will have some remarks/suggestions or idea’s on how to solve things differently, no code is perfect. Make sure to give your candidate some feedback. I usually send over the unfiltered feedback to find out how they deal with it.

The best way to do this is to set up a short (timebox 30minutes) call with your engineering team go over the most critical remarks.

Allow the candidate to provide more information or defend certain choices. Pay close attention to how they deal with that feedback and if they have the ‘always be improving’ mindset. Update your rating/score after the call.

Do you like this approach of have some idea’s/feedback let me know in the comments. I almost forgot: we’re hiring.

Update: In the last months we’ve been getting a number of bad reactions to the whole process not being humane. In an attempt to defend ourselves we wrote about this.

--

--

Gijs Nelissen

Belgian Techie. Builder. Bootstrapper. Dad x3. Entrepreneur. Smarty pants. Passionate about the web & technology. Founder of @prezly