As Ben pointed out a great study a while ago, as your incompetence goes up your ability to rate yourself goes down and you will rate yourself very high. Which follows your point.
But I think when you factor in interaction with other programmers and insecurity and failure you quickly learn where you really stand, and then it is a matter of hiding or leaving or believing you will get better. Or calling in the political correctness troops.
We have a couple who belong at about 70% level. Usable production programmers, but people who can't be trusted for the entire picture. If you need to be managed, if you accept that code will always have some bugs, if you think you can blame you environment for your personal failures, you are not a "real" programmer to me.
One of them was sure he was in the "elite" when he was the 70%er in a group of idiots. I saw him as the best of the group and chose to keep him on the promise he showed. But he stayed there and got no better. The ego is still pretty high, but the cracks are showing.
You also have the portion of the 10% who are so incapable of interaction with the rest of people (90% of programmers, managers, customers, etc) that the actual base of usable programmers from a corporate perspective is far lower. We got rid of one a while ago. He was FAR better than me when going in Perl. But his actual productivity relative to what we needed sucked.
As I get older I am more and more aware of what I don't know. That grows far faster then what I do know, so my knowledge base is constantly shrinking. I'm quite aware of this.
I used to think with enough time and money I could create/code/setup anything. Now I know better. I'll never have enough time. The only way to gain time it to multiply your ability over other people. So I also need political muscle since I am merely a catalyst to a much larger group of people who need to get things done.