The most important aspects of a great programmer are:
The ability to learn what users need.
The ability to learn how a how a system works.
The ability to learn the cause of a bug.
The ability to learn from mistakes.
And the ability to solve complex problems.
Domain specific knowledge has some limited value but flexibility of thinking is far more important.