Why is programming so hard to master?

Why is programming so hard? Because it’s no longer about programming.

Allow me to elaborate.

I wrote my first line of professional code back in 1987. It was an application written in BASIC that did lease calculations for computer rentals. (Yes, back then computers were so expensive it made sense to lease them by the month. Today, we practically give them away.) The program worked when you selected a computer from a list, provided the number of months for the lease terms and the program calculated the monthly payments. The program also had a feature that allowed you to print a hard copy of the results.

In terms of the work I had to do, 90% of my effort was the actual programming. The remaining 10% involved creating the executable file, copying it onto floppy disk and then installing the code on the computers of the other people in my office.

It took me about a week to write the program. Admittedly, it wasn’t exactly rocket-science programming and when I look back it, wasn’t very good programming either. But, it worked and I got paid — win-win, so to speak.

Fast forward 30 years to today. Last week I wrote a program for a class I teach. The program is called WiseSayings. It’s a web app that responds upon request with a random saying from a list of wise sayings.

Wisesayings connection

Connection to Wisesayings

It took me about 30 minutes to write the code, including application data retrieval and configuration. Yet, just programming the app wasn’t enough. Here’s just the beginning as to why is programming so hard. Containers are very popular these days, so I had to create the Dockerfile that allows users to run WiseSayings in a Docker container.

But, there was more. Not only did I need to create the Dockerfile, but I also had to post the container image on DockerHub to make it easier for others to use. This means an image build, followed by a push after I logged into my DockerHub account.

So far, so good, right? Wrong!

As an ambitious coder, I imagined that millions of people will want to use my app. So, I need to make it easy to scale, and that WiseSayings can be run under Kubernetes. I wrote a deployment.yaml to create the Pod and ReplicaSet so my containerized WiseSays app will run in the cloud and, at the least, a service.yaml to provide web access to the logic in the pods from outside the Kubernetes cluster.

If I want to provide security and routing, I’ll need to create a Kubernetes secret or two, a TLS certificate and an ingress.yaml to manage it all. I could go on. We haven’t even talked about web page creation to render my application’s response, nor have we talked about multiple-language support for the app. Who knows, maybe some of my anticipated millions of users will be in China.

How things have changed

My main point is this on why is programming so hard: 30 years ago, all I had to know to create a program was the programming language BASIC and how to structure code into subroutines — which is what we called functions and methods back then. Printing was a bit harder because printer drivers weren’t part of the operating system and your programs needed to know a whole lot about the printers they used. But, that was it. Most of my work revolved around how to express the specific application logic in code.

Today, to create my little WiseSayings app, not only do I need to know a programming language — in this case, JavaScript that runs under Node.js — but I also need to have a basic understanding of how the internet works, as well as how to fiddle with things such as status codes and all the other name-value pairs I can stuff into an HTTP header. Then, I need to know Docker and the basics of Kubernetes. I’d also like to add that there isn’t much in the basics of Kubernetes that’s actually basic. When you work with any Kubernetes API resource, it takes time to really master, even for something as fundamental as a pod.

Now you can really see why is programming so hard.

It still takes about half an hour to write the actual code and get it up on GitHub, but I now add hours to make my program available to my users. My old means of distribution involved copying the executable’s file on to a floppy disk and walking over to a user and copying that file from disk on to the desktop computer. What used to take minutes for a local code distribution has now transitioned into what now makes up the bulk of my “programming” activity, regardless of whether the code goes to a user on the other side of the office or halfway around the world.

Now, don’t get me wrong. Under no circumstance do I want to go back to the days of BASIC and floppy disks. The programs we make today go way beyond anything I could have imagined 30 years ago when I did BASIC programming on an IBM AT running DOS 3.3. I think it’s beyond cool that we’ve made it so you can point your cellphone camera at a newspaper and have the device read the text out loud to you in real time. I like watching the Merchant of Venice any time I want on YouTube with scene summaries available on my iPad. (Yes, sometimes I find it hard to follow the language of the Bard.)

These are amazing achievements, but they come at a price. While commercial software has always required the coordinated efforts of many, these days, even the simple stuff is hard and the implications are profound.

In the old days, knowledge of a programming language and a rudimentary understanding of software design was enough to get you on the playing field. Today, you need to know networking, deployment tools, automated provisioning, testing its variety of forms — from unit testing to performance testing on a distributed scale — and the details of a multitude of development frameworks.

To use a basketball analogy, in the past all you needed to play was a ball, a hoop and the ability to dribble, pass and shoot. Today you also need to know all of that, plus how to sell tickets and run the concession stands. It’s a lot of work.

Is it worth it? Of course. But, the added complexity makes the profession a lot harder to get into. Maybe this is a good thing. Medicine, engineering and nuclear physics have always been “hard to do” professions. Work in those fields has extraordinary benefits when done well and grave consequences when done poorly. Software development is now in that league.

Today, software runs more of the world. Soon it will run most of the world. Maybe it’s time to set a high bar and make it as hard as possible to play. Yet, it’s sad to think that when the next version of me comes along, that person will have to do a lot more than write a simple program in BASIC to get started. I was fortunate to have the opportunity to play and in doing so, software changed my life. Others might not be so lucky.