I don’t go into a lot of detail about my work on the show, because it doesn’t necessarily interest everyone. But I do occasionally mention that I’m a software engineer, and work it into my discussions here and there. I had to take a break from the show for a year or so while I finished my Master’s Degree at UT in 2008. I have a second blog for writing thoughts about my profession; it’s called Castles of Air.
Occasionally people ask a question like the following: “I like your show. I’m a young skeptical atheist and I’m trying to decide what to do with my life. What should I study in school?” Some common answers are: Go into science. You will learn how to study the world in a naturalistic way and be better equipped to answer questions without resorting to supernatural answers. Or: Try politics. You can work to reinforce separation of church and state, and use your influence to advance causes you care about. Or: How about religious studies? You can get a real handle on how major world religions developed, and promote skepticism from the inside.
Those are all good answers, but I’d like to take a minute to speak in praise of the career track I picked.
First I’m going to toss in the most obvious practical recommendation: Programmers get jobs. The world is increasingly driven by the interaction between computers and people, as well as interaction between computers and each other to streamline tasks that make things easier for people. In some sense this has contributed to a difficult economic environment, because the more labor that is automated by sophisticated machines, the less of that is available for good paying human jobs. That’s an issue that I feel concerned about, but at the same time it means that some of the best opportunities are available to people who understand how computers work. That’s an economic fact that’s not going away any time soon.
A recent article in US News and World Report drives this point home, although you can find similar results from many, many studies released in recent years. This article ranked the best jobs of 2014 in terms of factors like salary, work availability, stress level, and growth. The number one job was “Software Developer.” Number two was “Computer Systems Analyst.” Number 9 was “Web developer.” This brings the number of computer related jobs to three out of the top ten.
Beyond that, there are some specific reasons I have for saying that computer programming is specifically a good tool to learn skepticism critical thinking. James “The Amazing” Randi has often said things like this:
A magician will instantly see the truth behind any colleague’s illusion. But we have a bit of an advantage: We know we are being fooled. Scientists are instinctive doubters who employ a rigorous method to zero in on the truth, but they aren’t necessarily trained to expect deception by subjects and collaborators.
Programmers are trained to expect deception. We have no choice, because computers and computer users lie their asses off on a regular basis. When you write a program, you have an idea in your head how it should behave under normal circumstances. But in the first place, the program never works the way you expect. And in the second place, “normal circumstances” are the least likely situation you will ever encounter.
Maurice V. Wilkes, credited in some places as the inventor of microprogramming, had this to say about his work:
As soon as we started programming, we found to our surprise that it wasn’t as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs.
In some ways, debugging a program is a lot like being a detective. Often you run a program you wrote, only to discover that something has gone wrong. You don’t know what, you don’t know where, and you don’t know why. So you start narrowing it down: you think through the structure of the code, you isolate and identify pieces of it that are definitely working correctly, and gradually you rule out various possibilities until you can pinpoint the part that is broken, or poorly written.
Even when you have done this correctly, you’ll still wind up releasing a program that is eventually going to be used by other people. End users don’t always do what you want. They enter words when you asked for number inputs. They invent fake names and addresses. They set up impossible situations.
So the other part of your job as a programmer is to look at the problem from all possible angles and figure out all the possible ways that people will break your program, before they do it to you. Murphy’s Law — “Anything that can go wrong, will” — applies to computer programming in spades; therefore, you constantly have to be figuring out how to set up situations where nothing can go wrong.
I believe that being in this habit, and practicing the techniques of robust software development, can help train your mind to look for logical fallacies, inconsistencies, and logical consequences of situations you encounter often in your day to day life. Computer programming is certainly not the only way to develop these habits, but I find it a fun way to get there.