Fabio Akita
This is very broad question. There is so much that "great" professionals know in general compared to the average.
Particularly I think that what makes great programmers include:
Experience. Time in the market, delivering many different kinds of software, in many different contexts with many different teammates, for a long time, makes a lot of difference. No theoretical training can replace what a good amount of real problem solving and practicing can match. The key is not doing the same things for a long time, that amounts for nothing. People that hold too strong to his current skill set, not wanting to learn something new, are usually weak.
Foundation: many programmers stay in the business without knowing the foundations correctly. That includes algorithms, data structures, different language's techniques, the basics in math, basics in statistics and probabilistic, etc. Students think that this is useless and I will say that it is not.
Experimentation and practice: programmers that only code in work hours specifically for the job requirements are not practicing enough. Expose oneself in open source projects, both by directly collaborating and also just watching and tinkering do a lot of difference.
Being current . The world is spinning. You are not the center of the universe, sorry. We need to be always aware of our surroundings. It doesn't matter if it doesn't fit our
personal tastes. Tastes can change. So people that keep in touch with what's going on is always one step ahead.
Business mindset. Again, lots of programmers think they can get away by not understanding the real purposes of the software they are writing. This is one the biggest mistakes and the worst myth in the programming market. Programmers that can understand the big picture, understand the trade-offs, understand how to make good cost-effective decisions make themselves apart from the rest.
Teamwork. This is again, not technical, but people that can't get along other people tend to become useless very fast. Of course, there is always the case when one person holds a knowledge so hard for anyone else to grasp that they can get away with it. But this is the edge case, the rare exception. In reality, people that is unable to work together with other people, regardless of their skill levels, are very useless.
Less ego, more results. From my experience, the "average" programmer tend to think that they know better, they tend to be heavy on NIH ("not invented here") syndrome, they tend to open big discussions with no end. And in the end the real "results", real delivered software, less regression bugs, real business goals achieved, are very very low and tend to zero. The larger the ego the smaller the real result. And they tend to be mischievous, throwing the blame to someone else or to "unexpected" situations. Again, people that tell too many excuses with too little solutions, are always a problem.
The question is very generic, so the answer is not specific to just programmers, but to "professionals" in general. There is no such a thing of "I'm special" then I can get away with things. It rarely happens.