Tuesday, June 29, 2010

Books for ‘Advanced’ Programmers

Do advanced programmers read books?

There is a stage where you are no longer a 'beginner', yet you still want to learn things (Actionscript is on my list, currently). I've been looking for books which do not start from the 'How to install' or 'How to configure IDE for that' phase, but which assume the reader has more knowledge and has reached a 'can-do-it-yourself' level.

Do you have any good book recommendations?

books programmer
flag edited Feb 18 '09 at 17:19
2,01731532 asked Dec 26 '08 at 4:01
Vardhan Varma

Wouldn't this do better as a community wiki, one book per answer? – David Thornley Sep 16 '09 at 20:15

closed as subjective and argumentative by Mehrdad Afshari, Bart K., dmckee, jitter, sth Jan 30 at 15:28
It's impossible to objectively answer this question; questions of this type are too open ended and usually lead to confrontation and argument.
25 Answersoldest newest votes 28
My answer would depend on how you define "advanced". Some of my professional colleagues use that term to indicate an increasing degree of specialization, while others use it to indicate mastery of a broader set of skills and perspectives. If you mean the first, I can't answer without knowing the area(s) of interest. (So I'll assume you mean the second, and forge ahead. ;-)

In no particular order, I'd recommend:

Effective Java, second edition, Joshua Bloch, 0-321-35668-3 : This is the only language-specific book on my list, but a careful (advanced) reader will also gain insights which apply to other languages.

Test Driven, Lasse Koskela, 1932394850 : Although the examples are in Java (he had to pick some language), the principles apply to a wide range of languages, and are carefully explained.

Refactoring to Patterns, Joshua Kerievsky, 0-321-21335-1 : Tying together two of the most important concepts in recent OO development, this book richly illustrates the process of continuous improvement of code.

Working Effectively with Legacy Code, Michael C. Feathers, 0-13-117705-2 : Written for the majority of us (those who don't get to spend all their time creating beautiful new ivory towers, but have to maintain and evolve existing systems without breaking them), this book has a wealth of techniques for making code more manageable, reliable, and work-with-able. Examples are given in Java, C++, C, and C#.

Test-Driven Development: A Practical Guide, David Astels, 0-13-101649-0 : Covers refactoring, programming by intention, mock objects, and other techniques, including frameworks for C++, C#, Python, VB6, Ruby, Java, and Smalltalk.

Refactoring: Improving the Design of Existing Code, Martin Fowler, 0-201-48567-2 : The classic book on taking poorly designed code and making it better without breaking it.

Prefactoring: Extreme Abstraction, Extreme Separation, Extreme Readability, Ken Pugh, 0-596-00874-0 : No, the title is not a typo! The author focuses on taking what we learn from maintenance of existing code as a basis for doing better design the next time around. The guidelines and principles are illustrated in detail with sample code.

Beautiful Code: Leading Programmers Explain How They Think, Andy Oram & Greg Wilson, eds., 0-596-51004-7 : A thought-provoking set of essays from a wide range of experts and accomplished practitioners.

The Best Software Writing: I, Joel Spolsky, ed., 1-59059-500-9 : Another collection of essays that will make you think, framed in Spolsky's characteristic style (meaning that you'll either love it or hate it! ;-).

Purely Functional Data Structures, Chris Okasaki, 0-521-66350-4 : Reading this book almost amounts to a graduate-level class in how to solve really hard programming challenges in an elegant style.

How to Measure Anything: Finding the Value of Intangibles in Business, Douglas W. Hubbard, 978-0-470-11012-6 : Yeah, we all hate estimating. Get over it. Whether estimating running characteristics of a program, development time, or ROI of a new piece of code, it's not as hard as we all think it is. This book turns your head sideways for a better perspective on the classic back-of-the-envelope.

YMMV, but I found all of these books worthwhile additions to my (already bulging) bookshelf.
link|flag edited Dec 26 '08 at 17:41

answered Dec 26 '08 at 15:04

I agree. When you understand the topics in Effective java you could judge better some other languages and apply the lessons there. – Support - multilanguage SO Dec 26 '08 at 22:23
I'm surprised that Code Complete hasn't made it to that list – Maciek Sep 16 '09 at 20:11

If you're advanced enough there comes a point where "How To" books are no longer interesting because they are either monotonous and assume no programming background or unnecessary because they teach you things you could teach yourself with a decent web browser and a days worth of googling. So why not try some theory? Here's what I've enjoyed:

Algorithms by Dasgupta, Papadimitriou and Vazirani - A good introduction to algorithms and algorithmic analysis. It will help you analyze your own work, show you timeless optimization techniques that aren't necessarily obvious and give you a solid foundation for choosing algorithms for your own work.

Discrete Mathematics and Its Applications by Kenneth Rosen - An introduction to the mathematics behind most of computer science.

The Pragmatic Programmer by Andy Hunt and Dave Thomas - How to do your job as a programmer well.

Refactoring: Improving The Design of Existing Code by Fowler, Beck, Opdyke and Roberts - What to do with the code you've written before you finished this book.

