Saturday, December 13, 2008


Loosely speaking all software development is re-enactment of early life trauma, where early life trauma is other pieces of software you've written.

Writing software is (mostly) about creating tools to fulfill real world requirements. For instance, I am a bagel baker, and I need to track how much high-gluten flour I have on stock. This is a requirement. To fulfill it, I could use a pad of paper and a pen. I could hang a calendar on the wall and write in blue pen bags taken in and in red bags used.

There are often a few fairly similar classes of ways to implement a physical solution. In software, there are almost infinite number of ways to implement anything. It's as if you were asked to build a car and instead of using steel and plastic, you could choose paper, cheese, yarn, concrete, feathers, human hair, wood, or pepperoncini. This injects a great deal of complexity into each piece of software. I might know how steel behaves during a crash, but what about feathers and peperoncini together? Unlike physical structures, which follow well-known physical rules,

In addition, software is written by humans, and humans aren't that consistent: they get have moods, they get sick, they get drunk, they die. Some are stupider or smarter than others. Some are crazier. Some are jerks. Some are kind to a fault. Software can reflect those human quirks. Just as there is no single way to be a person, there is no single way to write software, and the individual programmer infects the software with their own psychology.

Unlike time or life, software is maliable and can be fixed later. Remember when you broke up with that really nice girl/boy in college and still regret it? Remember when you were five and spilled milk into your grandmother's lap and she died the next day? Remember deciding to find out how your G.I. Joe worked by smashing his head with a hammer and then you didn't get a new one? There is no "undo" on any of those actions, or more exactly, no "redo". Your only choices are to either, a) endlessly replay the events in your mind, struggling with regret, or b) getting into the same sorts of situations again and again and trying to make them at last come out right.

Writing software can be re-enactment of the trauma of having written earlier bad software. In every new program, programmers are endlessly trying to re-do something they did imperfectly. Sometimes that's actually "learning" or "practice" and if you do the same things enough times, you get "good" at them. However, it can be a pathologcal tendency. A former co-worker's first programming job had been using a certain kind of directory software that stored personal information. After that, he approached every problem as if it were a personal information directory, no matter whether it made any sense. Whether he was writing an application to order sacks of flour, or send email to a thousand people, he wanted to somehow make it work like a directory of personal information.

Writing software can also be re-enactment of real life trauma, where the programmer re-enacts not just earlier software projects, but personal experience. The computer becomes a proxy for life. For instance, a child grows up with an unstable parent - mentally ill, alcoholic, ill-behaving - and programming attracts them because it's frequently about organizing chaos and infinite choices and uncertainty and making things work properly.

That person might also be attracted to recreating their trauma in software. Because they cannot escape their personal chaos, they create complicated and arcane software, which behaves in uncertain ways. They solve problems in overly elaborate ways, seeking to prove themselves, as if to a stern and demanding parent. They try to solve all possible problems, all at once, whether they have anything to do with the task at hand. Such software tends to be less reliable, and ultimately causes pain for everyone involved, including the programmer who must now face now their own inner demons, but their co-workers and superiors, to explain why they did such an irrational thing. In trying to escape chaos, they instead incur it in their professional lives.

The temptation is endless, because nothing is set in stone. You can't build a house and change the foundation while you're hanging the drapes, but in code, you can do, essentially, that. You can pull off heroic, last minute maneuvers, or make small, "harmless" changes which cause enormous problems. Many complex physical structures are easier to predict than similarly complex pieces of software. As in life, everything is interconnected, and everything is co-dependent. There are no guarantees and no set limits to fulfill or exceed.

Better than in life, all mistakes can be corrected and all things re-done. There is the illusion of control and infinite perfectability. Like one of those movies involving time travel and long lost love affairs, you can kepp going back, reliving the same situations until you finally get things right.

Software that falls on its face cannot learn or improve on its own. Only people do. Software reflects us, but in a vague and imperfect manner. We seek our own completion in the reflection, but there can be no happy ending, no resolution. Only mistakes and re-enactments and endless progress toward nothing in particular except for further dreams of perfection.


Dave Soup said...

Your lovely and thoughtful ruminations on technology and process are touching, but, really, this is what the web is for:

t said...

See, this is what separates me from brilliance. Why don't I have ideas like that?