Effective Java (by Joshua Block, from Sun Developer Network), is a wonderful book that offers me hope for the new Software Engineers out there. It’s not just about writing high-performance software, but understanding the side effects and costs of skinning the cat one way instead of another. It’s a compendium of “issues” one faces while architecting or writing software, and best practices on how to face them. The concept of such a book comes from Scott Meyers’ book, Effective C++.
<rant>I feel that many schools today are teaching programming languages, not software development. They don’t teach exactly what’s happening inside the computer when you choose to write a construct one way instead of another. Or how you diagnose why the computer is doing what you told it to do instead of what you’re thinking (computers can be so pedantic!). Or how to figure out where all your computer’s resources are going. It’s sorta the equivalent of learning another country’s language without learning a thing about the culture.
I’m not saying you had to learn computers on something with a bank of lights on the front representing the registers, or feel the pain of dropping your punch card deck before you remember to make the diagonal line along the side, but even in a managed resource language, you still have to worry about the plussess and minuses of your choices</rant>
The introduction to the book states that it is not meant to be read cover-to-cover, but to be used as a reference when you need some guidance. I disagree with that. I felt that reading it start to finish gave me the insight into how to deal with more issues than this book covered, by examining the similarities between them. The real-world examples related them to implementation decisions I’ve made in the past, and even just a week ago (nasty chicken-and-egg problem with a factory class for another class).
Definitely worth a read.