Ten Books That Fill the Gap a CS Degree Leaves
Ten books for software engineers that a computer science degree skips, from Ousterhout and Kleppmann to Feathers and Brooks, grouped by the problem each solves and when in your career it will land.
Jul 23, 202612 min read

The short answer: ten books for software engineers that a degree skips
You can finish a computer science degree without reading a word of Kleppmann, Feathers, Fowler or Brooks. You leave knowing algorithms, discrete maths and how a compiler works in theory, and not knowing how software is actually built, debugged, maintained and shipped by teams. The best books for software engineers fill exactly that gap.
This is not a list of twenty to impress you, because a list of twenty is a list nobody finishes. It is ten books, grouped by the problem each one solves, with the thing that matters most and gets said least: when in your career each one will actually land. The right book read too early is a book you will not remember.
I am a Lead Full Stack Engineer, and nearly every one of these changed how I work at a specific moment, usually a painful one. Students in Pakistan and elsewhere ask me the same question every term: "what should I read beyond the syllabus?" This is my answer.
Why a CS degree leaves a gap (and what these books cover)
A degree is designed to teach computer science: how computation works, how to reason about algorithms, how the machine runs your code. That is valuable, and it is not the same thing as software engineering, which is mostly about change over time, with other people, under constraints. If university feels disconnected from the job, you are not imagining it; I wrote about why professional software development feels different from university.
Here is the whole list in one place.
| Book | Author | Problem it solves | Read it when |
|---|---|---|---|
| A Philosophy of Software Design | John Ousterhout | Code that is hard to read and change | About a year of real coding in |
| Refactoring | Martin Fowler | Improving code without breaking it | You inherit code you want to rewrite |
| Designing Data-Intensive Applications | Martin Kleppmann (2nd ed. with Chris Riccomini) | How data systems really work | After a production database surprise |
| Database Internals | Alex Petrov | What happens below the query | After Kleppmann |
| Working Effectively with Legacy Code | Michael Feathers | Changing untested code safely | Your first weeks in a new job |
| The Mythical Man-Month | Frederick Brooks | Why projects slip | When you watch a team slow down |
| Peopleware | Tom DeMarco and Tim Lister | Why teams work or do not | Any time |
| On Writing Well | William Zinsser | Writing that people act on | Your first design document |
| Structure and Interpretation of Computer Programs | Abelson and Sussman | Thinking about abstraction | A quiet stretch with no deadline |
| The C Programming Language | Kernighan and Ritchie | What memory actually is | When pointers still feel like magic |
Books for writing code somebody else can read
1. A Philosophy of Software Design, John Ousterhout
Short, and the best book on complexity I know. Ousterhout's central idea is the deep module: a simple interface hiding a substantial implementation. It is a better lens than most of what gets taught about structure, and it quietly contradicts some popular advice about keeping every function tiny. The second edition came out in 2021 and added a chapter on deciding what matters.
Read it when: you have written enough code to be confused by your own work six months later. Roughly year one.
2. Refactoring, Martin Fowler
A catalogue of small, safe, named changes to code. The catalogue is not really the point; the habit is. Improve code in steps small enough that you never lose a working state. The second edition was published in late 2018, and there is an online catalogue summarising every refactoring in the book.
Read it when: you have inherited something you want to rewrite and know you should not. The first few chapters are enough to start.
If you want the design principles these two books assume, taught in order, Grokking SOLID Design Principles is a structured companion. My post on six rules that keep a codebase worth working in covers the same ground from a different angle.
System design books: understanding what runs underneath
3. Designing Data-Intensive Applications, Martin Kleppmann
If you read one book from this list, make it this. Storage, replication, partitioning, transactions, consistency and stream processing, explained with unusual clarity and no vendor agenda. It is the book the whole field points at. A second edition, co-written with Chris Riccomini, was published in March 2026 with revised and new chapters, so if you are buying now, get that one.
Read it when: you have worked with a database in production and hit something you could not explain. Too early and it feels abstract. At the right moment it reorganises everything you know.
A book like this is excellent for depth and slow for structure. Many people get more out of it when they pair it with an ordered path: the system design roadmap for the sequence, and Grokking System Design Fundamentals as a structured course alongside the reading rather than instead of it.
4. Database Internals, Alex Petrov
What is happening below the query. B-trees, log-structured merge trees, and why write-heavy and read-heavy storage engines are built so differently. Then the distributed half: replication, consensus and failure detection.
Read it when: you have finished Kleppmann and want the storage layer in detail.

