The Learning Spiral

An Adventure in Shaving Yaks

I'm in a weird position. I'm the kind of guy who loves reinventing wheels. I love going off on mad-scientist tangents that, while instructive, don't often prove themselves practically useful — maybe they have a corollary that does the job better, or one that is more widely accepted than what I've written, or maybe they're a little too pie in the sky to be regarded as capital S capital P "serious projects".

To make that position just a little more precariously nervewracking, I'm a programmer. At the core of being a programmer is knowing that Getting Things Done is (sometimes much more, sometimes less so) more important that Doing It Right, or Doing It Yourself. To that end, whenever I go off on one of these quixotic ventures and end up with an orm or some other well-meaning frivolity, I carry a little mental passenger with me, who is constantly screaming "No! No! This has been Done Before! not to mention Done Well!" But try as that little voice might, it can't convince me to stop scratching that itch / shaving that yak / colloquialism for rewriting code. Granted, I do it on my off-time, though more often than not it ends up as constant mental background noise for the duration of the adventure — Whether I'm fixing some practical bug, brushing my teeth, or making really awesome fries, deep down I'm still thinking about problems related to that one thing — and to a lesser extent, worrying about my tendency to go off on these tangents in the first place.

Smart and Gets Things Done

And occasionally reinvents wheels

I've actually gotten equal parts flak and praise for going off on these tangents — mainly due to timing, I suppose. Part of me is a little afraid that it'll damage my chances of getting a career in the future. It's probably that same part of me that screams "DON'T DO THIS" whenever I initialize another git repo in another project directory with some (hopefully) clever name that's currently empty.

Aside: Yeah, I totally have a project directory called 'toast' that was destined to be this blog you're reading right now. Yes, I thought toast was a great name for a blog — I even doodled a mascot.

Flak by relative volume, highest to lowest:

  1. I "have too much time on my hands".

  2. Next, that I haven't done my research.

  3. Finally, that there were other things that needed my full attention.

Of these three only the last one truly concerns me; and I really really do try to avoid going off on some wild goose chase if there are actually things to be done. I do slip occasionally though.

The other two — the first being largely addressed by the linked boingboing article, and the other being sort of an odd ad hominem that is, to be honest, fairly closely related to the first — don't bother me so much. Really, they boil down to someone guessing about my abilities or my priorities. And it's hard to be offended by a guess, unless you let yourself be.

So assuming I'm at least 80% efficient at avoiding these tangents while I'm working on other projects that demand my full attention — and I'd say that's a fair assumption, personally — what are the upsides and downsides of these escapades, and why can't I shake that little voice inside my head that tells me no?

The big downside

Fear of accidentally cloning Hitler?

Downside wise, I think there's about two big ones. You've got your classic Frankenstein "oh good lord I've created a monster" situation, which really doesn't happen very often in the field of programming; and you've got the more likely "what a waste of time" problem.

The first one, taken less literally, could mean you end up having to maintain a pile of code that at one point you found interesting, but somehow, through cosmic forces (or quantum?) just as you realized how boring/horrid it was, everyone else in the world started using it — which means you're SOL. Welcome to maintaining your monster. I haven't personally experienced this one, but I've seen it happen. So, I haven't felt that particular sting.

The second problem, the time-sink problem, is the mirror image of the first problem. This project, whether or not it ended up horribly or boring or super great and awesome, just didn't take off. No fault of your own. There's just no mental market for it — something else already cornered it, or your voice in whatever community you're working within just doesn't carry far enough, or whatever. Worst case here — you wrote something and it was a waste of time. Utterly and completely. No one else cared, except for maybe your relatives or significant other, and only then in the sense that they're just happy you're excited. Heavy Dramatic Sigh. And when someone says something like "Oh, s/he obviously has too much time on his/her hands", it plays into the fear of wasting your time.

These two things, at least, are what keep that nagging voice in my head alive and well.

Learning is never a waste of time.

At the very least, you have an shiny new wheel now.

And it's good that that voice is there — it's there to keep me from getting too sidetracked when I should be doing something else. It's there to be acknowledged, if not necessarily always heeded -- that you can hear that voice at all means that you're probably in the clear. It's insistent because it's providing a useful service to your well-being — it's not there to be rigidly obeyed.

When it comes down to it, even if what you wrote wasn't noteworthy at all, it's furthering your education! It's how you breed domain knowledge. It's — well, at the very least, it's a cheap dopamine rush for the first twenty minutes you start working on it.

For a quick case study, this last spring I wrote a framework for intercepting SSH commands called "Nappingcat", that more or less didn't really go anywhere, and for good reason: the competition was already really stiff. Gitosis is the go-to choice, and if you're not down with Gitosis, Gitolite is an equally valid course of action. But I didn't stop writing Nappingcat, and from that experience I learned how Paramiko works, how the URL patterns in Django work, and it was my first sophomore attempt at putting together a tiny framework. Totally worth the time. I even got to release a client side script called Thundercat! I mean, total bonus points there, at least from my perspective.

I wholeheartedly thought that nothing would really come from this. But low and behold, Django Dash rolls around and I end up working with the fabulously talented Cody Soyland on Repocracy — a project that was totally up my alley, as it involved speaking to git and hg over SSH. It even ended up using another project I totally wrote off, Django-Bluebird, as it's auth system. And I think that, because I had prior experience with these things, the project ended up going way smoother than it would've otherwise.

But that's just it — you don't know that you'll use what you learn from scratching some itch. You cannot begin to predict where and from what direction that knowledge will be leveraged. The important thing is that it's there, and the more you go off on these tangents in your free time — the more you get excited about writing code, whether or not it's been done before — the more domain experience you'll have.

I'm going to stretch for a parting simile: It's like being a beaver. You have to chew wood constantly, even if you're not particularly interested in building a dam — otherwise you get long in the tooth.