Where is the design?

Recruiting senior software developers by example.

Posted by Paweł Małkowiak on April 8, 2018

Recruiting software developers.

Searching for new developers for your software company is always a challenge; this challenge can also grow depending on the candidate’s expertise. The technology involved in the role is not particularly important, what matters is the talent on offer from the candidate. If you know that only senior or exceptional skills are required then there’s one important question to ask yourself: do I really need to check their coding skills?

This, however, is a rather limited approach. Additionally, if this person has worked with the specific technology for several years, they must have succeeded in the recruitment process previously. Therefore, in this situation, how do you dig deeper and determine if the candidate in front of you is correct? Is there a particular approach you can take to uncover the candidate’s best qualities? And how can you encourage them to demonstrate the experience they have gained throughout their career?

As I can’t give definitive answers which will suit every software company, the only thing I can do is share my current approach for recruiting strong candidates for solidstudio.io.

Distributed systems design.

A few weeks ago, I posted an article which looked at the pros and cons of testing algorithm skills in the recruitment process. In this new article, however, I want to look at whether designing a distributed system is a good task to set during an interview for a senior developer position. Everything here is based on my experience and the dozens of interviews I have conducted within our company.

Before we look at the required task, I just want to clarify why I feel that designing a distributed system is such a crucial skill. Sure, many people will state that the knowledge required can be learned relatively easily. However, I believe that listening to the candidate’s experience in building these systems provides a fantastic insight into their talents.

Let’s take a look at an example of my approach. In conceptual design, even the simplest problems may require highly sophisticated solutions. This is why I ask candidates to design straight-forward functionality:

Imagine you own a website that serves content to its users. Everything is there — content, design, security and scalability — so it’s now time to make some money! Your business model is to display sponsored links in a given section of the page. You get these links by fetching them from an external system — let’s call it system B. Once a user is logged in to your site, you need to ask System B for a link to be shown to this user. As time goes by, links change as the user’s preferences are likely to change as well.

System B will only pay for links to be displayed that are relevant to that individual user. Therefore, after showing the link, you need to update System B with information about user, link and timestamp. Now comes the tricky part: System B is not very reliable — sometimes it is available, sometimes it is partially available and sometimes it is not available at all. Your job is to maximise profit without exposing the failures of System B to your user.

The good thing about this task is that the amount of variation in solving it is almost endless. Moreover, you can see how candidates gather the required information regarding the system. If there is more than one recruiter in the room, one can be a product owner that verifies all assumptions and the other can be another developer to provide some healthy discussion about the system.

Now that we understand the task, let’s talk about the benefits of solving it during a recruitment session. We’ll start with technical feedback first:

- we can easily measure the experience of the candidate. The task also provides a simpler approach towards the quantity and quality of similar problems experienced in previous roles.

- the candidate’s approach to modern system designing is demonstrated and provides a vast insight into their methods. A candidate stuck with an MVC model has little to do, so this provides little insight.

- the solution can involve caching, queues, different kind of storages, synchronised and unsynchronised communication. These are all concepts which require a broad field of knowledge.

Solving this task can also help to uncover some insights about the candidate’s soft skills:

- mitigating developer or product owner role-playing can give provide an idea how the cooperation may work while working on actual projects.

- the more questions asked, the better. Gathering requirements, be they functional or non-functional, are critical in developing good software. A candidate that follows this approach has a greater chance of becoming a successful developer.

- embracing failure. In almost all the scenarios and solutions to the problem, there can be an issue that causes the designed system to fail or not meet the requirements. The manner in which a candidate reacts can give valuable insights about their work approach and how they handle tough situations.

The greatest benefit of this task is that the scenario can be pushed or challenged almost endlessly. Every time that a problem is solved it can be replaced with another. Alternatively, you can start to talk and ask questions from different perspectives and focus on other parts of the system.

Developing elegant and innovative solutions to the problems present can indicate that a candidate is the right fit for your software house. And, in most of the cases we’ve experienced, the candidate had no issue with the next step of the recruitment process: a coding task. However, when you’re looking for a senior software developer, a coding task is something that you simply cannot skip, so it’s vital that this skill is tested.