When All You Know is a Nail

The other week I was discussing the difference between what software developers consider a tool and what we consider a material. This came about because almost every developer I talk with ends up referring to everything they use as a tool. Their programming language, their editor, their hosting service, their keyboard, it’s all tools. I realized though in our chat that this doesn’t sit right with me.

When I think of tools I think of the things I use to create and separately there are the materials, the things that go into the actual project and remain there after I leave. When I knit my needles are my tools and my yarn is my material. When I work on my house my hammers, screw drivers, saws, and drills are my tools and the wood, nails, screws, drywall, and so on are my materials. When I garden my trowels, hoses, and buckets my tools and the water, soil, and plants are my materials. When I program my editor, computer, desk, email, and version control are my tools and the languages, frameworks, hosting services, are the materials.

This separation is important because too often I hear people say something like “When all you have is a hammer, everything looks like a nail. When all you know is JavaScript.” or whatever language you want to pick. But JavaScript, and any language for that matter isn’t the hammer, it’s the nail! Which would make the saying “When all you have is a nail, everything looks like …..?”, well I’m not sure. When the metaphor breaks down, or when even the understanding of what role something plays in the process breaks down, we can’t have meaningful discussions about the tools and materials we use.

My hope here is to shift the discussion a little towards the idea that the languages and frameworks we choose are like the bricks and mortar, wood and nails of our homes. They are not easily changed or moved and care should be taken when choosing them.