Programming Pearls is a collection of columns that the author has published in the Communications of the ACM journal. The topics of the columns cover many aspects of programming, like debugging, algorithms, efficiency and data structures. Each column is about a different topic, in which the author usually presents a problem and then gradually builds several solutions, discussing their relative merits.

I think that what describes this book best is two quotes from it. One from the epilog:

The most important [theme] is that thinking hard about programming can be both useful and fun.

And the other from section 12.3:

One part of a programmer's job is solving today's problem. Another, and perhaps more important, part of the job is to prepare for solving tomorrow's problems.

It's a fun book to read for any programmer, and I highly recommend it. The only problem with it is a somewhat sub-optimal programming style, in C and especially C++ (what's with all this horrid C++ in books about algorithms?). But all in all, it doesn't ruin the overall pleasant experience.

Update 30.12.2009: I've just finished going through the book for the second time, this time paying more attention to actually implementing the author's code and doing some of the exercises.

My opinion is even higher than before - for programmers of any level, this is a great little book to read. It gives you an entertaining tour through most of the important issues of programming, allowing you to either just read the text, or get your hands dirty with the code. The second option is, of course, the preferred one, although naturally much more time consuming.