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 dont 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 dont 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.