Software engineering book recommendations
The following is a list of software engineering books I've read that I felt had a strong and lasting positive impact on my career. It's not a list of everything I enjoyed (that would be impossible to list down), but rather a special list of resources that taught/helped me so much that I still find myself thinking about them years later. They are my top recommendations for other software engineers.
Some are about iOS development specifically, but most relate to general software engineering. If you strive to be a world-class developer, these books and resources will help you get there.
(I'm constantly learning new things, so expect this list to expand. I also have been struggling with bad memory as of late, so I predict that I'll also be updating this list to include things that I failed to recall when first writing it. I'll post a message whenever I update it!)
- Write Great Code: Understanding The Machine (Randall Hyde) - Probably my favorite software engineering book. This book teaches you how modern computers work in a high-level way that is easy to understand and not overly technical. It's not going to teach you new fancy APIs, but it will give you the ability to “understand” code; an ability that has proved to be useful almost daily in my career.
- Operating Systems: Three Easy Pieces (Remzi Arpaci-Dusseau, Andrea Arpaci-Dusseau) - This is similar to Understanding The Machine, but is more technical and focused on operating systems specifically. Amazing resource to learn about core OS fundamentals such as memory, threads / concurrency, file systems, and CPU virtualization. It's also free.
- *OS Internals Trilogy (Jonathan Levin) - This trilogy about how Apple platforms work internally is an absolute goldmine for us who develop for said platforms, but it's not for everyone. They will teach you everything you could possibly want to know about these platforms, but they're massive and go into extreme detail on things that you're never going to interact with, making this series a very painful read for beginners and those looking for quick / practical knowledge. But if you're reasonably experienced and is interested in things like linkers and kernels, then these books are a godsend. The only problem with these books is that Amazon only delivers them if you live in the US, so getting a copy can be challenging.
- Game Engine Black Book: DOOM (Fabien Sanglard) - Fantastic deep-dive on not only the source code, but also the hardware, tooling, and team dynamics that allowed the masterpiece known as DOOM to be conceived. iOS developers will find this book extra interesting because DOOM was developed on NeXT workstations; many of the tools were written in Objective-C, so the book has a lot of interesting information about the language and frameworks like Foundation that is still relevant to this day.
- Cracking the Coding Interview (Gayle Laakmann McDowell) - Even if you don’t care about the interviewing bits (I’m not even sure if companies like Apple still run LeetCode puzzles), this book is still a legendary resource for getting started with computer science theory. If you’re not sure why you’d want to do that, check out my article about it.
- The Staff Engineer's Path (Tanya Reilly) - Perfect book for senior engineers looking to get to the next level. This book demystifies the concept of a Staff Engineer and provides a gigantic amount of great advice on how to get there and how to do a good job once you’re there.
- Effective Objective-C 2.0 (Matt Galloway) - Even though we don’t directly write apps in Obj-C anymore, we still have to do so indirectly when using older frameworks like UIKit. This book does a great job of explaining how Obj-C works, which is something you’ll wish you knew when dealing with issues that either originate or pass through Obj-C.
- Clean Code (Robert C. Martin) - This book gets a lot of flack in the community because some people treat it as some sort of bible that must be followed religiously, but it is nonetheless a great resource for learning how to write code that is easy to read and maintain by humans. Just don’t be like those folks.
Other Resources
The following are not “books” in the traditional sense, but are nonetheless great software engineering resources that I think should be present here.
- System Design Primer - A collection of resources for learning how to design scalable backends. Great resource for learning how giant products like Twitter work. For mobile developers, this knowledge can help you make sure the client-side bits are designed properly.
- Nand2Tetris - A free online course that teaches you how to build a modern computer and make it run Tetris, from scratch. Another amazing resource for learning how computers work.
- Prateek Gianchandani’s articles about iOS security, and DVIA - This giant series of 50 articles teaches you how to hack iOS apps and is how I learned everything I know about iOS security. It’s quite old so I’m not sure how much of it still applies, but is an interesting read regardless. Prateek also has a project called Damn Vulnerable iOS App (DVIA) that is basically a playground where you can try out everything he mentions in his articles, but unfortunately it seems that the website that explained it doesn’t exist anymore. I was able to find it in the Internet Archive, so hopefully that still allows you to try it.
- Learn Git Branching - A page that teaches you to use git in the CLI by presenting it as a browser game. This is how I learned how to use git and is a resource that I greatly recommend even if you prefer using GUI apps for your git needs.
- MIT OpenCourseWare - MIT has a lot of free content on YouTube, and the ones related to software engineering are amazing. Here’s a link to my favorite one, which is a class about HTTPS/SSL/modern cryptography.