Scott Hanselman

Six Essential Language Agnostic Programming Books

June 13, '07 Comments [51] Posted in Musings | Programming | Reviews
Sponsored By

A gentleman emailed  thanking me for http://www.hanselman.com/tools, and suggested I make a list of great Programming Books. I don't think it'll be as long as the Tools List, but here's my list. I specifically made the list Language Agnostic. Also, many of these books are by authors who write gold. That means, nearly everything they write is worth taking a look at. I haven't listed every book they've written, in those cases, just their "Greatest Hits."

When it comes to programming languages, I'm not a religious zealot or C# apologist. My religion in these matter is strict Apatheism. I just don't care enough to fight (except for VB people. They're just nuts. (kidding!)) . Pick the language that makes you smile and ships the project. It is for this reason that I prefer to read Language Agnostic Computer Books.

Code Complete - Steve McConnell - Darn near a bible of software development goodness, Code Complete reminds us of our priorities. It's essential and everyone who writes code should read this book. The Pragmatic Programmer - Andrew Hunt and Dave Thomas - I like to read this book at least every six months or so. It's clean, clever, clear and full of concrete tips you can use to be a better, simpler, pragmatic programmer. A new classic. Programming Pearls - Jon Bentley - This may feel initially like a C book, but it's really an algorithms book at its heart. It's old school with techniques and thought problems that can be applied today, even in language like Ruby and C#.
Refactoring - Fowler, Beck, Brant, Opdyke, Roberts - Although the language used is Java, the concepts are universal. This is a very linear, easy to read, learn by example book. If you think you know how to refactor, but you haven't read this book, pick it up and refresh yourself. You'll find names for Refactorings you've used for years and you'll definitely not only pick up new ones, but be better able to spot opportunities to use them. Design of the UNIX Operating System - So few programmers today can answer questions like "explain how virtual memory is managed" or "how are Unix processes different from Windows." How did we get here. Know your history. Design Patterns - Gamma, Helm, Johnson, Vlissides- One of the comments on Amazon says it best, "It is expected that any professional developer has read this book front-to-back. Buy it, read it, then put it in your bathroom and read it when convenient. Also, when you're done, spend some time at the Portland Pattern Repository.

UPDATE: There's some GREAT comments below, and I'm looking into each of them and putting together a list on Amazon.com. I made some pretty obvious gaffes (it was late. ;) ) by not including SICP (Structure and Interpretation of Computer Programs) or TAOCP as well as Types and Programming Languages. A number of folks said the list wasn't very language agnostic because it's very "C" and imperative language focused. Good points all!

What books did I miss, Dear Reader?

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. I am a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by ORCS Web
Wednesday, June 13, 2007 6:47:25 AM UTC
I like "Domain Driven Design" but it's a little more advanced. Kind of Fowler++ (or # depending on how you bend)

