Ответ довольно прост по сути, но не очень короток в объяснении.
Если у человека есть особенности психики, которые способствуют инженерной деятельности и программированию, как ее форме, он может стать очень хорошим программистом быстрее большинства, при условии, что будет усердно учиться и упражняться в применении всего, чему научился. Если он не будет учиться, никакие способности ему не помогут.
Если у человека нет особых склонностей, ему понадобится несколько больше упражняться, чем если бы они были. Но, таково большинство людей, так что это точно не должно служить препятствием для обучения, от которого, в данном случае, результат зависит полностью.
Если у человека есть психологические особенности, которые противоречат инженерной деятельности (например, он чудовищно неорганизованный и никак не может заставить себя соблюдать любые формы порядка), ему будет крайне трудно стать хорошим программистом, сколько бы он ни трудился (способность соблюдать порядок, как минимум - в коде, для хорошего программиста - обязательна, ее нечем заменить или скомпенсировать).
Есть редкие случаи, которые не укладываются в общую схему, но на то они и редкие, что их стоит рассматривать только как исключение.
Добавлю, что такое деление на три группы нужно понимать, как деление на три интервала, между которыми нет четкой границы. Скажем, где-то в нижней области второго интервала существуют люди, которые слишком много времени вынуждены тратить на борьбу со своей природной неорганизованностью, потому именно "хорошими" программистами им быть сложно - условный error rate слишком высок, даже если они, в конце концов, могут исправить всё, что накосячили, пока те, у кого этот error rate - ниже, двигаются вперед быстрее в решении задачи. Также и наоборот - усердный и терпеливый посредственный программист может систематически работать лучше ленивого гения, хотя гений иногда и способен придумать за час решение, которое будет эффективнее решений, на которые другие потратили дни.