Computer Programming is hard! It’s at least as hard as what commercial architects do, and I will argue that it’s as intellectually difficult as what doctors and lawyers do.
Many people think it’s easy, because they know some nine-year-old who “programs,” but there’s a difference between fooling around with the computer and building good software applications.
When you write a computer program, first you have to get both the syntax and the semantics absolutely 100% correct. It’s like writing a large novel with no spelling errors, no grammar errors and no typographical errors. That much is just the syntax part. There’s also the semantics part. The novel also has to make complete sense. There can’t be any of those little oops moments that readers love to spot. For instance, you can’t refer to some minor character as a barber and later as a grocer.
So a software application is like a large novel with zero mistakes in typography, spelling, grammar or logic. That’s the “writing it right” part. It also has to solve a problem or meet a need. It has to be designed for a specific purpose. In this sense, a software application is more like a large building than a novel. The novel metaphor helps illustrate the need for perfection and the difficulty in achieving it, but there is also a dimension of usability necessary with software.
Some novels deliberately challenge the reader. They require effort on the reader’s part. For example, science fiction novels sometimes invent new words or even a new language. Consider A Clockwork Orange by Anthony Burgess or the invention of the Klingon language in Star Trek (there are fans who have learned, and can speak, Klingon). Or consider the canonical “hard to read” novel, Finnegans Wake by James Joyce.
Such novels, as software, would not be “user-friendly.” In fact, Finnegans Wake would be considered “user-hostile,” which is the opposite of what good software should be. Software is a tool, and it should be as easy to use as a hammer or screwdriver (or a chain saw or a car). This is where the building architect metaphor takes over from the novel metaphor. Buildings may be designed to be beautiful and perfect, but they also need to be functional. Humans use buildings, and a good architect always keeps that central to the design.
What this means is that good software designers are part author and part architect. Doing that well requires training, experience and possibly some native skill. At the least, it requires an aptitude for detail, a passion for correctness, an eye for design involving human factors and the ability to think in the abstract.
Architectural drawings are abstractions of the real building just as a computer programs are abstractions of the operation of the software. And since running software is something of an abstraction, the program is an abstraction of an abstraction!
§ § §
Software designers are also part researcher. They need the ability to look stuff up; that is a constant element of the work. In fact, the second rule I give to young programmers is, “Learn to look stuff up. You will be doing it for the rest of your career.” No one can remember all of the information that goes along with software design. Some programming languages are complex enough, or large enough, that you must constantly refer to the manual even after years of experience with that language.
It also requires the ability to constantly learn new material. That’s the first rule I give newbie programmers, “Learn to learn. You will be doing it for the rest of your career.” Whether it’s a new language, a new protocol, a new method or a new programming tool, there’s always something new to learn. It’s definitely not a career for the casual!
And it is in the requirement to constantly learn and constantly research that I think the difficulty level of software design approaches the intellectual level of doctors and lawyers. Both those professions contain vast amounts of specific and detailed information that constantly evolves. In fact, the body of information is so large that many practitioners specialize in a single aspect of it. There are bone specialists, heart specialists, property law specialists and criminal law specialist. There are generalists, too, and it is generally understood that they sacrifice expertise in any one area to work with the broader view.
Doctors, lawyers and programmers require many years of study before they are truly useful. It requires many, many years of study to become expert. (Remember Malcolm Gladwell‘s 10,000 hour rule!) It requires constant study to remain useful and expert.
Comedians often use it as a joke, but there’s actually good reason that the word, “practice,” is used for doctors and lawyers. It requires constant practice to be good (just as with musicians and athletes). The same is true of software designers.
§ § §
You may notice I do not use the term “Software Engineer” here. I reject that term and do not allow it to be applied to me (despite over 33 years of practice). I refer to myself as a computer programmer or, if I want to be fancy, a software designer.
The problem is that right now, there’s no licensing or oversight for programmers. Anyone can call themselves a programmer; many anyones do. That is why the term “Software Engineer” is rightfully offensive to Real Engineers. Real Engineers have licenses and certifications and prescribed educations. No such exists (currently) for software makers. It is still a new craft in our society (it goes back only to the 1950s or so), and we haven’t caught up to how complex and demanding it really is.
Over my career I’ve met and worked with many programmers, and well over half of them should not be allowed anywhere near a keyboard. Education is no indicator; some of the worst programmers I’ve seen have advanced degrees (albeit usually from schools not known for their computer science curriculum — chances are that someone from, for example, MIT is very good). Conversely, some of the best programmers I’ve known are self-taught (I am largely self-taught, and I think I’m pretty good at what I do).
I believe that eventually society will catch up with the difficulty inherent in software design. Then there will be the same licenses, certifications and prescribed education for this craft as for engineering (or architecture or medicine or law). Then the quacks and shysters will be more easily recognized compared to the true professionals.
That day may be coming soon, Many organizations are recognizing the value of good software workers.
They are recognizing one simple fact:
Computer programming is hard!