Meaningful Meaninglessness

(theme music)
Here comes the rain and thunder now
Nowhere to run til until now
I’ve disappeared, they’ll wonder how
Looking for me, I’m underground

OK, OK, cut the music. Yes my friends, it is I, the phantom shadow of your nightmares, OO’s native San Diegan, a bitter codist, and anonymous OCD denier, El Moffdo. Enemies commence pouting, because I am here after a one week unannounced absence. There was no Nowhere To Run strip and there was no Helltime on Monday, to be sure.

Continue to stay tuned for a special guest feature on Nowhere To Run by Reina. She is finding that drawing stick figures that say witty blurbs and partake in geeky inanity isn’t as easy as I make it look.

As for the Helltime of August 17, you’ll have to do without, for it has sank quietly into the stormy abyss of nothingness. Now that we’re all cheered up, let’s talk about morons.

Now I assume that people who read this blog understand and can spot my grandiose braggadocious Limbaugh impression and understand that it is made in self-jest. It takes a special amount of arrogance to believe you can make a computer do exactly what you want.

However, now I’m not so sure that my arrogance is totally in jest. A Coding Horror post about natural programming ability has always lurked in the back of my mind.

Look, before I get into that, here’s a programming quiz for you folks: write a program that prints the numbers 1 through 100. If a number is divisible by 3, print “Fizz” instead. If it is divisible by 5, print “Buzz” instead. If it is divisible by both, print “FizzBuzz” instead.

Here is my Java solution and I don’t need to run it to know it is right:

void fizzBuzz()
{
	for(int i=1; i <= 100; i++)
	{
		boolean divisibleByThree = i % 3 == 0;
		boolean divisibleByFive = i % 5 == 0;

		if(!divisibleByThree && !divisibleByFive)
			System.out.print(i);
		if(divisibleByThree)
			System.out.print("Fizz")
		if(divisibleByFive)
			System.out.print("Buzz");

		System.out.println();
	}
}

This took all of two minutes. Jeff’s article cites another article that states that the majority of Computer Science majors can’t do this at all. I echo Jeff’s question: why can’t programmers program?

Now, cut to a Clay Shirky guest post on Boing Boing. Saeed Dehnadi and Richard Bornat are computer science instructors at Middlesex University in the UK. They gave their computer science students a test about assigning values to variables on the first day of class before any lessons were given. The results revealed a chasm:

The group tested broke down into three camps: people who answered the questions using different mental models for different questions, people who answered using a consistent model, and people who didn’t answer the questions at all

So what?

Dehnadi and Bornat’s thesis is that the single biggest predictor of likely aptitude for programming is a deep comfort with meaninglessness

A deep comfort with meaninglessness means you have to make peace with the fact that the computer is a mathematical device. As a result, it follows the laws of math. The laws of math have no meaning. You must accept axioms and follow them wherever they may lead.

So what is going on here? There is a high correlation between accepting meaninglessness and successful programmers, and (apparently) the vast majority of people who have been trained as programmers can’t program. By the transitive property (witness me applying the axiom), the vast majority of trained programmers cannot deal with meaninglessness.

In other words, these programmers cannot put themselves in the computer’s shoes and act out what they are asking the computer to do.

When I was but a mere 10th grader in AP Computer Science, the best way for me to run through algorithms on paper and debug any problems I had was to essentially draw the memory space of the code in question out on a piece of paper, run through the algorithm, and fill in the memory step by step:

i 1 2 3 4 5
divisibleByThree false false true false false
divisibleByFive false false false false true
output 1 2 Fizz 4 Buzz

The more I wrote code, the less I needed this crutch because it now occurs in my brain without me even noticing, and I have long since never had to actually write this out.

As much as I’d like to think I was born with the programmer gene or have visions of class designs and algorithms delivered to me in the wee hours during my sleep, I have never believed that I had any natural talent. Most of my successes in school were (I caught myself writing “are”) because I worked harder than 95% of the people there. I broke my neck for my grades.

I had a few friends who I could tell naturally had “it”. They did just as well as I in math and computer science, but never had to break their necks like I did to study and practice and develop the skill.

Back to the question: why can’t a majority of programmers “become” the computer when needed?

You’ll hear arguments that it takes a brand of spatial and visual reasoning, an ability to form abstractions and recognize patterns. These may be necessary, but they aren’t sufficient, so to speak. I think this comfort with meaninglessness is a more specific manifestation of the ability to remove yourself from yourself.

You may have written the code with the intent to calculate the Fibonacci series, but is that what actually happened? What is the evidence? Your code is the evidence. Who are the witnesses? The computer is the sole witness. Running the code either in your head or on paper is like interrogating that witness.

The catch is you need to be extra careful because the accuracy of the answers your witness provides hinges on your ability to apply the rules as they stand. There isn’t an actual witness to answer your questions; rather, the “answers” come in the form of you applying the rules to the data, “answering” for the witness (the computer). You can’t fall into the trap of knowing what the code is supposed to say and running it in your head that way. The programmer, in this way, is much like a constructionist judge.

You need to forget yourself. You are irrelevant. The only thing that matters is the set of facts, and that set of facts is what you actually told the computer to do.

So have you ever thought to yourself “there must be something more to programming. There must be an eternal truth like the Halting Problem that lies at the center of this if-statement I am debugging”. Well let me clue you in on something: there isn’t.

Announcer: You’re reading the EIP web-ring.

Leave a Reply