Programmers Don't Read Books -- But You Should

April 28, 2008

One of the central themes of stackoverflow.com is that software developers no longer learn programming from books, as Joel mentioned:

Programmers seem to have stopped reading books. The market for books on programming topics is miniscule compared to the number of working programmers.

Joel expressed similar sentiments in 2004's The Shlemiel Way of Software:

But the majority of people still don't read. Or write. The majority of developers don't read books about software development, they don't read Web sites about software development, they don't even read Slashdot.

If programmers don't learn from books today, how do they learn to program? They do it the old-fashioned way: by rolling up their sleeves and writing code – while harnessing the collective wisdom of the internet in a second window. The internet has rendered programming books obsolete. It's faster, more efficient, and just plain smarter to get your programming information online. I believe Doug McCune's experience, which he aptly describes as Why I Don't Read Books, is fairly typical.

I lay part of the blame squarely at the feet of the technical book publishing industry:

  1. Most programming books suck. The barrier to being a book author, as near as I can tell, is virtually nonexistent. The signal to noise of book publishing is arguably not a heck of a lot better than what you'll find on the wilds of the internet. Of the hundreds of programming books released every year, perhaps two are three are truly worth the time investment.
  2. Programming books sold by weight, not by volume. There seems to be an inverse relationship between the size of a programming book and its quality. The bigger the book, somehow, the less useful information it will contain. What is the point of these giant wanna-be reference tomes? How do you find anything in it, much less lift the damn things?
  3. Quick-fix programming books oriented towards novices. I have nothing against novices entering the programming field. But I continue to believe the "Learn [Insert Language Here] in 24 hours!" variety of books are doing our profession a disservice. The monomaniacal focus on right now and the fastest, easiest possible way to do things leads beginners down the wrong path – or as I like to call it, "PHP". I kid! I kid!
  4. Programming book pornography. The idea that having a pile of thick, important-looking programming books sitting on your shelf, largely unread, will somehow make you a better programmer. As David Poole once related to me in email, "I'd never get to do that in real life" seems to be the theme of the programming book porn pile. This is why I considered, and rejected, buying Knuth's Art of Computer Programming. Try to purchase practical books you'll actually read, and more importantly, put into action.

As an author, I'm guilty, too. I co-wrote a programming book, and I still don't think you should buy it. I don't mean that in an ironic-trucker-hat, reverse-psychology way. I mean it quite literally. It's not a bad book by any means. I have the utmost respect for my esteemed co-authors. But the same information would be far more accessible on the web. Trapping it inside a dead tree book is ultimately a waste of effort.

The internet has certainly accelerated the demise of programming books, but there is some evidence that, even pre-internet, programmers didn't read all that many programming books. I was quite surprised to encounter the following passage in Code Complete:

Pat yourself on the back for reading this book. You're already learning more than most people in the software industry because one book is more than most programmers read each year (DeMarco and Lister 1999). A little reading goes a long way toward professional advancement. If you read even one good programming book every two months, roughly 35 pages a week, you'll soon have a firm grasp on the industry and distinguish yourself from nearly everyone around you.

I believe the same text is present in the original 1993 edition of Code Complete, but I no longer have a copy to verify that. A little searching uncovered the passage Steve McConnell is referencing in DeMarco and Lister's Peopleware:

The statistics about reading are particularly discouraging: The average software developer, for example, doesn't own a single book on the subject of his or her work, and hasn't ever read one. That fact is horrifying for anyone concerned about the quality of work in the field; for folks like us who write books, it is positively tragic.

It pains me greatly to read the reddit comments and learn that people are interpreting the stackoverflow.com mission statement as a repudiation of programming books. As ambivalent as I am about the current programming book market, I love programming books! This very blog was founded on the concept of my recommended developer reading list. Many of my blog posts are my feeble attempts to explain key concepts outlined long ago in classic programming books.

How to reconcile this seemingly contradictory statement, the love and hate dynamic? You see, there are programming books, and there are programming books.

The best programming books are timeless. They transcend choice of language, IDE, or platform. They do not explain how, but why. If you feel compelled to clean house on your bookshelf every five years, trust me on this, you're buying the wrong programming books.

I wouldn't trade my programming bookshelf for anything. I refer to it all the time. In fact, I referred to it twice while composing this very post.

my-programming-bookshelf-small.jpg

I won't belabor my recommended reading list, as I've kept it proudly the same for years.

(Update: Tim Spalding kindly set up a LibraryThing account on my behalf – and members have already documented and entered every book pictured on these shelves. Impressive, and quite cool!)

But I do have this call to arms: my top five programming books every working programmer should own – and read. These seminal books are richly practical reads, year after year, no matter what kind of programming I'm doing. They reward repeated readings, offering deeper and more penetrating insights into software engineering every time I return to them, armed with a few more years of experience under my belt. If you haven't read these books, what are you waiting for?

Code Complete 2 Don't Make Me Think Peopleware Pragmatic Programmer Facts and Fallacies

It is my greatest intention to make stackoverflow.com highly complementary to these sorts of timeless, classic programming books. It is in no way, shape, or form meant as a replacement for them.

On the other hand, if you're the unfortunate author of Perl for Dummies, then watch your back, because we're definitely gunning for you.

Posted by Jeff Atwood
231 Comments

By declaring that you will never read Knuth's The Art of Computer Programming, you declare yourself to be a hack coder, not a programmer and certainly not a hacker.

The details of your "damning with faint praise" comments about Progamming Pearls confirms this.

You see, computer science is what makes the difference. Without it, you're technician-class.

(The notion that all important "low level" algorithms are already available in libraries is nothing but a thin rationalization, BTW.)

Doug on April 29, 2008 9:57 AM

The Art of Computer Programming is a must for anyone who wants a deeper understanding of structures and efficient (as in O(x)) algorithms.

If you are doing CRUD and using libraries for anything slightly more complex, you can skip it. But the idea, I thought, was becoming a better programmer.

Daniel on April 29, 2008 10:03 AM

"Employ your time in improving yourself by other men's writings, so
that you shall gain easily what others have labored hard for."
-- Socrates

