From what I've seen, people find programming difficult because they lack both the ability to break a problem into smaller and smaller pieces until the pieces reach the same granularity as the language in use, and the ability to anticipate a range of possible scenarios.
This hits the nail on the head. It's not that people don't understand the syntax or even the semantics of programming languages (well, some people can't write a for loop, but they're just hopeless). It's that they can't see how to use the language to get from point A ("I want a program that does x") to point B (an actual program that does x). For instance, when I first began programming, I struggled mightily with deciding how to represent real-world data. Other people might be able to decide how to represent data, but become hopelessly stuck when it comes to turning their verbal descriptions of tasks into actual algorithms. I think that this is why so many people go on programming interviews and then can't actually solve simple programming problems: they do fine when they're taking exercises from books, but they can't concretely conceptualize the solution to an even slightly ambiguous problem.