And these are just scratching the surface, there's plenty out there for the more advanced programmer.

EDIT: You can find a pre-release version of the first book, Algorithms, released by the authors for free here.
link|flag edited Dec 26 '08 at 22:07

answered Dec 26 '08 at 4:16
Eric Scrivner

Refactoring and TPP both had a big impact on my as a programmer. I'll put the others on my list. – Jay Bazuzi Dec 26 '08 at 18:01

To the extent that I'm an advanced programmer (other than in age, that is), I read books. I doubt if I'm alone in doing so. Indeed, IMO, any serious programmer is continually learning, and much of that learning will come through reading books.

However, as Eric Scrivner says (and, indeed, as the questioner says), as you become a more experienced programmer, the books you read are different. Books that would be impossibly dense for someone still learning a language (for example, Harbison and Steele's "C: A Reference Manual") become useful as a reference. It would be tough to learn the language from the book; it is an excellent source of detailed information, though. If (when) you become a beginner again (learning a new language, for example), you may need to fall back onto books more nearly suited for beginners. However, you can often cope with more advanced books than those that someone who is not only learning a particular language but also learning how to program at all could cope with.

Many of the interesting books are extremely specialized. For example, "Calendrical Calculations, 3rd Edn" by Dershowitz and Reingold is an incredibly useful book - if you happen to be dealing with calendars. If you have no interest in or need of handling multiple calendar systems, the book is of zero use to you. Another book in a similar vein is "Concurrency Control and Recovery in Database Systems" by Bernstein, Hadzilacos and Goodman; another is "Time Granularities in Databases, Data Mining and Temporal Reasoning" by Bettini, Jajodia and Wang. Very useful if that's what you need; useless (except for insomniacs) if you don't need them.

However, there are a lot of books that are only tangentially about a specific programming language or system, but that help you program better. Others have mentioned "The Pragmatic Programmer", for instance, and "Clean Code" has been cited while I'm typing.

I'd add some more to the list:

Knuth "Literate Programming"
Myers "The Art of Software Testing, 1st Edn" ("2nd Edn" - more expensive).
Hoffman and Weiss "Software Fundamentals" (collected and annotated papers of David Parnas - very interesting)
Raymond "The Art of UNIX Programming"
Kernighan and Pike "The Practice of Programming"
Feathers "Working Effectively with Legacy Code"
Beck "Test Driven Development"
These all, in different ways, take you beyond the basics in a largely language-agnostic way (and largely platform-agnostic too - though there's a strong Unix/Linux bias in my preferences and therefore reading materials).
link|flag edited Dec 30 '08 at 6:10

answered Dec 26 '08 at 5:32
Jonathan Leffler

Many of the books suggested I would tag as more for the intermediate programmer. Some good old intermediate-level books not already mentioned:

Programming Pearls by Jon Bentley
The Unix Programming Environment by Kernighan and Pike
Software Tools in Pascal by Kernighan and Plauger
And a couple of "advanced" titles:

Essays in Computing Science by C. A. R. Hoare (actually a mix of material at all levels)
A Discipline of Programming by Edsger Dijkstra (for the hard-core formalist)
link|flag answered Dec 26 '08 at 7:26
Norman Ramsey

I would add that these are for readers who don't want to be treated like babies who must be warned away from techniques considered "evil" by self-appointed prognosticators. – Mike Dunlavey Dec 26 '08 at 18:22

The Art of Computer Programming by Knuth.

Introduction to Algorithms by Cormen, Lieserson, Rivest and Stein.
link|flag edited Dec 26 '08 at 13:24

answered Dec 26 '08 at 4:08

It's a great book, but only really useful if you want to pursue the analysis of algorithms. – Mitch Wheat Dec 26 '08 at 5:41
@Mitch Wheat. Disagree. It is foundational stuff -- with an advanced presentation. Algorithm design and analysis is the core programming skill. After that come all the various languages and tools for implementation. – S.Lott Dec 26 '08 at 11:55
I wouldn't say algorithmic design is the core programming skill in itself. You'd be missing machine organization and hardware architecture. The two go hand in hand. Today everyone things its all about algorithms due to managed languages, and nobody learns the machine any more. – ApplePieIsGood Dec 26 '08 at 14:54
@ApplePielsGood: Disagree. Machine architectures change. Managed code (and related oS features) comes and goes. Algorithm design is the one invariant skill over the architectural considerations of the harware currently popular. – S.Lott Dec 26 '08 at 18:38

Feynman Lectures on Computation

The C++ Programming Language by Stroustrup

Compilers (the Dragon Book) by Aho, Sethi, Ullman

Lex & Yacc by Levin, Mason, Brown

These are my favorite advanced programming books. They are sorted by inverse specificity.
link|flag edited Dec 26 '08 at 14:32
Steven A. Lowe
28.4k247112 answered Dec 26 '08 at 5:10

There are some books out there that's more abstract, but it should be part of your bookshelf.

The Mythical Man Month
Code Complete 2
Peopleware: Productive Projects and Teams
Pragmatic Programmer: From Journeyman to Master
And for more technical, generic stuff:

Design Pattern
Structure and Interpretation of Computer Programs
Introduction to Algorithms
Programming Pearls
We never stop learning. When we do, we're dead.
link|flag answered Jan 22 '09 at 1:59

Seconded! Especially if "advanced" means "higher" position ;) – Heartless Angel Jan 22 '09 at 5:16
+1 for the first set, these are great books to add to the collection. – Paolo Jan 29 at 20:20

Lisp in Small Pieces by Quinniec

The Art of the MetaObject Protocol
link|flag answered Dec 26 '08 at 4:05
Technical Bard

Pragmatic Thinking and Learning will help you narrow the gap to reach rockstar-dom ;)

