- Decoupling your code (DI is an excellent approach) - You can use Spring, Google Guice or even EJB3 - Unit Testing and Integration Testing - In Both, you can use JUnit + Any mock object framework (I like JMock + Hamcrest) - Automatic build process - I use Maven instead Ant - SVN or CVS - SVN is better in my opinion - Refactoring - A good IDE, like Eclipse, can help you in this task - Keep your code as much simpler as possible. - Paper, Pen and a Dashboard
I would add index cards, and since recently also planning poker cards.
You don't need a DI framework to practice dependency injection, by the way. In my experience, simple DI through constructor parameters works just fine most of the time. In many cases it seems to me that the flexibility of a DI framework isn't needed at all and the additional indirection just makes it harder to understand and navigate the structure of the system.
The soul is dyed the color of its thoughts. Think only on those things that are in line with your principles and can bear the light of day. The content of your character is your choice. Day by day, what you do is who you become. Your integrity is your destiny - it is the light that guides your way. - Heraclitus