I love reading but it takes so much effort and time - but there is no better alternative.

The problem I think, is that most programmers have this 'nobody can teach me anything' mentality.

Personally I like to approach a subject and immerse myself from a higher level into the nitty-gritty details over time, to get an overview first and the philosophy behind the thinking - as was mentioned, the Why? and not just the How?

I also enjoyed Code Complete and I am busy with Booch's OOAD book as well as Watts Humphrey's Managing the Software Process.

It is tough to find the energy to read after a hard day in from of your IDE, so I have resorted to reading in the mornings before work. It works well for me and it gives me a sense of achievement, even before I step out of my house!

Vic on April 29, 2008 10:05 AM

You are not at all interested in computer science (as you have explicitly declared, which is understandable since you are a self-taught coder).

There's nothing wrong with that, in itself.

There *is* something wrong with you pretending to be some kind of hotshot pundit about programming, when you have already declared yourself to be a mere coder.

Your blog seems to have very wide appeal; apparently there are a zillion CRUD coders out there who view you as God of hacks.

Does that help your ego? You know the truth.

You know in your heart of hearts what is, and is not, true of you: your technical expertise is zero compared with the real experts.

Doug on April 29, 2008 10:07 AM

All the books that you mention are relatively old, not of course to imply that they are any less relevant. I was wondering which books from say, the last three years, you would recommend?

Is this a joke question? I'm concerned. I can't tell.

Actually this was a serious question, perhaps not well phrased.

The top five books that you have listed are all at least 3 years old;
-- Code Complete 2 - 2004
-- Stop Don't Make Me Think - 2005
-- Peopleware - 1999
-- Pragmatic Programmer - 1999
-- Facts and Fallacies of Software Engineering - 2002

I was enquiring as to whether there are any books that have been published recently (2006, 2007, 2008), that you would recommend which may have the potential to be timeless classics.

Surely the whole computer book industry has not put out complete drivel since February 02 – 2004.

I ask this question, as my sorting the wheat from the chaff reading time and money over the last couple of years has been significantly reduced. As a result, I am always looking for good recommendations for new books in the field to read.

Adrian. on April 29, 2008 10:08 AM

You and I share a lot of the same books. I see many that I own, in your collection. I have about 7 or 8 shelves worth here. In your collection, I HIGHLY recommend the following for everyone:

Peopleware - You'll read this and swear it was written about your company

Code Complete - Absolute must

Applying UML and Patterns is fantastic

The Head First Design Patterns book is pretty good, and the Gof book is classic but a little more academic so a harder read for people

Rapid Development is great

Showstopper was a really enjoyable read

And I'm laughing at the "BASIC Computer games" and "More...". I used to have both of those; and all games were input onto my Atari 800, and my school's PDP-11. Yikes! :)

Also recommended, but I don't see on your self is Feature Driven Design. Interesting project methodology book.


Bado on April 29, 2008 10:13 AM

hmm, do i buy code complete or do i buy call of duty 4? decisions, decisions...

cowgod on April 29, 2008 10:29 AM

Funnily enough I've bought way more programming books recently - now that many of them are coming out of my own company's revenue - than I did when I worked for a corporate. Spending money was too much hassle in the big firm!

One "classic" book that I don't feel fares as well as the others is the Pragmatic Programmer. I own it and have read it, as well as Code Complete and some of the others on your bookshelf but PP just doesn't seem to hold up on re-reading as well as some of the others. I need to maybe read it again and figure out why.

To the person who was asking about good .NET books, I've had good results with several of the Apress books - CLR via C#, Pro C# and the .NET Platform and the Windows Forms and Custom Controls one is quite good too.

Julian on April 29, 2008 10:34 AM

"The market for books on programming topics is miniscule compared to the number of working programmers."

At $50 or more for a good book, many working programmers must make a purchase decision where not buying the book is a valid option. At $20, you would see more books being sold...

poor programmer on April 29, 2008 10:36 AM

Robert S. Robbins See http://www.codinghorror.com/blog/archives/000117.html

Anyways back on topic. I have held for a long time that the best way to pick a new tech employee is in the interview ask them the last technical book they read, or are reading, and the 2-3 blogs or magazines they read regularly.
If they actually read them they should not have any problems to quickly answer it and if they actually reading then they are probably better then most of the population and are at least interested in learning new things.

will on April 29, 2008 10:39 AM

Your recommendations have yet to be wrong, so you can enjoy more commission coming your way ;)

Brandon on April 29, 2008 10:50 AM

I like the functionality to be able search "My library" via:
http://books.google.com/

Granted not all (or many) books are indexed, yet. I consider this to be a free version of Safari, using books that I own:
http://safari.oreilly.com/

erik9000 on April 29, 2008 10:54 AM

Let's have an annual social gathering to burn our obsolete technical books. Imagine the size! Call it the programming pyre.

I'll bring the marshmallows.

Charles on April 29, 2008 10:58 AM

I used to buy a lot of books.. Now that they cost 40-50 bucks and it's coming out of my pocket I don't anymore.. I wish I could afford them but it just doesn't work at those prices..

-jfc-

JFC on April 29, 2008 10:58 AM

A really good book is an excellent way to become familiar with a new technology.

For example I found "Developing ASP.NET Server Controls and Components" http://www.amazon.com/exec/obidos/ASIN/0735615829/nikhilkothari-20 invaluable for getting a really good understanding of ASP.NET 1.0.

And I would be interested in books of similar quality and depth for new technologies such as WCF, Silverlight, etc.


Joe on April 29, 2008 11:05 AM

Jeff,

Actually, "For Dummies" series quality has increased to the level of other "beginning/intro to language X" book.

Now on the topic of "Sams Teach Yourself". I like those books because I can pick up a new language (in a nutshell) pretty fast and advance faster than buying the best introductory books.

I wouldn't buy either series. But I've been borrowing a large number of those from a public library near my house.

For example: I don't know CSS. I borrowed Sams Teach Yourself CSS in 10 minutes. The book is small and thin. I learned the basic intro of CSS in a nicely structured way. It's not enough to be a professional, but it's good enough as a starting point.

