I think its probably design - ie the approach of thinking about what you're going to do before you do it.
Too many inexperienced coders (remember when you first started) like to jump in and get something going, then add a bit more and ad a bit more and add a bit more. This approach can work if you've planned to do it that way (each bit can be tested as you go after all), but most inexperienced coders only focus on the part they're writing.. so all the additions tend to be hacked in on top. And we've all seen code that's evolved like that!
Organization is the next thing, often they're too focused on the code they've written to remember how they did it, and what was required. So they forget to bundle or document a dependency that's required. They also tend to put things where they fall, I had to criticism a junior last week who checked in his code in the root directory including 3 wsdls, 2 of which were the same file, and a set of 3rd party dlls which he committed in a sub directory and the root directory. The code wasn't formatted to any standard you could think up either, and there were several functions that were present but never called.
Obviously he got it working but it was not tidy, and that meant installation, and maintenance, would have been troublesome.