I think software development, apart from the most basic programming, is an inherent trait that cannot be learned -- much the same as playing an instrument. I played in a school orchestra and one of the other musicians played the French horn. He could get the basic tones out but had no sense of beat and could not play syncopes or counterpoint, no matter how much we helped him.
Programming is a mix of skills ranging from "language" skills, where the programmer needs to understand:
- The syntax of the programming language
- The semantics of the programming language
The programmer also needs to know how to "interface" and thus understand:
- The interaction with the OS
- The interaction with storage systems
- The interaction with networking systems
- The interaction with the presentation layer (this includes communicating with the user)
- The limitations of each subsystem
And lastly the programmer has to solve the problem and therefore needs to understand:
- The problem
- The solution
- The different ways of achieving the solution and select the best in the circumstances
- What can go wrong at every step and catch each possible error in a meaningful way that does not break the functionality
On top of this, any seasoned programmer knows a number of "tricks", methods and algorithms, and can select the best for the current job. The list is probably not even complete, but the best I could do at short notice.
Many of the above skills can be learned, but some are just beyond many, if not most, people like understanding the semantics of the programming language (Perl is notorious in this respect) and the intricacies of the interaction with the subsystems (like how a program can fail miserably when ported from *NIX-type systems where filenames are case sensitive to Windows where they are not), to name two. And coming up with a solution to even simple problems is impossible for many -- believe me, I have seen quite a few failing. What can go wrong and how to catch it is a challenge for even the most seasoned programmer -- it is near-impossible to learn this if you do not have the "gift".