Основная проблема — это написание кода в лоб. Пробелы в знаниях языка и его конструкций толкают разработчика на прямолинейные реализации. Отсюда множественные вложенные циклы и все то, что называется индусским кодом, который невозможно поддерживать. Справиться с этой ошибкой поможет чтение хорошего кода коллег, кода open-source-проектов, документации.
Так же часто встречается ошибка, связанная с написанием собственных библиотек, реализацией функционала (велосипедов), когда есть готовые или общепринятые. Кроме очевидной потери времени на написание кода и последующую его поддержку, код одного человека заведомо не может быть лучше (исключения конечно есть) кода, который досконально протестирован и уже несколько лет используется многими разработчиками во всем мире.