Blog by Sumana Harihareswara, Changeset founder

16 Mar 2014, 23:44 p.m.


Hi, reader. I wrote this in 2014 and it's now more than five years old. So it may be very out of date; the world, and I, have changed a lot since I wrote it! I'm keeping this up for historical archive purposes, but the me of today may 100% disagree with what I said then. I rarely edit posts after publishing them, but if I do, I usually leave a note in italics to mark the edit and the reason. If this post is particularly offensive or breaches someone's privacy, please contact me.

I've been thinking recently about the line "A week in the lab will save you an hour in the library," in the context of how programmers keep reinventing the wheel over and over instead of reviewing each others' code or learning from CS or software engineering research. Part of why lots of programmers don't reflexively ask themselves, who's already solved this problem? is a lack of discoverability. StackOverflow is much better at sharing useful code snippets than it is at shifting searchers' paradigms. So much relevant research is locked up behind paywalls, and even when it's publicly available, naive web searches for my problem won't necessarily match the jargon academics use. And another reason is that programmers need a certain amount of initial cognitive and behavioral training even to recognize what classes of problems we have and notice when we could use help. We don't teach these thought processes in most accredited programming education.

Greg Wilson says that, on average, a Software Carpentry bootcamp saves a participant one day per week for the rest of their working life. That's how valuable those skills are, and how under-taught they are in the general curriculum.

I want practitioners, in general, to effectively learn from each other. As Leonard wrote:

When you design the fifty-eighth microblogging API you're limiting your audience and wasting your users' time.

This is a really huge problem and we won't solve it with a book. But we can point out that it's a problem and take the first step towards mitigation.

We can't afford to waste time; there are real unsolved problems that need our efforts. Reinventing the wheel is spinning our wheels.

Which means, among other things, that we need to be able to teach developers to review code effectively. It's been done before and I'd love for someone to say they've replicated that process, or a similar one, in an open source community.


17 Mar 2014, 8:38 a.m.

One of the things I am sort of constantly mulling over is the role of social learning in code. We have this stereotype of code as a profoundly lone-wolf thing -- and we have this pipeline that says if you weren't that lone-wolf autodidact when you were ten you don't get to play -- but in fact, outside the basic syntax, the learning is all social. "What are the affordances of my text editor", "virtual environments exist?", design patterns, "whoa you can do that with developer tools?", "that API exists?", "there's a vocabulary for this class of problems and I can use that to google and discuss and reason about it?" - these are all learned in shoulder-surfing and in conversation.

And there's a thing which dovetails uncomfortably with a massively distributed world - with open-source projects and MOOCs and my own environment, where there may be no more than one person per institution with any code knowledge. How do you facilitate shoulder-surfing?

It's the problem of my own world, too -- I've become a developer in the last few years, and the fact that I've had coworkers whose codebase I've been in communication with has been a real accelerator there - but the fact that my coworkers have always, for all of it, been remote, is a real retardant. I am sure I have large and incomprehensible holes in my craft knowledge ("incomprehensible" in the sense that they wouldn't arise in someone who learned colocated with craft practitioners, and would be very surprising to same). I don't know what they are, so I can't fix them - just stumble across them by accident.

I am doubtless reinventing all sorts of things. Because I'm in this position at all because I have the capacity to invent. I can look at raw electrons and a framework and some syntax and make a thing that does the thing people need. But I am largely unequipped with knowledge of how to do it better. Craft knowledge. Social knowledge.