25 March 2006

Why I'm Not an Engineer

My official job title at most of my jobs has been "Senior Software Engineer." And I hate it.

I won't belabor the fact that "Senior" makes it sound like I've been at the company for 15 years, when actually I've been there 6 months and the company was only around for 3 months before that.

The real problem is with the word "Engineer."

Engineering is about physics and mathematics. Engineering is about designing to exacting specifications. Engineering is about being able to prove that a solution will work before implementing it. Engineering is about discovering all relevant factors and taking them into account. Engineering is about repeatable successes. Most of all, engineering is about using proven processes to guarantee reliability.

Anyone can design a bridge, or a skyscraper, or a fuel pump. But we don't let just anyone do it. And there's a reason. If you design a bridge, a "crash" is not acceptable. People die, there's a major scandal, your company gets sued for negligence, and you get fired, if you're lucky.

But when you're building a mail server, or a web browser, or a real-time strategy game, it's perfectly normal for a sizeable percentage of your customers to have regular crashes. What happens? Your company charges them for support, and gives you a bonus for releasing on time.

Worse, when something goes wrong in a software project, it's usually so difficult to pinpoint the problem that nobody even tries. Remember the Challenger O-ring hearings? Imagine something like that applied to Microsoft Windows. In fact, you don't have to. The Navy tried to hold similar hearings to determine why a Windows crash left one of their ships dead in the water. Ask them how that went.

From the other side, what we do--when we do it well--feel something like magic, even to us. That's simply not true for engineers. That's not to denigrate engineers. They get the satisfaction of solving a difficult problem (just like us), or doing a job and knowing they've done it right (unlike us), but if they pull something off and can't believe that it works, they consider that a red flag, not a reason to celebrate.

So, if what we do isn't engineering, what is it?

Computer Science. Adobe calls all of their code-writing employees Computer Scientists. After all, that's what most of us studied in college, right?

This is completely bogus. Someone who studies algorithmic complexity, or programming language semantics, or type theory: that's a computer scientist. Calling someone who writes software a computer scientist is like calling an auto mechanic a physicist.

Software Craftsmanship. Some people (most famously Pete McBreen) argue that what we do is more like craftsmanship than engineering. There's something to that. Despite all the college degrees, the knowledge that we pass down is more like guild wisdom and rules of thumb than rigorous training in known methodologies.

The problem is that craftsmanship, even more than engineering, is about repeatability. A craftsman builds similar products over and over, and gets very good at doing so. But software is supposed to be not just better, but radically different, than its predecessors. A marble table that's every bit as good as one from the Victorian era is a triumph. A program that's just as good as last year's is a failure. Forget our products; even our methodologies are supposed to be radically different than those from a decade ago.

Software Development. "Developer" doesn't sound bad at first glance. But that's only because it doesn't seem to mean anything.

As a consequence of that vagueness, most fields use it for those people who are neither actual workers nor creatives. Within the software industry, we're the workers and the creatives--or at least what passes for them. Look at development executives in television, or the career development team at a performing artists' agency, or the business development team at your own company. That's about as far from what we do as anything I can imagine.

Tinkering. Others have likened us to tinkerers. There are no rules to what we do, but there are lots of tricks that we figure out, and these tricks look like magic to the outside world even when we try to explain them, even though they're really pretty simple.

But that doesn't really work, for much the same reason. Tinkerers make minor improvements to existing products, Whether or not we succeed, we're always trying to build new things.

Mechanics. Sometimes people in "traditional engineering" fields like to disparage us by calling us mechanics or technicians. But mechanics only exist in fields where there are already engineers. Without automotive engineers to build cars, there'd be no auto mechanics to fix them. We're the top guys in our field, sad as that may sound.

Besides, this suffers from the same problem as the last two categories, only more so. A mechanic who ripped out your working engine and replaced it with an untested new model because he had a cool idea would not be in business long.

Software Writing. Why not run with the "creative" thing. We write programs, so we're writers. Maybe it's not exactly writing novels, but then neither is punching up dialogue in screenplays, producing tech manuals, or doing biographical research--and yet people who do those jobs are called writers. And if our hours and work conditions aren't as weird as writers', they're not exactly normal.

That all sounds appealing, but I think it misses something crucial: We're creating products. Actual things that do work for people--at least when they work. Writers don't do that.

Plus, nobody wants to read what we write. I know, the linux kernel is available online, and thousands of people download it and read it. But every one of them is doing so in order to improve it, or get ideas for a different kernel, or write linux drivers, or debug linux applications. Not a single person reads the linux kernel just to read it.

Programming. What about programmer? We make programs, so we're programmers.

If it sounds a bit dull and old-fashioned and unglamorous, so what?

That's really the crux of the matter. Most people in our field want an impressive title. "Engineer" has some kind of cachet that many of us covet.

But why? Who are we trying to impress?

Girls aren't impressed because you call yourself an engineer. If they're impressed by your job, it's because you're so overpaid that you can afford to buy ridiculously stupid toys. Or maybe because you can get away with dressing like a teenager and showing up to work at 11:00.

Banks and lenders aren't impressed because you call yourself an engineer. They're impressed because you make enough to pay interest. And because even if your company tanks or you get fired, there's so much turnover in your industry that you'll have another job in a month anyway.

Your grandmother may be impressed, but she doesn't know the difference between you and a computer repair technician or an AOL tech support drone. Besides, your grandmother would be a lot more impressed if you just called more often, or married someone nice.

Do you really want to be a guy who wears a buttoned-up white shirt, black socks even with sneakers, and a slide rule in a pocket protector? Not me.

The best title I ever had, I was in charge of a team that, as far as our founder could tell, just randomly banged away at keyboards until eventually an approximation of working code came out. Like Hamlet, but he didn't need an infinite number of us.

So I was Big Chief Codemonkey.

Unfortunately, we soon had to start dealing with H1B visas and partnership deals and next thing you know, I was Lead Software Engineer.

Sigh....

1 comment:

barnert said...

I forgot to mention: I also don't wear the red hat, or drive a choo-choo.