I see you have lots of books in that shelf. I'm guilty of having tons of books too. I have tons of .NET books (most of them I got it for free during my internship at Microsoft). I also have several J2EE, Perl, Ruby, PHP and Python books. I'm in the process of selling them for cheap price.

At one time, I got stressed out for having to catch up with these technologies. But lately, I realized that most of the books I have don't give much value. I have GoF Design Pattern book but I rarely use most of the DPs. I probably only use few of them. I have Refactoring book (from Fowler) but yet I failed to see a significant value out of it. These books teach us how to patch C++/Java/C#.

What we're missing is tutorials/books on how to design tools like "ls", "echo", "cat". Tools that are usable and live forever (if engineers forbid them). So since last week, I decided to get back to the root. Start reading old books. Luckily, my university has these old books so I can borrow them with no hassle.

These books are thin, but they teach me more than any software engineering books out there. They do this with less complexity, less noises and to the point.

1) The UNIX Programming Environment (Kernighan)
2) The Practice of Programming (Kernighan)
3) Software Tools (Kernighan)
4) The Elements of Programming Style (a 1978 book)
5) Effective Java (partly because it is work related)

After interning at MS (on the Oslo team), I lose my appetite of doing any .NET (or, to some extend, Microsoft tools) stuff unless if it is work/highly-paid/consulting related. I know I'll have to learn new technologies, but I chose to learn them on the job.

Sorry if some readers think that I'm doing disservice to the IT field. I'm not the guy who decided to buy another J2EE app-server, or yet another CMS/CRM from Microsoft while simple open source software out there work fine.

Ted on April 29, 2008 11:10 AM

Got to say I love programming books but it is a case of finding the time to read them especially when it's learn a new programming language (in detail), a book like that will take you maybe between 5 and 10 times as long to read page for page compared to a novel. Especially if you are doing the excercises and so on.

Maybe companies should offer personal development time where you can do this kind of thing. They get a better programmer, you improve your skills without eating into what free time you have (which you probably spend a lot of on the computer).

pete on April 29, 2008 11:16 AM

To know "how to" - Google
To know "why"... - blogs of all those egg-headed software devs!

Those suckers spend precious hours of their lives reading voluminous books and spit out the very essence in effortless pills in hope of luring more ad-cash generating traffic with their wisdom;)

Cheers

Tomek on April 29, 2008 11:35 AM

One other thing that may be quashing the sale of books is the speed at which the industry changes. The lead time for good books is really long, and the length of time the books stay up to date may be short.

Apple no longer publishes their SDK through Addison-Wesley, as they did years ago with the Inside Macintosh series. Instead, it is all web / PDF documentation and is updated three times a year.

Call me old fashioned, but I do still like books. You can cover a lot of material in a book, and high-speed visibility to a lot of information. That's harder with screen-based documentation.

Bill Coleman on April 29, 2008 11:37 AM

You are prematurely optimizing your learning experience. Please step away from the keyboard.

http://tailguard.blogspot.com/2007/10/please-buy-some-books.html

Chris Moorhouse on April 29, 2008 11:37 AM

The trend that I notice is that as one becomes more adept, the required reading becomes more abstract. You move from "Beginning C++" to "The Pragmatic Programmer" because when you're a nooblet, 95% of "Beginning C++" is new and fresh and only 5% of "The Pragmatic Programmer" even makes sense in application. Eventually only 5% of "Beginning C++" (if that) exists outside your brainpan, but 95% of "The Pragmatic Programmer" really resonates.

Chris Rikli on April 29, 2008 11:41 AM

http://mitpress.mit.edu/sicp/

Mac on April 29, 2008 11:45 AM

I only read books when I am bored or have downtime between jobs. Some have substance others, once read, lose their value and begin to take up valued shelf space.

Internet search whatever you want to learn and you'll have resources for any topic right at your finger tips. Want a book about it, buy a printer and a stapler.

Kazimir on April 29, 2008 11:51 AM

I've started including my favorite books in my resume. I think it really helped me get my last job. It really lets them know your serious about what you do. Here's what I have in my Resume within my Technical Proficiency section.

Influential Books

Code Complete, The Pragmatic Programmer, Lean Software Development: An Agile Toolkit for Software Development Managers, Implementing Lean Software Development: From Concept to Cash, Don't Make Me Think: A Common Sense Approach to Web Usability, The Non-Designer’s Design Book

Darrel on April 29, 2008 12:12 PM

