I think I'm going through different phases of becoming a better programmer these days and the feeling is really good.
Sources to improvement:
1. School: CS background, knowing how to break a problem down and analyze the strategy to solve it.
2. Working on side projects for fun in school: free learning, time management, experience the joy. This source also get you the most rewards.
3. Working with a large team at a big company: you learn bureaucracy and how large companies maintain code and process. Y
4. Working at a mid size company with a small team: you learn how to manage your own time since you won't have a manager. You learn to maintain your code better as the company grows.
5. Working at a tiny company you started: stressful, but rewarding. At this point you just write things that works, but the good habits developed from #4 really helps.
6. Working as an independent contractor: time management+fast coding+ coding for yourself+half managed style.
7. Back to working at a startup with a rockstar team. :)