I’ve been thinking a lot about good programmers lately.
I think the only real requirement to become a good programmer is a genuine love of the work (which is no different from any other trade I imagine). If you don’t actually love programming you can still achieve a level of proficiency that will allow you to be a professional and make a living, but it’s bad for you, and it’s bad for the world.
It’s important to note that even if you love to program now, you might not always love it (and the converse is of course true as well). I’ve been programming since childhood, and while most of my life I’ve loved it, there have been several long stretches (years) where I wrote no code at all (or if I did it was out of obligation).
During these times I thought that I had reached a point where I was no longer going to be a programmer. I thought that I, or the world, had changed and it was no longer something I was going to do. Each time this passed, and each time I understood afterwards why I stopped programming. These experiences have made me a better programmer.
Tools come and go, as do interest, motivation and resources. If you love to code, do it. Don’t let anyone else tell you you can’t (or shouldn’t), especially because your work doesn’t fit in with the current fashion or trend (remember that what’s practiced today will be obsolete tomorrow).
Learn a number of languages, systems and other tools; not just because each will teach you something new but more importantly you’ll start to see what they have in common, and what all programming tools have in common, and those are the things that great programmers carry with them through time.