Smart. Motivated. Works well with others. Has passion. Good problem solver. Detail oriented. Able to focus.
In order to be a great programmer, how many of these are important? All of them.
How many are necessary? None of them.
I once had a calculus professor who said, “Many students are simply unsuited for the sciences.”
I disagreed with him then, and after many years of work experience, I disagree with him more than ever. I firmly believe (with some exceptions) that almost anyone can become great (or at least very good) at almost anything. I’ve seen it over and over again.
I have worked with hundreds of programmers over the years and screened thousands of others. Almost all of them consistently delivered substandard work. Not because they weren’t smart or motivated or capable. More likely because they weren’t taught properly and were in terrible environments.
Teach someone how to do the job properly, give them an environment in which they can thrive, give them a chance to do quality work, and treat them like human beings. Then watch what happens. But companies are too stupid or lazy to do this, so they think they’ll just hire talent and dump them into their already sour environment. Fix the environment and let regular people become great.