Hummm, programming books...
* Mike Abrash books help a lot to understand how to deal with CPU caches, pipelines, etc. Even it was about old Intel processors, it still apply for ARM CPU, modern multiple cores CPU issues, GPUs, and good old 6502 for the NES homebrew game coders :) Just a matter of a way of thinking.
* The "Red dragoon book" is also a old but yet good book to learn how to put together a lot of theoretical stuffs (finite state automatons, grammars, data structures) to make a working software. And by the way, good to discover data structures.
* Some books about LISP (can't remember the titles, somebody ?), that behind LISP, teach the functional programming. As object programming, functional programming help to have organized and solid code, just choose your weapon. The more weapon you know, the more armed you are to fight real-life beasts.

Alex

Alex on April 29, 2008 12:15 PM

I prefer books over the Internet; however, I usually use the Internet simply because it's cheaper. I don't want to spend $80+ on a book when I can get nearly the same content for free. Granted, I like the organization and formal learning from a book.

I do own several programming books, but I usually only purchase a programming book when I know nothing about the language I'm investigating. Once I have a firm grasp of it, I ask Google for anything else.

Brent on April 29, 2008 12:16 PM

The other advantage of having the books on your resume is that it gives you something to talk with the interviewer about, as they always seem to notice the list and bring it up.

Of course that only works if you've actually read the books :P

Darrel on April 29, 2008 12:19 PM

What, no "More Programming Pearls"?!

Geekraver on April 29, 2008 12:22 PM

Books are good.

I tend to use both the WEB and teaditional books. What doesn't work fer me are "books on the web" - such as O'Reilly Safari (which I subscribe to). I tend to use that service as a paid for preview service. If I like the bit I see on-screen I shall buy the book.

There are some really poor books on code development - unfortunately - and I have spent a small fortune on a pile of obsolete books I found were very poor - AFTER I had purchased them. I usually invested in them since I put my trust in the publisher. The publisher plays a big role in this - I expect aggressive quality control and editing to keep up standards. Trust is hard won and easily lost.

Chris on April 29, 2008 12:23 PM

What, no Programming C by K R?

Vaibhav on April 29, 2008 12:38 PM

I have taken to grouping these texts into two categories. There are "programming books" and there are "development books".

Programming books are those that focus on actual code and almost invariably about a single language. Development books are about techniques, practices, and management. These are the books that are universal, that know creating software is a lot more than just writing code.

Programming books are useless. Development books can be priceless.

Calvin Spealman on April 29, 2008 12:54 PM

first there was dialup access I had to pay for per hour (aol, prodigy...)

I was very glad my university gave me free access

then there was flat-rate per month, or "AOL FOR 200008475 free hours for the first month"

then, BROADBAND - YAY!

Now everyone has access to everything. First, programming books. Tomorrow, ALL BOOKS! hehe

Gregory Magarshak on April 29, 2008 12:59 PM

Books are definitely not useless - they are just not as important and/or necessary as they used to be. However, one thing books make possible ( other than the benefits derived from their portable nature ) is that they can lock your focus. Trying to learn stuff on the Web or even via PDFs and whathaveyou is a challenge in fighting off distractions.

Mark Papadakis on April 29, 2008 1:30 PM

A collegue at work let me borrow Head First Design Patterns. I found it an enjoyable read (which where dev books are concerned is rare!) and patterns are now a fave subject of mine.

Nice to see it on your shelf Jeff.

Matt on April 29, 2008 1:53 PM

Jeff,

Despite your past comments, I bought the book you co-authored. I'm still relatively new to ASP (spent much more time so far on the raw C# and Winforms) and I thought it was great. Sure, you can do web-searches for stuff, but it's rare to be able to dip into a blog or other resource that makes you want to try and improve aspects of your coding. Plus, I really like to be able to have some time away from the computer screen just absorbing new stuff, so books win there for me...

So don't be so hard on technical books!

Nij

Nij on April 29, 2008 1:58 PM

I'd like to add a book that every programmer should read, How Not to Program in C++. They say you learn the most from mistakes. I'd rather learn from someone else's. I wish they would release similar book for other languages.

Jim Cook on April 29, 2008 1:59 PM

I can't agree with you more. The best way to coding is to actually try it and get your hands dirty.

Julia.

PRNewsExpress.com

Julia on April 30, 2008 3:03 AM

I have a lot of programming books but I will admit that I buy very few anymore - mostly for the reasons already mentioned in the blog post. I didn't see one key reason though: any given language/framework/technology book is quite likely to be out of date within six months to a year, yet online info often stays much more current. I still occasionally go back to even out of date books for reference, but once I am up to speed I rarely pick it up again.

I do sometimes pickup language/framework books when I want/need to get up to speed on something, but I am fairly picky about what I choose and I often buy used copies instead of new copies. I am much more likely to buy a good book on design or best practices than I am to buy a book on specific technologies.

One of my favorites hasn't been mentioned:

Object Oriented Design Heuristics by Riel - very academic sounding title, very down to earth content applicable to most OO languages.

Another that I think I am going to buy is "Design Patterns - Simply". I like their online content and their approach:

http://sourcemaking.com/design_patterns

I do have Code Complete, but most of it seems to be practices I have already learned - I wish I had read it first before having to learn them the hard way. It is the 1993 version, but I don't see the passage mentioned (it might be there somewhere - I am too lazy to do more than a cursory search, another benefit of online material).

Finally, I am sure someone has already mentioned it, but just because we don't buy many books anymore doesn't mean we don't read - there is plenty to read online. Also, actually getting your feet wet with a technology is superior to just reading about it - and necessary.

Lauren Bish on April 30, 2008 3:16 AM

This has probably already been said but I don't have time to read all the comments first. To "learn programming" you have to have some continuity in what you're learning, you don't get that with 500 word How To's or posts, or at best 1000-2000 word tutorials on-line. The internet is by nature a huge source of fragmented information that requires a lot of time searching in order to knit together in your brain a cohesive, unified (and useful) bundle of information. I find I get a lot more of the basics, background, fundamentals in my books. I use the net for the surgical precision I need to fix my problem du jour, one-off exceptional-case solutions, problem resolution, da da da, it was made for that. But to find a single place to sit down and learn in one (maybe two) book what would take you 100 web site hits is well worth the $39, $49 I pay for a book. Besides, I'm relying more on the net for answers these days I find I'm losing my sharpness. It's like being given the answer key to those math problems you slaved over in middle/high school. I see more and more the wisdom of witholding that, you have to think. With the answers, err Web, I don't have to think, I find someone else who thought for me and copy their code - it's great! and bad. Not sure if books fix that problem, but I know with the web at my fingers, less thinking and more copying is happening, not just me, ask around.

Kevin on April 30, 2008 3:27 AM

To learn C, even as a first programming language "C for Dummies" is brilliant. He even offered free extra chapters online because they wouldn't fit in the two volumes (and claimed he wanted it bound sold as one book but couldn't publish that). It's what I learned from, and I've had offers from the big players with infamous hiring practices fresh out of school.

It does have some concepts that are widely applicable, too, but the focus is on learning how to make C go. Not how to make C go efficiently, not how to make sound architectural decisions (beyond a certain point). It's a bit dated, with sample code that only runs in pure DOS with compilers using long-deprecated functions and formats that aren't valid C99. But it does what it advertises and it does it well: read it and you will know C thoroughly (and have a very minor grasp on what C++ adds/changes) and will be able to understand strange edge-cases and and the strangest, most convoluted code; fake classes like a champ; understand common data structures and fundamental algorithms like quicksort. I have never found pointers in the least bit confusing; maybe I'm far more brilliant than these Internet people, or maybe this guy just explains it well. Or both. I think both :).

I would never claim that every, or most programmers should read this book. It's not anything close to Code Complete in importance. But I would definitely recommend it for somebody trying to learn C, despite the datedness. And it's far more entertaining than any of those other books.

