Effective Java by Joshua Bloch (creator of Java Collections Framework) is a book on programming. It contains examples on common mistakes people make, best practices for software design, Java gotchas and introductory material on new features of Java language.
Although some parts of the book are specific to Java, in general it contains advice that would be useful in any object oriented language. Even tough it’s heavy in content and requires your full mental attention, it is organized in chapters containing several suggestions on a specific topic that make it easier to read.
It was interesting to came across interview questions I’ve been asked in the past which were derived from examples in the book (designing a point class with a color, and implementing its equals method).
It was enlightening to learn about why certain APIs are designed that way in SDKs I use daily. (Builder pattern when creating a Dialog in Android for instance)
It was also embarrasing to come across examples of bad code and remember similar code I’ve written in the past :) Some of the programming sins I’ve committed were not using enums when needed, depending on ordinals of an enum and not overriding hashCode when overriding equals.
Overall, "Effective Java" is one of the best technical books I’ve read and is a real gem. It contains exactly the advice an intermediate Java developer needs to be a better programmer. It should be required reading for all team members working on a Java project.