I've just finished reading "Java Puzzlers: Traps, Pitfalls, and Corner Cases" by Joshua Bloch and Neal Gafter (Addison Wesley, 2005). This is a collection of small, often simple examples that produce (usually) surprising results, along with an appendix of guidelines produced by examining the puzzles. Both authors were part of the core Java development team at Sun, right up until the release of J2SE5, when both of them left for Google.
One of the most interesting aspects of the book is what these two, who are about as close to the center of the Java universe as you can get, quietly said at the end of some of the puzzle solutions, in their "lessons for language designers." Which is to say, "if you are designing your own language, here's something you should do instead of what Java did." Which is to say "where Java didn't get it right," in the gentlest possible terms.
I really like this weblog, cause it points out very interesting thoughts, which I mostly agree on. He says: Java has obviously moved the programming world forward, but I think its major wart has been the inability of the adherents to look at Java objectively. I totally agree on that, especially when it comes to the Java vs. .NET war! He also mentions the Java community, which he thinks tends to stifle problems and questions, when it comes to Java's design. I only agree on that partially, cause I think Java developers are quite honest when it comes to the design (and the flaws that comes with it) of their software. Well anyways, I'm thinking of getting the book, cause it sounds quite interesting.