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:
- 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.
- 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?
- 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!
- 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.
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?
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
Without programming books I would be clueless... but I'm part of your generation Jeff - the "old guys" who learned to code in the dark ages before 24 hour internet access was a given. As such, I still use books (as well as the net). I simply can't get comfortable trying to snuggle up at night with my laptop - books work much better in that respect.
Ugh. Did you see the (unofficial) documentation for writing software for (jailbroken) iPhones?? There is one book, I think, but what is available the most are VIDEO TUTORIALS ON YOUTUBE. Even more for tutorials explaining users how to jailbreak. Looks like people can't even be bothered to READ online. They need a step by step in a freaking video.
I think there will always be a small group of developers willing to pay for well-written material, online or on paper, but hopefully the net will deal the death blow to the hated "X in Y days" category.
With fast searching and Intellisense I don't need to thumb through poorly written books to find parameters for API calls or quirks of this or that library.
When I saw your bookshelf (Basic Computer Games - oh, the hours typing those into my Apple II and the pointless hours playing Horserace!) I turned around and looked at mine and, no, despite all the information at my fingertips I still like my Meyers, Stroustroups and so on. I did notice I haven't bought any in a while even though I liked the Pragmatic stuff.
What are the numbers on your "Design Patterns?" - didn't return it to the library?
I must confess, that I avoided books about coding for years. After I made my passion to my job, I began to read books. Mostly about GUI design, defensive design, usability and performance. I fully agree to you: Programmers must read books!
I've always loved computer books. When I was a teenager (looooong ago) my brother remarked that I'd have to write books myself, because I'd already read most of the computer books out there. I haven't come close to reading everything out there, but I do write a lot of computing books (11 at last count.)
I was an elitist too, for a while. I never owned any Dummies Books, and I nearly turned down the offer to write one. Now I've written two. A series isn't bad or good. Any author has the opportunity to treat any work as a task or as a masterpiece.
The technical publishing industry is full of well-meaning English majors who find themselves editing programming books while working part-time on their novel. Many of them become quite proficient at technical work, and many of them actually care about quality. I can't really blame the people. When they find an author with technical skills who also cares about the craft of writing, they do what they can to support her or him. It's very hard to find anybody who has the technical skills and communication ability. (Of the two, I find writing ability more rare.)
Truth is, there's not a lot of incentive to write great technical books. You'll earn a lot more money by being reliable than correct. If you just keep pumping out copy, you'll sell them and make back your royalty advances. It's the rare tech book that makes any money past the advance (only one of mine so far, but I'm very optimistic about the latest one.)
Writing an excellent book, and writing it well doesn't pay the bills.
It takes too long, and if the marketing department doesn't understand it, you'll get no support. It doesn't matter how good the book is if it doesn't get to Amazon and store shelves. I earn as much (or more) putting a buy-through link on my site to amazon as I do writing the book in the first place. Why would anybody sane write the book if marketing it on a web page is just as valuable?
Still, a part of me believes that quality matters, that the marketplace will eventually recognize excellence, and that even the industry really wants to promote quality (as long as it sells.) I'm hopeful that positive Amazon ratings will eventually turn into meaningful sales, and that even people who buy Dummies books deserve great writing - a combination of useful skills and insightful fundamentals. I'm going to keep writing book I'm proud to have on my shelf. (None of mine are on your shelf, but maybe they're on the back shelf - grin.)
Ahl ROCKS. I've written two game dev books trying to be true to his spirit but actually teaching something along the way.
I'd love to rectify the horrible state of programming literature out there. I'm a graphic designer and would love to apply informational graphics that explain computer programming concepts in a visual way. But alas - I am a novice programmer not capable of doing it on my own. If anyone out there wants to team up with a designer who gets geeked out as much as you about technology, let me know. You can find my contact info at www.conartistry.net. (don't want to post my email here for privacy reasons)
now for my rant
Finally, someone who sees the horrible state of programming literature out there! I have been trying to learn computer programming for years and have gotten nowhere because of the shitty "books" out there. 99% of the programming books don't make sense to a newbie as they make congnative leaps and skip over minute, but important information. I am a graphic designer, and also love technology and want to know how gizmos work. Despite my interest, dedication, I have not become proficient in the ways of the coding.
As a designer, I think visually and am trained to communicate clearly. These two characteristics are not common among a large percentage of engineers. Not to stereotype here, out of all the engineers I've met personally, although they are great people, usually dont' have a good aesthetic sense, and they tend to communicate in a way that I percieve as unclear. Perhaps they make sense to other engineers. I think There are relatively few people who possess design and programming skill sets (compared to those who only have one skill set) at a high level of proficiency. Therefore engineers probably think and communicate in different ways from us non-engineers. A good computer programming book also must be written by someone who is a good teacher. One must possess the knowledge, be able to write well, AND have the ability to teach. There are very few people who can do all this at once. Thats why the books all suck.
The rare moments where I did find a good book, it was written by two people with similar interests, but different educational or vocational backgrounds. And sometimes I'd find a good book written by a designer/programmer. I even read one or 2 good computer books by a programmer. "So he's read all these books, why can't he program?" you might be asking yourself (if you've read this far). The answer is this: programming is just hard. It may come easy to some, but not me, I just dont' think in the way that I need to write code. I may think that way one day, but I'm not there yet. I have yet to meet or read work by someone like me who is a good programmer, a good writer, and a good teacher. I can't just read and make sense of this stuff on my own, I need the aid of a teacher or friend to explain things in a way that I understand.
You're right, this is the fact that hate most from our field. People who depends on their knowledge and forget feeding it from time to time.
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. Guys, pay for what is worth, and books are.
I don't see your copy of KR, "The C Programming Language". Very slim book and it teaches you C quikly without any tomfoolery.
I'd like to read more programming books but they're actually pretty expensive, IT doesn't attract the brilliant salaries it used to.
I totally agree with you, with no books there's no proper programming
I write programs for Java ME and well known in narrow circles so many people ask me what to download to start programming. My usual answer is that first you buy books for language basics and they better be real paper books, not online. People who listened to me agree later that I was right and about others I usually don't hear anymore.
Now, I'm no expert, more of a hobbyist trying to turn a passion into a job (somehow..), but:
I love programming books.
I like the 'how' style of books (Programming Ruby, and The Ruby Way in particular), are very nice. Also books that introduce a framework are interesting (I have Beginning Ruby on Rails E-commerce) are nice. They serve as quick introduction (good language introductions include a reference of the language, too) into a topic, and allow me to ask the right questions, and help me in getting to know the problem domain or language domain.
And I also like the 'why' books. Or books covering a certain area in depth, too. They can be especially useful if they cover libraries like the .NET library (it is huge, I have little to no clue where to look to get to know the features), similar the Java library.
And lets face it: API/library documentation on the web can be nasty, too.
However, there is a real issue in finding good books. And for that, I rely heavily on recommendations by others, more expert than me.
I think I have almost all books Jeff recommends in my Amazon wish list.
I've also noticed, that the quality of a book depends highly on the publisher, too.
And the 'For Dummies...' books are a real mixed bag, I've noticed. They can be real hit and miss (The SQL book is next to useless, while the Crystal Reports book was a tremendous help to me).
I can see the point in reading timeless books, but rarely there are some amazing ones you can learn a lot of.
I bought Omar Al Zabirs "Building a Web 2.0 Portal with ASP.NET 3.5", this man is one tricky genious! This was well worth my money.
Books like this are especially useful, if your a part time student that can't afford expensive internet connection while on the train.
That's a quite excellent bookcase there. I see many old favorites and many items from my "to buy" list in there.
The truly shameful thing about our industry is that there are many practitioners of software development who know how to do it well but there is something of a disconnect with the way people tend to learn software development. Many who teach themselves grasp at disjointed code samples provided by googling for specific answers to specific problems and they tend to struggle mightily with attaining even the smallest bit of maturity as an engineer. Many who learn through formal education at colleges and universities receive either shoddy educations from a system that has discovered it can make more money by lowering standards than from producing competent professionals or they receive inapt educations which leave graduates poorly trained for the real world (i.e. software engineer hopefuls who learn computer science instead).
The result is that for every honestly good software engineer there are dozens (or perhaps even hundreds) of coders practicing shoddy cargo cult programming techniques or churning out software through copy-paste combined with random code mutation. The result is also that for every individual who tries to extol the virtues of good, well tested software development methodologies there are dozens (no, definitely hundreds) of snake-oil salesmen peddling quick-fixes and magic bullets.
We are indeed in some of the darkest days of software engineering to date, yet there is still much hope. There is an impressive number of people who know the better ways to develop software, and they are starting to find their voice, starting to organize, and starting to influence others at an ever accelerating pace.
Jeff, you read my mind.
The first programming language I applied "professionally" was PHP. I've decided I need to come back to something like C++ to get a better foundation, and for this I am reading Thinking in C++ by Bruce Eckel.
Before downloading this book (I know, hard copy is better etc) I ran Bruce through your search and it seems you're a supporter. Can you vouch for his book too?
Jeff, you wrote: "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." I own a copy of that edition, and definitely, the text is present. It appears at the end of page 760. The chapter it is in is "Personal Character."
Congratulations for your work,
PS: Please, forgive my English, it's not my native language.
Apparently programmers aren't buying technical books anymore then. The internet has made information abundant albeit generously redundant and infinitely variable in quality just like the invention of the printing press in it's day. It's no different to the bound pages of the literary world just bigger and faster. The internet is far more searchable, you can seek your info-fix in a finer grained manner. A book needs to be sourced, opened and digested. A web page can be sought appraised and used or ditched with a fraction of the effort. A book is a banquet where as the internet can be grazed. But you can't take the internet as conveniently to the bath or your bed. Also books don't disappear in a puff of smoke when some navvy chops the line to your local exchange by mistake! Stereo typically hackers have little regard for bathing and bedtime. But thanks to printers you can turn bits of the internet into your own tailor-made book for off-line consumption, it's like on-demand TV. Yeah 'On-Demand' that's what it's all about.
You should get Knuth, though, because its just a pleasure to read something so authoritative and comprehensive.
I would also add to your list of reasons the fact that authors are barely paid if at all for writing books. You probably went through that too. This state of affairs is not specific to computer science and although you can argue that writing is a call, the fact is that receiving a couple of thousand dollars for six months work raises definite barriers to serious writing projects.
I must be the exception to the rule - I read books *constantly*. Not just about programming, either - math, physics, electronics (or in fact anything remotely related to computers)...
I'd like to hope that there are a few more out there like me.
So, what would you recommend for a business analyst?
I have an odd job. In our group, I spend most of the project hopping around from group to group. I code with the devs, I do CSS with the designers, I attend management meetings, I look at content with our content owners. Why all this jumping around? Because I'm the documentation fairy. Having a moderate hands-on knowledge helps me create documentation that means something more than 'get the man off our back.'
So, I don't need high level programming books. I'm never going to design a system on my own. I need books that are more about how things fit together. Anything you can recommend for that?
All these books are available here:
as online versions. A very cost effective way of getting these books IMHO.
$45 a month for as many books as you like or $25 a month for a 10 slot bookshelf.
definitely, the text [about programmers not reading books] is present [in the original 1993 Code Complete]. It appears at the end of page 760.
what would you recommend for a business analyst?
Here's my top 5 for business analysts; two are the same.
1. Krug's "Don't Make Me Think"
2. DeMarco and Lister "Peopleware"
3. McConnell's "Rapid Development" (more project management oriented)
4. Cooper "The Inmates Are Running The Asylum"
5. Nielsen/Loranger "Prioritizing Web Usability"
I don't think you'll be disappointed!
Hmmm, i guess im different to 'most' programmers then...i have read 5 programming books this month (currently part way through The Mythical Man Month), and i really enjoyed the Don't Make Me Think book.
Thanks Jeff for your recommended reading list!
I still prefer books over learning over the internet. The internet is a source for quick fixes, but with the good books (and you're absolutely right, most programming books are an utter waste of paper) I don't just get whati should stick into my code to make it work, but rather the prinicples upon which the language is based, how it works, and a list of commands, variable types, and their properties which allow me to play about and instantly grasp what i am doing.
In fact, thinking more on it, I think you'll find that the best programming books consist of that: a general vocabulary of the language in question, and the general principals on howthe language works.
You can't get by with just a sheet of terms such as print, else, if, or, etc... without understanding the logic behind it, any more than you can get by knowing that a language was developed to give you a variety of means to object oriented tasks, without knowing the difference, for example between the variables "int" and "string".
Good programmers write good code
Great programmers steal great code
I think the main problem with coding books is that to be able to write a good one, you have to a) really, DEEPLY understand your subject (not just be competent in it) and b) be able to communicate that understanding in a clear way, step by step, while keeping in mind what it might be like to be a complete beginner.
This is not easy. Essentially, you have to be a natural or trained teacher. And that's something that not many people are.
I was pleased to see "The Design of Everyday Things" on your bookshelf - one that has been on mine since the early 90's university sojourn and one that pre-dates most of Nielson's usability writing (although ...Everyday Things was not about software in particular). Cheers to the design of everyday things - which now does include software!
You can't call yourself a Windows programmer unless you have read and understood:
- Programming Windows, Fifth Edition (Petzold)
- Programming Applications for Windows, 4th ed (Richter) or the new title, Windows via C/C++
- Ideally, Windows Internals, 4th or 5th ed (Russinovich, Solomon).
Programming Applications was originally called "Advanced Windows" but the 4th edition covers Windows 2000. Windows Internals was called "Inside Windows NT" then "Inside Windows 2000" but again, you probably want the more up-to-date information. Programming Applications tells you what to do, Windows Internals tells you what the OS does when you do that.
If you plan to write server applications, "Programming Server-Side Applications for Windows" (Richter, Clark) is also helpful.
All of this is C/C++ material, but it's the fundamentals of how Windows works. As we know, abstractions leak, and the .NET Framework is no exception. If you want to know what's going on with your .NET program, you still need to know this stuff.
All these books are monsters. There's a reason. Windows is big. Very very big. None of these books provide complete coverage but they provide the fundamentals on which everything else is built.
As well as applauding the great books you talk about here, I think there's more scope for naming and shaming some of the real shockers.
I think a five "worst" books would be an equally interesting list....
Julian Bucknell nails some of them here:
On a related note, has anyone ever read a good book on microsoft programming techNologies (VB6, .NET, MFC, etc)? I don't mean to single out MS developers/writers (I am one by day) but they seem to be the orst offenders in this regard.
It seems like everyone of these books (and the vast majority of msdn documentation) boils down to a click here, type this, click there, select this walkthrough.
If I'm reading documentation I want an explanation of the concepts and key parts involved (with links to reference documentation), not a step by step guide.
The same goes for tutorials. In a tutorial there needs to be some hand holding, but it should also take breaks at appropriate points to explain the concepts it's dealing with.
I think the reason most people don't document code is that they don't know how to make it usefull.
Interesting. I picked up a book "C# for Dummies" and read it cover to cover. I then picked up a C# reference book and starting reading that. I then picked up a heavy weight Asp.Net book and read that. After a lot of trial and error, I started get the hang of things. Of course the code was rubbish and thankfully it was all throw away stuff. It was only when I got away from the basic books and into the more professional books that my coding achieved a high enough standard for production.
Books are vital for for bringing this awareness to the development community. The Google look up won't tell you the best way to do something just the way that can be explained in a few short lines.
To over simplify things - The quick fixes come from Google while the long term good code and good design comes from books.
I really should stop reading your blog, as I turn poor buying all the stuff you recommend.
Hey but at least I can use the Fenix L0D light to read the books. And if the battery runs out I can use recharge the eneloops using my shiny new BC-900 ;)
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?
I think it's an age thing. I'm pre internet by several years and remember reading most of the books you give here. Reading online sucks as well - it's much harder to remember stuff. O'Reilly try really hard with Safari but it's a pain. I remember hearing a podcast (on Conversations Network somewhere) that was saying in general people are finding it harder and harder to pay attention to stuff because of this - always want it now - even when it is poor quality and not a lot of use.
You can also read books in bed without scorching your lap and scribble on them. It's *easier* to try coding examples from a book because you're less likely to cut and paste them and learn nothing. Typing it in makes you think about what you're doing.
That said, I agree about the quality of programming books. I've been doing Ruby now for about a year and understand a lot of the deep stuff - code generation, metaprogramming etc., that can save you loads of time if you use it intelligently. I recently picked up a book on design patterns and the first third of the book was an introduction to Ruby padding it out - WHY? This ground already covered extremely well by at least 5 other authors - I want the advanced stuff (but couldn't find it). And 40 (yup $80 or so) was a pure rip.
Also - you haven't mentioned this - but I learned a TON of stuff at the Euoropean Rails conference and Scotland on Rails. Go to conferences and hang out with other coders, look at what they're doing. Be humble.
What a coincide, I'm taking a few days of sick so yesterday I decide to order some books to keep me busy:
1. Code Complete - as per Jeffs reading list
2. The C programming language - as mention by Joel on the podcast. In short the Joels point is that C is close to machine language and so by understanding C you understand how the computer works at the most basic level.
3. Concrete Mathematics - My reason for choosing this book are similar to choosing the C book. By understanding the problems which our program are to solve we're in a better position to solve them efficiently.
I picked these books because they'll let me understand the why. Also the few how-to style books I've read were really boring!
I've been programming either as a hobby or a career since I started learning on my father's TRS-80 a loooong time ago. In that time, I've read several books from cover to cover. I prefer the electronic books, because they're easier to search. Even then, most of them are useless. The big tomes (Pro C# blah blah, Pro this or that blah blah, etc.) mostly contain stuff I already know. Sure, I reference a lot, mostly because I'm senile. Sitting here now, I can think of only one book that truly stands out in my mind:
"The C Programming Language" (1st ed.)
That's it. Not a good ratio if you ask me.
(Note: books on theory are a little different, about neural networks, embedded programming, animation, etc.)
Programming books are relevant for at best 2 years.
After that, the libraries have changed, the languages have changed, heck, the platform may well have changed.
If I need particularilly arcane knowledge for a project and I can find a book that covers it in quality depth, I will buy it so that I can read it a dozen times in a way that computer reading just does not afford. HOWEVER, many other computer books are just not worth the price.
I love books, and I have a library with fiction down one side and technical references down the other. Sadly, the book on computer graphics from 1985 is probably one of the least relevant reads you will ever have. Happily, the math and physics text books are still mostly relevant, as are the dictionaries and grammer guides (well, ok, grammer guides are really less useful in today's devil may type world..)
That said, computer books are way to darn expensive for their expected useful life time.
Current literature has the low end covered. Lots of fluffy text and the same repeated drivel.
At the upper end it's a desert. A wasteland, and while some books have promise, more often than not they're just a mirage.
There's a definite lack of quality books that talk about the bigger picture. Mostly they're just waffling theory without evidence they know what they're talking about, or at least without being able to communicate that knowledge without appearing to be waffle. How do I build it, and how do I know I've built it correctly? Am I just creating an enterprisey WTF?
Similarly for high end technical books. I want the facts and only the facts, and I want to read from someone who is smart and learn something. I want to know caveats, I want to see properly written code. Funnily enough one of the best books I read in the past few years was an ExamCram book for an MCSE. It was all facts, delved into edge cases, and didn't mince words. A traditional 'professional' book would have been 5 times larger and probably missed out the important stuff.
Too much good knowledge is being lost, and reading over and over how to bind data to a repeater or set a label control isn't cutting the mustard.
+1 for the "The Inmates Are Running The Asylum".
And if someone is doing serious UI work the green book next to it on the top shelf is also recommended (that is Cooper's "About the Face 3" if I am not mistaken).
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.
On the topic of C books, I always found Harbison and Steele's "C: A reference manual" to be better than KR in actual usefulness. KR is a great book as well, but HS is the one that you'll actually turn /use/...
"To over simplify things - The quick fixes come from Google while the long term good code and good design comes from books."
Beautifully put, Brian.
I dabbled with OpenGL using information and tutorials online... and finally understood how it works once I got a book on the subject. Sometimes I need things to be explained to me really slowly, without missing any details, before it truly makes sense. I'm sure a lot of coders are the same - and that, in my opinion, is why "___ for dumbasses" books _really_ suck.
No "Writing Secure Code" up there?
Your list closely resembles my own, therefore you are a genius!
I'd add "Ship It!" from the Pragmatic bookshelf and "The Little Schemer" from MIT Press. "Ship It" has strategies for dealing stagnant workplaces and how to achieve change in them. "The Little Schemer" is less about the Scheme/Lisp languages and more about teaching recursion. Which is an eye and mind opening concept in computing. I'm still working my way through "The Little Schemer".
What programming books have you read in the past 12 months?
As for dead trees, your publisher SitePoint supports selling PDFs but I don't see your book listed on their site. While I like to sit down with a dead tree book for the first read through, easily searchable digital versions for later reference are really useful.
There aren't enough great authoritative technical writers. It's going to be a long time before I replace my tried-and-true Unix and networking references by W. Richard Stevens. I can't remember the last time I read a new-to-me book with actual code examples in it. The majority of the 30 non-fiction books I read last year were about business psychology, software/network security and career management.
As far as I know, most of CS undergrads think course notes are all the knowledge the need in life. The problem comes from the root: basic education.
I like your article and selection of books except
1. The VB book detracts from your cred.
2. UML and design patterns are a classic hallmnarks of second rate corporate drones. Not to mention that the design pattern books are incredibly boring.
3. If you are doing algorithmic work where O(x) matters, Knuth is actually very useful.
"...one book is more than most programmers read each year (DeMarco and Lister 1999)"
"I believe the same text is present in the original 1993 edition of Code Complete"
Time machine? A citation from 1999 in a 1993 edition would indeed be prescient (-:
And yet it must be so...
"I own a copy of that edition, and definitely, the text is present. It appears at the end of page 760."
On average, I will buy one or two programming books per month. The choice is usually based on whatever happened to pique my interest that month. Only a handful get read cover-to-cover each year. The rest I will either give up on because of disappointment in the content or I will skim from time to time if I think it has something interesting or useful to tell me.
I've also learned to screen books based on publisher. All other things being equal, I will usually go for an Addison-Wesley or O'Reilly book. I won't even consider Wrox books anymore.
"I won't belabor my recommended reading list, as I've kept it proudly the same for years."
How sad is that? That says that the book industry is dead - that nothing worth reading is being produced any more, that only "the giants" of the past are worth reading.
I call BS on that. How 'bout 37signals "Getting Real"? GREAT book, even as I didn't agree with all of it. Completely changed my mind about a few "truths" I've held dear for decades. Because the good books challenge you as they teach you.
And as for classics, you missed "Systemantics", now known as "The Systems Bible" in its third edition. While not about programming per se, every programmer and analyst and project manager and program sponsor on the planet should read it. Period.
I laughed when I saw Basic Computer Games on your shelf there: I can't get rid of a href="http://steelwhitetable.org/2004/05/20/games-basically/"my edition/a, either. A classic, in its own way (in addition to the others you listed).
This seems a good place to ask... can anyone suggest a good C# 3.5 (asp) book?
My experience up to this point has mainly been with VB.net 1.1.
I can't imagine that one can do programming without reading. Be it reading code or reading books. The great thing about books is, they simple work. You can get them with you whererver you want, and you can read them while sitting or lie about. They do not need any currency just enough light. My usual way to get into a new area, is looking up and buying one or more books about it. Then I read it, I know I'll hardly understand anything but it's to get into it. Then I start looking for example and implementing things from it. After a time I get back to it an I see that more and more things from the books fall into place.
You just can not get an oversight from the "cut paster" camp. This is just "programming by accident" ;-(
I'd bet programmers really serious about their job, do read books and the do spend a lot of money on them.
The great thing about books is their inherent random-access nature; open a book and you can easily choose page 34 or instead page 759.. close your eyes and pick any page... this is somewhat different with viewing on the PC and/or in .pdf form- it's more about the experience too... Screens, even the best of them, can cause strain on the eyes- but I find this not to be the case with paper and ink.
What I also like about most of your selection of books is their transportation value- they're of the size that you can physically carry them in your briefcase or even roll them up and stick them in your back pocket. It's refreshing to know I own a few of the books you've got, purchased one book from your list just now that is a long time coming and super popular and got another one from your list put away on my wish list.
Tarkovski Programmer - not all design pattern books are boring. Check out the O'Reilly Head First Design Patterns. I'm not ashamed to say I actually loved this book and not just because of the semi-hot girl on the cover!
I tend to find I can pick up new languages a lot faster from playing with examples online, but I always come back to a solid reference text book when I'm up to intermediate level to get a deeper, more comprehensive understanding than bite-sized web articles can deliver.
And I would say that if you haven't read code complete then you're an incomplete coder. End of.
Most of the programming books suck. I mean they just rehash stuff that can be found in the documentation or MSDN. For example pick any book on ASP.NET. It's the same stuff about the controls and how to use them. The web page life cycle.. blah blah.
Why did you spend any time coauthoring a book which you don't want people to buy? Wanted to see your name printed?
I stopped buying books long time ago. Now I just browse them at the bookstore and return them to the shelf (actually I leave them by the comfy couch :) ). Yes I return them because they are not worth buying. Reminds me of music albums. An album might have one or two good songs and the rest is rubbish. Same with books. One or two good chapters.. or a few good pages only!
I need good stimulating books. Books like the SQL puzzles by Joe Celko. Give me a puzzle and show me how different people solved it.
Effective C# was a good book. Tell me how NOT to do things.
The problem with your Business Analyst list:
in my corner of CubeLand (and still a few others), BAs get to specify the "file content". Needless to say, it all ends up being spreadsheets stuffed into database. For such kinds of development, database smarts is needed. But it usually ends up with something like, "well, I know a little bit about SQL. Read Ambler".
Here is a list of some books I've read in past few years that are more modern:
"Hackers and Painters"
Bunch of Ruby books from Pragmatic Programmers.
A quick once-through of your shelves shows that I've got six of the same books as you Jeff, which I feel kind of pleased about.
I don't see how you can "love the craft" (ick) and *not* love reading technical books - I'm a technical book junkie, it's only the price of the damn things that restrains me. And although the internet is an unrivalled resouce, there's nothing like the heft of a real book.
Love the concet. And I truly can't wait until stackoverflow.com gets going. I used to by books all the time. I have, and have read, most of your recommended list.
Now, for cost reasons, I use Safari Bookshelf unless I really want a copy to keep for reference.
I don't like Safari's model of forcing you to buy slots because you have a minimum amount of time a book must occupy a slot. But it is an effective way for them to make money. Until you roll your solution out anyway.
My own belief, based on my own experience, is that the ratio of good usable books vs manual reprints with simplistic examples is pretty bad. And most book stores are devoting decreasing amounts of shelf space to the whole genre. You can find more certification books than anything else. And the number of titles surrounding productivity apps like Office far exceed the number of actual programmig titles now in Borders and Barnes and Noble.
When I am being asked to pony up $60.00 + for a book I stop and think now, and really be very aware of my own perceived value. Am I really going to get my value?
Good luck, I think you are on the right track!
Oops, meant concept above, not sure what concet is?
Great column, thanks.
I think most programmers have stopped reading books on the subject because the web has become the best source for the standard information as well as notes on the "Gotchas" of any facet of any language.
Unfortunately that leads to lazy (and rude?) newbie programmers and programming students who ask in forums "Will someone please tell me how to write my XXXX system?" As if 1) there are a dozen programmers who read that forum with a complete inventory control system sitting on their hard drive, and 2) that the newbie could actually understand and implement such a system if the competent programmer dropped a fully-documented system in their fat laps.
Personally, I'd rather have my books online than in hardcopy because they're much more searchable that way for me. But I ain't paying O'Reilly $25 per month for access to 10 books. That's just stupid.
I wish each printed book would come with a pdf version you could download and lock to your machine. Heck I've had a pre-release book on order from Amazon since January and it's now not due out until June! Let me pre-order it and send me the PDF now so I can start using the info! Please??? :-/
Just another tip-o-the-hat to "Don't Make Me Think." Excellente!
(I especially enjoy that not long after reading it and the praises Krug gives Amazon for their tab navigation...they change it.)
The list of programming books that I actually *re*-read or have read all the way through is pretty short. I have perhaps 60% of your bookshelf there (including Basic Computer Games and the Tufte books).
Three more I'd add are Effective Perl, SQL for Smarties and Unix Power Tools. Every time I open one of those, I get a new insight or inspiration.
I think Code Complete and UPT are probably the only 'fat computer books' that are worth the bulk.
To me, the main thing about books is that you are exposed to things in a way that you aren't with online articles. You get more structure.
If you get a good book on say, ASP.NET and read it cover to cover, you find out about its capabilities. If you don't know the capability is there, are you going to google for something about the capability, or just build something in a hackneyed manner?
For the detailed stuff and for code snippets and the like, I prefer articles, though.
"On a related note, has anyone ever read a good book on microsoft programming techNologies (VB6, .NET, MFC, etc)?"
I really like Jesse Liberty's Programming C#. His book on asp.net is not bad (and it very much deals with asp.net code, not using vs.net).
I've read several programming books this year and not one of them has bothered to include a chapter on security, including "The ASP.NET 2.0 Anthology". I've also noticed that the programmer elite has nothing to say about security; no blog posts or mention of it when complaining about the shoddy work in the profession. Now there is news of a massive SQL Injection attack and nobody is trying to educate developers about how to deal with it. Unfortunately I have inherited a classic ASP web application that is probably extremely vulnerable so I'll have to study stored procedures today.
VB.NET - that's really timeless! No, I meant worthless...
It seems the last winter was not cold enough...
Programming books which teach you code are useless and often contain typos and other errors which make it more harmful than good. Books about programming which teach process, methodologies, strategies, pitfalls and what's going on behind the scene are what we should be handing our kids.
You want to know syntax? Google it. Want to know why your app is slow when all you are doing is combining strings, read a book.
Oh, and stop talking smack on PHP.
I tip the hat to "Don't make me think" as I've probably read it several times since I got it earlier this year.
I've got stacks of books for programming, cleaned out a lot of it several months ago and now am replacing it with the why? books and not the expire-able books that document how to do something in a language/product/tool, etc. The web is a fine resource for finding relevant solutions to the books I no longer buy - although I do still enjoy reading a book as opposed to web pages, just not the same easy to use interface for reading (although much easier to use searching...)
I've got several of the books recommended off of your list and I do enjoy them all.
Many of the topics brought up in this discussion hit close to home for me. I recently graduated with a double major in comp sci and comp eng. The hardest part of my courses always fell into my teachers focusing on the how. Rarely did they get into why, that was usually something I had to stumble upon myself.
Most of my fellow students fell into the copy and paste programmer description. To be fair, I can't blame them. You can only really apply as much thought as you have understanding.
To sum it all up, my college career would have been vastly easier and more enriching if my professors followed my philosophy:
"The why explains the how."
An less obvious benefit of books:
A boring train journey went much quicker at the weekend after I got into an interesting conversation with a stranger who had noticed I was sat reading "Code Complete" and correctly assumed I was a fellow developer.
Incidentally, Code Complete is probably one of those larger books that Doug McCune would complain about having to lift - but fortunately the content is excellent, and a free arm workout is always good.
I think one of the reasons most programmers don't read books is that the constant deadline pressure of our jobs discourages taking any time during the work day and many (most?) of us work much more than 40 hours a week, so we don't have a lot of time outside of work. However, I have always found time, somehow, to keep reading software books. I no longer read technology specific books.
As other people have mentioned, I think it is generational as well. I started programming professionally in 1979. I don't think I had access to the internet until 1987, so my habits were established well before the web. Also, I notice that the people I know in their 20s don't read any books of any kind not just programming books.
I've found that it takes at least 5 years out of school before you have the desire to read a book.
This post has uncanny timing. Just last week I purchased, for the first time in a while, my first software engineering book whose purchase was not mandated by my university: Applying Domain-Driven Design Patterns by Jimmy Nilsson. Furthermore, I started my own blog, partly inspired by my hours of reading this one.
I tend not to have such a negative view on programming books. They can give a programmer a consistent style and technique for writing in the given language. Pouring over various internet articles for tips can lead to inconsistency, and I experienced this first-hand.
I had no formal training in VB.NET outside of following fragmented code snippets on the net. As a result, the first few months of code I cranked out at my job contained inconsistent styles...sometimes using MethodName = ReturnValue, sometimes using Return ReturnValue, etc.
Finally, I agree that while language-specific books are nice pragmatically, the books I enjoy the most are the "why", not the "how". I think the Nilsson book will be one of these. In addition, Eric Evans' classic Domain-Driven Design book was a book I carried with me to and from work and used every day.
25 years ago I taught myself Turbo Pascal 3.0 (wow, am I getting old) thanks to a book by a fellow named Tom Swan. Great stuff.
Ten years later I found myself editing technology books, mostly consumer stuff (I edited David Pogue's books for a couple years) but also the occasional programming book. I learned that the entry-level "Teach Yourself in 24 Hours" programming books are written by the publishers' favorite authors -- people whose entire programming knowledge is stretched to write the book, but can churn out piles of serviceable text on time. At the other end of the spectrum are the really deep and niche programming books. It's incredibly difficult to find authors for those because it takes the rare combination of deep experience *and* the ability to write. My employers could find one or the other, but seldom both. They tended to favor experience, but they weren't always good judges. So as the editor I spent ridiculous amounts of time fixing inaccuracies and making their writing make sense.
A serendipitous turn of events led me to the software (LabVIEW) that I have been making a living from for the last 9 years. And I learned it from a book first. Since then I have had formal training, a little bit of mentoring, but many more books. Code Complete is one of the best and my favorite. Although it teaches little about my actual software, what I have learned from it about software engineering principles and project management gives me a much deeper appreciation for the big picture and how to get a project done most efficiently.
What's up with Code Complete being on the second shelf. That book should have it's own book case...
Just my 2 cents, but the majority of programmers and designers I know (including myself) have mini libraries. There are only a couple of my books that I have read cover to cover, but I have used all of them on occasion as valuable resources. Most of the free resources, like the ones on the web, do a fine job in showing the how, but they do a horrible job in showing the why. Much of good and efficient coding comes down to work flow. Its hard to learn that work flow from a four page online tutorial.
An interesting book I picked up not long ago was an old text from 1971, the Psychology of Computer Programming, Even today a lot of the information applies today on how people interact.
Most of my favorite books are more reference works, that explain the language or methods.
Some pre-written type-in works i kind-of like, when reading those I look through them get the gist of how to do things and start to think of ways to develop better interfaces, data structures, whatever, so in a round about way those do help my programming in giving me seeds of ideas for how to do things and to use better programming methods.
Liked seeing the BASIC Computer Games and Creative Computing books on your shelf... I've got those too.
It seems obvious to me that your definition of programmer is quite different from mine. Even though those top 5 are great books for programmers, they are too much software engineering-oriented. My point is, they do not have more value to a programmer than SICP, KR's C and (yes) Knuth's TAOCP. Programmers need to learn how to program, and that is done by reading up on as much code and different kinds of abstraction they can. A programmer would be just fine if he didn't know jack about UML or software development process. It is much more valuable to a programmer, from the _programming_ point of view, to buy and read---even if parts of---TAOCP than it is to read Peopleware, for instance.
I was worried when I heard all the no-book talk on the stackoverflow podcast; it makes me glad to hear your defense of books. Websites are great for answering specific questions, but books are great for an in-depth command of a subject.
On the .NET side, Jeffrey Richter's Applied Microsoft .NET Framework Programming is indispensable. The list can go one and on; every subject matter has its books like this. However, books of this caliber are rare. For every one of these, there are 50 "teach yourself XYZ is 24 hours" quick-buck books.
"Reading, after a certain age, diverts the mind too much from its creative pursuits. Any man who reads too much and uses his own brain too little falls into lazy habits of thinking." - Albert Einstein
I learned to program from books. C++ from the Ground Up was my first computer book. It gave me more than just a syntactical guide to the language. The book was full of useful principles that I still use today, over a decade later.
Our organization recently handed each programmer a copy of Code Complete with a mandate to study it completely. I am now reading it and Software Estimation by Steve McConnell. Both books are very well written and valuable resources.
Sadly, a majority of books that crowd the book store shelves are merely parroting online documentation or other documents that are available on the Web instead of teaching valuable and useful skills. Also, many focus so narrowly on a software or platform version that they become obsolete with the next release. C# 1.0, C# 2.0, C# 3.5. You can't finish reading the book before the next version of the platform or technology is released; much less apply it in your work.
Selecting books, like the many on Jeff's list, is difficult, but definitely worthwhile. True references should help programmers develop skills that transcend the current technology or platform but can be the foundation for work on whatever groundbreaking work comes along in the future perhaps on a platform that does not yet exist.
*So* nice to see that you have Tufte and Norman on your bookshelf alongside other books about programming. I've been recommending them both for years as mandatory reading for programmers, and I get blank stares from almost everybody. First: who? (Maybe half have heard of Tufte but nobody has read TDoET). Then: "But...they're not about /programming/".
Yes, Virginia, programming is about design. And thinking abstractly about design is something most people never bother to do, but it is something that differentiates the programmers from the technology bricklayers, and you can spot one from the other pretty easily just by asking if they own a copy.
Not to mention, it seems that many if not most of the programming books worth reading have the price tag of $100 or more.
I can't see how anyone can call themselves a good programmer if they haven't read Code Complete.
Of your list I've read all but one and that one I never encountered. I'm going to rectify that oversight.
1. I read that some authors (of good books) are discouraged from writing books because someone scans that books and then it floats around the internet. one author wrote on his blog something like, "why share my knowledge if someone is going steal it; I will keep my knowledge to myself and let 'them' pay me for consultancy, instead". depressing but true.
in fact, if you do a search for your asp.net book (and add "pdf OR chm" to the query string), you can find sites to download it. neither you nor the other authors are going to get paid/royalties for your hard work and valuable knowledge that you shared via your book.
2. sometimes good books are thick, e.g. "CLR via C#".
3. i like to ask this question during interviews: "what professional books you have read in the last year?"
one person we interviewed said that he hasn't read a programming book since college. he was hired over my 'no' vote, and his lack of reading showed in his work, in my opinion. the internet will only get you so far.
There are 2 paths: "the short long way, and the long short way; it is your choice".
Years ago I picked up a book, "C for Dummies". It was completely and totally awesome. It really explained the subject well, and the sequel (Volume 2) covered pointers in such a way that it finally made sense to me.
The author, Dan Gookin, is the one that invented the Dummies concept and sold it. I think the "for Dummies" concept has been run into the ground and I agree that a lot of the "for Dummies" books are crap, but the original author and the original concept were pretty keen and those are the only "for Dummies" books I have on my shelf (though I do find myself defending it a lot).
A somewhat elitist tone in your post.
Just like bad music on CDs, which you find plenty of in used record stores, there are many bad programming books.
However, there are many great ones that I referred to for several years running that were exemplary.
While I learned Fortran, BASIC, and Pascal in school, I learned C, Delphi, and much of what I know about .NET from excellent books.
I bought the programming book 'Java Concurrency in Practice' a while back to try and learn more about multithreaded programming techniques. It's a good book and there were some good general ideas but I was wondering if you or anyone else knew of an equivalent book dedicated to multithreading techniques thats for .NET?
If you are willing to put in the time, Knuth is excellent, and will definitely make you a better programmer. It's the opposite of the "Quick-fix" books-- but it will give you a profound understanding of the underlying structures that you rely upon. If you're not willing to commit to the big books, try a fascicle or two.
Your book shelf looks very different from mine. Unfortunately, I have a lot of those ten pound books that I can never find what I'm looking for in. Well, never is an exaggeration, but it usually takes me three tries to figure out which book to even look in. There's a lot of good information there, but, generally more effective than sominex. I have started reading Code Complete, based on one of your earlier posts, and I am glad to get recommendations as to what I should be reading.
I'm reading more bookds than ever. I download them first, if they are good I buy them. Then I read them on the train to work. Last book was about WPF Unleashed (excellent), next book is LINQ in Action (I hope that will be good too).
One thing though, they are very expensive.
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".
Coming from somebody who doesn't know and refusese to learn C :-)
I kid, I kid (but I will continue making fun of you for that until you do learn the damn thing :-)
Most blogs wouldn't follow a LINQ to SQL example with an explanation about coroutines and functional programming. Some books do that, and they are therefore very valuable to me.
I see you have some Tufte on your shelf, one should be enough, and that's the one about Powerpoint ;-)
Programming books are good to get you started. Once you have mastered two or more programming languages, only timeless books like The Art of C. P. are worth it.
Specific books like "Data Binding with Windows Forms 2.0" in my opinion are a waste of time. You can get the info from the internet much faster and even more specific.
I'm on the verge of being semi-offended by the ageist comments here. I'm a Java developer so no .NET/Basic/published-before-I-was-born-(1981)-books (not that I'm discounting the classics, just haven't gotten there yet)
and I admit, college (ironically) killed my desire to read books for a couple years, but I own several of the books pictured (Working through Head First Design Patterns right now)and have read a few more.
Still, I read. I think its more about a lowering barrier to entry in technology. I work mostly on web applications, so I call myself a web app developer. I met someone who works in my building who also calls herself a web app developer because she took a 2 week Dreamweaver course.
Its not that hard now, to become a sys admin or programmer because there is a lot of crutchware for people who could not function without it. I'm not saying we should all be running CLI Linux (though I wish I could at work), but if you are unable to operate a computer without a mouse and you call yourself a programmer I think there is a problem.
Got a book for that? :-)
If you can't afford to purchase books, check your local library. Most libraries can borrow books from Interlibrary Loan or WorldCat. See http://www.worldcat.org/. An example, Code Complete is showing in 850 libraries world wide. Usually you can borrow these for little or no cost.