Terence Parr has some excellent information to share:
Software is more an art or skill than a science or engineering discipline. The most effective means of becoming a great programmer is through an apprenticeship (even if self-directed). There is no substitute for coding a big system that evolves over time. It seems to take about 2 to 3 years before somebody absorbs the important lessons. You can read books and papers in an effort to avoid common mistakes, but talking to and working with other programmers still seems to be the best (if slow) approach. As Chris Brooks says, becoming a commercial programmer is like becoming an architect; being a junior associate for a while is part of the process.
In this document, I have tried to remember and distill my hard-fought 3-year experience as I evolved into a programmer capable of building a commercial product, http://www.jguru.com . Naturally this is a not complete list of programming advice, but rather what I learned on this project.
[Via Gordon Weakliem]