What backpacking taught me about software
Going backpacking is a surreal experience. There are few moments in modern life where we bundle up everything we think we may need in a single pack and then wander off into the unknown. Before departure, we have plenty of time to check (and double check) our packing list in the comfort of our homes. Once we are out in the wilderness however, all bets are off, you either have a working system or you have a problem.
For me, this causes a great deal of respect and care for the gear that I choose to bring with me. On the average day, I don’t pay attention to the intricacies of my water bottle. While packing, I do. It has to be sturdy, lightweight, and have adequate capacity. If it doesn’t, it shouldn’t make it into the pack. The limitations on what I can bring actually cause a reflection on whether anything is worth bringing. Small tools, like a carabiner, may on the surface look boring. In action, they are invaluable.
In packing, I began to think of software… (what can I say I really do love computers). Now that I move between computers more frequently, I find myself thinking of the backpack concept as I figure out what should be placed in my configuration files. Similar to the water bottle, a fancy tool doesn’t necessarily make it the best. Or the carabiner, something like git that is quite straightforward actually holds so many parts together. Although we live in an always connected world, perhaps there is merit in thinking that we should design a core software system that could hold its own without an update every day.
Core concepts
I will try not to stretch the metaphors too far, but below is a rough idea of how I was thinking about things.
The Backpack: Neovim
For me, this would probably be neovim. This is where everything gets done, and then additional small tweaks are added to make it feel my own. Should this strap over here be tightened? Does the overall weight feel appropriate? I don’t want something that feels like it is missing key functionality, but I also don’t want it to be weighed so heavily that moving with it feels like an impossible burden.
The Packing List: The dotfiles
This is kind of “my identity as a hiker”, the document that lays out what I always want to bring with me, and how I would rebuild an identical pack if I were to find myself somewhere new. Not everything has a place on the list, and everything on the list needs to be checked to make sure that it is sill functional every year, so adding things carries a cost.
The Map: The todos and notes
A clear set of instructions about where I have been, and where I need to go. It should be exact enough that if I come back to it in a weeks time, I still remember the context in which I originally made certain notes. I should also keep notes about where a have been to avoid having to figure out the same problem twice.
The Light Gear: Small cli tools
It can be easy to go overboard with light gear. While at the shop I saw a portal phone holder, a mobile shower, and fancy food utensils. It can be easy to think “well that sounds awesome, I could totally see myself using that”, general purpose tools such as carabiners and rope are far more important. For me this might be something like lazygit – useful in almost every situation and not overly fancy.
Respect for tools that work well
One of the carabiners that I picked up has the ability to integrate with a rope (has some notches and ridges in addition to the normal clip structure). Such a small design change immensely improves the usability, and I found myself with a certain sense of gratitude towards the tool. In today’s complex world, this little thing does a couple things really well, but nothing more. In software, respecting the work and ingenuity that goes into things that “just work” is so important. Contribute back to the developers and projects that you value most, so that the toolset you rely upon can continue to be amazingly boring. Just because something doesn’t get new features every week doesn’t mean that the tool isn’t doing its job.