David Brooks has a great essay on which skills are difficult to master:
She’s protecting them from the most intellectually demanding activities because she doesn’t understand what’s cognitively difficult and what isn’t.
Practicing a piece of music for four hours requires focused attention, but it is nowhere near as cognitively demanding as a sleepover with 14-year-old girls. Managing status rivalries, negotiating group dynamics, understanding social norms, navigating the distinction between self and group — these and other social tests impose cognitive demands that blow away any intense tutoring session or a class at Yale. [...]
Participating in a well-functioning group is really hard. It requires the ability to trust people outside your kinship circle, read intonations and moods, understand how the psychological pieces each person brings to the room can and cannot fit together.
In the same vein, I have always been puzzled by people who say that math is hard. In my opinion, your understanding of most math that you need is directly proportional to the effort you put in, and less to do with your intelligence. It is like a ladder. Once you master each step, the next step is easy as long as you put in the effort. In fact, most of school is just that: put greater effort, reap better rewards. Through enough investment of time and effort, you can increase your scores at even exams like the GMAT that purport to measure intelligence and capability.
But there are many other areas in life where this dynamic doesn’t work because they are not one-dimensional. Dealing with other human beings is one such scenario. You have to use different tactics (kindness / toughness / incentives / self-abasement, etc.) to get other people to do what you want. Getting a bunch of people to work towards the same goals means learning not only to deal with each person individually, but also how those people interact with each other. For example, how giving one person more responsibility in the team will affect the ego and motivations of other persons in the same team.
Programming is a learnable skill. The more you work on it, the better you become. You can master the intricacies of a language, understand different patterns of building software, acquire the knowledge of useful algorithms. Practice keeps your skills sharp. There will always be edge cases which are beyond you, but for most mundane programming tasks, if you are willing to improve yourself, you can do the job. In this regard, programming is just like math. In math, 1 + 2 = 3 always (unless you are in some weird alternate universe). Your program is either right or wrong. And you have metrics about performance, program size, etc.
But let us take software development. I am making perhaps an arbitrary distinction between “programming” and “software development”. So let me be clear. Programming is solving a well-defined problem. Software development is defining the problem in the first place. Once you have a question, it is usually easy to solve it once you have the tools and the knowledge to use them. If you don’t know the question, things become a lot harder.
Software development is about that tricky part. It is about understanding your customer, sometimes talking to them and sometimes not knowing them and only understanding them through observation. It is also about working with multiple people to build a coherent quality system. It happens in the real world where things can go wrong and frequently do. I don’t need to elaborate because you know what I am talking about. It is far easier for a single programmer to pick a problem and solve it than for a huge team to define the problem and set about to find a solution to it.
As a related example, I was recently intrigued by all those YouTube videos of world records by Rubik’s Cube solvers (< 10 seconds!). Wow, those guys must be so intelligent! Anyway, so I bought a Rubik’s Cube and found that there are well-defined steps to solving any Rubik’s Cube. And if you are sufficiently advanced, you can actually solve any Rubik’s Cube in 20 moves. So practice, practice until you get there. Maybe you cannot do it in 10 seconds, but even 30 seconds will impress friends who don’t know this.
Similarly, programming looks like some supernatural act to those who don’t know programming. And some nerds like to encourage that. But in reality, if you have the programming skills, most of what you do is incredibly banal. Good programmers recognize this, seek out greater challenges beyond what they know and push themselves. But doing what you already know is not such a big deal.