I am having a ball reading The practice of programming by Kernighan and Pike. I read some controversial opinions on the web about the book, ranging from praise to the most ferocious critiques, but I definitely situate myself with the former group.
The authors express their intent in the preface, and their goals are simplicity, clarity, generality, and automation, and in my opinion, they do a fantastic job of it. The book must be read from a historical perspective, as it was written in 1999, but the basics are there, and it is a fantastic refresher for topics such as data structures, algorithms, design, and implementation ideas.
I agree with some of the opponents that a few sections are very outdated (historical perspective, right?), and a lot has changed since then, especially in the realms of automated testing and replacing debugging (to a certain extent) with tests. Also, wouldn't be such a good idea to be building Java programs with Vectors and un-parameterised Hashtables. But I am thoroughly enjoying the book. Even the fact that most examples are written in C has made me go back and review what all those weird symbols such as * or & mean. Hadn't implicitly used a pointer in a while, let alone allocating or freeing up memory!
If you liked books such as Code Complete or Clean Code, you will definitely enjoy this one too!