Ens on April 30, 2008 3:38 AM

Hi Dude,

hows the Job at Amazon going? ;)

Steve on April 30, 2008 4:13 AM

Hi Jeff,
I read your blog for some time (almost a year) and I love it. But I just had to say; I disliked your comment about PHP. I know it was a joke, but still..

I started with PHP (as a regular script-kiddy ;), went back and forth between a whole lot of other languages (including REAL languages, such as Java), but am now back to PHP again. Why? Because the power of PHP is endless. And they keep developing the language, which is a good thing.

I just wanted this off my chest, because everyone who seems to call himself a 'good' or 'respectable' programmer seems to dislike PHP. But I challenge every one of those programmers to get the best out of the language. Because what most people do with PHP might be lame, but what you actually CAN do with PHP is certainly not.

P.S: I blame the general PHP books for giving PHP its bad name. There are so many PHP books where the scripting (easy hack-fix mentallity) is explained, but almost none seem to care about the great OO-sides of PHP.

Things will be better for us PHP-programmers one day :(

Jan Willem de Birk on April 30, 2008 4:19 AM

The quality of technical books varies, from author to author, from publisher to publisher. Around the time of the original Internet bubble, like the tech market, the book market was flooded with crap.

I think the typical quality has improved, but there's still a lot of useless stuff out there. You don't need books on syntax -- web references, rich IDEs, robust compiler messages and Intellisense-like features take care of syntax.

There are, however, certain software books worth reading. GoF, Fowler, most of the Pragmatic Bookshelf, McConnell, etc. There are also more technical books on specific products worth reading, like Richter's stuff on .NET that really gets deep under the hood.

On that same note, there are LESS technical books that every good developer, or anyone with any sort of ambition, ought to be reading, like The Innovator's Dilemma and Crossing the Chasm.

Andrew Badera on April 30, 2008 4:46 AM

Jeff,

This blog made a great read. It would be great if you could take a look at another problem which programmers need to look at. This would be the approach on taking up a new technology in a time constrained project. An analogy would be the following:

If you are asked to learn to drive a car within a specified time, does it make sense to spend some time and effort to learn rudimentary ideas about internal combustion engines, gearboxes and brakes? It is entirely possible to drive a car without knowing about anything under the hood. But does having the basic knowledge help in anyway?

I have blogged about the approaches at http://wesleyneo.wordpress.com/2008/05/01/learning-methodologies/ It would be great if you could provide some insights into this.

Thanks,
W.

J Wesley on April 30, 2008 4:47 AM

No new blog today? I'm guessing you're not reading a book but are instead playing GTA4 non-stop...

Mitur Binesderty on April 30, 2008 5:00 AM

I read alot of programming books and can't remember any language that i've learn't solely with writing code. My style : read about the language , write some code and optimize code.Tech blogs are gradually replacing programming books.Is that a good thing ?

gogole on April 30, 2008 5:27 AM

I found the Head First Design Patterns book to be a very easy and interesting read.

The Art of SQL was also a very useful book.

Gio on April 30, 2008 5:34 AM

My view is there are four types of programming books ...

1 : Overview how to - Most of your top 5 : no specific language (maybe for examples) but lots of explanation of why : Buy to Read

2: Getting started - Dummies guides, xxx in 48hrs etc - Mostly good books, but read once and throw away so better to read online? : Don't bother? with a very few exceptions (The C Programming manual)

3 : Reference books - (overlap with 1) in depth algorithms and guides and lookup tables : Buy to keep

4 : How to Guides : Cut and paste step by step guides - Usually badly done, out of date, and mindless with no explanation and so worse than useless (except in a very few cases) : Avoid!

Jaster on April 30, 2008 5:36 AM

Using online tools is much quicker.

Acronyms on April 30, 2008 6:04 AM

When I started programming, I read MANY books. Over time, as my skills improved, I found I read fewer books and used the Internet more. Looking back, I think that once I had the base skills I needed, learning new languages was just a matter of adapting to different commands/syntax.

TheMirthfulSwami on April 30, 2008 6:17 AM

I found a lot of my big thick "reference" books at goodwill for about $2 each.

rvanderkooy on April 30, 2008 6:25 AM

Mostly I refer to official manuals, but I also read books.

Vikrant on April 30, 2008 6:30 AM

"And yes, it will always be better to have a paper book of 900 pages than a big pdf file to read in a screen."

That's entirely a matter of habbits and opinion. If you just want to go read your book on the beach sipping your drink and look like in a movie.. well, you have no other choice.

If you want to search trough books concerning your probmlem at hand, WHY would you have to get up from the computer and start flipping pages if instead you could enter a search and have the references list of WHOLE LIBRARY!!!

I would say there are (still) SOME uses for books printed on paper but I would be brave enough to say, that most of them are "historical" or traditional nature. Books on paper will be something you will see only in museums in 50..100 or so years, when everything will be digitized and recallable on devices with more convinient user interfaces.

Even today books are printed "on demand".. which already tells me that it's a thing of a convinence, not necessity.

Programmers should be first to drop this aristrocratic abstraction of information as "books" and start seeing well packaged chunks of "the flow", "learning sessions", "verbal experience" or whatever is suitable according to content. I understand this is a paradigm shift that will not be well accepted until generation (or two) changes.

This does not stop programmers as technologycally un-challenged people to adopt such attitude YESTERDAY.

Or as your article already kind of confirmed, they mostly have done this in one way or another.

So this is "A Good Thing"(tm). Programming books are prime candidate for trying out digital distribution models, go with it! And take your publisher on the ride with you.Then complain that sales have dropped.

Right now your article mostly says:"Look, I'm cool the old way! And you should be too, because... emm.. ojeah! reading stuff on the computer display is shit!!"

My proposal: buy a better monitor. It probably costs only 2..3x more you paid for your current crap.

Tom on April 30, 2008 6:34 AM

Personally I find programming books to be a great resource for building my programming skills/knowledge. I especially favor O'reilly books.

steve on April 30, 2008 7:10 AM

frankly, i don't think you can beat a good book when starting out in a particular technology. you can ramp up much quicker cranking out a book than piecing information together on the internet. for the quick answer, the internet is the best.

you can also gauge someone's knowledge in other tech fields by the books they have on their shelf. for example, i probably wouldn't hire you if you're an oracle dba and never read a tom kyte book.

JRock on April 30, 2008 7:26 AM

Release It!: Design and Deploy Production-Ready Software (Pragmatic Programmers) (Pragmatic Programmers) [ILLUSTRATED] (Paperback)
by Michael Nygard

It changed the way I think when I am programming. It helps me keep the big picture in view.

Mark on April 30, 2008 7:51 AM

People don't read books because they don't care about why things work the way they do. Like any other profession or endeavor taken seriously, one needs to know not only the what, but the why.

john on April 30, 2008 7:52 AM

I hear a lot of comments about the price of coding books. I am not sure what city you live in, but I live in Milwaukee, WI and have checked out your top 5 books (and many others) from our public library for free. True I don't have them on hand as a reference, but that is what the internet is for. I am looking more for high level concepts. They also give me some direction in my internet searches.

Kurt on April 30, 2008 7:56 AM

My proposal: buy a better monitor.

Uh-huh... where can I get a 1000dpi high contrast display that requires no power to use, that I can scribble on and can be stuffed in my bag, thrown around and then read in the bath?

I'd love to hear your example of a 'better monitor'.
"Man books are expensive! You can read this stuff just as easily for free on a $3000 monitor."

I like O'Reilly Safari and Google Books - very useful for looking stuff up quickly, but I wouldn't want to read through all 960 pages of Code Complete on a screen - no matter how good the monitor was.

Can you honestly say you would?

Graham Stewart on April 30, 2008 7:59 AM

I've been wrestling with this train of thought for the past couple months. Not only are many developers not reading, some are refusing to embrace technology. I've met developers who don't own computers, refuse to even use IM etc, and who don't read period. When talking with these developers you discover that most of their practices rely on voodoo, superstition, and 3rd party information. It's terrifying!

I've been toying with the Knuth books, they look so fun, but in reality I don't know how practical they would be. :)

