Programming is not hard.
Sure, there are plenty of examples you can pull out of the bag that have really brain-numbingly complex algorithms in them, and they are indeed hard to program, but they are really the exception. For most programmers and most programs, this is not the case.
Most programs that fail do so not because the implementation is done badly or fails altogether, but because they implement the wrong things. Its not that the programming was hard, but that they programmed something nobody wants.
Deciding what you should program is where all the beef is.
The point I’m trying to make is maybe most prominent with beginners (although it is really not only about beginners – this misconception exists widely throughout all levels of programmers).
When I teach first-year students to program, they always think that learning how to implement their programs – how to write nice, correct, maintainable, good quality code – is the hard bit. Once you can do this, they think, you’re out of the deep water and in a much more comfortable zone. Maybe it’s good to believe this initially. After all, you cannot learn everything at the same time, and you cannot learn those things which require experience at the start.
The truth, however, is: Learning to implement your problem is really the easy bit. Well, easy, relatively speaking. When I see bad software (and you can find a lot of it), it is almost never the implementation that is the killer. It is partly user interfaces, and mostly functionality.
The applications just don’t do the things I want them to!
This observation is the same at all levels. It is true for final year student projects, shareware I find on the internet, and professional software that I pay good money for.
So many programmers with adequate implementation ability sit down and write programs that do things that end users really don’t want. And they don’t get the right ideas to implement stuff that would be of good value. The process of making decisions about what functionality should go into a program (and then what the UI should look like) is really where the 80% of software that is essentially rubbish falls down.
It’s not how to do things that’s difficult, it is knowing what is worth doing.