Wednesday, June 13, 2007 7:07:22 AM UTC
I like Michael Feathers' "Working Effectively with Legacy Code". It analyzes legacy code on every stage until making the code testable
Wednesday, June 13, 2007 7:16:03 AM UTC
I think Design Patterns is actually very C++/java oriented. Considering that most "design patterns" are trivial or not needed in more dynamic languages (see http://norvig.com/design-patterns/), I don't think that this book is really "language agnostic".
Wednesday, June 13, 2007 7:18:03 AM UTC
You have left "The Practice of Programming" Book.
Reemus Kumar
Wednesday, June 13, 2007 7:24:07 AM UTC
The Structure and Interpretation of Computer Programs is great for opening your mind beyond the mainstream paradigms of programming.
Ori Folger
Wednesday, June 13, 2007 7:27:15 AM UTC
I liked The Cuckoo's Egg by Cliff stoll. Though it's not a programming book per se, it's a good book on computer hacking and espionage. The book has a lot of insights on computer networks, Unix and how the internet evolved from Arpanet woven around a tight story line. It's a fun read for non-geeks and a must read for system administrators.
Wednesday, June 13, 2007 7:32:15 AM UTC
Where's SICP?
Wednesday, June 13, 2007 7:56:02 AM UTC
G'day Scott,
Unfortunately, you have made a very common mistake. None of those books are language agnostic. The GoF book in particular is well known to be specific to a class of languages called 'imperative languages'. In fact, this holds for all of these books. The common mistake is thinking that 'imperative languages' is the universal set of all languages, when in fact, they are all very much the same language i.e. little differences between them compared to other languages. Granted, non-imperative languages aren't taught at school so much any more (though, this is changing a little thankfully), but it is these other languages whose ideas are adopted by the mainstream not-so-good languages (I used to work on the IBM Java implementation and even watched it happen once or twice!).

In fact, I have commented on this fact before in reference to someone else commenting on it (2006-12-06) http://blog.tmorris.net/defmacro1-defmacro0-1/

Here is the original quote:


Most people I’ve met have read the Design Patterns book by the Gang of Four. Any self respecting programmer will tell you that the book is language agnostic and the patterns apply to software engineering in general, regardless of which language you use. This is a noble claim. Unfortunately it is far removed from the truth.
Wednesday, June 13, 2007 8:06:27 AM UTC
Nice list, thanks very much


Danny
Wednesday, June 13, 2007 8:09:16 AM UTC
I have a going offer (http://quay.wordpress.com/2007/05/09/acknowledge-its-broken/) (which hopefully not too many people take up) that if someone buys Code Complete and doesn't think it's amazing, I'll buy it back from them so i can give it to someone who will appreciate it.

I was just re-perusing it yesterday... you really can just open it randomly and get amazing nuggets of useful techniques and gotchas.

But one of the problems I think is that the people who would feel that a book like that is useful to them have already read it and those who don't can't imagine why they would want a book like that.
Wednesday, June 13, 2007 8:36:53 AM UTC
Another here that thinks the GoF book is really rather C++ orientated. Steve Yegge said it best, though: http://steve.yegge.googlepages.com/singleton-considered-stupid
.
Julian Birch
Wednesday, June 13, 2007 8:47:09 AM UTC
Hi Scott

I find that Joshua Kerievsky's is an essential companion to Refactoring.
Wednesday, June 13, 2007 9:13:13 AM UTC
I recently asked a similar question in a comment on Phil Haacked blog. A number of people recommended Head First Design Patterns.

I just started reading it yesterday and it is a really well written (lots of pictures and examples) and is put in terms even I understand. Even so early on I would recommend it to anyone wanting an introduction into design patterns.

You may not want to include it is all the examples are in Java although if you know c# you should understand it and even the VB / C++ shouldn't have to jump to far.

I also recently read From Coder to Developer which started very interesting. For someone new to the business it gives a nice overview of what the whole software development process entails and made things a lot clearly for a new graduate like me.

I guess it really depends who you are aiming the list at
Remmus
Wednesday, June 13, 2007 9:19:57 AM UTC
+1 for "The Practice of Programming" Book
Anthony Tarlano
Wednesday, June 13, 2007 9:57:34 AM UTC
Code Reading by Spinellis is a good read for learning how to quickly and efficiently get to grips with an existing codebase. I'm fortunate enough to have worked on greenfield stuff my last couple of projects, but this is gold when starting at a new company and needing to get up to speed. Also great if you're looking to join an open source project.

http://www.spinellis.gr/codereading/
Russ
Wednesday, June 13, 2007 10:10:06 AM UTC
What about algorithms ?
OmegaSupreme
Wednesday, June 13, 2007 10:14:41 AM UTC
I'd add The Algorithm Design Manual by Steve Skiena. Excellent intro to fundatmental data structures and algorithms.
Mike
Wednesday, June 13, 2007 10:25:55 AM UTC
The formatting of this page is a little off, the images of the books aren't ligned out to the right ;).

Anyway I really like Head First Design Patterns, it's a bit of an unorthodox book, but it explains the principles really well. Though the examples are in java, they're very easy to read and easily ported to any OO language.
Wednesday, June 13, 2007 11:20:31 AM UTC
"Writing Secure Code 2" by Michael Howard... I think it is a must read for all developers
Wednesday, June 13, 2007 11:40:19 AM UTC
You missed "The Mythical Man Month" by Brooks.

This is a touchstone book, where by merely mentioning the name, you instantly communicate a body of knowledge on software engineering insight. It's full of truths about Software Engineering that are still relevant. 30 years later.
Dugald Wilson
Wednesday, June 13, 2007 12:16:26 PM UTC
Design of the UNIX Operating System - So few programmers today can answer questions like "explain how virtual memory is managed" or "how are Unix processes different from Windows."

Aside from implementation details, how are Unix processes different from Windows processes? The concept is the same isn't it? NT processes are thread based and Unix processes are not (or were not during Maurice Bach's time). What else?
SM
Wednesday, June 13, 2007 1:17:15 PM UTC
From the language agnostic:

Patterns of Enterprise Application Architecture - Martin Fowler
Wednesday, June 13, 2007 1:36:05 PM UTC
Types and Programming Languages & Advanced Types and Programming Languages by Pierce
Sam
Wednesday, June 13, 2007 1:50:10 PM UTC
IMHO you have failed making an agnostic list. its smells C like languages too much ... Where is CTM or SICP ? What would be your knowlegde of functional programming after reading all these books ? Close to zero ?
Pierre
Wednesday, June 13, 2007 1:54:20 PM UTC
You most definitely missed SICP... and you have no real Algorithms text... Intro to Algorithms by CLRS, for example...
Matt
Wednesday, June 13, 2007 2:49:05 PM UTC
I agree with adding SICP and Types and Programming Languages.

I would also add Introduction to Functional Programming by Bird and Wadler, and Peopleware by DeMarco and Lister.

SICP and Introduction to Functional Programming are biased toward certain sorts of programming paradigms, but in a good way, like Design Patterns.
Andrew Norris
Wednesday, June 13, 2007 3:28:20 PM UTC
I like the book "Writing Solid Code: Microsoft's Techniques for Developing Bug-Free C Programs"
Vivek
Wednesday, June 13, 2007 3:42:27 PM UTC
All have to toss my vote in for SICP as well. An absolute must for anyone looking to absorb CS theory. The code is very basic, but the concepts are quite advanced. Someone also mentioned Intro to Algorithms, which is phenomenal as well.

Let's not skimp on theory, people ;)
Michael
Wednesday, June 13, 2007 3:48:16 PM UTC
Where's Knuth?
brian
Wednesday, June 13, 2007 4:16:14 PM UTC
What about Fowler's Patterns of Enterprise Application Architecture (P of EAA)
http://www.martinfowler.com/eaaCatalog/index.html
Wednesday, June 13, 2007 4:19:29 PM UTC
How could you have missed Fowler's PEAA?
Wednesday, June 13, 2007 4:34:46 PM UTC
TCP/IP Illustrated Volume 1 by W. Tichard Stevens

To quote a former colleague...You pay $70.00 for the diagrams on the inside of the cover/1st page, and as an added bonus you also have the remaining pages that offer good overall information on TCP/IP networking.
Arthur Strutzenberg
Wednesday, June 13, 2007 4:39:33 PM UTC
What about Charles Petzold's Code? More foundational than practical, but it's a great read.
Tim K
Wednesday, June 13, 2007 5:13:34 PM UTC
Wonderful wonderful comments, folks. Answering from the bottom up:

@ArthurS - I debated a TCP/IP book. That was my favorite class in school. I agree with you. If you're coding on the Internet, digging deep into TCP/IP is a very useful thing. It gets less "agnostic" but it's ubiquitous these days.

@SamGentile and Chris - I went back and forth on that one, but it sounds like folks here agree it's a classic and very important. I rejected it because it had "enterprise" in the title, but it was late, so probably not the best idea on my part. :)

@brian - Ya, I assume you're talking about TAOCP 1-5? I went back and forth on the "textbookiness" but they are classics. I've never made it all the way through myself. Still, great point.

@Sam - I wasn't familiar with Types and Programming Languages but I will check it out. Sounds like folks agree with you.

@SICP Advocates - Yes, I thought about SICP (Structure and Interpretation of Computer Programs) although I personally prefer the videos, which are available out there to download, over the book, but point taken. I wanted to find a balance between overly "heady" and fundamentally useful. Do you think that it's truly essential for any developer?

@TimK - I LOVE Petzold's Code and have talked about it before on this blog. Not everyone agreed with me, but I personally think it's CS101 required reading. A great primer.

@AndrewNorris and TonyMorris - Thanks for the reminder that there's a non-imperative world out there. I think I'll post about that separately. I'm a Haskell fan myself, but often those brain cells are overwritten and jostled by the work of the day.

I'm looking into each of these and putting together a list on Amazon.com
Wednesday, June 13, 2007 6:13:16 PM UTC
Great... Now I've got another reading list to conquer..
Wednesday, June 13, 2007 6:59:29 PM UTC


mccarthy - the dynamics of software development

writing solid code - ms book , forget the authot (I am away from my book shelf at the moment)

debugging the software development process - another MS book

And of course - the mythical man month
Paul Moore
Wednesday, June 13, 2007 7:48:07 PM UTC
Great book list. I have Design pattern and once in a while, I refer to it.

I am also wondering if you guys are hiring .Net professionals.
Srikanth
Wednesday, June 13, 2007 8:09:22 PM UTC
you've missed Cormen - Introduction to Algorithms MIT Press... i'm surprise no one recommended this great book.
Wednesday, June 13, 2007 8:21:30 PM UTC
After all the user interfaces I've seen today, I'm thinking that "Don't Make Me Think" and "The Inmates are Running the Asylum" need to be promoted more.
Wednesday, June 13, 2007 8:32:48 PM UTC
How about Computer Organization and Design:The Hardware/Software Interface ?

this is the only book I kept from my schooling and have continued to read and learn from.
Vincent
Wednesday, June 13, 2007 9:01:08 PM UTC
Object Oriented Analyis and Design by Grady Booch

http://www.amazon.com/Object-Oriented-Analysis-Design-Applications-2nd/dp/0805353402
Wednesday, June 13, 2007 9:28:43 PM UTC
I'm reading Code Complete right now. I'm only 1/3 of the way thru, but so far it's a great book.
slapout
Thursday, June 14, 2007 5:14:08 AM UTC
Anyone here ever read More Programming Pearls (Bentley, 1988)? I haven't myself, but was wondering about it...
Michael
Thursday, June 14, 2007 11:09:10 AM UTC
Code Complete (1) was the basis of the development standard adopted by the team I ran in the first half of the 90's. Somehow I don't find the second edition as compelling, perhaps because I'm irritated by his (sort of) dismissal of agile/XP with simultaneous claims to have (sort of) invented them. But I'm going on (ageing) memory here - CC2 doesn't live on my desk. Design Patterns, yes. PragProg, certainly. Refactoring? I don't leave home without it.

Others that I'm fond of, without wishing to assert that they belong on your list, are Friedl's Mastering Reguler Expressions & beck's Test Driven Development. And most of the XP series at least made me think. Oh, "Don't Make Me Think". That's not on my desk, but only because I'm rereading it on daily the commute right now.

Norman's "The Design Of Everyday Things" ? That's worth considering.

I loved Cooper's "About Face" (the first edition). But I'm not sure how well it has aged. Some of the concepts at least are still relevant though, and still as ignored as ever in the majority of interfaces.
Mike Woodhouse
Thursday, June 14, 2007 4:28:45 PM UTC
GOF Design Patterns...SNOOOOOOOOOOOOOOOOOOOOOOORE
Thursday, June 14, 2007 6:49:11 PM UTC
I liked Steve McConnell's other book - Rapid Development - even better because it focuses on the company politics that usually make or break a project.

I can think of a lot more times where bad management made a project fail as opposed to bad coding practices.
Friday, June 15, 2007 2:21:51 PM UTC
I realize you are programmers.....but, how about an Apatheistic data quality book....Data Quality: The Accuracy Dimension by Jack Olson. Many excellent examples of "screening" data (vs. "screening" a UI).
Robert Harvey
Monday, June 18, 2007 10:07:26 PM UTC
Hey Scott,
I wanted to e-mail you but didn't want to pay $12 a year for that account. I'd love to know how you find the time to read books. Do you do it at work? At home? On weekends? In college? I try to read as much as I can but ultimately read about 20% of any book I pick up, even if it's a great read.
Monday, June 18, 2007 10:13:13 PM UTC
Hi, the site says " An i-name or a valid email address is required." You can just use your email address...an i-name isn't required. :)


I read most books between 10pm and 2am. I read on the toilet. I read at lunch. I read on the bus. I read when I'm watching TV. Why do you stop at 20%?
Monday, June 18, 2007 10:36:41 PM UTC
Whoops! My eyes skimmed down to the sentence "If you don't have an i-name, you can get one here".

Toilet reading is some of the most effective, in my opinion. I think I'd read on the bus more if the books I read were lighter. You seem so productive, I've often wondered what time you to go bed; I now take it as 2am ;) 10pm-2am is an interesting time of night for reading. I'm usually on the Internet at those times; I'm going to try reading and see how that works out.

About the 20%, I've often wondered that myself. I think what happens is that I force myself to read the beginning of a book and the beginning is often slow and boring so I start skimming - looking for things that are interesting and reading a few pages after that. That doesn't explain why I stopped reading Code Complete, though. What a great book! Even from the start.
Sunday, July 01, 2007 3:57:44 PM UTC
Please take a moment to share your comments on a quick six question survey about programmers and blogs. http://www.surveymonkey.com/s.aspx?sm=H3Tk7Ho1186wC3taRdYZuw_3d_3d

Thank you.
Comments are closed.

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.