Posterous theme by Cory Watilo

Exploration and specification

When it comes to learning things, I'd rather experiment than study.

Bear in mind that experimentation is not at odds with studying. In fact, good experimentation often requires careful study. What I am getting at is that in order to understand how one thing works within the context of another, I get more out of playing with it than reading about it.

I've noticed this pattern in many activities; cooking, for example. My wife and I enjoy writings of Michael Smith and Julia Child and have been working from their recipes lately. That said, we don't learn what works in a dish until we try cooking it, regardless of the authority behind the recipe. Learning to cook from just reading about it is remarkably difficult.

What is enjoyable about cooking, even though the specifications (recipes) are not complete, is that the laboratory used to experiment is enjoyable. Most kitchen equipment is simple, though somewhat tedious. During the experiment is it easy to investigate the state of things and sample it to get an idea of the end result. Improvisation is encouraged, both with respect to ingredients and tools, in order to deal with things that don't go according to plan. And even if they don't go according to plan there's still a good chance you'll get something approaching edible out of it.

In short, cooking is fun because experimentation is, for the most part, simple and even if you screw up you'll still eat.

Another example of this is software development. Here I've noticed a culture that emphasizes specification. My experience has been that experimentation within software development environments is not that enjoyable. It gets considerably worse the more strict the system. This is the case even with decent documentation around what the system can do.

Consider something as simple as using a function. If the system is not very strict the setup involved to use the function is usually straightforward — just type it in at a prompt — but determining what is necessary to make it useful can be tricky; if something doesn't work, investigating the result is tedious and rarely informative. In stricter systems, even with a decent specification readily available, the setup needed to use the function can be a pain: surround it with a main function, allocate objects, make sure everything is the right type, and so forth. Both kinds of systems suffer from a lack of meaningful error objects to be poked and prodded (read: tasted).

Yes, it's a gross generalization but in my experience obtaining useful or satisfying results with the elements of a "programming laboratory" means leaving the laboratory and seeking help elsewhere. My kitchen experiences have not suffered from this problem.

In short, making experimentation easy makes me happy. I'll study when I want to know more.

(Ok, so it's a slightly unfair comparison as presented but I want to avoid excessive technical terminology. So there.)