Wednesday, January 31, 2007

Less programming, more skill?

I just picked up a copy of Programmers at Work (disclosure: that's a paid Amazon link) and I've been looking forward to reading it. I've only read the Charles Simonyi chapter; I got distracted by other books and other things, but it's sitting there on my nightstand waiting.

So it was pretty cool to see Jeff Atwood quote the book on his blog entry about becoming a better programmer by not programming. I agree with the quote:

Does accumulating experience through the years necessarily make programming easier?

Bill Gates: No. I think after the first three or four years, it's pretty cast in concrete whether you're a good programmer or not. After a few more years, you may know more about managing large projects and personalities, but after three or four years, it's clear what you're going to be. There's no one at Microsoft who was just kind of mediocre for a couple of years, and then just out of the blue started optimizing everything in sight. I can talk to somebody about a program that he's written and know right away whether he's really a good programmer.

And I definitely agree with this from Jeff:

You won't-- you cannot-- become a better programmer through sheer force of programming alone. You can only complement and enhance your existing programming skills by branching out. Learn about your users. Learn about the industry. Learn about your business.

I think he limits it too much, though.

The best thing I ever did for myself was walking away from programming, as best as I could, for 4 years. In 1998, after 3.5 years at Microsoft and 5 years of high-stress programming before that, I was burned out, unsure of what I wanted to do with my life, and fed up with the work I was doing. I cashed out my stock options, put all my belongings in my friend's basement, and set out to hike, bike, and finally get that college degree I'd always wanted.

The day I quit, I started driving to LA. I hiked in Joshua Tree, then went to Canyonlands and hiked for days in the Maze, where I swear I was surrounded by the ghosts of the Anasazi. I flew back to Massachusetts, saw my parents, then took the train to northern Georgia and started hiking home on the Appalachian Trail. I didn't quite make it, but detoured to Washington DC for the 4th of July, hiked some more in Vermont, then went to Olympia for school.

At school, I took classes in forest ecology, evolutionary biology, neuroscience, geography, linguistics, and so on. I learned a bunch, despite the hippies.

Between classes and during breaks, I rode my bike in the mud of Olympia, augmented with road trips to the sandstone of Moab and the dust of Nevada. I met my wife, and during summer vacation, we rode our bikes from northern Montana to Wyoming; we saw bears, and almost got struck by lightning, and saw amazing views and played pool at every dive bar that would let a couple of smelly cyclists in.

Through all of this, I missed programming. I dreamt about it, in good ways.

I didn't miss the long hours or the stress, but I missed being surrounded by lots of really smart people, and sitting down in front of a computer to just crank out code. I did a little bit of contract work, and after a few years I joined a startup with some friends, then ended up back at Microsoft.

Now, 9 years after trying to leave programming behind, I'm working on stuff that gets me as stoked as I was when I was 11 years old and learning Logo, or 13 years old and learning to do psychedelic animation with palette switching, or 16 years old and learning assembly language. There is always something new to learn -- always a new way of looking at a problem you've known about for a while, always a new problem to discover.

But Jeff is saying something a little different than what I'm driving at, I think:

Passion for coding is a wonderful thing. But it's all too easy to mindlessly, reflexively entrench yourself deeper and deeper into a skill that you've already proven yourself more than capable at many times over. To truly become a better programmer, you have to to cultivate passion for everything else that goes on around the programming.

Of course I agree: if you have profound knowledge of the cloud of problems around programming, of the higher level problems you're trying to solve, you'll do a better job programming. This is obvious, and explains why the best programs are always the ones programmers write for themselves, eg. emacs, Google, Visicalc, etc. And it conversely explains why so many programs are so uninspired, too: if you'll never use the feature you're writing, you're not going to imbue it with brilliance, because the brilliance will never occur to you.

And beyond that, if you truly love the entire experience of programming -- not just the act of sitting in front of keyboard, but the planning, and the bug triage, and the promotion of your ideas -- of course you'll do a better job. And yes, this cloud takes some time to master, and for many programmers it's a huge barrier.

But that stuff is necessary but insufficient. If you're gonna implement the killer features you want, you need the chops to bang 'em out. And if those killer features are also gonna be used by a million, or a hundred million, other people, you'd better have the chops to bang out that code rock-freakin'-solid. Those chops don't come in 3 years, as Bill Gates claims, and they don't come from the 97th percentile of programmers, as Jeff alludes:

Good developers are good at programming. Really good at programming. You might even say fanatically good. If they're anything like me, they've spent nearly every waking moment in front of a computer for most of their lives. And naturally, they get better at it over time. Competent software developers have already mastered the skill of programming, which puts them in a very select club. But if you're already in the 97th percentile for programming aptitude, what difference does a few more percentile points really make in the big scheme of things?

The really killer code that's used to build the really killer features come from the programmers with a Z-score of 5 or 6, not 3. Being a natural will get you most of the way there, but unless you're a true prodigy, you need to continually refine your skills over many years. For most people, I think that cultivating expertise and interests outside the scope of programming helps this, as it does with any creative endeavor: as an analogy, if you want to write, read lots and write lots, but also live lots. For me, staying psyched about programming definitely requires lots of extrinsic inspiration; I'm a better programmer when I have time to ride my bike, and run, and play with my daughter, and laugh with my wife.

Being an excellent programmer requires being excellent at the cloud of things directly related to programming -- dealing with people, anticipating problems, having vision about products and features -- of course it does, and of course you should cultivate that. Beyond that, I truly think it requires external stimulation; really, really not programming will let you recharge and be better at programming. I doubt this is limited to programming.


A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.

-Robert A. Heinlein

Monday, January 29, 2007

Dreaming in Code, take 2

True story: when I was 18 years old, a series of unhappy accidents left me the only programmer on a massive software project. This project was an upgrade to the cash cow for the company I worked for; if it didn't ship, the company stood to lose lots of money and indeed might've gone out of business. I worked 80-100 hour weeks for months to try to make the thing work right, and every time I fixed a bug it felt like I introduced 2 others.

One night, in the midst of this, I had a vivid nightmare. In this nightmare, I felt sick and feverish; my limbs didn't work correctly and my brain was fuzzy. As I stumbled about, I realized that I was the project I was working on: I wasn't dreaming about working on it, I was dreaming about becoming it. I was a huge collection of code, I was ill and nothing worked right and I had no idea how to fix myself.

When I saw the title of Scott Rosenberg's book, I thought: yes, that's right, that is not nearly so idyllic as it might sound.

And, as it turns out, the subject of the book is not a transcendent glimmering example of software genius. Chandler is, rather, one of those projects that, I suspect, inspires the sort of dreams one might be glad to wake from.

Another reminiscence, if you will indulge me: when I was 22 years old, I got a job at Microsoft. No bullshit or exaggeration: my dream job. I worked on Outlook, with about 20 other developers and maybe half as many program managers. Most of us were recent college grads or at least (in my case) the correct age to have just graduated from college. Our product manager, Brian, had a huge vision for Outlook, and I think we all shared it, and we worked our butts off to make it happen, to the extent that it could. Brian's vision was that Outlook should be an über-PIM, the place to which all your data flow, and the place from which you can see everything. Sound familiar?

Anyone who knows Outlook well must've shared the déjà-vu I felt when I read about Chandler. For instance, its "revolutionary" idea of applying arbitrary views to data was implemented by Outlook in 1994. All the views in Outlook are data-type agnostic; you can apply a calendar view to your files, if you'd like, or a timeline view to your email.

Of course, this sort of abstraction leads to endless feature creep. For instance: did you know that, until Outlook 11, you could browse your files in Outlook, as if it were the Windows shell? It was possible, through some tweaking, to browse the web with Outlook and might still be, for all I know. Did this fit into Outlook's Grand Vision? Absolutely. Did it add unnecessary complexity and make it much, much harder to ship? Hell yes. Chandler is clearly facing similar scoping problems.

Beyond the functional overlap between Chandler and Outlook, there's something else that's interesting. When I first booted Chandler, it took about 45 seconds to start. If you ever used Outlook 97, you may remember a similar experience.

I was on the team responsible for improving performance for Outlook 98. Right after Outlook 97 shipped, my lead printed out every single function call made when Outlook started up. It was a stack of paper about a foot high. He spent about a week going through this printout with a highlighter, looking for "stupid shit", as he called it. Turned out, there was plenty of it. It further turned out that most of this "stupid shit" wasn't a result of any one programmer making a dumb decision; most of it was a result of an architecture and a mindset which tried to prevent developers from shooting themselves in the foot by gratuitously abstracting away "dangerous" things like memory management. Again: needless abstraction will bite you in the ass if you're not careful. My lead and I spent months going through the Outlook code exorcising "stupid shit" -- removing code which hid what it was actually doing, getting the code cleaner and closer to the machine, making everything more explicit, tighter, and less generic. I suspect Chandler is going to need someone to go through its code with a fine-tooth comb in the same way before it's viable.

As a programmer, I find abstraction a beautiful idea. In practice, abstraction is useful only when its benefits are concrete. Here is today's Advice To Young Programmers: Create a class you can instantiate first; then, only if you need to create a similar class should you create an abstract base. Create an application which solves one problem really, really well; then, if you see that the problem you solved is similar to some others, you'll have a nice framework to expand on.

Sunday, January 28, 2007

Now I've been tagged

Justin tagged me, so here goes. I'm supposed to tell you 5 things you don't know about me. I don't know my audience, exactly, so some of you may already know all this stuff:


  1. My mom says that when she decided to name me Moishe, she saw my name floating in the sky with rainbows and stars floating around. She didn't mention unicorns, but I sort of wish she had. My dad has a less drug-induced version of where my name came from, but I believe my mom.
  2. When I was 17, I rode my bicycle from my parents' house in Massachusetts to Los Angeles. When I got home, I was skinny and bearded, and my little sister Mahala (who was 6) had no idea who I was. Apparently I scared the hell out of her by picking her up to hug her.
  3. I met my wife at a poker game at a house in Olympia. The house was named Thelma's, after its previous (?) owner. This house had two incredible features. First, it had a "fire sculpture": the house overlooked Puget Sound and sticking up out of the mud and the water, about 100 feet off shore, were a bunch of pipes about 5 meters tall. Inside the house was a switch. Turning the switch would cause gas to flow through the pipes and an ignitor to fire on their tips. This created a truly awesome effect. Second: in the front yard of this house was a bathtub. Next to the bathtub was a pile of firewood. If you wanted a hot bath, you filled the tub with water (via a pail), piled the wood under the tub and lit it. The effect was like a cartoon-cannibal stew.
  4. With my friends Ansel and Scott, I "stole" (maybe Ansel had permission? It's still unclear) Isaac Brock's shitter Honda motorcycle from a parking lot on Capitol Hill. We stuffed this thing into Scott's VW cargo bus, drove it to Oly, and put it in my garage, where it stayed for at least two years. When I moved out of my duplex, I abandoned the unloved motorcycle in the woods.
  5. During the aforementioned bicycle trip, my traveling companions and I arrived in a town in Texas after a very long day, as the sun was setting. According to our map, this town should've had a grocery store, a campsite and even some people. It had none. So, we started looking around this weird abandoned town for a place to stay, and saw what looked like an abandoned building with an unlocked door. So... we opened the door, saw what looked like the interior of an abandoned bar. Why not sleep in an abandoned bar, right? I mean, if you're a bunch of scrawny east coast liberals and one weird Australian, what harm could possibly befall you in an abandoned bar in an abandoned town in Texas? So we started moving our crap in, and on our second trip outside we were confronted by a GIANT Native American dude, who asked if he could help us. We stammered out what we were doing, and he replied, "wait here". What the hell else were we gonna do, right? So wait we did, and giant Indian dude came back with a littler guy and a mean-looking pit bull and a GIANT CASE OF BEER. And a camp stove, and STEAK. And we fucking raged that abandoned bar, drinking beer and eating steak with the locals. I am no way clever enough to make that shit up, but if you don't believe me I have photographic proof. And, the best part: the dog's name was Asshole. It's all true.


Now, I tag Lindsey, Hosie, Steve, Steve, and Deonn. Special bonus: Dad

OK, I take it back

Bluedot is rad!

Turns out you can set it up to auto-import your Google Reader shared sites (or whatever random feed you want). Check it out.

So your bluedot feed turns into a superset of your shared RSS items and whatever random sites you see.

Monday, January 22, 2007

My own private fat-ass

My week of veganism made me weak and unmotivated to the point that I woke up early Saturday morning (like 3am) literally sick with hunger, with a splitting headache. When my alarm went off at 5am, I turned it off, rolled over, and went back to sleep, missing the Capitol Forest Fat-Ass that I was looking forward to.

So, Saturday, I ate some meat, and some bread, and some yogurt, and it was so fucking delicious. Perhaps I'll write more about this, but for now, just let it be said that a week away from all those glorious things makes them taste better than I ever could have imagined.

Anyway, Sunday I decided to go to Tiger Mountain and do my own long run. Here's the geekery. It fully kicked my ass -- that was the hardest athletic thing I've done in a long time, despite how slow my time was. Much of it was under snow, so my legs are sore everywhere: all the stabilizing muscles are wrecked, in addition to the major muscles that I'd expect to be sore. There was a lot of steep climbing and steep downhill. The weather was good, though: no rain, low 40's. And it was so nice to be outdoors for so long with my only worries immediate ones: how much water I had, whether I should've turned left back at the top of that hill I just ran down (of course, I should have), when this snow would end, etc.

Saturday, January 20, 2007

Sorry bluedot

But I think this is way more useful. Check out the Shared Links feature of Google Reader. Want to aggregate a bunch of your friends' shared links? Easy, just subscribe to them in Reader. As a bonus, Google Reader easily gives you a cut & paste way to drop your list of shared items on your blog (or where ever, look to your right to see an example).

Thursday, January 18, 2007

Book recommendation

The Old New Thing: Practical Development Throughout the Evolution of Windows

I've been reading Raymond's blog for about 3 years now, and it is fan-freakin'-tastic. If you're a Windows developer, you should read everything he writes. He gives great, gritty details about the Win32 API: how to use it, how not to use it, why certain things are the way they are, etc.

Also, search for "Raymond Chen" on Google - the ads are cool :)

(the above link is an Amazon Affiliates link; if you click it and buy the book, I'll make a small amount of money)

From the comments

Steve said:
Damn. I take you hunting once and you join PETA and become a vegan. From my perspective, that is not progress.

Stinging! You'll be happy to know that my veganism is only making me hungry and angry. When I'm done with it I'll be in the mood to kill and eat a deer, or a cute little bunny, or whatever, with my bare hands if necessary. In fact I'm getting to that point now.

The veganism is merely a lark; one of those things that I feel like I might as well try. I might stick with the wheat-free thing, though, as I think it actually makes me feel much better. Corn pasta redux!

Wednesday, January 17, 2007

Please

From Sortie


Buy my track frame!

The Pista Concept that I've been lusting after for almost a year finally went on sale to a price where I just couldn't justify not buying it. So, the Flyte goes.

If you read this blog and want the frame, I'll sell it to you cheap (and de-list it from ebay) -- leave a comment.

Tuesday, January 16, 2007

Book recommendation

Dreaming in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and One Quest for Transcendent Software

I just got "Dreaming in Code" by Scott Rosenberg. It's really good so far. I will write more when I'm done reading it...

(the above link is an Amazon link; if you click it, then buy the book, I'll get a small amount of money. I'm going to make it a habit to link to books I like on this blog)

Vegan for a week

Eric and I have decided it would be fun to be vegan for a week.

This is progressing much as you'd expect: I'm hungry, grumpy and mean. But I ran my best-ever 1.5 mile tonight (though I won't mention the time, as it's rather embarrassing).

I have tentatively committed to this vegan thing until the Big Sur marathon, which is on April 29th, and which I signed up for today. I've got a 17-mile run on Saturday down in Capitol Forest which I may or may not do, depending on if I randomly decide whether Capitol Forest is still deep under a blanket of snow come Friday night. Failing that, I'll go for a 17-mile road run.

Sunday, January 07, 2007

Deer hunting



A few months ago, I idly mentioned to Lindsey that I'd like to go deer hunting with her dad, Steve. Steve's been hunting his whole life, and is good at it, and it's obviously something he loves to do. I've been interested in an oblique way in hunting for my whole life, and despite my hippie parents I've shot guns more than a few times including during a world-view-changing week with my aunt & uncle in West Virginia when I was in 3rd-grade, and a winter of weekly trap shooting a couple years back.

However, I knew (and now know better) that there's a huge difference between shooting a gun and actually hunting. What I was focused on, mentally, when I found out that Steve would actually do me the honor of taking me hunting with him, was the idea of actually shooting an animal. I'm an avowed carnivore, and I know that my dietary choices have resulted in the deaths of lots of cows, pigs, chickens, and fish, and the odd buffalo, rabbit, and, yes, deer. But I've always been isolated from the actual animals that I eat. On Friday night, before a 4:30am start on Saturday, I couldn't sleep for thinking about what it might actually feel like to aim a gun at a deer, shoot it, and kill it and eventually eat it.

When I was in, like, 8th or 9th grade, my friend Josh and I bought some slingshots. The super-powerful kind with surgical tubing for the elastic and a wrist brace for (one assumes) better accuracy. I shot the hell out of mine, to the still obvious detriment of my parents' backyard fence, and got to be a fairly good shot. One day Josh and I were out walking around the pond behind Josh's house, and I saw a red-winged blackbird perched on a reed about 50 yards away. Without even thinking, I raised my slingshot, aimed at the bird, and let fly. I nailed that bird, right in the head, and it made a couple of noises, fell to the ground, and started twitching. Josh, being by far the more kind and nurturing of the two of us (who shot the freakin' bird, right?) walked out along the small hummocks of grass in the pond to the bird, where he watched it die. I was too sick to follow, and stood in the grass, feeling sad and ashamed. After the bird finally died -- it felt like it took about an hour, and might have -- Josh came back to shore and we walked back to his house. I can't remember what we said to each other. Maybe nothing. We probably played video games or watched shitty afternoon TV, then I went home, and I continued to feel guilty and ashamed; indeed, writing about it now, I still feel like a piece of shit.

From that perspective, then, I must admit a certain churning in my stomach as I lay in bed on Friday night, thinking about what it might be like to actually raise my gun, sight on a living animal -- likely a beautiful one at that -- and pull the trigger. I tempered this feeling by thinking, "yeah, but it'll provide food, and given that you eat meat, this is a feeling you should be comfortable with." Which I do honestly believe; as a carnivore I feel almost an obligation to see what it's like to kill that which I eat, at least once. If I can't wrap my head around that, what right do I have to eat meat? Maybe I'm getting a little Ted Nugent, and this obviously isn't a clear problem.

At any rate, 4:30am rolled around, the alarm went off, I got dressed (first time I've ever worn camo, and it was honestly pretty damn sweet), Steve & I loaded up the truck with guns and various other implements, and we rolled down to Steve's land in Mississippi. The long drive, in the pre-sunrise dark, talking about whatever, was over almost too soon, and we arrived at Steve's land. We unloaded our guns and food and radios and other sundries from the truck, and walked by the light of our flashlights to the blind that I'd be sitting in for the morning. One of the most important rules of hunting, Steve had explained was to be quiet. My attempt to quietly climb the 12 foot ladder into the blind while carrying a rifle, a backpack, and a folding metal chair came to naught and I'm afraid I clattered around quite a bit.

I settled in (trying my clumsy best to be quiet still) while Steve walked the quarter mile or so to his blind, which was out of my sight.

The last time I visited Memphis, Steve, Lindsey and I had spent the better part of a day exploring Steve's land by foot and by tractor. So I knew the general layout of the fields I could see from my blind: a soybean field which extended for about 100 meters to the south and probably 75 meters to the east, and about 25 meters to the north. The southwest corner of the field funneled into a doubletrack path, down into a ditch/stream; this was the area that Steve said would most likely see some deer traffic. I set up my chair so I was looking towards the south, so I could see the doubletrack and most of the soybean field. And then I waited.

Waiting and watching -- forcing yourself to do it, with no distractions -- is actually a fairly compelling activity. I got situated in the blind at about 6:00am, in the pre-dawn dark. I could hear things happening in the woods around me, but I couldn't see much other than the transitions between the woods and the fields; details were lost. As it got lighter, fuzzy shapes resolved into detail: that hulking dark shape became a small fir tree, that other hulking dark shape became... well, another fir tree. But as the light increased, so did the activity; cardinals and other small birds gathered on the western edge of the field. Just before the sun rose the trees were teeming with little birds, arrayed (so it seemed to my tired eyes) just to watch the sun rise.

And the sun did rise, slowly, and that too is a pretty amazing thing to just watch. I watched the shadows move down the trees to my right, to where the birds were waiting. When the shadow's edge reached the field, the birds followed it along. I guess they were eating seeds, but it looked to me like they were just following the warmth and were interested in the aesthetic as well as nutritional appeal of their activities.

After what felt like hours of watching the sun and the birds, and hearing the birds and nothing else, there was a ruckus underneath the blind I was sitting in. After the small noises the birds made, whatever it was that was down there sounded enormous. It was crunching and moving stuff around and breaking twigs and stalks and generally raising hell. In my mental state of just absorbing what was happening around me, it took me a little while to even think to wonder what it was that was making all that noise; up to that point, I just thought something like, "huh, birds... sun... birds... trees... noises... birds... big noises... birds... sun..." -- well, you get the idea.

Once it occurred to me to think, I thought, "uh, could that be a deer?" Sure enough, as that thought was coalescing, a deer wandered out from right underneath my blind. A 4-point buck, which was (just) legal for shooting. He came out from underneath the north side of the blind, walked about 10 yards further south, and started eating something from the field.

So now was the moment of truth, and what was weird was that I thought those exact words to myself. The problem was that the deer was about 160 degrees to my left: my chair and I were facing north and only by turning my head sharply could I even see the thing. Compounding that is that I shoot left-handed, so I needed to turn myself almost entirely around to point and aim the gun.

In my visions of The Moment of Truth, I imagined that the real moment of truth would be putting the deer's chest in the cross-hairs of my site, inhaling, and pulling the trigger. What I didn't think The Moment of Truth would be about was trying to be very quiet as I tried to stand up, turn, and raise my gun.

I wasn't quiet.

The deer looked up at me, froze for about 2 seconds, staring right at me, and bounded away. I never even switched the safety off.

What I'm still unsure of is if the noise I made was actually the noise of me chickening out, or an honest mistake. I'm a clumsy, clumsy oaf (my first girlfriend's term of affection for me, to the extent that she ever had one, was in fact "oaf", so there you go), and certainly nobody had any trouble believing that I wasn't quiet despite trying my damnedest to be. But I'm not so sure. I certainly didn't explicitly try to scare the deer away, but I admit to feeling a flood of relief when he saw me and it was clear I wouldn't get a shot at him.

Would I like to try again? Absolutely. Everything I said about feeling an obligation as a carnivore to know what it's like to kill for food is still true. But the feeling of killing that bird is also still there. Hopefully there will be a follow up to this next time we're in Memphis during hunting season.

Even more pictures

Grandma Denise sent Amelia a wagon for Hanukolstice. Pictures!