Programming is like most things in life: hard if you have no affinity for it, much easier (but not necessarily easy) if you do.

I see programming to have a lot of parallels with being a combination mechanic and automotive engineer.

A mechanic fixes cars, diagnoses problems, tunes a car and so on. It's really a lot like (code) reading, testing, debugging and maintenance--all key programming skills.

An automotive engineer will actually a design a car, design and various components, model how it should work and so on. This is really program design and programming specifically.

The thing about programming is that involve perhaps the most tractable medium humans have ever used. It takes a long time to design and build a car. It still takes a long time to make significant changes to that car. Now compare that to software, which is easily changeable with a feedback loop that can be measured in as little as a few seconds (edit code, save, reload page in browser).

Of course some software has a longer feedback loop but at worst it tends to be in hours, possibly days. It's a different order of magnitude.

Cars can be adjusted within fairly tight limits (meaning you can make the engine more efficient or make the brakes work better or not at all but you can't easily make that car float or fly).

Is programming harder than being a mechanic and/or automotive engineer? Empirically I can't answer that question. I would be useless as a mechanic. Could I learn? Possibly. Would I be as good as those with a natural affinity? Absolutely not.

One thing I'll add is that the barrier to entry for programming is probably higher but this might simply be an issue of complexity.

Consider a car from 40-50 years ago. It wasn't that complicated. Now? Cars have dozens of computing units in them and qualified mechanics have to use computer systems to interface with them. So perhaps modern software is more like a modern car than a car from the 70s.

Now consider another discipline like medicine. Is medicine hard? It certainly requires a lot of knowledge. Part of many medical disciplines it appears involve a significant amount of rote learning. Bone names, nerves, diseases and so on.

Some have an affinity for rote learning and some don't. I know I don't.

The other part of medicine is the mental attitude required. Not everyone is psychologically capable of dealing with a patient who is dying or has the mental endurance to perform a 12 hour heart transplant. It's very exact.

But is it harder?

My own theory is that some people can become programmers and others can't. Some of the ones who can't sadly are employed as programmers.

Programming requires an extremely high level of abstract thought. I remember demonstrating to my sister how I used Splashtop on my iPad to connect to my PC at home to start it doing something. To her, it was for all intents and purposes magic (to paraphrase one of Arthur C. Clarke's laws).

To me--and anyone reading this--there's nothing magical about it. It's simply a system of concepts built on top of other concepts.

This also changes my thinking. I see (human) language much like a network protocol. Letters are merely agreed-upon symbols that, when combined, form sounds (most) humans are capable of making. Combine those sounds (or groups of letters) into words and you have a another layer of agreed-upon concepts (or definitions).

Network protocols work much the same way. Ultimately there is a physical layer where certain voltage differences equate to 1s and 0s. Once you have the concepts of transmitting bits, you arrange them into bytes. Certain bytes or byte sequences resolve to characters. Combine those characters and you have a message.

It's systems built on systems. Do non-programmers see language that way? Unless they're linguists, probably not.

So I guess my point is that programming (or anything for that matter) may simply look hard because the foundation in concepts simply isn't there. Whether or not someone can learn those concepts and whether or not that makes programming qualitatively hard is another matter.