Author: John Mongan, Eric Giguere & Noah Kindler
Audience: Professional devs using object-oriented languages
Reviewer: Sue Gee
Programming interviews are notoriously stressful. Can this book help you into your next job?
The preface to this third edition includes news that adds to it authority. One of its authors, Eric Giguere, who like co-author John Mongan was a job-seeking recent graduate when they wrote the original edition, recently interviewed for and landed his dream job at Google.
Is there anything in the book for someone who isn't looking for a job?
The tricky problems that are used to test candidates applying for programming jobs are interesting puzzles. So if you follow the advice of trying the problems yourself before reading the answers you are likely to improve your programming skills. The problems have all been taken from real interviews and the book solves them in a variety of languages (mainly C, but also C++, C# or Java) with an emphasis on object-oriented solutions.
The introduction to the book points out that landing a great programming job its luck but a matter of preparation. To me it's a lot like facing any exam, you need not only to know the stuff, you need to be able to match what you know to what is being asked and to do it almost automatically. Programming interviews are essentially about proving you can code, and are better at than other people - which is why most of the book concentrates on elegant and efficient code. However, before getting onto the programming questions, two short chapters are devoted to other aspects of preparation.
Chapter 1, with the title Before the Search steps back and asks you to contemplate you own likes and dislikes and you strengths and weaknesses - can you cope with interacting with non-technical users, are you good at debugging, do you like testing and so on. It also prompts you to think about the work environment - big company versus small company, long versus short projects, commitment to open source projects. It then suggests you gather up-to-date information on the current job market and also considers ways to ensure your new job doesn't disappear overnight due of outsourcing - including being hired by a firm that undertakes outsourcing!
For first time job seekers it suggests way to develop marketable skills through postgraduate degrees or certification or through open source project experience. It also advocates doing well in school and to keep learning, something that is increasingly possible given the advent of free MOOCs at different levels. It also advocates becoming an intern. The final section of this chapter advises you to manage your online profile - paying special attention to LinkedIn including a caveat about how to prevent your current employer realizing you are job hunting.
Chapter 2 covers the job application process from finding and contacting companies, through the interview process, to negotiating salaries and, and either accepting or rejecting offers. This chapter is supplemented by the final chapter in the book which is on non-technical interview questions that include "What Salary Are You Expecting" and "Why Do You Want to Work for This Company" and the Appendix on Resumes which includes both good and bad examples plus plenty of useful; pointers - such as write your resume to sell yourself and make every word count.
Chapter 3 kicks of the programming-oriented section of the book. It provides a series of steps for solving the programming problems you typically encounter in the interview process suggesting that you should focus on the algorithms and data structure, outlining your approach to the interviewer and explaining your code as you write it. Your should verify you code works by tracing through it with an example and then check it with special cases and boundary conditions. Half of the chapter is devoted to analyzing your solution with Big-O Analysis - the form of runtime analysis that measures the effectiveness of an algorithm in terms of the time it takes for the algorithm to run as a function of the input size.
The subsequent chapters take topics that are commonly encountered in programming interviews to test a candidate's abilities:
4: Linked Lists
5: Trees and Graphs
6: Arrays and Strings
Each starts by presenting basic theory and then includes a series of problems with full explanations about how to provide an excellent solution, including code where appropriate.
Chapter 8: Sorting is a new addition in this edition and follows a similar pattern. Code is included for the major sorting algorithms and then a mix of problems, some theoretical and others requiring implementation are provided.
Chapter 9: Concurrency and Chapter 10: Object-Oriented Programming can be considered as moving on to more difficult topics and then we come to another new chapter.
Chapter 11: Design Patterns first characterizes some common design patterns as creational, behavioral or structural and then advises that because design patterns are so abstract you can expect a lot of variation of questions about them before working through four examples.
Chapter 12: Databases doesn't go very deep - its databases for non-database programmers and it really is pretty fundamental. Similarly Chapter 13: Graphics and Bit Manipulation covers fairly basic stuff for non-specialists.
The next two chapters looks at how to tackle the brainteasers that are often included in programming interviews. Chapter 14: Counting, Measuring and Ordering Puzzles has advice about breaking the problem down into parts and, resoling a simplified problem or a specific example. Chapter 15: Graphical and Spatial Puzzles reminds you to draw a picture - or multiple pictures if it involves motion or change. The selection of problems include some that are well known but the variety is such that they prepare you well for a wide range of these brainteasers,
Chapter 16 looks at how to prepare for Knowledge-Based Questions and points out that you should be prepared to answer questions on anything that is on your resume. The problems in this chapter cover a wide variety of issues and reading through them should alert you to the sorts of questions you might expect.
Overall this book does a good job of making you aware of the hurdles you are likely to encounter going through the interview process for a programming job. As it was originally written from the point of view of recent graduates looking for a first job, it is probably most helpful for others in a similar position. Most of the technical topics covered aren't deep enough to get you through a tough interview, they more serve to point out what you should know. You really need to allow time for it to mature for you to actually make use of it. It does cover some more advanced topics and so may be equally suitable for someone with a couple of years experience.