Designing Data-Intensive Applications: Martin Kleppmann
If you’re eager to gain a comprehensive understanding of data handling in modern distributed systems, look no further. Martin Kleppmann does an exceptional job of elucidating the tradeoffs you’ll encounter with different data storage options. Part II, “Distributed Data,” is particularly enlightening.
Operating Systems - Three Easy Pieces: Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau
I can’t help but admire the authors’ ability to explain complex topics in an accessible manner. The book is divided into three sections — Virtualization, Concurrency, and Persistence — and delves deeply into securely sharing computer hardware among multiple programs, the challenges of multiprocessing, and data persistence.
Computer Networking - A Top-Down Approach: James Kurose, Keith Ross
Get ready for an easy-to-understand journey through the world of computer networking. However, don’t mistake its simplicity for superficiality! The book does a deep dive on the intricacies of the protocols that underpin computer networks, with a particular focus on the Internet. The knowledge gained from this book has been invaluable to me countless times, especially when troubleshooting DNS or network-related issues. After all, we all know, that it’s always DNS 😉.
Effective Java - Third Edition: Joshua Bloch
While not an introductory book on Java programming, I highly recommend it once you’ve grasped the language’s basic syntax. Joshua Bloch, an industry expert involved in designing and implementing Java platform features, has created a masterpiece. Despite the complex subject, the book’s language remains easily understandable. Even experienced developers can learn a lot about writing concise, correct and idiomatic Java code.
Java Concurrency in Practice: Brian Goetz
This book has been on my reading list for quite some time, and this Christmas I finally dedicated time to reading it. It was well worth the read. Unlike a mere documentation of Java’s concurrency classes, this book explores the underlying design decisions made when implementing the concurrency classes and discusses the tradeoffs. The section on the Java memory model is particularly valuable. If you’ve ever wondered what the semantics of the volatile keyword in Java really are, this book is for you.