views:

3095

answers:

25

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?

+4  A: 

Lisp in Small Pieces by Quinniec

The Art of the MetaObject Protocol

Technical Bard
+6  A: 

The Art of Computer Programming by Knuth.

Introduction to Algorithms by Cormen, Lieserson, Rivest and Stein.

S.Lott
It's a great book, but only really useful if you want to pursue the analysis of algorithms.
Mitch Wheat
@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
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
@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
+25  A: 

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.

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
+3  A: 

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.

Chii
+3  A: 

Effective Java

Clean Code

Kire Haglin
+6  A: 

These are my favorite advanced programming books. They are sorted by inverse specificity.

Colin
+9  A: 

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:

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).

Jonathan Leffler
+4  A: 

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.

melaos
+7  A: 

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)
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
+2  A: 

I'd recommend the Wrox Professional books which presume a level of prior experience.

Dean Madden
+4  A: 
  • 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.
Jason S
+3  A: 

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".

dr. evil
+29  A: 

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.

joel.neely
I agree. When you understand the topics in Effective java you could judge better some other languages and apply the lessons there.
OscarRyz
I'm surprised that Code Complete hasn't made it to that list
Maciek
+1  A: 

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

http://c2.com/cgi/wiki?WikiList

+2  A: 

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.

Echiban
A: 

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.

maurycy
+1  A: 

The Definitive ANTLR Reference

Every advanced-level developer should be able to write language parsers.

RogerV
A: 

In addition to the others:

  1. Beautiful Code
  2. List item
  3. Unix Power Tools
  4. SQL For Smarties
  5. Practice of Programming (K & P)
  6. Joel on Software
Fortyrunner
A: 
  1. Mythical man Month
  2. Essential COM by Don Box, if you are a COM Programmer
  3. Art of Computer Programming
  4. SICP
Vinay
+1  A: 

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.

Nick Gerakines
A: 

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.

jcollum
+1  A: 

"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".

Kendall Helmstetter Gelner
+6  A: 

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

And for more technical, generic stuff:

We never stop learning. When we do, we're dead.

KOkon
Seconded! Especially if "advanced" means "higher" position ;)
Heartless Angel
+1 for the first set, these are great books to add to the collection.
Paolo
A: 

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

Sean McMillan