And Code Complete. contains basic to advanced stuff, a good reference to keep at your desk.

Plus Understanding the Linux Kernel - if you're really hardcore.
link|flag edited Dec 26 '08 at 7:33
Jonathan Leffler
53k23494 answered Dec 26 '08 at 5:34

Design Patterns by Gamma, Helm, Johnson, Vlissides. (good advanced object-oriented techniques)
Algorithms by Cormen, Leiserson, Rivest, Stein. Covers most of the common data structures and algorithms, and big-O notation & all that.
Numerical Recipes by Press, Teukolsky, Vetterling, Flannery. Good for numerical algorithms (approximating functions, solving roots of equations, numerical integration, etc.) -- not something you normally need to deal with, but if you do then this is a good place to start.
Structure and Interpretation of Computer Programs by Abelson and Sussman. It's also available online. This uses the Scheme language (similar to LISP but simpler) to discuss algorithms from a more abstract approach than found in most books. It gives some interesting perspectives, though, that you won't find many other places.
link|flag edited Dec 26 '08 at 15:22

answered Dec 26 '08 at 13:21
Jason S

If you are an enterprise programmer, take a flip through Martin Fowler's Patterns of Enterprise Application Architecture .

Its not light reading unfortunately (unlike pragmatic programmer mentioned above), but it does have some goodies in there. Though most enterprise frameworks these days basically does what that book says anyway (ala hibernate, spring, etc in java world).

Another one that was recommended to me (but I havent had time to read yet) is Java Concurrency in Practice. Its apparently the book for concurrent programming advice.
link|flag answered Dec 26 '08 at 4:44

Effective Java

Clean Code
link|flag answered Dec 26 '08 at 4:47
Kire Haglin

This is not great answer to your question but just wanted to point out I think it's a good idea to read books like http://www.mindhacks.com/book/ instead of focusing only technical books. Books about "concentration", "reading faster", "learning methodologies" and "problem solving".
link|flag answered Dec 26 '08 at 14:46
dr. evil

I'd recommend the Wrox Professional books which presume a level of prior experience.
link|flag answered Dec 26 '08 at 8:38
Dean Madden

I would like to throw in McConnell's Code Complete to the mix (one of my absolute favorites). Also see Scott Hanselman's book list.
link|flag answered Dec 26 '08 at 18:11

This one is not a book, but I'd say it's a big high-quality collection of computer related knowledge.

link|flag answered Dec 26 '08 at 17:56

The Definitive ANTLR Reference

Every advanced-level developer should be able to write language parsers.
link|flag answered Dec 26 '08 at 18:40

I strongly suggest "The Algorithm Design Manual" by Steven S. Skiena. It's a great read that covers a wide variety of algorithms and contains many helpful examples.
link|flag answered Dec 31 '08 at 2:22
Nick Gerakines

"The Design and Evolution of C++" is a great thing to read (good even if you do not know C++ well).

I also second "SQL for Smarties".
link|flag answered Dec 31 '08 at 3:07
Kendall Helmstetter Gelner

Any of Marvin Minsky's books:

Computation, Finite and Infinite Machines

Semantic Information Processing

Society of Mind

link|flag edited Dec 31 '08 at 3:57
Jonathan Leffler
53k23494 answered Dec 26 '08 at 18:32
Mike Dunlavey

Paradoxically, after approaching some level of proficiency in programming I found myself learning much more from math books than programming ones.

What I believe is a crucial skill for every programmer is ability to easily handle a lot of abstractions and strip them easily into simpler concepts. Nothing beats math in this.
link|flag answered Dec 26 '08 at 18:40

In addition to the others:

Beautiful Code
List item
Unix Power Tools
SQL For Smarties
Practice of Programming (K & P)
Joel on Software
link|flag answered Dec 30 '08 at 0:31

Mythical man Month
Essential COM by Don Box, if you are a COM Programmer
Art of Computer Programming
link|flag answered Dec 30 '08 at 1:16

The Martian Principles It's very short and very much to the point. Teaches you a lot of the things that you can do wrong when building an application. Many of the books on this list are advanced, but they're also not real practical. Martian Principles is something you can use every day to help you build more bullet-proof code.
link|flag answered Dec 31 '08 at 2:31

I would think someone would have mentioned The Lions Book by now

No comments: