on Dec 1st, 2006The 5 Books that Every Programmer Should Read
Over the years I have read many programming related books, and there are a few that really should be required reading for anyone who develops software. All of these books are language-neutral and cover ideas that pertain to any kind of programming. These are the cream of the crop. I would not trust a developer who has not read at least half of these book.
Code Complete
by Steve McConnell
Some will say that the majority of the knowledge in this book is common sense, which reminds me of the quote, “Common sense is instinct. Enough of it is genius.” by George Bernard Shaw. It covers just about every aspect of programming. McConnell is a great writer. Although the book is large, it’s easy to read and understand.
The Pragmatic Programmer: From Journeyman to Master
by Andrew Hunt, David Thomas
I really can’t decide if I like The Pragmatic Programmer or Code Complete better. They are both similar books in that they cover a lot of general programming practices. Andy and Dave have a very down to earth writing style. The book, like Code Complete, is very easy to read. This book is fully of practical advise, that for some reason just does not seem to get taught in computer science courses. If every computer science graduate was required to read this book before graduating, I think the world would be a better place.
Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development
by Craig Larman
Don’t be mistaken by the title of this book. This is THE book for learning object-oriented analysis and design. Larman goes through each step of the process, taking an application from concept to completion. It covers requirements gathering, creating use cases, agile development, iterative development cycles, testing, and of course UML. The code examples are in Java, but you don’t really need to know Java to understand what is going on.
Design Patterns: Elements of Reusable Object-Oriented Software
by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
If you’re a programmer I’m sure you’ve heard of this book. It’s one of the most famous software engineering books ever written. This book is a tough read. The examples are in C++, which might be why I had such a difficult time with it. It’s well worth it though. Recognizing and using software patterns is an important part of being a good programmer.
Refactoring: Improving the Design of Existing Code
by Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts
If you’re a professional coder, more than likely you’re going to spend a large part of your time fixing/modifying code that someone else wrote. It’s the nature of the beast. This book is a catalog of common problems in code, and the best way of Refactoring them. Reading this book will greatly increase your ability to detect bad code and fix it.
Any books I missed?

















