From: http://worrydream.com/refs/Brooks-NoSilverBullet.pdf

The conclusions are not what is important, but the thought process is brilliant. You are doing things that are Essential (the business logic, the solution to the actual problem, the source control) and Accidental (the Java boilerplate, the system administration, the git vs. mercurial debate) It is an incredibly useful way to view the world.

A good programmer is doing something new (at least to them) every time they write a program.

Why is this so? Because a good programmer re-uses code. So if they had solved this problem before, they’d be re-using old code. And whenever possible, a good programmer uses libraries. So if someone else has solved the problem, and made a library, a good programmer would be using that library.

So a good programmer, if they’re tacking a problem that they don’t have old code or a library for, is tacking a problem that (at least) they have never solved before. Which means every problem is a new problem (at least to them), and thus generally pretty hard. (and creative Hackers and Painters)

In short, programming is inherently difficult for the exact same reasons all problem solving is inherently difficult. And that’s on top of the other things Brooks points out: inherent essential complexity, inherently large difficulties in communication and coordination, and second-system syndrome.