Acho que provavelmente é o design - ou seja, a abordagem de pensar sobre o que você fará antes de fazê-lo.
Muitos codificadores inexperientes (lembre-se de quando você começou) gostam de entrar em ação e começar algo, depois adicionar um pouco mais e anunciar um pouco mais e adicionar um pouco mais. Essa abordagem pode funcionar se você planejou fazer dessa maneira (cada bit pode ser testado à medida que você for, afinal), mas a maioria dos codificadores inexperientes se concentra apenas na parte que está escrevendo. Portanto, todas as adições tendem a ser hackeadas em cima. E todos nós vimos código que evoluiu assim!
A organização é a próxima coisa, muitas vezes eles se concentram demais no código que escreveram para lembrar como o fizeram e o que era necessário. Portanto, eles esquecem de agrupar ou documentar uma dependência necessária. Eles também tendem a colocar as coisas onde caem. Eu tive que criticar um júnior na semana passada que verificou seu código no diretório raiz, incluindo 3 wsdls, 2 dos quais eram o mesmo arquivo e um conjunto de dlls de terceiros que ele cometeu em um subdiretório e o diretório raiz. O código também não estava formatado para qualquer padrão, e havia várias funções presentes, mas nunca chamadas.
Obviamente ele conseguiu funcionar, mas não estava arrumado, e isso significava que instalação e manutenção teriam sido problemáticas.