Why are test tasks necessary and how are they estimated? How can one prove effective with their help, especially when competing for a Software Engineer position? Check out the advice from Scrum Master/Senior Software Engineer at Conscensia, Ivan Popovych.
We have practiced various types of interviews and experience shows that the theoretical skills of candidates do not always coincide with the practical ones. So, we decided to create a small test task, which can check the skills necessary to deal with our project.
The peculiarity of our test consists in the fact that it is not available for candidates beforehand. This does not suit everyone because one needs to spend his free time for it. Secondly, frankly speaking, in fact it is never clear who and how has completed the assignment.
Therefore, we want our candidates to complete a small test task as a part of their interview. To do it, a candidate is left alone for 15 minutes. Since the time is limited, the assignment should be clear for understanding, but it should reveal the depth of the candidate’s knowledge at the same time. That is why, we have written a small part of a code: interface and its implementation. The class and the interface are one data structure. It is realized syntactically correctly for the candidate not to get distracted by checking syntax and misprints, but it has many drawbacks. Overall, the assignment fits one A4 sheet. The candidate needs to do the code review and say if the given program is going to work and how it can be optimized.
We do not have separate tests for different positions, but the mistakes and drawbacks have different levels of complexity: some of them are obvious, others require deeper knowledge and more experience. Our goal is to figure out the depth of candidates’ knowledge.
Before a candidate starts working on the assignment s/he is given a list of items for analysis – a so-called plan of how to deal with the assignment. The plan might, for instance, include the following items: what exactly data structure is it? Will it work correctly in a multithreading environment? Is it implemented correctly from the point of view of SOLID principles? Are there any memory leaks? These items are in fact the criteria for our interview with the candidate. Sometimes the answers are impressive! Some candidates even pointed out the improvements we had not had in mind.
Types of mistakes
The most widespread mistake is that the candidates do not take their time and do not get deep enough into the assignment. They find 2-3 obvious mistakes and decide that they have completed the task. When we ask them questions, they start seeing much more. The assignment is aimed at checking specific things as well as focusing at a much higher – architectural level. Not all candidates manage to understand whether the specific method is going to work and at the same time evaluate the structure on the whole and realize how it can be improved, like, let’s say, it should be divided into subclasses or its interfaces ought to be separated.
How can one prove effective?
It is hard to think of a “golden algorythm” for that. My advice is to read the task carefully: correct understanding is already half of the right answer. After that you need to think of a plan of how to do the code review – for example, you can start with the specific things and move on to the more general ones. One should be really attentive as far as the details are concerned, but, at the same time, bear in mind to view the code at the upper level in order to understand if this data structure will be convenient to use. This advice, however, works for our particular assignment. Generally speaking, one needs to understand coding well, think critically, and be capable of realizing all ideas!