Adam Kahtava on April 30, 2008 8:04 AM

For anyone using visual basic for windows .net programming, by far my favorite book is:
Visual Basic 2005: The Language

Keith Williams on April 30, 2008 8:29 AM

Jeff, I notice on your snapshot of your bookshelf that you have all four of Tufte's self published books. I'm willing to be that a large percentage of your audience (read 'programmers') don't know what Tufte is all about. I'd love to see a note on why Tufte is an absolute *must* read for all programmers (especially if contemplating any sort of computer/human interface).

Thanks for the blog. I look forward to reading it everytime a new article (?) appears.

thomas on April 30, 2008 8:40 AM

...and one more thing for Daren...
I have read Norman's TDoET (The Design of Everyday Things, originally published under the name The Psychology of Everyday Things until Mr. Norman realized the bookstores were improperly shelving it with the Psych books). A great book and another *must* read, if you ask me.

thomas on April 30, 2008 8:48 AM

Thank you very much for this post.
I set out looking for some great literature on the WHY as opposed to the "Do this and that and Boom!" This post came at just the perfect time.

Lake

Lake Denman on April 30, 2008 8:49 AM

I have been programming for over 25 years now. I remember back in the early days that the only way you could learn anything was from books. We didn't have the internet to go to and lookup how to perform certain functions, etc. Luckily that habit has stuck with me over the years and I now have a rather decent sized library (including a couple of old machine language books for the Commodore 64 and 1 book for the Timex Sinclair). Maybe one day I'll open a museum and make my years of being a pack-rat pay off.

Intoxination on April 30, 2008 9:31 AM

I have yet to meet a good programming book. I own a dozen or so, and I have found some good references now and then, but aside from the introductory books I've not found one that can teach anything.

Nowadays there is so much online as far as reference material for various languages that it seems almost silly to buy a paper version which will be outdated in a few months anyway.

I read a great deal, but I have never seen a programming book I find useful outside of reminding myself of syntax or features I've forgotten the proper name of.

Alex on April 30, 2008 9:37 AM

When I do read books its for: beefing up for certifications, tired of reading off a screen, very brand new programming concept languages (like linq and WCF), or when I don't have Internet access.

I also think you forgot to mention one good reason why most programmers don't buy books. The stale fish concept. Most tech books can't update themselves and who wants to date themself by having books on languages that are extinct.

Will on April 30, 2008 9:38 AM

I'm reminded of a good analogy:

Reading on a monitor is like reading the small text on a light bulb while its on.

It hurts my eyes and gives me a nasty headache to read 100's of pages on a computer screen. Books are no problem though, and in fact it's been proven that people are typically able to read books faster than text on a screen while maintaining the same level of comprehension.

This is why books will never go away - at least not until we can create some sort of ultra-crisp elecronic print that doesn't require a backlight.

KG on April 30, 2008 9:50 AM

???

wm on April 30, 2008 9:55 AM

I am really not sure how it is possible to gain absolute knowledge without reading books..

Saj on April 30, 2008 9:57 AM

@Jan Willem de Birk

PHP gets no respect because it's simple and nobody gets paid big bucks to setup a web site on a LAMP server. No, see, corporate web sites require an application server. And a web server. And an Oracle server. We need tiers! Each tier needs its own server! Ok, so PHP can do tiers, but it all runs well on a single server and you only need to separate when you get big. I thought you wanted a real enterprise web application? Enterprise applications all have many servers.

Scalability. Don't forget about that. Ok, so you only sell a dozen widgets a day on your site now, but what if you're the next Amazon.com? You can scale your tiers and sell ten million widgets a day! First we'll scale the data tier because the advanced connection pooling doesn't actually help. Two more in a cluster ought to do it. Then we'll scale the application tier because the application server provides advanced session and failover management. That management adds some overhead, so we'll get two more servers instead of just one more. Alright now this cool template abstraction we used for the web front-end tier is pretty slow so we'll add another server there, too.

