Wednesday, October 25, 2006

Ass-First Programming

Full disclosure: I was an English major. As a programmer, I am one hell of a faker. I even wrote an essay about it a few years ago. I am not sure when I will ever live this down. I like to read about software, and I find plenty of things to remind me how far short I fall.

My new favorite blog is by Steve Yegge. He writes so well, he makes it look easy.

When I read The Truth About Interviewing he really struck a nerve. This part in particular:

If you want a job at a company like Microsoft, Yahoo!, Apple, or, they’re going to have high standards. It doesn’t matter if you “know how to program”. They’re going to test you on algorithmic complexity analysis, advanced data structures, algorithm design, searching and sorting, internationalization techniques, network protocols, OS-level memory management, parsing and semantic analysis, recursion and mathematical induction, graph theory, combinatorics, programming language theory, machine architecture, discrete math and logic, graphics and window systems, fonts and typesetting, color spaces and representations, databases and query languages, filesystems and storage, embedded systems, device drivers, mobile and wireless protocols, and internet standards and technologies.

If you’re lucky, that is.

If you’re unlucky, they’ll ask you to derive the outline of their Ph.D. thesis on fault-tolerant massively parallel machine-learning systems. Or to solve a grand-unification style computation problem involving telephone switches, grid networks, and third-degree differential equations. Or, God forbid, they’ll ask you about the darkest corners of C++ syntax.

And you want to know why they’ll ask you about that stuff? Because they’re using it every day. They’ve tried hiring people who don’t know this stuff. Believe me, they try all the time. They want to hire more programmers, and they’re out there on the constant lookout for new meat. But when they lower their standards, they get burned.…the service goes down for days, losing them millions; the project gets delivered late or even not at all, losing them contracts and customers; they lose the business battle to competitors who hired better engineers.

Putting together a pretty Ruby on Rails site is no small feat. Learning to program is no small feat. Many people try and fail to get even that far. But it’s 3- to 5-ball juggling, and it just doesn’t cut it for the Cirque du Soleils and private hospitals of the software industry. I’m sure you want to be a racecar driver, a hang-gliding instructor, a corporate lawyer, a movie sound editor, a rocket scientist. But you know you don’t have the requisite training or experience. Why do you think knowing a little (or even a lot) about programming automatically qualifies you to get hired at Microsoft?

Software companies have excruciatingly high standards, just like any other profession. Those that don’t get eaten up by those that do.

He mentions this idea again in passing in Dreaming in Browser Swamp

One cause [of disrespect for web programming], and let’s be honest here, is that a lot of web developers were self-taught, weaned from text to HTML to onclick=”foo.hide()” and onwards to CSS and DOM and more complex JavaScript, and thence on to CGI and PHP and VB and ActiveX and SVG and Flash and the rest…

This is exactly how I came to be a programmer (although in my case it was Java instead of VB and ActiveX). It hurts to be pegged.

Sigh, this is a long-lived meme. Here’s Philip Greenspun from the introduction to SQL for Web Nerds:

That doesn’t sound too tough to implement, does it? And, after all, one of the most refreshing things about the Web is how it encourages people without formal computer science backgrounds to program. So why not build your Internet bank on a transaction system implemented by an English major who has just discovered Perl?

And Joel Spolsky, from the forward to Mike Gunderloy’s “Coder to Developer:”

There’s something weird about software development, some mystical quality, that makes all kinds of people think they know how to do it. I’ve worked at dotcom-type companies full of liberal arts majors with no software experience or training who nevertheless were convinced that they knew how to manage software teams and design user interfaces. This is weird, because nobody thinks they know how to remove a burst appendix, or rebuild a car engine, unless they actually know how to do it, but for some reason there are all these people floating around who think they know everything there is to know about software development.

The thing is, I have high standards too. I’m not satisfied with the status quo. My wife and my (non-technical) co-workers are always telling me not to be so hard on myself. In their opinion, I’m a good engineer. While that feels nice, and I appreciate their support, it lures me into a false sense of security, because they don’t know anything about software development. I try to learn all the time, but it always feels like I’m putting lipstick on a pig, because I don’t know jack about pointer arithmetic, discrete math, number theory, compiler design, multi-threading, and on and on. Perhaps one day I’ll cave to my mediocrity and phone it in for the rest of my life, but by God I hope not. Until then, I stubbornly refuse to accept that I cannot be a good programmer just because I didn’t go to MIT. I’m trying to be very pragmatic and systematic about this: I will put the full light of day on my ignorance and chip away at it in the right places until I like the shape I’m taking. Which is not to say that it will ever be finished. I have to accept the fact that I have limitations — every human being does. But I don’t have to accept that my life is not up to me.

In a perfectly painful synergy, this is also the story of how I became a “musician.” I will not rest until I can play piano like a cross between Reuben Gonzales and Count Basie. I hope you’re willing to wait, because this is going to take a while.

1 comment:

Moishe said...

Let me tell you about the place I work. Names have been changed to protect anonymity.

Joe sits next to me. Joe started at Microsoft many years ago as a tester; within a couple of years he was a developer, and by the time he left he was an architect. After 20 years in the industry, he still wants to talk about and solve computer science problems in his free time. He took a year off from Microsoft and... wrote code, on his own, for fun.

Fred, who sits next to Joe, started at Microsoft about 5 years before Joe (which is going *way* back). Fred was 19 when he started at Microsoft; he went there from Atari. Fred can hang with anyone on any computer science topic, from game theory to networking to low-level Unix architecture.

Neither Joe nor Fred has a CS degree; indeed neither of them has an undergraduate degree, period.

Every concept Steve mentions (btw, Steve -- yeah, his real name -- sits a couple offices down from us) is absolutely necessary to being a kick-ass programmer. But they aren't sufficient: you also have to be truly fascinated with programming (and it sounds like you are). Want to learn pointer arithmetic? Learn C; it's the first thing you'll need to grasp. Want to learn to write a compiler? Write one.

I've found the best thing I've done to increase my programming chops is being around people who are smarter than me and getting in a little over my head on projects. That way, your *job* is to learn all this cool stuff -- which doesn't make it less fun, it just means you get to spend more time doing it.

I don't know how easy it is to find projects like this in web development, but I'll bet it's possible. Maybe you've got a site which needs to be faster -- improving perf is a great way to learn all sorts of deep CS theories. Or hell, maybe you've got a bunch of JavaScript on a page and it's slow on your friend's crappy old circa 1999 computer -- figure out how to make the page itself faster.

Anyway, I dunno how useful that is, but I hope it's some encouragement. There are plenty of *awesome* programmers (yep, with jobs at Google or Amazon or Microsoft) who don't have rock-star CS pedigrees.