Не программист - тот кто вообще не может решить проблему (написанием кода).
Плохой программист - тот, кто может ее решить. Но решает так, что пользоваться этим не возможно, и проблем от его решения становится только больше.
Средний программист - это тот, кто уже может решить проблему. Но, со временем, его решение обрастает соплями и ведет к большей проблеме (но уже на длительном промежутке времени).
Хороший программист - тот кто решает проблему и заодно предвидит/предотвращает будущие возможные проблемы.
Отличный программист - тот, кто знает, что действительно стоит предотвращать и предвидеть, а что не стоит решать сейчас, так как потом это вероятнее всего и проблемой не окажется.