Взять для начала самый простой инструмент (язык)
так чтобы не путаться в многочисленных нюансах и не в меру широких и оттого сложных возможностях.
Писать разные задачи... Разными методами... Книжки читать
По алгоритмам, а не языкам...
Алгоритмы ЦОС или алгоритмы компьютерной графики или что вас больше интересует. Пытаться реализовать на ЛЮБОМ (пусть простом) языке.
По поводу программистов... Ну конечно, чистых "обезьян", которые хаотично колотят клавиши, пока программа не заработает, наверное, не бывает (хотя иногда очень похоже).
Чистых программистов, которые знают методы, но не могут реализовать - тоже (вернее их не называют программистами - это математики, скорее).
Истина, как всегда, посередине
В реальной жизни ошибки допускают все - это естественно
Только одно дело, когда ошибки в синтаксисе или там "ой, блин, тут же не с нуля, а с единицы считаются и вообще не прибавлять надо, а отнимать, вот я баран"... Такие ошибки - очень локальные и легко исправляются... Это _ХОРОШИЕ_ ошибки.
И другое дело, когда программа организована косо, а ее пытаются исправить локальными правками (сейчас мы вот тут проверочку вставим, вот сюда еще условие, вот тут заплатку, тут тип поменяем, тут заглушку, а вот здесь я скопирую просто десять раз - вот вроде и завелось)... В результате, он и сам не понимает, что от чего зависит и код превращается в спагетти с заплатками... Его бы переписать с нуля, но это не в духе кодера - он отлаживает до "победного конца" - ставит и ставит новые "заплатки" пока не перестает понимать запутавшийся код.
Это _ПЛОХИЕ_ ошибки
В таком коде, даже если все запятые поставлены правильно, нереально понять запутанные взаимосвязи... Самое страшное, что такой подход косвенно культивируется рынком и возрастающей сложностью софта... И он начинает восприниматься новичками, как единственно верный.