front matter

 

preface

“Can you describe a situation in which two threads of execution would cause a deadlock?” asked my interviewer. After I gave the correct answer, he probed further: “And what would you do in that situation to make sure the code avoids the deadlock?” Luckily, I also knew the solution. The interviewer proceeded to show me some code and inquire whether I could spot anything wrong with it. The code had a bad race condition, which I highlighted, and I suggested ways to resolve the problem.

This exchange came up during my third and final interview for a core backend developer position at an international tech company in London. In this role, I was exposed to some of the most challenging problems in programming—problems requiring that I sharpen my skills in developing concurrent, low-latency, and high-throughput services. That was more than 15 years ago.

Throughout my career in technology, over 20+ years, many circumstances have changed: developers can now work from anywhere, computer languages have evolved to model more-complex businesses, and geeks have become cool since they now run the giant tech companies. However, a few aspects have remained constant: programmers will always struggle to name variables, a great many problems can be solved by turning systems off and then on again, and concurrent programming skills are still in short supply.

acknowledgments

about this book

Who should read this book

How this book is organized: A road map

How to read the book

About the code

liveBook discussion forum

about the author

about the cover illustration