February 2020 marked an entire year since I left my last job. I spent a lot of 2019 thinking about what to do next (a topic for a later blog post), and after many conversations with my wife and extended family, I ultimately decided to get back on the job market.
It had been over 5 years since I last interviewed for a software engineering job, and the idea of getting back into the interviewing game was daunting. My financial and familial obligations gave me about a month to find employment, so I had to spend as much of that time as I could, brushing up on the skills I felt weakest in.
Common software engineering interview practices are notoriously bad. Despite that, nearly 90% of engineering interviews always consist of some type of whiteboarding component, so I knew that I had to get stronger at the weakest part of my interviewing game: data structures and algorithms.
I put together a month long curriculum that consisted of 70% data structures and algorithms, 20% system design and 10% practice interviews. During that month, I also made it clear to recruiters on LinkedIn, and sites like Hired, Angellist and Vettery that I was ready to start looking, but wouldn't be available to interview for at least 30 days.
Since I wasn't working full-time, I had the luxury of time to study for 4 hours a day, 6 days a week. My days would mostly be split studying or listening to lectures in the mornings, and doing practice questions via Leetcode and hackerrank in the afternoons. On Tuesdays and Thursdays I'd do a 1 hour practice interview using Pramp.
Data Structures and Algorithms
I learned how to program as a teenager by modding games and making websites for my friends. I didn't study computer science in college and never had the opportunity to drill data structures and algorithms into my head the way that many computer science undergrads do. I always had some insecurity about my data structures and algorithms weaknesses, so my goal for this round of interviews (aside from getting a job) was to gain enough confidence in my data structures and algorithms so that I would know that I had my bases covered any time I walked into an interview.
My curriculum consisted of two textbooks and a set of online lectures.
The first book and most important book I worked through was The Algorithm Design Manual by Steven S. Skiena. This book does an excellent job working through highly complex algorithms and data structures, all while keeping the subject matter rooted in practical applications.
The goal with this book was to read and finish all exercises for at least one chapter each day. On Sundays I'd review my notes and work through 4 - 5 leetcode questions that corresponded to some of the chapters I read in the previous week.
The second book, Programming Interviews Exposed is a classic. I bought this book during my first year as an engineer, and hadn't read it or practiced with it since at least 2011.
Each chapter in this book is grouped around particular sets of interview problems, all while teaching the concepts that the problems illustrate. The answers to each problem are listed in the book, but in the spirit of learning, it's probably best to try each problem before looking at the answers.
I worked through the exercises in this book using 30 minute timeboxes. If I solved the question faster than 30 minutes, I would attempt to make my algorithm more efficient. If I wasn't able to answer a question within 30 minutes, I would take the opportunity to read through the answer and understand the optimal solutions. I'd then add a similar question to my leetcode questions for the upcoming week, just to make sure I drilled the concepts as much as possible.
Finally, The Easy to Advanced Data Structures Course on Udemy was a great course that I used to reinforce what I was learning via the books that I was reading. The course was well laid out, with easy to understand source code for each lecture and clear animations that showed how each algorithm that we implemented worked.
Assessing Weaknesses with LeetCode
Sunday evenings were spent putting together an overview of what the next week would look like. During my interview prep period, I'd look ahead in both the Programming Interviews Exposed and Algorithm Design Manual, then go to Leetcode and compile a list of 1 - 2 questions that corresponded to each chapter. At the end of each week, I'd work through these questions, and make notes about what topics I found difficult. I'd review each of the challenging topics during the next week.
This process allowed me to continually assess concepts that I was weak in and reinforce those concepts over the course of the month.
Working through Interview Anxiety
Engineering interviews aren't just challenging because of the material. The environment and the interviewer can often be triggering for those that deal with performance anxiety and imposter syndrome. Earlier in my career, bad interview experiences created major setbacks in my confidence and I often struggled to pick myself up and continue moving forward through the adversity of those experiences.
Pramp helped me ease my interview anxiety. I scheduled two hour long coding interviews each week with other engineers on the platform.
How did it go?
I started interviewing about 26 days into the preparation process. And I'm happy with how the process turned out. I ended up with multiple offers from some great companies, and chose the offer that fit best with what I was looking for. I didn't kill it in every interview, but I did walk into each interview confident and prepared, which is really what I was looking for with this process.
Overall, I'm happy with the outcome of this process. I got a new job, I'm learning a ton about an industry I know very little about, and have a more persistent set of fundamentals that I can fall back on when necessary.
If you'd like to learn more about this process, or have any questions, reach out on twitter, I'm @kneelshah.