Cracking_the_code

Cracking the coding interview, by Gayle Laakmann McDowell, is a book with a goal: helping the reader ace their next tech interview. In order to achieve this goal, one must understand the theory and techniques of the computer sciences: knowing which algorithms to use, what data structures works best for a given scenario, analyzing the complexity of their algorithms, knowing the nuances behind googling recursion.

After mastering these skills, one could go into the interview sure of themselves, but when the first questions arrive, they stumble upon finding they have overlooked one very important aspect… behavioral questions. After all, it doesn’t matter how well you can traverse a tree if you can’t work with other people. With that in mind, while the name of the book might give the impression of a purely theoretical book of examples and exercises, the book contains a plethora of information and tips in order to get a better view of the interview process, as well as preparing the candidate for any unexpected or unfamiliar scenario that might arise.

With that summary, let us dive into each of the chapters that this book has to offer.

I. The interview process.

This section of the book focuses on explaining what exactly the interviewer will be focusing on in order to assess the potential of a candidate. In short, the interview process isn’t much more than a performance assessment, in which the ability of the candidate to fit into the position is being analyzed on different levels, such as:

  • Analytical skill

  • Coding skill

  • Technical knowledge (tools) / Computer science fundamental

  • Experience

  • Culture fit / Communication skills

The weight on each of these points may vary from company to company and from position to position, and while one might look at this list and assume one might forget about the social aspects, this couldn’t be further from the truth, as this point could make or break a candidate. Another point worth nothing is that, if you are out of college or starting your career, experience is expected to be quite short and not as important as a veteran in the field.

II. Behind the scenes.

If you are trying to get into one of the big tech companies, this chapter will be a delight. This chapter explains in a lot of detail the process some of the biggest tech companies in the world (Google, Amazon, Microsoft, Apple, Facebook, Palantir) employ to vet their candidates, as well as the points they focus the most on. Even if you aren’t interested in applying in any of these, this chapter is still quite useful, as it gives you an insight into the interview differences between companies.

III. Special situations.

Trying to write a guide considering all of the possible scenarios an interviewee might encounter is obviously impossible, but this section makes the second-best thing: provide a comprehensive of some of the most common scenarios one might find themselves in. This section provides practical advice for different people that might want to jump into the software development field, as well as for the specific areas they might aim for. This list includes but is not limited to: testers, experienced candidates, product managers, dev leads, startups, acquisitions, etc.

Another interesting group of people that the author takes into account are interviewers, as from the time this book was published to the current day, a lot of interviewers have picked up the book in order to get a better picture of how candidates view the interview process, or even, to prepare for their own interviews.

IV. Before the interview.

This section focuses on tips one must take into account before the interview itself, such as acquiring experience (whether as a student or a professional), as well as the way and points one should make their resume to maximize their chances of success.

V. Behavioral questions.

These questions are not supposed to assess the technical ability of a candidate, but rather their ability and skills in communication, teamwork, career history and personal values. While the image of the programmer usually is one of a genius loner and introverted person, in reality one must be willing to work with others, able to learn from their mistakes, as well as keep learning each day.

The chapter covers common questions, some tips on how to answer these questions, as well as the best way to structure the history of yourself in order to make the biggest impact possible,

VI. Big O.

In this chapter we cover a technical topic that is essential to understand both algorithms and data structures: Big O, otherwise known as complexity. The chapter starts by introducing the concept of complexity from the understanding that the reader has no previous context of this topic, then proceeds to explain some of the more common types of complexity usually encountered in practice. The chapter ends with several exercises for the reader to test their understanding of the topics covered.

VII. Technical questions.

Technical questions are those we most commonly associate with programming interviews: some sort of abstract and challenging task, designed in such a way that it makes the screening of potential candidates possible. This chapter goes over several topics, tips and tricks one should keep in mind when solving this type of question. For instance, the chapter starts with a clear and solid warning: if you want to get better at solving problems, you must solve them, not only read them and understand them. Much the way one must solve math problems in order to really understand them, one must solve programming algorithms.

Another important topic covered in this chapter is how to optimize our solutions, using techniques such as:

  • BUD optimization. Remove:

    • Bottlenecks.

    • Unnecessary work.

    • Duplicated work.

  • DIY (How would you Do It Yourself).

  • Simplify and generalize.

  • Base case and build.

  • Data structure brainstorm.

VIII. The offer and beyond.

Last but not less important, the eighth chapter covers some of those forbidden and uncomfortable topics we all face when looking for a job: offers, rejections and money. As well as some tips for handling both a rejection and an offer, this chapter also deals with the often not so talked about topic of offers and negotiations, which most of us find quite a difficult topic to discuss, but is essential in advancing your career, development and well-being. The chapter also makes some important remarks on the importance of always setting a timeline of our career, even when we are just starting in our new position, as to not lose focus on what is important to us and the path we desire to take.

IX. Interview questions.

From this point on, the book focuses on preparing the reader for the technical questions they will encounter in their interviews. The questions are great, whether you want to practice or just get a sense of what type of questions might be asked. The variety of topics provided ensures that a thorough use of this section well leave any candidate well prepared for their interview.

X. Solutions.

A thorough manual solving each of the problems detailed in the previous section, allowing the reader to check if their solution is correct, or if stuck, the solution provided by the author.

XI. Advanced topics.

A further dive into some computer science topics that, while most likely you won’t come across in your interview, are explained in further detail for those curious.

XII. Code Library.

This section provides some sample code for some common but a bit complex data structures.

XIII. Hints.

For those not ready to give up but needing some assistance with the problems in chapter 9, this section provides some hints to get your gears turning in the right direction.

XIV. About the Author.

The final chapter provides a bit of background behind the author of the book.

Conclusions.

Overall, I liked this book, not only did it helped me be a lot more familiar with the interview process in the tech sphere, but it also allowed me to reflect upon some of the practices and habits I had, as well as some incorrect notions behind the interview process, such as the idea that you must be perfect in order to qualify.

Sketch_note_1 Sketch_note_2 Sketch_note_3 Sketch_note_4 Sketch_note_5