Why is software development so hard? It could be argued that software development is so hard because programming is so easy. Since this seems to be contradictory, I will explain what that means.
Whether or not most people realize it, the titles "developer" and "programmer" are not interchangeable. Nearly all of us (myself included) start out as programmers. We learn the programming languages, the syntax, the data structures, the program flow controls, and how to assemble these elements to produce useful components. A good programmer knows the languages, the object models, and the techniques that are capable of producing stable, working pieces of code. But a good programmer is not a software developer. Some people remain very good programmers without ever moving to software development.
To become a software developer takes a good programmer who breaks out of the "program" mindset. A program does a specific task very well, but most professional development projects must go beyond specific tasks. When a company or government agency starts a project it is very seldom a project to create a program. Instead, it is typically to create a solution. This is a very important distinction. A program is a software solution to a single, focused problem while a system is a collection of programs that satisfy a much broader class of problems.
For example, a project to transform data from a legacy system to XML results in a program while a project to make data across legacy systems available to a web-based front end is a system. The difference is that while the transformation program does a single job very well, the legacy to web system consists of many, many components, any of which at their core are a program.
From this view of program vs. system, it makes sense that a software developer is not the same as a programmer. While a programmer must be an expert in a very narrow domain of the overall problem (depth), a developer must have a solid understanding of both the depth and breadth of the problem. Not only must the developer know how to create programs, but he must also know how to assemble the many programs that perform the various tasks required to solve the larger problem.