I'm a programmer who isn't so hot with design. But I certainly know how to use a program to layout objects; that's trivial to learn on the grand scheme of things.
What I (and other non-designing devs) don't get is how to know what "doesn't work". I have at most a fuzzy idea of what are considered good and bad designs, much less how to produce them.
One of the biggest issues is the lack of feedback. With beginning programming, you are getting constant feedback from the computer. It even tells you where you are going wrong (line numbers, variables, etc.)
Design lacks such an objective feedback system. Sure, there's the times when your friends will agree that iteration B is superior to A. But actually getting feedback on what to do next? Pretty tough.