Joho the Blogconfessions Archives - Joho the Blog

August 2, 2010

The flatfooted learning society

I’ve been a hobbyist “programmer” since 1984 when I got my first computer. It was a KayPro, and, although I was a humanities guy with no computer background, from the first time a character I typed showed up on its screen, I was curious about how the damn thing worked. So, I started poking around. I ended up teaching myself SBASIC (a structured version of BASIC that came with the machine) and then some Assembler because SBASIC over-wrote the section of memory that contained WordStar documents I wanted to rescue from the machine’s frequent freezes. One of the pieces I’m most proud of as a writer is was my beginner’s tutorial on assembler, using my WordStar program (SaveStar) as an example, published in Profiles, the KayPro magazine.

Back in the old days, most of the time you put in learning programming on your own was spent being stuck. I remember in 1985 or so calling a random professor in Boston University’s computer science department after spending days and days unable to figure out something about file-handling in SBASIC; he didn’t return my call, and email was not an option. Now Google can answer just about any programming question I have, because as a perpetual beginner, my questions are rarely unique. Within seconds, you get a list of freely available code that you can just plug into your own project. Boom, done.

But not necessarily boom, smarter.

I “program” for two reasons. First, I enjoy it. For me, it’s puzzle-solving. I also like the sense of control over my environment. Of course, the environment is a hugely artificial, constructed environment. But, it happens to be the environment in which I spend almost all of my day.

Second, “programming” is a semi-practical pursuit. Over the years, I’ve written utilities customized entirely to my needs and preferences. In most cases, the time it took me to write the utility far outweighs the amount of time it saved me — usually by orders of magnitude. In a few cases, I’ve used the utilities for years, adding features until they are over-stuffed, hideous beasts. The best example is the blog editor I’m writing this post in. Some of the features — e.g., the color picker — were obviously needless additions, but I got interested in how to programmatically create a display of all the Web-safe colors. Other features never quite worked, but I’ve left in the UI access to them because maybe someday I’ll get around to fixing them. And some features are so useful to me that I don’t know why every blog editor doesn’t have them; for example, when I create a link, my editor remembers it and offers it to me the next time I select the same text. It also records how often I’ve used each link, information I’ve never looked at but it’s comforting to know it’s there. (Don’t tell me all blog editors do that now! I don’t want to know!)

There’s another dimension of the pleasure I get from “programming.” The Web is an incredible environment for the pure fun of learning. When it comes to software, you can almost always find an explanation that is just slightly over your head, so you’re stretched. You can do it in private, googling as many dumb questions as you want. (Note: Some questions are dumb. Believe me. I google them all the time.) Software development is such a deep, deep field that you’re never going to run out of things to learn. And, you get to actively observe a culture that is extraordinarily rich in norms, mores, and personalities.

But, I am a flatfooted “programmer” and always will be. I have limitations that would have kept me from ever becoming a professional. I have an odd inability to handle indirect relationships, e.g., pointers; I did fine with C, but bombed at C++. I have problems with recursion, so although I once did a fair bit of hobbyist Lisp “programming” (I once wrote a beginner’s guide to Lisp as a document extension language), I can’t handle the self-reflexive capabilities that turn Lisp into a super-tool for Paul Graham. I’m terrible at math. I simply could not have become a pro.

At the same time, as a hobbyist, the programs I write are also quite limited. They tend to be small. If they get biggish, almost always it’s because I’ve added more features, not because they’ve gotten more complex. They are for personal use. I am doing this in my spare time.

Give my limitations, the limitations of the programs I write, and the reasons why I enjoy “programming,” I think being flatfooted is a pretty rational approach. (Not that I have a choice about it.)

Let me be more exact. I write code that goes step by step through a process even when I know there’s a more efficient, more elegant way to do it. I do things the long way. I spell things out that could be abbreviated. Why? Because it’s easier to debug, it’s easier to figure out what I was doing if I go back to it, and my “programs” are so small that extra processing steps will not noticeably affect performance. For example, if I want to create an array that associates two values in Javascript, I’ll just create two arrays and keep them in sync. I know there are more elegant ways of doing this. But this way works and lets me give each a descriptive name. I also use too many globals, create functions when adding methods would be better, often skip jquery’s shorthand because I have trouble reading it, and have passed multiple variables out of a function by combining them into a single string with some unique delimiter between them.

So, I am flatfooted. Pedestrian. A literalist. Without grace. Inelegant. Inefficient. Wasteful. Taking long cuts. It’s embarrassing. I see the leaps professionals make, and I am awestruck. It’s like watching aerialists at the circus while you’re schlepping back to your seat with root beer stains on your shirt.

Nevertheless, I want to encourage my fellow flatfooted beginners. Since I’m “programming” almost entirely in Javascript these days (and loving it), there’s no problem finding tutorials and helpful guides. But, when you have a specific problem — some bit of functionality you can’t figure out how to create — you are often dropped into a geek-on-geek world that assumes the person asking the question understands more than beginners like me do. The code can get so compressed, so efficient, so elegant that it can be just about impossible for someone like me to understand. Real programmers of course should and will explain what they do in their own terms, and with the most advanced techniques they can create. That’s why beginners like me should share more of what we do. We don’t do it as well, but we can often learn from one another better, even though it means exposing flatfooted code to a world of professionals with wings on their ankles. And the especially kind ones will swoop down now and then to set us straight when we’ve gone too far wrong.