Ben Collins-Sussman writes about the two types of programmers – the alpha programmers and the rest which make up 80% of the programming world. Jeff Atwood writes about building a bridge between the two to make an impact in the software development world. I am not very keen on the generalization, nor do I think that putting people in groups helps.
But there definitely are patterns in development of the programmer. I think the difference is developing a self-belief, independent of your job and work. Many a times I have met people who are motivated more by the business than by the discipline of software development. I cannot claim whether it is wrong or bad, but that is what makes people learn only the tools, not concepts. More often than not I talk to a programmer working on SAP tools without any idea about what an ERP is. Or programmers proud to be working on either Java or C++ without trying to understand the OOP concepts and principles. But they are comfortable, it is earning them bread, perhaps much more than that and they are able to live a life they want.
And I do not think it is the fault of the programmers themselves alone. Even the companies benefit from this. I remember a conversation with a manager when he said that he was looking for junior programmers. He wanted them to not think, just do what the seniors tell. It is a lot easier to deal with them and negotiate lesser salaries, and perhaps blame them too. And these companies like to keep a wider gorge between these senior and junior programmers. The junior programmers are taught to get look at the business instead of trying to get better at software development.
The companies benefit from these programmers not developing their self-belief and their own understanding. Else they might refuse to do the paltry things that the company might expect from them or just leave the company for greener pastures. I have heard before that it is difficult to manage a company where all programmers think.
That is the reason, as a programmer, I think you should build your own self belief and understanding. And the best attempt you can make at it is to learn outside of your job, which I call out of job thinking. It is not about yearning to learn every new programming language or paradigm or hack into a new product. It is about building your own thought process about software development, and trying to get better at it. If every programmer tries to do this, I think the bridge will be automatically built.