What is the single most influential book every programmer should read?
stackoverflow.com
stackoverflow.com
Code Complete is a fine book. The Pragmatic Programmer is okay. But neither book holds a candle to Introduction to Algorithms for career-long usefulness. For that matter, neither one holds a candle to Design Patterns for the ability to expand your mind and improve your ability to think about code (I read both at the same time, and Design Patterns is the only one whose lessons I remember distinctly, years later).
I think the main problem here is that the easy, mechanical reads get more votes than books that are harder, but more valuable. It's the technical equivalent of a lolcat photo.
What sets these books apart is that they try to tackle the problem of _how_ to design elegant algorithms. In the process they introduce crucial concepts like invariants which, once you understand them, become indispensable tools in reasoning and designing algorithms.
More generally, their stress on elegant proofs develops a taste for mathematical elegance which would serve all programmers well as they design new systems.
These books are much too under-appreciated, in my opinion.
Also, it should have a short appendix explaining that you do not get geek brownie points simply by using as many patterns as you can think of.
I realize these are not problems with the book per se, and it's worth reading, but some developers seem to get the wrong message from it.
Not really. I've found a use for design patterns in just about every language I've used. They're not all equally useful, but that was never the book's claim.
It's become a little fashionable to be cynical about Design Patterns, but most of them have held up well. A few of the patterns were always obscure (even at the time of writing), and a few others are trivially implemented in newer languages, but honestly, there are a lot of people who are doing a poor job of re-implementing the patterns, then doing an worse job of communicating their work. There's something useful about the notion of a consistent engineering vocabulary.
Also, I talk to a lot of people who claim to hate Design Patterns, but haven't actually read the book. They've used Java, decided that they hate Singletons and Factories, and thrown the baby out with the bathwater. There's a lot more to the book than just Singletons and Factories.
Well this is just wrong! I would call them good languages but that just my opinion.
I have never really found it helpful to think about these patterns. Witch one do you find helpful to think about?
Lots of people seem to independently "re-invent" the Observer and Visitor patterns (badly), which is a shame, because there's lots of room for subtlety in their implementations. And of course, Ruby makes use of Interpreter all over the place, and frameworks like Rails use Command, Chain of Responsibility, Mediator, Template Method, and so on...but don't really call them by their names. Blargh.
I reread Pragmatic Programmer every year.
The other two you mention I find pretty poor, to be honest. I may reference them once in a while, but to really understand the topics they cover I'll rely on a well written, colorful article over those books.
In general I've found books written by more than 2 authors to be quite boring, impersonal, and oftentimes misleading.
Code Complete and Pragmatic Programmer are two of my favorites alongside C, and the Practice of Programming.
For what it's worth, it's the same imprint that gave us the pickaxe book (Programming Ruby), so perhaps that ought to be a point in it's favour.
Design Patterns are only needed if your language is not powerful enough.
In assembler subroutines and classes are design patterns.
If we're talking about technical books, Refactoring is easily the most beneficial read I can remember having. I was pleased to see it (barely) trump Design Patterns... a book that I think (through no real fault of it's own) has spoiled more developer-years than it's benefitted.
Softies are overrepresented on stackoverflow.
Edit: Oh, no wonder. This is a very old repost.
Code Complete: First ed 1993
Prag Prog: 1999
SICP: 80s?
K&R C: ditto
CLRS: 1990
Refactoring: 1999?
GoF DP: 1994
Mythical Man Month: late 70s, 80s?
TAOCP: Decades ago, and not a serious suggestion
Dragon book: 1986
GEB: 80s was it?
Programming Pearls: 1999
CODE: 1999
Off the top items in that list, only two have them have been published in the last TWELVE years, which in our industry is at least two full generations.
I don't know about you guys but that makes me a little sad. I think somethings have changed a lot in the last 20 years. I refuse to believe that Brooks had the last word on project management several generations ago.
I accept the notion that "the more things change, the more they stay the same" but I can't help but think this Greatest Hits List couldn't be improved somewhat.
Mark-Jason Dominus' "Higher-Order Perl" is fantastic, but unfortunately specific to a language that's most programmers are not choosing in 2011. There was an attempt at a JavaScript port. Maybe someone should take that up again.
I disagree. There's over 200 pages before they even introduce mutation and impure functions. Later they touch on the thorny problems that mutation creates when they touch on concurrent programming. There's sections on building lazy streams which are core parts of Clojure and Haskell. And I don't think there's a more accessible intro compilers and programming languages text than chapters 3 and 4.
While there might be other places to learn about functional programming to apply to working in Python and JavaScript, SICP is a fine place to learn the fundamentals. In some ways, I would say modern programming languages are just starting to catch up to SICP. (yes I know Haskell is pretty old, and disclaimer: I'm a huge fan of SICP)
That's kind of the point. I tend to be the one defending SICP on this board, but only for someone who wants the very particular kind of education SICP brings.
Meanwhile, over in languages people are using, you don't have the option of living without mutation. Time to learn how to protect yourself, or not, with closures.
Recursion has a bigger speed and space penalty. You need to tell people when to use maps and folds and when not to.
SICP doesn't really do combinators, and they are very useful in JS.
Also, a lot of libraries in JS use chaining, so a grounding in their theory (maybe even a discussion of monads à la Haskell) might be very fruitful. SICP has nothing like that.
Callbacks are everywhere in JS programming, so a discussion of how to avoid spaghetti would be good.
Latency is a much bigger deal for JS -- how to balance very fast local resources with potentially never-returning remote resources -- and techniques for beating that are not to be found in SICP, as far as I remember.
And of course there's no discussion at all of UI or media in SICP.
You really need to elaborate on that. Especially given how Guido could have used reading SICP when implementing Python and how Brendon was thoroughly inspired by Scheme (and I assume SICP) for Javascript.
TAOCP is not even finished. My copy of volume 4a is copyright 2011. Although it's definitely not something every programmer should read, it's a fantastic resource when you run into a really, really hard problem. I think it's also a great source for recreational programming problems if you like that sort of thing.
Today's problems tend to be more specialised, which means even a brilliant book about how to solve them isn't going to be as widely influential. Something accessible to mere mortals about functional programming probably has the best chance today, given the increasing penetration of related ideas into mainstream programming languages, but while there are some brilliant presenters working in that field, their focus is still typically far too academic for mainstream interest. Something about non-traditional databases, distributed systems, and why certain key problems can't be solved and there are necessarily always trade-offs, might also be applicable to many programmers today, but again I know of no natural figurehead to write a definitive book on the subject.
The drop-off in top-notch books also correlates pretty well with the rise of the WWW as a mainstream information source. Of all subjects, computing is one of the fastest evolving and perhaps the most natural candidate to find a home for new information on Web pages rather than paper. It's tough to write a book that won't date scarily quickly today, again partly because of the specialism aspect, but a Web page stays up-to-date for as long as you care to update it.
What's left? Lowest-common-denominator commodity books: X For Dummies, Learn Y in Z hours, the latest unsupported advocacy from some "Agile trainer", and occasionally a printed snapshot of an interesting web site as it was six months ago when the publishing process was started. Not exactly the kind of material written by the industry giants and sagely academics of 20 years ago, alas.
> I don't know about you guys but that makes me a little sad.
It doesn't make me sad at all. It says that computer programming is not just about the latest whiz-bang tool. Rather, the field has a core of worthwhile, enduring knowledge that does not become obsolete just because you switch to a new language/framework/platform/whatever. And this core is worth spending time and effort to learn, because it is not going to go out of date.
in 5-10 years (or even now, maybe?) people will be talking about what single blog post is the single most influential post every programmer should read.
Many of the books above focus on the fundamentals which is what makes them classics.
Also, The second edition of Programming Pearls was around 1999. The first edition was much earlier.
As far as coding skill, I agree about Refactoring. Design Patterns is just a grab-bag of tools that are useful in some situations and harmful if misused or abused. Refactoring is a set of skills that are globally useful and are married to equally important models, terminology, and advice. Studying refactoring gives devs a much stronger ability to talk about, study, understand, reason about, and modify code. I'd much rather work with someone who was an expert in refactoring than someone who was an expert in design patterns.
Edit: also, Refactoring concentrates on changing existing code vs. greenfield development, which tends to be far more useful in practice.
new $className();I really really hate singletons, visitors, factories, and all the lot, but I'm glad I can understand the intent of these things.
I think being disillusioned with this book is a good stepping stone for devs, it felt like one to me.
That's why I like PoEAA - Fowler is better writer than the GOF so his books do a better job of bringing the ideas across.
The problem with using it to impart a method of thinking in my mind is that the way of thinking (and the patterns themselves) really have to be earned. I think it's possible for a book to do a fair job at imparting that wisdom, but GOF is setup terribly for it. It's sort of like picking up a recipe book full of classical french dishes without learning about french cooking first. It's too easy to misunderstand the specific values and compromises of specific 'ingredients' and undo the benefit the pattern could provide altogether.
I've wondered before if GOF could be rethunk with Refactoring in mind. Starting with code smells is exactly right. The book should focus more on identifying problems with an approach, because that's the hard part. Solutions are much easier.
If you work in an object oriented language, I think one of the most useful books you could read would be Kent Beck's Smalltalk Best Practise Patterns. The reason being that the lessons and tricks Kent discusses in his book can be applied to Ruby, Python, Java, C#, C++, Delphi, and any other language that I insultingly forgot, where you are working with objects and polymorphism.
But it certainly wouldn't be useful for _every_ programmer to read. Those would be much more abstract like the already listed ones (mythical man month, sicp, code complete, gof, pragmatic programmer)
While I still don't usually write C, having that base knowledge before jumping into high-level stuff like Perl and PHP in my middle teens was invaluable.
As always. Considering we are making great software, but a lot of projects still seem to go over the estimated time....then I guess learning about that is what will bring us ahead.
Also this talk by Greg Wilson: http://vimeo.com/9270320
And it was good, while not saying anything I was hugely shocked by, but making clear and sensible points.
And now a few years down the line, I'm out of uni and working, and I find myself toying with buying it for my boss...
Not so much for the details of windows (although those are interesting), but it is the only book I have ever seen that attempts to show how a large software project evolves over a long period of time.
1. http://www.amazon.com/Code-Language-Computer-Hardware-Softwa...
Seriously, asking for one book to read is silly in a profession that is all about lifelong learning and disruption of established assumptions and paradigms. If you want something timeless, then you need to go way low level to the mathematical fundamentals of this profession.
The question is "What is the single most influential book every programmer should read?" I.e. given the set of books that every programmer should read, which one is the single most influential?
As a programmer, lets consider the answer to the question, as parsed logically (regardless of intent).
Typing 'most influential books' into Google brings me to this list: http://en.wikipedia.org/wiki/The_100_Most_Influential_Books_...
It turns out its just one persons opinion - but pageranked to the top for 'most influential books'; and notable enough for wikipedia - thats good enough crowd-vetting for my purposes.
If I knew which books all programmers should read, it'd now be a simple matter of finding the highest ranked; but here, I have to use my judgement.
So I suggest:
Number 13, Euclid's Elements
Number 32, Machiavelli's The Prince
Number 93, Orwell's Nineteen Eighty-Four
I'm not sure every programmer should read Elements - maybe, but its a little abstract these days.
I think The Prince would be good reading for the softer skills of the programming profession - and genuinely has really influenced management thinking; its short, so probably worth everyone's time.
Finally, I believe without a doubt, 1984 should certainly be required reading for all programmers - a single read is worth a great many 'ethics for technologists' courses.
There are other candidates on that list too, but I don't think there's anything that I'm as certain all programmers should read as 1984.
Any differing opinions?
1. The Bible.
Closely followed by whatever the first book that people in stackoverflow's demographic read whilst learning to read.
I'm an atheist, but even I can see the bible's profound impact on the course of western and near-eastern civilisation.
I'm not sure - it is very long. Its probably worth reading some subset of, but I'd be more certain about 1984 and even The Prince, depending on whether we mean 'read all the way through'.
I don't understand the "these days". Does Geometry decay? Or logic? What is the half-life of a Pythagoras' right-triangle theorem?
But whether the particular presentation is worth reading, can change. 150 years ago, every person hoping to do anything vaguely mathematical should probably have read Elements.
But now, there is so much other material to pick from, I'm not sure it'd be a good use of time - it might now be a little on the abstract side, to recommend it to all modern programmers.
Thats what I was trying to get at; I should have phrased it better.
For me, it's: http://www.amazon.co.uk/dp/0195019199
Pattern Language
It's about architecture, buildings, towns. How to make them work, to serve all the needs of them, and how to allow them to grow.
What is important to me and influenced me heavily is the thinking behind it. All parts of a large system in harmony, well-separated concerns, and working together to achieve a common goal.
In architecture (computer as well as construction), there is also politics. We pour ourselves into these systems, our beliefs come out in their design and implementation.
There was a lot that I learned from that book, and a lot that I still go back and refer to.
GOF took their inspiration here, it's obvious from the structure... perhaps you should see why?
If it has to be a programming book, then The Unix Programming Environment by Rob Pike and Brian Kernighan.
It's sitting proudly behind me next to The Mythical Man Month, the GOF book, the Dragon book, Refactoring, Code Complete and The Visual Display of Quantitative Information.
I think a copy should be given to every CS student upon graduation.
http://sunsite.uakom.sk/sunworldonline/swol-07-1997/swol-07-...
It's ancient history. Lessons have been learned.
And I believe that many young programmers are still being thrown onto late projects.
I'd really love to believe that UML is dead, but can it really be true? cite?
To be honest, I had forgotten the book contained anything about heavyweight process methodology. I'll have to grab it out of the shelf when I get home.
I would think that before any of these books I would prefer that someone I was working with or hiring had read something like "How to Win Friends and Influence People" or a book on writing effectively, instead of any of the books on the first two pages.
My reasoning is that the most common problem I find with other programmers is not their programming skills, but their communication of interpersonal skills.
Edit: Aha! "How to Win Friends and Influence People" is on page 5 with 74 points!
People associated with writing technical documentation of any kind could learn a lot from it.
You won't find many programming books from 1988 that are still relevant and on the market -- the only exception that comes to mind is SICP, which also has a very high rank.
I think there's an unwritten condition in the question:
"What is the single most influential [explicitly programming related] book every programmer should read?"
My guess is that is how most people interpreted the question. Of course, there's no explicit reason to interpret it this way. This just highlights the weakness of human language (that is on a standalone basis, using context human language is probably very powerful).
But talking for me, the most influential book I read is SICP.
But before that, the book that really opened my mind about 'professional programming' was effective C++. I wonder if Scott Meyers read HN.. and what's happening with him. For some reasons, I even remember the name of his dog (Persephone) which one of his book was dedicated!
What's the best widget to help me get a random task done? Let the "definitive" answers be spewed.