I got several comments about my Can you learn to program better? post, mostly asking what I thought were the things that helps programmers makes the leap from average joe programer to the uber developer. Harry had posted in the comments a great explanation:
The most important fact is that for every improvement they are usually a 'pattern' or 'paradigm' shift, rather than single improvement. What I mean is, there are almost many skills and behaviors you have to learn first before you can be comfortable in the new level.
For instance, everyone knows TDD is good, but not everyone practices it. Some of us trying to do it in our code and found it difficult and don't know whether those tests are useful or not. Only later when we learned more about DDD to make our object model solid, MVP/MVC to make our presentation level untangled, NHibernate to coquer the ORM chasm, we realized that everything kind of make sense to us. But before that, most programmers are just stop trying, claiming there is no difference between good and bad, or just move to management. ;=)
If my theory is true, here are some ways to get to the great level:
1. You can keep trying, and finally get there.
2. You can speed up your learning by invest a lot of money on books, trainings, ... etc to help you get there. (Training, Conference)
3. You can join a strong team, so you can focus on only learning small amound and feeling safe that your team will help on others. (Pair Programming)
In any ways, it's hard if you don't have help (company support, team support, ...). It will even slow your productivity.
I would have to say that I agree in full. There isn't a single thing that you can do to significantly improve your abilities. My current tag line is "Specialization is For Insects", and I believe that this is the case. Yes, development has grown huge and we are told that we must specialize. But before we can specialize we need to understand a lot of the general stuff.
A lot of this come from doing stuff. Not just routine stuff at work. I have a lot more respect for someone that dedicate from their time to build stuff for themselves. I am a great believer in OSS resume, as I have stated before.
Don't stay in the same field, if you are a winforms programmer, go grab ASP.Net book and build a project. If you are a winforms guy, drop to the database and write some store procedure and tweak some indexes. Build your own Ajax framework and write a custom control for WPF. Spend some time making a database server dance to your tune, then turn your head toward a profiler.
Write at least one hard-core, low level utility that you can use on a frequent basis. Get a book about networking and build a network tracer, learn python and use it for a month for all those daily tasks. Get Ruby on Rails book and implement the excersizes, spend some time digging through the academic literature. Write a chapter for a fictional book about a subject that interest you. Go give a lecture in a user group. Write some COM interop code, and then implement A*Star.
Spend a day in notepad and compiling from the command line, build your own DSL toolkit. Create a program that dynamically compiles and run itself, prevent it from killing your computer. Dedicate an hour a day for a month to answer questions in a tech forum / newsgroup. Open a blog and post about your cat. Take a look at the sky and try to reduce the abstraction.
You are not expected to do any of the above, as a matter of fact. If I will ever meet someone who did it all, I would make sure to keep them far away from any caffeinated beverages. The easiest thing in the world is to remain in the part that you already know. You need to learn new stuff, and you need to do it all the time. Find a subject that you don't know and learn a bit about it. Improve your learning skills to the point where you see new stuff as adventure, not a treat.
At any rate, what I am trying to say is that you need to act. Doesn't matter what you do, you need to keep pushing your knowledge until extra knowledge is easy to absorb. Learn to be articulate, that one is important.
I can tell you right now that I know of a lot of subjects that I really would like to know more, which range from compiler theory to 3d math, to knowing right from left. I think that the most important thing that I have is the belief that I am able to do it when I need to. Do not be afraid if you don't get it in the first few times, often enough you need extra knowledge that will come by, and when you will return to it, it will be much clearer.
I am beginning to sound like a self help book, I am afraid, so I will stop. Go get the Pragmatic Programmer book, though, that will help.