I just read an article by Jeff "CodingHorror" Atwood about a comparison between Software Projects and Rock Climbing.
As someone might have guessed from my domain and from the logo of my blog, I'm a rock climber
Some comments on the original post say that, with the right justifications, probably anything can be compared, more or less, to software projects. I think this is correct: words are a very powerful tool if used by someone that knows how to use them.
But let's focus on the original software project - rock climbing metaphor.
First let's say that there are a lot of types of climbing:
- top-rope climbing
- sport climbing
- traditional climbing
- mountain climbing
and each of them have a different approach to the climbing.
So let's explain which are this approaches and how can we compare software to rock climbing
You climb small boulders, short pieces of rock (max 3-4 meters), usually more technical that usual routes. You climb without a rope, but you use some kind of mat where you can fall on without harming yourself.
Here you climb alone, but you need a good partner or group of friends looking at you to help in case of a fall. No tool are required, just your hands and a chalk bag. You try the problems many many times until you finally complete it. It's really challenging and a lot of fun.
But doesn't fit the software project metaphor: probably it's more like trying to write a powershell script that gets an RSS feed from flickr, saves the images on a temp folder, writes an HTML page and than opens IE to show a nice image gallery. All directly coded in the commandline . This just programming for the sake of it.
You climb with the rope from the top. With this technique you can try routes or problems a bit over your level of skills without the risk of falling down. This is usual in indoor climbing walls where people go to train. And usually climbers do this kind of climbs because they have to do, not because they have fun doing it.
I cannot find a development scenario that is similar to this kind of climb.
That is rock climbing as people usually see in magazine or in television: you climb a pre-bolted wall with the rope from the bottom and every now and then you clip the rope into a quickdraw connected to the bolt that is in the wall. So if you miss an hold, you fall only for a few meters (till the last bolt). Routes can be from 20 to 50 meters long, and can be joined to reach the top of a tall wall or cliff.
This is more like programming, the act of writing code, going from a bolt to the following is like implementing use case or interfaces that someone else already designed. "Real programmers" like this kind of activity more than dealing with architecture, project plans and similar stuff.
Probably the more rewarding type of climbing: like in sport climbing you climbs vertical walls, but you have to place your own gear into the wall. You need to be more experienced, you have to find your own way up to the mountain, you need to plan for the climb, look at pictures of the wall. But once you are hanging on the wall you are alone, just you and your partner.
We may say that Trad climbing is like working on a project developed using an Agile/XP approach: you write some guidelines and use cases at the beginning, you design the general architecture, but once you start climbing (ehm... programming), a lot of factors can force you change from the original plan: a thunderstorm coming, a crack that is too friable, a wall that is too steep or with no holds.
Mt Everest, K2, but also Mt Cook, Mt Blanc, Gran Paradiso: climbing one of this mountain requires a lot of stamina, a lot of planning, a lot of different tools and a lot of experience. A mountain climber is not necessarily a sport or traditional climber, and viceversa. Different skills are needed to complete a 40 day expedition on Mt Everest. To get to the top you have to plan, you have to climb a bit each day, set up base camps at various altitudes, put fixed ropes to help yourself and the others of your team in case they are getting tired or want to save some energy for the trickiest part of the climb.
Comparing to software development this is like designing a big enterprise application with a BDUF, with a 1 year roadmap, spending heaps of money, with a big team of developers.
So, is Software Project similar to Rock Climbing?
In my opinion the most realistic metaphor is Sport Climbing == Programming:
It's fun, it's not dangerous, it's technical but you need only strictly technical skills, you have to know your tools, but you need to know only the ones you really need, you don't need to plan a lot because the route has already been setup by someone else, and it's not very team oriented.