I love to read and explore new ideas, especially in software. Many software thought leaders share their thoughts in writting. There is a robust body of knowledge out there, but it can hard to get acquainted with. I owe most of my connection to great writings to other writings I’ve read. I thought I’d collect some of my favorite books into a list to get others started and short cut the laborious crawl between sources.
This is not a blog post because I plan to update it over time. I generally avoid editing my blogposts once they’re public.
Fundamentals overview
This is the list I would currently use to train a young professional developer, probably. It tries to build overarching picture of software development. The focus is on ideas and approaches over specific technologies or specific techniques. I’m generally trying to cover all the categories in this diagram.
This list may seem like a lot, but the majority are articles, not books.
- Code That Fits in Your Head
- Teaches effective software practice by example. Does an incredible job of explaining underlying ideas while rigorously tying each back into the context of the example and a holistic development flow. Builds a good foundation for understanding how aspects of development fit together.
- No Silver Bullets
- Defines some of the fundamental challenges of software. Built some of my most foundational views on software. Its views on essence and accident are also immediately practical and effect how I code every day.
- What is Software Design
- Another article that influenced how I fundamentally view software and the nature of coding. Every stage of programming is design; there are no mechanical activities essential to the discipline.
- What’s Your Duck
- This is my own series. It captures my mental models for software and problem solving. It also describes my primary tools for thinking effectively.
- Most of the ideas come from Design of Design
- The Humble Programmer
- Programs get big, and we can only keep so much of it in our heads at once. One of our most essential task as programmers is writing understandable code. Code that fits in our head.
- Prospects for an Engineering Discipline of Software
- Sets context for the current state of the software industry and how we can become a more mature discipline.
- Pragmatic Programmer
- A broad overview of values and practices refined from experience. Covers ideas like testing, understandability, documentation, choosing tools, thinking about compatability and more.
- Refactoring
- Teaches small complete increments of work and continuous improvement. Builds the toolbox for working effectively even in systems that might be sub-ideal.
- A Little Architecture
- A sassy introduction to architecture. Addresses misconceptions and key goals of high-level design.
- Four Languages from Forty Years Ago
- Compels developers to think beyond a single language. Establishes the value of learning different language paradigms.
- Code Complete
- I’ll admit, this book is massive. It’s not necessary to tackle all at once, or even to read the whole book. Even so, it is the standard for low-level design and style like spacing, naming, variable use, and more.
- Code: The Hidden Language of Computer Hardware and Software
- A delightful crash course in how computers work told through the history of ideas that led up to computers. If you feel like computer hardware is magic, this book will make you a wizard.
This book is notably lacking resources on requirements and reviews. I’ve read books I like on those subjects, but none that I’d hand to a junior dev as an introduction.
A prospective addition to this list could be Google’s DevOps Research and Assessment site. I’ve only poked around a bit, but it seems like it overviews many key ideas. It’s even backed by research!
Writings that influenced my fundamental views of software development
This list is not focused on any target group. It’s an attempt to identify writings that significantly impacted how I write software. I figured others might benefit from them too.
- No Silver Bullets
- Design of Design
- What is Software Design
- Refactoring
- Domain-Driven Design
- Software Engineering Body of Knowledge (SWEBOK)
- Code complete
- On the criteria to be used in decomposing systems into modules
- Stop corrupting yourself
- Peer Reviews in Software
- Layers, Onions, Ports, Adapters: it’s all the same
- Clean Architecture (blog post)
- Prospects for an Engineering Discipline of Software
- Designing with Types
- Domain Modeling Made Functional
- Language of the System
- Pragmatic Programmer
- Agile Principles, Patterns, and Practices
- Code That Fits in Your Head
- Four Languages from Forty Years Ago
- Railway-oriented programming
- Property-Based Testing (F# for fun and Profit)
- The Humble Programmer
- Thorns Around the Gold
- Hordes of Novices
- There is a Silver Bullet