When hiring software developers a common technique for assessing their aptitude is the “programming challenge”. These come in a variety of forms, but they all generally involve a staged example where the candidate is tasked with solving some type of a task where multiple solutions exists. The candidate is then graded (in no particular order) on their ability to:
- Find any solution
- How quickly they found their solution
- How optimal the solution they found was
These types of challenges are often times highly subjective, and depending on the nature of the problem they can also have bias. A challenge problem that is common, at least within certain domains, can bias the results such that candidates from certain backgrounds are advantaged or disadvantaged. For this reason, I always attempt to use changeling problems that are both my unique creation, and to also limit their usage. The latter, because far too often, recruiters debrief candidates after an interview. I’ve personally seen instances where later job candidates from an unscrupulous recruiter are seemingly already aware of the questions I’ll be asking before I even ask them – not cool!
Because of this, I occasionally retire a question. Today I am retiring one such question, and in the process I’d like to share this with you. The introduction to the challenge typically goes something like this:
At this point in the interview, I’d like to have you work on a programming sample. The purpose of this task is not to measure how well you memorize esoteric bits of information, but rather to simulate how you might go about solving a real problem in your day-to-day job. Because of that, I have no expectation that you’ve memorized every standard function, their signatures, etc. In your day job you’d Google things, or ask a co-worker for help, so I highly encourage you to do the same. Google what you need, and ask for clarification or assistance if needed. I will caution you, however, that you will not find the solution to this problem on the Internet, as it is a solution of my own creation, so I do ask you to not attempt that. Likewise I cannot provide direct assistance in finding the solution, simply clarifications only.
Lastly, before we get started, I want to remind you that the purpose of this is to also have fun. We had fun creating this challenge, and it is my sincere hope that you also have fun while solving it. And, with that, I present to you a problem I like to call “Genetic Palindrome”. You can program this in any language you choose. I’ve written some brief instruction in the comments, but let me know if you need any additional clarification.
At this point the candidate will typically review these instructions for some minutes. While certainly not definitive, there does seem to be a correlation between the questions asked at this point and the success of the candidate. I’ve seen candidates go one of three ways at this point:
- They ask no questions, and immediately start developing
- They ask a LOT of questions, and seemingly repeat the same question in multiple ways
- They ask a few, concise, set of questions and start developing.
Of these, the last group – those who ask just a couple of pointed questions and get to work – are more likely to be those who both complete the challenge on time, and also with a correct result. The middle category – those who are seemingly confused – are the ones most likely to not finish it on time, and to have made little significant progress by the time the allotted time is over.
Finally, the first group – those who ask no questions, and jump right in – are more often those who finish on time, but get the solution completely incorrect.
With that, I invite you to try this challenge. You have one hour, or less, to complete this task. In a future post I’ll share my solution and discuss the mechanics of the problem. Good luck.