Apprenticeship Patterns: Concrete Skills

Feb 10

One of the things I appreciate about Dave Hoovers book Apprenticeship Patterns is the idea that writing software is a craft. Unsurprisingly, not everyone wants software writing to be a craft. If software is a craft, you run into some problems with personell and hiring, because unlike line workers, craftspeople are not interchangeable or easily trained. And some people don't understand that a simple retaining wall is just as much a product of the stone masons craft as a soaring cathedral. Me, I like the idea of craftsmanship, even if I sometimes forget that I'm still an apprentice.

When I want to remind myself of where I sit in the craft hall, I just think of a task that should be automatic and isn't. The kind of thing I'm thinking of is what Hoover calls a concrete skill, things like writing build files and deployment scripts, setting up Rakefiles and automating tasks. The sorts of things that need to get done but aren't particularly fun to do. When you are in the position that I'm in right now, trying to get on a skilled team that offers a great learning opportunity, it helps to have some concrete skills that people value.

One skill that Hoover listed that I've actually been working on a lot over the last few weeks is JavaScript. There's an old saying that a programmer should know three languages, English, C, and something else. I think we're rapidly getting to a point where it would be more accurate to say English, JavaScript, and something else. JavaScript is everywhere and it shows no signs of gettting less significant as time passes, even though it still seems to be a risky choice as the primary language for a project.

But this concrete skills thing gave me an idea for a different kind of coding kata… a kata that focuses on coding infrastructure rather than coding itself. I'm not sure what these utility kata would look like, but the idea sounds good. Maybe a Rakefile kata… create a rake task that runs a specific set of tests. Or a Puppet kata to write a puppet task that installs a particular project from github, stuff like that.

What are the concrete skills that would make a rookie an instant asset to your team?