Man, it's a good thing we didn't choose PHP for this because PHP doesn't have an application server to manage all this scaling. Some people talk of the "share nothing" approach to scaling, but I've never done that and I think it's voodoo.

Dave on April 30, 2008 10:13 AM

your pretty much right, I have been coding for 10 years and I learned basically from trial and error(oringally went through all the intellsense options till I figured it out :P ) and the internets.

mistone on April 30, 2008 10:16 AM

Another thing I'd like to bring up:

I wish I didn't have to work, so that I could spend serious time reading tech books.

On week days, after a long hard day, the last thing I want to do is more tech stuff at home. I do some reading and programming side projects on weekends though - but if that's all I have it takes a year to do anything that I otherwise could easily have finished during a summer break (if I was still in college).

KG on April 30, 2008 10:25 AM

"The Mythical Man Month" should be on the top list, why you haven't included it?

Gabriel C on April 30, 2008 11:30 AM

Learning principles from a book is good. But the best way to learn how to be a good programmer is to maintain and make directed changes (user specified requests) to your own code. After a few years maintaining your own code you learn how to make it easier to change. After 30+ years of programming I am still learning how to make code easier for the programmer coming behind me to maintain it.

@mistone.. you got it understood.

@jeff... you ever live in cary,nc?

james on April 30, 2008 11:42 AM

@Dave
I work in a company where they've build an entire Enterprise server out of PHP. I help develop on it. The company sells their software (not only the server in PHP, but also some C++ stuff) to everyone who needs a media solution (publishers, newspapers, etc). And believe me; it works. I bet that 8 out of 10 papers/books/magazines you read (either online or printed) are made with that software..

So in my opinion; everything is possible with PHP. And it sells, once proven ;)

JW on April 30, 2008 11:47 AM

Hey Jeff, how about some comment modding or maybe even paging?

It's getting a little crazy here, 90+ pages of comments for a single blog.

I do agree with this one, I think the big difference between picking up a book and just trolling the internet is that a good book will provide information you can use but may not have looked for.

For example, there is a guy here who became our new DBA. At first he made some improvements just by regularly reading a few blogs and picking up some tidbits, but it wasn't until he read a few good Oracle books cover to cover that he really took it to the next level.

Googling for code samples is typically reactionary. You're looking for a solution to your problem, and you'll only find results that fit into your search criteria. There may be some great solutions that you haven't even discovered because they don't fit what you're looking for in that narrow list.

Dave on April 30, 2008 11:48 AM

A startling number of people commenting here seem to have accepted the fantasy that knowing how to look things up is as good as knowing those thing.

This is a dangerous fantasy because it severely limits how you think about problems. If you represent all your knowledge as a tree, the stuff you google for can only form the leafs.
As an example, if I need to change how my drives on my Linux machine are mounted I'll look up the syntax I need in "man fstab". Easy. Because I already know the exact piece of knowledge I'm looking for, and there's no appreciable sub-knowledge. (The second item on a line is the mount point. I can't learn that in any more depth.)
If I didn't ALREADY know the name of the file system table, it would take a few minutes of awkward searching to find it, but I'd still be close to the knowledge I need.
If I didn't ALREADY know that there WAS a file system table I would have to start my research by first researching the mount command. Not only are we increasing my research time for a simple task, but Already we're pulling back to the point where we're running the risk that it wouldn't even occur to me that the data I needed to change was stored in a human-editable file somewhere.
If I didn't ALREADY know that I had more one device in my filesystem that could be mounted and unmounted, etc, then my problem (which can be solved with a one-line change in the fstab file) could seem insurmountable. I would not even occur to me that the correct solution might exist so I couldn't search for it. I would probably wind up thinking up some convoluted solution involving symlinks or something. (Assuming I was aware of their existence.)

This sort of coding-by-google approach has filled the archives of thedailyWTF.com. Are the people who write the code featured in TheDailyWTF some sort of knuckle-dragging low-IQ cavemen? I suppose some might be, but most of them just lack an understanding of their field, and depend far too heavily on just-in-time googling to figure out whatever crazy thing is in their heads because they DON'T KNOW THE CORRECT THING TO LOOK UP.

Andy on April 30, 2008 12:45 PM

Thanks for the article. It's good. I have blogged about it, adding my own comments, here.

http://ploneglenn.blogspot.com/2008/04/why-johnny-coder-doesnt-read.html

Glenn on April 30, 2008 1:06 PM

Maybe you can make a 'Best Buy Guide' section or a 'Must Read' section where other programmers can vote for their favorite books?

Willem on April 30, 2008 1:14 PM

The Tufte books are the best. I noticed they are first on your shelf.

Two of my favorite books that you're missing are Stroustrup (C++) and Stephens (TCP/IP Illustrated). If you get Stroustrup (3rd edition or later) I think you'll find it refreshing, maybe C++ won't be as painful as you thought KR was (from your podcast). It's more than a language primer, it's a guide about efficiency and style. I still learn something every time I pick it up.

I have Safari Online; it's better than books because you can do a full text search. And cut and paste code (good for tutorials). And you can read part of a book; if it turns out to be bad, you only wasted your time, not your money.

Joe on April 30, 2008 1:25 PM

I've read Code Complete and agree that it is an excellent book with information that you will not find on the Internet--at least not in one easily accessible location. I would like to read the other books from your recommended list too.

Another Joe on April 30, 2008 1:37 PM

I can't agree with you more. The best way to coding is to actually try it and get your hands dirty.

Julia.

PRNewsExpress.com

Julia on April 30, 2008 1:52 PM

Programmers, I'm actually reading books when it comes to learning how to program. Its because I'm a newbie, and just started learning OOP languages. And honestly, I don't understand how to program yet. That's why I'm still giving my trust to the books.

Is this the right way of learning programming? Because I don't yet understand the basics of programming that's why I'm reading books to at least give me the basics on programming.

I'm reading Javascript: The definitive guide. I plan to master Javascript first before I go to PHP. Because Javascript is a loosely typed language and it draw inspiration from many OOP languages, I thought that studying this first will give me a sense of OOP.

After I read Javascript:TDG, I'll read another book to further understand how Javascript works and how to code properly.

