Similarities between Backpacking and Software Development

At first glance it's hard to think of two activities with less in common than backpacking and software development.  Certainly many who engage in one activity don't usually partake in the other.  Most software developers who do backpack are probably trying to get away from technology for a while.  The ones that don't probably would if they could have a persistent connection to twitter (or a hot shower).  I was a backpacker before I was a software developer and the more I get into software develpment the more similar they seem to me.  I thought about this while I was out backpacking recently and I want to describe just some of the ways that the two are similar.  

Preparation.  "Do I look like a guy with a plan?"  If you're The Joker, or a hiker who ran out of water, the answer may be no, but if you want to be successful as a developer or comfortable as a backpacker a plan is required.  Knowing what route you're going to take is important so you can decide how much water to carry.  Equally so for developers, failing to understand the requirements and plans of other teams can leave you duplicating effort or preventing others from completing their work.  Always have a plan.

Tell Someone Your Itinerary.  Speaking of a plan, it's generally best to tell that plan to other people.  If you break your ankle and don't make it home, will anyone know where to look for you?  If you start working on a critical piece of the data model without consulting other team members, you may waste effort by going down the wrong path, or you may have missed a requirement that someone else knows about.  Always tell someone what you're doing and where you are going.

YAGNI.  Ya Ain't Gonna Need It.  This is probably the biggest similarity between backpacking and developing software.  All too often we see developers who like to add gold plating and extra features to a class or framework where they may not be necessary.  Once I was designing a screen that had a complex custom layout and I had an idea for an additional feature.  I wanted to assign priorities to views so that they could be arranged automatically rather than by index.  I caught myself early as I realized that this absolutely wasn't necessary.  Likewise, people new to backpacking often pack far more than they really need.  "Will I need this hatchet?  Of course!  What if I need to chop firewood?"  Never mind that they are in Texas and there's a fire ban everywhere.  I call this behavior Shiny Object Syndrome (SOS).  When some people see a shiny object or a new toy they can't resist bringing it with them.  Unfortunately both of these behaviors have drastic consequences.  In a software project the team now has to maintain that shiny object forever, whether they use it or not.  When you're backpacking your backpack is often at least 30-40 lbs, and an extra 5-10 lbs of junk can really wear you down.  Sooner or later people realize that they never used that method or hatchet and they leave it out.  Trust me, ya ain't gonna need it.

Determination.  There's a certain amount of determination required to do anything difficult, be it backpacking, developing software, or watching a New York Jets game.  Especially when you're trying to race up a mountain before rain comes, or sprinting towards a release deadline.  Your body is telling you to stop, that you're tired, or that you're not going to make it.  It's up to the individual to put aside the doubts and press on.  Determination is something we all have to have.

Leave No Trace.  While of LNT doesn't directly translate to software, since you do want to leave a documentation trail in your source code, there is one principle that ties in closely.  When you are in the wilderness you should strive to leave everything better than you found it.  That doesn't mean trimming trees or building rock chairs, but it does mean picking up trash, fixing downed trail signs, building and maintaining trail, etc.  The same principle applies to software.  If a developer sees a method or class that isn't built well, contains a bug, or isn't' safe, that developer should strongly consider fixing or reporting it.  Ignoring technical debt has the same awful affect that littering does on the wilderness: it ruins the experience for everyone else.  Always leave things better than you found them.

Organization.  If the sun goes down and you can't see the inside of your pack, will you know where your flashlight is?  What if you need to meet someone at a trailhead, will you know where to go and how long it will take to get there?  This is equally as important in software because you need to know where things are in the code base, what features are on the roadmap, when other developers and designers will be finished with certain tasks, etc.  Know where things are.  Be organized.

Calm Under Pressure.  There's all kinds of pressures out there.  There's deadlines, of course, weather, physical danger to yourself or others, lack of food or sleep, etc.  Staying calm when someone has broken a leg is incredibly difficult, but without calm a first responder cannot act appropriately.  Panic never helps.  Likewise, with a deadline approaching team members have to be calm and perform.  Panic is contagious and if one person loses their calm then they put the entire team at risk.  Take a deep breath, count to three, and stay calm.

Health.  All the determination, will power, and planning won't help you if you can't get out of bed or lose the energy to continue forward.  It's common that inexperienced backpackers don't eat enough on a long day.  Your body consumes roughly 500 calories per hour on a strenuous hike.  On a 15-20 mile hike that could be 5000 calories.  If you aren't eating enough to replenish that then you won't have enough energy to reach your destination.  It's equally important to drink enough water.  Dehydration is the most common injury in the backcountry, not bear attacks or twisted ankles.  It's common for developers to chug coffee and red bull as they try to sprint towards the finish.  People have to think about what they eat and how they treat their body or they won't be able to perform when they need to.  Be Healthy.

It's fun to think about the different aspects of our lives and how similar they are in terms of the basic skills and considerations they involve.  All of these principles are important across many areas of our lives.  Remember that how you approach a problem in one activity may help in another, which is a great reason to diversify your life and maintain a broader perspective.  Or in other words, go enjoy Nature!