The first seven books I would buy if my shelves were bare
These are very different lists. I included books that I have read and re-read many times over the years.
I do like most of the book sin your list, although I have come to dislike “Design Patterns,” partly because of the awful misuse of the principles in the book (which is certainly not the authors’ fault) and partly because most of teh patterns simply go away when you switch to languages with more flexible constructs.
Otherwise, thumbs up, thanks!
Yes, you missed The Mythical Man Month. I would also say that you should read something that covers basic cs areas such as algorithms and language theory.
I love Code Complete, and the first few chapters of The Pragmatic Programmer (I’m still working through it).
I don’t like Applying UML and Patterns becuase, like most OO-Design books, it claims that the object model is the most important thing and doesn’t spend any time on UI or Database design.
UI is hard to get right, and users don’t like you changing it after the fact. Databases are very hard to change once multiple applications are using it.
The object model, which is entirely hidden from both the user and other applications, is very easy to change. That makes it the lowest risk factor, and thus the one you should spend the least amount of time on.
I find the explainations in Design Patterns to be poor, the examples to be downright silly, and there isn’t enough time spent on when not to use a specific pattern. I would only read it for its historical value.
I have not read Refactoring, but I have heard good things about it.
I enjoyed all of these books, and I think they’re all important, but I would place every one of them below Structure and Interpretation of Computer Programs.
SICP (Structure and Implementation of Computer Programs)
This starts with an assumption that the reader is very bright but knows nothing, and works up to designing an object system, a compiler, and several other serious systems. It’s tremendously influential, very well-written, and hands-down the best book to start programming with.
I would cut the UML and design patterns book, and would instead go straight to the source, and have coders read “A Pattern Language” by Alexander.
SICP!!!!
I recently found a very interesting website:
http://alreadylinked.com/
There you can purchase ad space for your Blog etc.
Software Crafstmanship by Pete McBreen - similar in theme to The Pragmatic Programmer, but I prefer its treatment of that theme
About Design Patterns… wasn’t it written in Smalltalk, and not C++?
Sorry, but I have read 4 of those 5 and all of those none now exist on my bookshelf - in the trash.
How about one of Pierce’s writings?
* Basic Category Theory for the Computer Scientist
* Types and Programming Languages
It is sad that most books portray hyperbole in contrast to the fundamentals of computer programming (that *is* your criteria right?) - call me a cynic if you will.
Peopleware! Successful software of any size requires an understanding of what is unique about the practice of developing software.
I would drop Applying UML and Patterns. I purchased the book based on similar recommendations and found the book misguided. It is academic and divorced from reality. It was ironic to me that it used a POS system for it’s sample application, and I was maintaining a POS system while reading it.
UML has never served a useful purpose for me in my software development career. Most object models are documented on a dry erase board, but not in UML.
++Alan
Knuth
The Mythical Man-Month: Essays on Software Engineering, 20th Anniversary Edition
by Frederick P. Brooks
I’m a big fan of Randall Hyde’s series-Write Great Code 1 & 2.
Perl Best Practises, O’Reilly
It’s not just useful for Perl but almost all structured programming languages.
I’d also drop the UML and design patterns book and drop in some Algorithm book (standard uni textbook stuff). Any good advices on UI design books?
There are different types of programmers, and the list you gave does NOT apply to all of them. You should really have qualified the term “programmer” in your article.
very good! i am a chinese bog ,i like your web!
The first two (Code Complete and Pragmatic Pogrammer) are good.
Number 3 (UML and Patterns) is boring and would probably make a good door-stop. The only useful insight I got from the book is that the terms “agile” and “iterative” encompass the entire development process, not just coding.
I’ve glanced at Design Patterns by Gamma, et al and wasn’t particularly impressed, and even the more popular “Head First Design Patterns” is a bit over-hyped, and not of as much value for say, a C# programmer as it would be for a Java programmer.
“Refactoring” is also a good book, but with good software support, a lot of the lower-level refactorings become trivial. Apart from the first couple of chapters, a lot of the stuff that most programmers would need is covered in Code Complete’s chapter on refactoring.
So I’d say the first two books listed are good, the others would probably give one geek cred, but apart from that are just going to be expensive coffee table books.
Cool!
Of these boos, I have read three :)
Good start to the list; here are some others:
– The Mythical Man-Month (Fred Brooks)
– The Psychology of Computer Programming (Gerry Weinberg)
– The Art of Systems Architecting (Meier & Rechtin)
– Facts and Fallacies of Software Engineering (Robert Glass)
– Waltzing with Bears (DeMarco & Lister)
– Death March (Ed Yourdon)
– Journey of the Software Professional (Luke Hohmann)
– 201 Principals of Software Development (Alan Davis)
– Principals of Software Engineering Management (Tom Gilb)
– Agile Software Development (Robert Martin)
– Software Engineering (Roger Pressman)
That said, I applaud your list and the attention it’s getting. Most of what I do professionally is (a) consult with large organizations that have troubled IT projects and (b) act as an expert witness in lawsuits that involve troubled/failed IT projects. The core problems have all been well documented for 30+ years (cf. Brooks, Weinberg); it’s just that nobody ever reads these books. ..bruce..
I refer to Death March all the time. Its a classic. Joel Spolksky’s ‘The Best Software Writing’ is a good read.
Pragmatic Programmer, is my all time favourite !!
The Deadline: A Novel About Project Management by TOM DeMARCO
I like Code Complete. It is a perfect book
You are missing “Writing Solid Code” by Steve Maguire. Highly recommended (despite the “Microsoft” in the full title). It covers how to avoid writing buggy code and how to learn from your buygs much better than any other book I’ve seen, including Code Complete.
Everyone Stating that the Design Pattern book is not a must-read is just a hobbyist programmer.
Every good IT student and every IT professor knows how important design patterns are when you get to work upon large codebases with a team.
I guess you meant the programmer that works with OOP.
I general, I would disagree. I wopuld look for more foundational books.
- Structure And Interpretation of Computer Programs (Abelson and Sussman)
- Concepts, Techniques and Models of Computer Programs (Van Roy and Haridi)
- The Art of Computer Programming (Knuth)
- Essentials of programming languages (Friedman Wand Haynes)
That’s more than 5 already.
I love Steve McConnel and would add Rapid Development by him in addition to Code Complete.
I would add Programming Pearls to that list.
Interesting, I’ve heard about the 2nd one “Pragmattic” - guess I should pick it up now.
Two books I found very good were Design Patterns in PHP (Apress), and Object Oriented Design with UML (Apresss).
Connell’s Rapid Development is another must read. And going back even further, Kidder’s Soul of the New Machine is a true classic.
You can find some of those books mention for free here
http://kickjava.com/books
Structure and Interpretation of Computer Programs, Knuth (AoCP), Mythical Man Month and the Soul of a New Machine.
You might want to check out free computer books on this site
http://2020ok.com/5.htm
Thanks great write up, I have read those books, and I had to agree with you.
Your list shows some good stuff for contemporary technology. It may surprise many that a lot of good information is available in older works. Also, some of my favorites are on topics that transcend any particular language or tool. Here’s my list of all time favorites.
Gause, Weinberg, “Exploring Requirements: Quality Before Design”, Dorset House 1989)
Freedman, Weinberg, “Handbook of Walkthroughs, Inspections, and Technical Reviews”, 3rd Edition, Dorset House (1990)
DeMarco, Lister, “Peopleware, Productive Projects and Teams”,
Dorset House (1987)
Brooks, “The Mythical Man Month”, 2ed, Addison-Wesley
Petroski, “To Engineer is Human, The Role of Failure in Successful Design”, St. Martin’s Press (1985)
Weinberg, “The Psychology of Computer Programming”,
Van Nostrand (1971)
Weinberg, “Quality Software Management: Vol. 1, Systems Thinking”, Dorset House (1992)
Weinberg, “Quality Software Management: Vol. 2, First Order Measurement”, Dorset House (1993?)
Weinberg, “Quality Software Management: Vol. 3, Congruent Action”, Dorset House (1993?)
Humphries, “Managing the Software Process”, Addison Wesley (1989)
Humphries, “A Discipline for Software Engineering”, Addison Wesley (1995)
Hetzel, “The Complete Guide to Software Testing”, Wiley (1988)
I would recommend Robert C. Martins Agile Software Development, Principles, Patterns, and Practices - it’s a broad introduction to agility, testing, refactoring and patterns. Great introduction for people wanting to get started with OOP or agile thinking.
I’ve recently been reading an interesting book titled “Understanding Algorithms and Data Structures” by David Brunskill and John Turner. It’s very interesting, has examples in pseudocode. C and ada.
It’s a very good book. :-)
Oh, and for those who like C++ and aren’t beginners “The C++ Programming Language, Special Edition” by Bjarne Stroustrup is very detailed and informative. :-D
I’ll second Jon Bentley’s Programming Pearls. The first edition taught me so much about how to think about programming. I don’t know if it was Bentley who coined the motto “First make it right, then make it fast” — but it was from his book I learned it. The 2nd edition, which I’ve not read, should be even better.
Some great recommendations here IMHO. I’d like to reiterate the _Rapid Development_ recommendations, and I’d add _Patterns of Enterprise Application Architecture_ also by Fowler for a “light read”.
[…] The 5 Books that Every Programmer Should Read […]
[…] read more | digg story […]
I would add Programming Perls by John Bently
[…] The list is not mine, though the books certainly look worthwhile. […]
[…] Sorry about the downtime yesterday and most of today, but an article on my other blog got posted on the front page of digg, del.icio.us, and many other sites and my server exploded. Speaking of del.icio.us, if you have an account, please help me out and bookmark my site there. I am trying to get the word out to more people about this site, and it’s proving difficult. Lastly, I have a lot of site improvements coming soon! A completely new redesign, as well as some new really cool features. Stay tuned… […]
If you plan to do any Java development, Effective Java by Joshua Bloch is a must read.
I also think that The Design and Evolution of C++ by Bjarne Stroustrup is another insightful read.
Great list. The first two books are probably the top two in the industry and every programmer should have them. Neither have to be read cover to cover, you can read a chapter here and there and still learn some great stuff.
I agree with the other posters that Applying UML and Patterns is on the dry side. I think it was written more as a college textbook.
I also agree with some of the comments on Design Patterns. It was no doubt a ground breaking text when released, but there are probably better starting points now. I liked Design Patterns Explained by Shalloway and Trott but I would have to recommend Head First Design Patterns now. The style is probably not for everyone, but I liked it. It was light and enjoyable to read.
I’m just fine with the Refactoring book :-) But if you are going to include it, I think you need to include Test Driven Development by Beck. Most beginning programmers biggest weakness is in testing and they could do a lot for their careers by learning TDD early.
I know you tried to stay language neutral, but I would also add The C Programming Language by K&R to the list for two reasons. 1) Even if you never write a line of C, you will learn a lot about programming from the book. The C syntax has been adopted and borrowed from a lot. 2) Here is a great example of a programming book with exercises you can work through at the end of every chapter! How rare is that these days; a lot of authors could learn a lot from that books example.
I’ll +1 all the people that mentioned Mythical Man Month, Peopleware, and Programming Pearls. All excellent and must reads.
It is interesting to see of all the great (and now dated) books that came out of Bell Labs, that Bentley’s book is the survivor. I guess his advice is timeless.
For anyone who liked Programming Pearls, you might enjoy some of the more dated texts like the AWK programming Language, The UNIX programming Environment, The Elements of Programming Style, or Software Tools. I have two of the more modern ones here, The Practice of Programming and the Art of UNIX Programming that I haven’t gotten to yet, so I won’t recommend them yet.
I add one last (and non-programming) book to the list. Getting Things Done by David Allen. GTD can be a big asset to a programmer and seems to becoming more and more widely adopted/accepted in the programming community.
Patterns book? It’s a useful reference, but the introduction to Refactoring To Patterns gives some real practical advice about when to use design patterns.
The other one is the KNUTH book.
I can’t agree more, that programmers need to lean away from the technology stuff, and get more into the modelling/domain stuff. I’m reading Domain Driven Design at the moment, and it’s not only reinforcing stuff I already do instinctively, but giving me insight and support into why I’m doing it.
[…] 5 books every programmer should read […]
Los cinco libros que todo programador deberÃa leer [en]
Lista de los cinco libros, en inglés, que todo programador deberÃa conocer. También hay otra lista de libros recomendado aquÃ: weblog.raganwald.com/2006/11/first-seven-books-i-would-buy-if-my_17.html. VÃa Digg.
[…] İnternette gezerken baÅŸlıktaki konuya rastladım ve linki tıkladığımda gerçekten haklı olduklarını anladım . […]
holy christ are you off base.
required reading? wheres knr? stevens/comer books on unix? knuths books? intro to algorithms? operating systems books?
these aren’t books every programmer should read, these are books every manager should read.
good for one thing: kindling.
[…]The 5 Books that Every Programmer Should Read[…]
[…] Quoth Shane Sherman in his list of The 5 Books that Every Programmer Should Read: Over the years I have read many programming related books, and there are a few that really should be required reading for anyone who develops software. All of these books are language-neutral and cover ideas that pertain to any kind of programming. These are the cream of the crop. I would not trust a developer who has not read at least half of these book. […]
[…] Over the years I have read many programming related books, and there are a few that really should be required reading for anyone who develops software. All of these books are language-neutral and cover ideas that pertain to any kind of programming.read more | digg story […]
[…] read more | digg story […]
Completely agree: I have two of those books - code complete - and - the pragmatic programmer - and they were very useful.
[…] Å io savaitgalio skaitinai: Stiff asks, great programmers answer The 5 Books that Every Programmer Should Read Fast PHP SusijÄ™ straipsniai:while vs. forSavaitgalio skaitiniai #3Savaitgalio skaitiniai #2 […]
[…] read more | digg story […]
Uhm….”Discipline of Programming” by EW Dijkstra anyone?
Like Shane, I’ve read many, many books having to do with programming, language design, project management, etc. Unlike Shane, I started doing this in the early ’80’s. I’ve read “all of some and some of all” of the books Shane lists and I do find them very useful. At the same time, echoing other posters, I have found that great books on the art and science of computer programming have always been available. Many have influenced me and are too many to list.
I agree with a couple of the posters that Abelson’s and Sussman’s book, The Structure and Interpretation of Computer Programs is a must-read. That one didn’t get published until I was in grad school and it was a real “aha” moment for me when I read it.
I’ve also read the various books mentioned by some of the posters that focus more on the larger aspects of programming (e.g., the Brooks, Yourdon, De Marco, Lister books). These are important because there is so much more to being a good software developer than just developing good software. The Mythical Man Month and Death March are very important to read.
I’m also a fan of Patrick Winston’s book Artificial Intelligence. This book shows where many of today’s ideas actually came from.
[…] I got a lot of feedback from my previous article, The 5 Books that Every Programmer Should Read. As with all “top x” lists, many people disagreed with me, and had strong opinions about other books I didn’t list. This gave me the idea for ProgrammingBooks.org. […]
[…] I got a lot of feedback from my previous article, The 5 Books that Every Programmer Should Read. As with all “top x” lists, many people disagreed with me, and had strong opinions about other books I didn’t list. This gave me the idea for ProgrammingBooks.org. […]
Whenever there is a best programming book list I always take a look and compare it with the books on my shelf, the books on my wish list, and the books that peers and community members also think are great. I also cross check these lists with Amazon’s popularity list and other sources of reviews of programming books. One final pass includes browsing at computer book sellers at developer conferences to make sure I see what is really new and upcoming. Just using people voting is one method of determining popular books, but a better algorithm/search should help make sure that seminal, important, and useful developer books are on the list.
One that is missing from the current list in the Data Structures area is Ellis Horowitz and Sahni Sartaj book “Fundamentals of Data Structures” which is a classic timeless developer book. Other books missing are the “Art of Computer Programming” series by Donald Knuth.
Additional authors include Edsger W. Dijkstra, Bjarne Stroustrup, Ivar Jacobsen, Per Brinch Hansen
There are so many more, I could go on and on.
Yes I read some of them.Can you please let me know if this books available in audio books format?Thanks
Concepts, Techniques, and Models of Computer Programming
I have to say most computer books are really bad. Especially “Teach yourself something in so many days”… or Dummy books. I think tutorial books and reference books are much better in an online medium.
Abstract CS concepts however are easier to learn when using a book.
The problem is that CS (in the business sense) like many things is not a spectator sport. You have to DO IT to get better at it. Yes we all are worried about becoming “Code Monkeys” so we buy these quasi computer programmer self improvement books (Folwer, McConnnel). Which do help only if you practice what the preach (hence don’t just read the book …DO IT)
[…] Like most programmers, Shane had read many programming books over the years. ProgrammingBooks.org grew as a result of a blog post about his favorites. I’ve read a lot of programming related books over the years and I’ve always thought about writing an article on my blog about the books I thought helped me the most. I finally wrote it and the response was amazing. The article made the front page of digg and del.icio.us, and got roughly 50,000 readers in the first 24 hours. I noticed that a lot of people disagreed with my choices and had very strong opinions on various other books. I started thinking about a way to allow everyone to pick their top 5 programming books and programmingbooks.org came out of that. […]
[…] read more | digg story […]
[…] read more | digg story […]
[…] read more | digg story […]
I recently wrote a list of the top 9 and a half books every hacker should have in their bookshelf, and found it interesting that we overlapped on two. I also included SICP, The Mythical Man Month, Programming Pearls and a few more. You can check out the full list here: http://grok-code.com/11/the-top-9-in-a-hackers-bookshelf/
[…] The 5 Books that Every Programmer Should Read: Lots of comments with other suggestions and opinions. […]