If you have any suggestions that will help me studying and mastering programming, please tell me.. Reminder, I'm a newbie so don't give me those complicating task yet.

Raymond Ho on May 1, 2008 2:05 AM

Raymond: I don't think Javascript is a good choice of language for an introduction to OO. Neither is PHP. Both of them can emulate some OO features, but they are not naturally OO languages.

Also being loosely typed is not a feature of an OO language. In fact strong type-safety is one of the benefits of a good OO language since when you pass objects around you always know what class, super-class or interface they implement.

I think you would be better off trying Java or C# as a useful intro to OO.

Graham Stewart on May 1, 2008 3:49 AM

I think some of those books are mine.

Scott Stanfield on May 1, 2008 5:45 AM

The subject of this article was news to me, since right now I'm knee-deep in Head First Design Patterns and just finished C++ Coding Standards (which isn't about coding standards at all). I've learned most of my programming skills from books (and by actual coding). The Internet is great, but, unfortunately, for programming information, it actually kind of sucks. For every Good Site with useful information, there are about 200 Rotten Ones. And those rotten ones are, for some reason, easier to find.

Frecklefoot on May 1, 2008 6:10 AM

My favorite book by far is "The Tao of Objects" by Gary Entsminger(sp). Sadly, it's out of print, but using examples in Turbo Pascal and C++, it presents the core concepts of OOP in a rather unique way.

Buck on May 1, 2008 7:12 AM

What's the book in the picture in the lower right with the white spine?

Stephan on May 1, 2008 7:26 AM

"The internet has certainly accelerated the demise of programming books, but there is some evidence that, even pre-internet" -- the passage you quoted cites its source from 1999 -- c'mon dude 1999 is the pre-intenet era? 1999 wasn't even pre-WWW, let alone pre-internet! Also, why are you surprised that most programmers are aliterate when most college educated people are aliterate.

chris on May 1, 2008 7:41 AM

You can get by writing trivial programs from examples on the web. But when you start developing enterprise-level, robust software, you'll need to know your stuff better than what a snippet here and there can provide. Not reading is not just a problem in the programming field. It's a systemic problem across our culture. People don't read anymore. And we're all getting dumb and dummer. If you do have the sense to turn off the mental chewing gum (TV) and pick up a book, you'll seem like a genius to the ditto heads around you. There is a common notion that people from hundreds of years ago weren't as "enlightened" as we are today. I have news for folks who hold that notion: we are a dumb society! Because we let others tell us what the news is, and how to program.

Art on May 1, 2008 8:28 AM

as a programmer in the newer generation, i learned that the easiest way to learn to program is to take apart a program without any help. this lets me know what is happening, why that code is there, what it relates to, or if it is just a really huge program that could have a lot taken out of it and work better than before, that its made by microsoft.

Risou Yokubou on May 1, 2008 8:42 AM

After reading this, I think I may dispose of some of my own "programming book pornography". I've only been out of college for a year, but I have a feeling I won't be opening these books again anytime soon. More of a .NET guy now as opposed to C++ and Java then.

Jeremy on May 1, 2008 10:21 AM

I have all those books. I guess I should read them.

Does just having those books on my shelf make me a better programmer?

engtech on May 1, 2008 10:49 AM

Is there any correlation between good programmers and books they owned/read?

I had a pleasuring of hiring a person based on his work experience but soon realized that his skills are sub-par.

So I recommended him a reading list - closely matches with your list except my list included 'Design Pattern' and 'Refactoring'. The response I got is pretty amazing - he did not know any of these books. None.

That signaled me two things

1. He did not have desire to better himself.
2. He treats his employment as a job.

I put 'Pragmatic Programmer' as the first book to read but I haven't yet got any feedback from him so I'm going to assume that he did not purchase or read it. He treats his work as job - come in the morning and push some keys and collect paycheck. I don't know how many programmers in the wild has similiar attitude.

I personally believe that we need to separate the computer books to two broadly defined categories - a) API-baed b) know-how

API-based books are the one you will throw out in a couple of years. 'Know-how' is the one you will keep forever.

One critical point to make is that reward factor of 'know-how' books. There is no instance gratification from these 'know-how' books because it is timeless advices. So it won't answer your questions to how to write socket programming. But it will teach you how to design network based program.

BTW - loved the fact that you included 'facts and fallacies'. It is one of my favorite books but not well publicized. I think everyone should read it.


leemic on May 1, 2008 1:06 PM

Great list. Also would recommend:

A Pattern Language (Christopher Alexander), just for the sheer joy of reading it. No need to read it all at once.

Working Effectively With Legacy Code (Michael Feathers). Amazing, life-saving book for those of us who have this challenge.

Mark on May 1, 2008 1:13 PM

Wow, all these comments and no one's mentioned "Structure and Interpretation of Computer Programs" (full text online: http://mitpress.mit.edu/sicp/full-text/book/book.html).

No matter what language or technology you use to develop programs, SICP will make you a better programmer, and critical thinker.

rk on May 1, 2008 1:35 PM

Programmers seem to have stopped reading books.
The market for books on programming topics is miniscule compared
to the number of working programmers.

I would not say that programmers have stopped reading "books". They are probably reading less "programming books".

Programming is an activity where it's increasingly more useful to read "non-programming books", dealing with subjects that would have been considered peripheral a few years ago.

(see http://blog.logeek.fr/2008/2/23/all-time-classics-recommended-books-for-software-developers for a list)

Think about the importance of communication, organization, process optimization, mental models (ie: refactoring your wetware) in any software project today!

Thibaut Barrre on May 2, 2008 8:48 AM

It's tough to drop down money on some of these books especially when just a few pages into the book you can see that the author never read a book like Code Complete, etc... especially textbooks from college courses.

Pretty annoying having to spend $90 on a textbook for a class when you can see that the writer was just plain awful at their craft.

HB on May 2, 2008 8:58 AM

As long as my bathroom doesn't have a flat panel screen on the wall, I will read books. ;)

The first computer book I had was 'Beneath Apple DOS'!

tim on May 2, 2008 1:47 PM

«Back | More comments»

The comments to this entry are closed.