Photo By: Kaleidico
Well, here we are. We’re about to undergo the series of interviews (in-person or otherwise) that will ultimately determine our possible future at the company. If you haven’t already, you will face your technical challenges during this phase. In some cases, you may be given (usually an easy) technical assessment before you reach this point via some online coding assessment platform such as HackerRank or LeetCode with varying limitations on language and time allowed and a series of test cases that allow you to easily debug and evaluate edge cases and whatnot.
These technical challenges I will separate into three generalized categories:
In the past, most new graduates typically only faced algorithm/programming challenges and possibly some programming language specific questions while more senior positions covered less algorithm-focused questions and more system design related questions. This was based on the idea that new graduates would ultimately be completely unfamiliar with system design given their limited professional experience while more senior developers should understand that broader scope of system design.
Jokes on us. Nowadays, it is expected that you be proficient in all three categories at many companies.
First, the algorithm/programming challenges…
As the hiring pool becomes more saturated with new graduates, it becomes more crucial for companies to incorporate these challenges to better filter candidates and avoid false positives (candidates that appear competent but ultimately are not suited for their role). Simply saying that you have programmed and/or showing your degree (or boot camp certificate) to prove your skills is simply not enough, you must be able to demonstrate it.
Not only must you demonstrate it, but you must demonstrate it in an environment under the scrutiny of complete strangers who, depending on their personality, may have very little regard for your personal anxiety and nervousness as they pick apart every move or step that you take while attempting to solve the problem. For those that dreaded being called to the whiteboard to solve a problem in front of your jeering classmates, this is the professional version. But it beats having to solve esoteric riddles or Fermi problems like in the past.
In addition to your technical skills, you must be able to (1) communicate your thought process clearly to your interviewers and take their suggestions or hints seriously and (2) write your code on a white board. The second can be especially difficult if you normally do not write code (or anything on an upright whiteboard) or even write anything at all (I pretty much type everything and my handwriting isn’t particularly good anyway). One common tip is to begin the top left corner to allow yourself as much space as possible for your solution.
Different companies may be strict in which language they would allow to solve such problems, others may be strict on syntax, while others may be more loose in their allowance of minor syntax errors or even allow pseudo-code to simply outline the concepts used.
It all differs! Some companies may allow you to use generic data structures such as linked lists, stacks, queues, hash tables or generic algorithms such as sort while others may require that you implement the data structure itself before using it to help solve the problem. Do these algorithm questions necessarily translate to your ability to work effectively in your job position, usually not, but many companies use them as a pseudo-IQ test to help filter through candidates (and to also monitor your general approach and behavior when solving a problem).
This aspect of the interview process for software developers has become so prevalent that an entire second market of resources has been generated to help prepare candidates.
Some of the most popular books for simply practicing these types of programs are:
Cracking the Coding Interview (CTCI)
Elements of Programming Interviews (EPI)
For further reading on data structures and algorithms, the following books come heavily recommended:
Introduction to Algorithms (CLRS)
The Algorithm Design Manual
The following are online free platforms that allow you to practice programming problems:
www.leetcode.com
www.hackerrank.com
It’s all about volume. As you perform more and more of these problems, your mind begins to be able to pick out certain patterns and traits that help you determine the right approach to a given problem.
How would I recommend studying based on the above information? It depends on your timetable and your available time. However this is what I would recommend.
LeetCode is the last step simply because it would take the longest to fully exhaust given the ever-increasing number of problems available to solve.
Like I said, volume is key, but it also ideal to have a universal approach when practicing these problems.
For example (based on the problem), allow yourself a set amount of time to fully solve the problem (this can vary based on difficulty). Perhaps, even within this range, you can explicitly set aside an introductory period to simply review the problem description or develop your solution before implementation. Practice talking through your solution out loud (this can seem silly). Start with a naive or brute force solution (perhaps one that doesn’t even involve programming), determine edge cases, and then refine your solution in iterations.
Save your solutions to quickly review if needed. Keep track of your progress when working through problems and note your own progress on the problem. If you completed it easily enough to a satisfactorily manner, then note that. If you didn’t complete it and needed to review the solution after the allowed time then note that so you can revisit the problem and try again. Resist any urge to look up a solution otherwise.
This can be a bit of a grind, but it is what it is.