Books for working in code you did not write
5. Working Effectively with Legacy Code, Michael Feathers
Almost every job hands you a large codebase with few tests and a deadline. This is the book about that situation. Feathers famously defines legacy code as code without tests, and the whole book is about how to find a "seam" so you can get a test around code before you change it.
Read it when: your first weeks at a new job. You will use it immediately. Pair it with my answers on how to read and understand a large codebase and your first 90 days in a new developer job.
Books on the parts of software engineering that are not code
6. The Mythical Man-Month, Frederick Brooks
From 1975, and still the clearest explanation of Brooks's law: adding people to a late software project makes it later, because new people need ramp-up time and every extra person adds communication overhead. Brooks himself called it an oversimplification, which is part of why the book is worth reading rather than the one-liner.
Read it when: you have watched a team grow and get slower and want to know what you were looking at.
7. Peopleware, Tom DeMarco and Tim Lister
The case that most software problems are people problems in technical costume: interruptions, noisy offices, turnover, teams that never gelled. First published in 1987 and revised in 1999 and 2013, and it reads quickly.
Read it when: any time. It gives you language for why a workplace does or does not work.
8. On Writing Well, William Zinsser
Not a software book, and it belongs here. Design documents, incident reports, pull request descriptions and the message that changes a team's direction are a large part of a senior engineer's output. Zinsser's 1976 guide is about clarity, simplicity and cutting clutter, which is exactly what technical writing needs.
Read it when: the moment someone asks you to write a design document. Applying a third of it puts you ahead of most engineers. See On Writing Well, and my answer on how to explain technical ideas to other engineers.
Books for the long haul
9. Structure and Interpretation of Computer Programs, Abelson and Sussman
A book about how to think about computation and abstraction, not a particular language. It is hard, and it is free to read online from MIT Press under a Creative Commons licence. It will change how you see functions, data and interpreters.
Read it when: you have a stretch of time and no deadline. Slowly, with the exercises. Not during a busy quarter.
10. The C Programming Language, Kernighan and Ritchie
A slim book that teaches you a language plus what memory actually is: pointers, arrays, the stack, manual allocation. Worth working through even if you never write C professionally, because every higher-level language hides these ideas rather than removing them.
Read it when: pointers, the stack or manual memory still feel like magic words.
What about Clean Code, The Pragmatic Programmer and Code Complete?
They are good books and they are on plenty of lists. I left them off this one on purpose: they overlap more with what a motivated student picks up from courses, tutorials and code review, while the ten above cover the areas a degree most reliably misses. If you want them, they are in the library: The Pragmatic Programmer, Clean Code and Code Complete. Read Clean Code with a critical eye; some of its advice about very short functions has aged less well than the rest, and Ousterhout's book is a useful counterweight.
A reading order by career stage
| Stage | Read | Why now |
|---|---|---|
| Student or first year | Philosophy of Software Design, The C Programming Language, On Writing Well | Builds habits before bad ones set in |
| First job | Working Effectively with Legacy Code, Refactoring | You are in someone else's code every day |
| Two to four years in | Designing Data-Intensive Applications, Database Internals | You have seen production problems to hang it on |
| Leading work | The Mythical Man-Month, Peopleware | You now own outcomes, not just tasks |
| Whenever you have space | Structure and Interpretation of Computer Programs | Deep, slow, rewarding |
If you are still in university, the fundamentals worth learning as a software engineer post pairs well with the first row.
How to actually finish books for software engineers
- One at a time. Three books in progress is zero books finished.
- Argue with it in your notes. Not summaries. Where you disagreed, and what it made you want to change in code you already own.
- Apply something within a week. One refactor, one test around legacy code, one design document written differently. A book you did not act on is a book you will not remember.
- Abandon the wrong one. If a book is not landing, it is probably the wrong time rather than a bad book. Put it back and try again in a year.
- Check for free editions first. SICP is free from MIT Press, and the Free Programming Books index lists many more legally free texts. Money should never be the reason you stop learning; see what to learn for free.
If you are graduating with theory but struggling to build things, books alone will not fix it. Read graduating with theory but cannot build software and pair one book with one project.
Learn it on Sefism
- Resource library, with all ten books alongside related courses and repositories
- System design roadmap to give Kleppmann and Petrov a structure
- Grokking System Design Fundamentals as a guided course next to the reading
- Grokking SOLID Design Principles alongside Ousterhout and Fowler
- Engineering newsletters and blogs worth your inbox for keeping current between books
- GitHub repositories worth more than a star for learning by building
FAQ
What is the best book for software engineers to read first?
For most people, A Philosophy of Software Design. It is short, practical and changes how you write code within a week. If you already work with databases in production, Designing Data-Intensive Applications is the one with the biggest payoff.
Is Designing Data-Intensive Applications good for beginners?
It is readable, but it lands best once you have used a database in a real project. A complete beginner will get more from it after a year of building. The second edition from March 2026 is the one to buy now.
Do software engineers still need to read books with AI tools around?
Yes. AI tools can write code, but judging whether that code is well designed, safe to change and right for the system is exactly what these books teach. They matter more now, not less.
Which books are not taught in a computer science degree?
Most programmes skip books on maintaining code (Refactoring, Working Effectively with Legacy Code), data systems in practice (Designing Data-Intensive Applications), team dynamics (Peopleware, The Mythical Man-Month) and technical writing (On Writing Well).
Is Clean Code still worth reading?
It is worth reading critically. Some advice, especially around very short functions, is contested. Read it alongside A Philosophy of Software Design so you see both sides.
Ask your own question
If your situation is different from anything here, browse the career questions library first; someone has probably asked something close.
Want a learning roadmap built around you, written answers to your own questions and a place to discuss your FYP? Create your free Sefism account. Members can also book a one to one session when they want to talk it through.
Stay in touch
- LinkedIn: where I share roadmaps, career advice and honest takes on hiring. Follow, or message me.
- X (Twitter): short practical thoughts on engineering and careers.
- Instagram: quick tips and a more personal side.
- Sefism Discord: meet other students and engineers working through the same job market and share what is working.
- Sefism on YouTube: walkthroughs and talks.
Comments (0)
Comments are closed for now.
No comments yet.