This essay was first posted on September 20th, 2005.
In preparing for battle, I have always found that plans are useless, but planning is indispensable.Dwight D. Eisenhower
We must be willing to get rid of the life we've planned, so as to have the life that is waiting for us.Joseph Campbell
For our honeymoon, my wife and I went on a two week trip to Hawaii. It's the classic honeymoon.
(This is about software development! Honest! Well, eventually. Maybe.)
Actually, we wanted to go somewhere else, but for various complicated reasons, none of them shady, we weren't allowed to leave the country. (Really!) So Hawaii it was. We went to a local travel agent that specialized in Hawaiian travel and asked her to set up our dream honeymoon. Normally, we just plan these things ourselves, but this was a big trip, we were frazzled with work and wedding preparations, and so we thought some professional help would be a good idea.
Our travel agent--I'll call her Kiki, because I've forgotten her name--set us up with something that looked great. A week "roughing it" (ha!) in Kauai, followed by a few days at Volcano National Park, then relaxation and bliss in Maui. A series of activities rounded out the package. It sounded great.
What could this possibly have to do with software development? Weellll... at this point, it was like we were at the beginning of a software project. We had a nice, pretty plan in hand and we were prepared for everything to go quite smoothly.
Guess what really happened?
Yup, it was a disaster. Our first clue was when our very first hotel--by the airport, before we had even left our home town--lost our reservation. I'll save you the rest of the details. Let me just say that lost reservations and squalid, expensive rooms were the norm. The final straw, though, was realizing that our travel agent had done some truly ridiculous planning. For example, she had us star-gazing one night (three-hour drive, arrive home at 2am) and then mountain-biking the next morning (leave home at 4am for a two-hour drive).
Normally, when stuff like this happens, we just change our plans. I spent several hours on the phone trying to do just that. However, the travel agent had booked all of our activities through another organization that in turned booked the actual activities. The hotels had strict cancellation policies. Changing was not an option, not at the rates that an alternate hotel would charge. Eventually we just cancelled the last half of our vacation and came home. We got some of our money back.
What could this possibly have to do with software development? Actually, it's a lot like software development. The plan was made by an expert who had been to Hawaii several times. But she made mistakes. A lot of mistakes. For whatever reason, the plan just didn't match reality once we got to Hawaii. Reservations were lost, activities were planned hours away from where we were staying, etc. Most software projects don't go according to plan, and like our honeymoon, changing the plan isn't an option. Problem compounds on problem until you throw up your hands and call the whole thing off.
So what do you do?
Well, partly to make up for the Hawaii trip, my wife and I took another big trip last year. This time it was a two-month trek through Europe. It was easily the biggest, most complicated trip we've taken. There's no way we could have planned it all in advance. So we didn't.
This time, rather than creating a detailed plan up-front, we took a more agile approach. We identified the "last responsible moment" for various elements of the plan. For example, airline tickets get more expensive over time, so we purchased our tickets months in advance. But hotels can be booked a few days ahead of time--in fact, too far in advance probably means they'll lose your reservation.
We also took steps that would make us more agile. We purchased a EuroRail pass, which allowed us to travel anywhere in Europe over a two month period for one fixed price. We had identified which countries that we wanted to see, but we paid extra for an unlimited EuroRail pass just in case. (It turned out to be a very good thing that we did.) We also made sure that our cell phones would work in Europe and signed up for our provider's international plan. There were a number of other steps that we took that were geared towards giving us maximum flexibility, like buying a good guidebook, buying quick-dry travel clothing, using good backpacks rather than suitcases, etc.
What we didn't do is reserve our hotels or plan our destinations. We had a general idea, yes. And we arranged for our initial stay and final stay with relatives in London, where our plane landed. Everything else, we planned as we went.
Our trip went like this: a few days before leaving for our next destination, talk about which country and city we wanted to visit next. Stop by the train station, look up departure times, and make a reservation (when necessary). Look up candidate hotels in our guidebook. Email the three most promising and go back to enjoying the city. Next day, confirm one of the reservations. On the last day, laze about, pick a time to leave from list of train departure times. Get on train. Arrive four or five hours later, go to hotel, check-in, drop off backpacks (just one each), go explore. Start thinking about the next city and country that would be fun to visit.
This worked out great. Initially, we thought we'd visit England, France, Spain, Italy, and Turkey. We ended up visiting England, France, Spain, Italy, the Czech Republic, Germany, Belgium, Holland, Switzerland, and Scotland. We cancelled our plans to go to Turkey because we learned it would be a 24-hour ferry ride each way. That gave us lots of time to visit northern Europe. Midway through our trip, we made improptu plans to spend a week in Sicily with some European relatives... and then three weeks later, we did. Two of the best places we stayed, Switzerland and Scotland, weren't even remotely on our radar when we started. We stayed in Switzerland because it was on the way to Sicily and we stayed in Scotland because we had some extra time, but not enough that we wanted to stray far from London.
The trip wasn't perfect. We stayed in a coastal town in France that was having some sort of festival. Our room was expensive, small, stuffy, hot, and on a very very noisy street. We had planned to stay three or four days, but after one sleepless night we caught the 6:30am train out of town. That evening we watched a (non-lethal) bullfight under our inexpensive hotel window and waved to the packed crowds struggling for a view.
What was the biggest difference between this trip and the Hawaii trip? Being able to change our plans. When we went to Europe, we didn't plan, but we did prepare. We had a great guidebook and lots of options. When things didn't work out (like in that coastal town in France, or when I caught a nasty cold in Amsterdam), we just changed our plans so that they would. We didn't have any planned activities, but the spontaneous activities we found instead--like seeing the miniature railroad in Berlin, biking among the vineyards outside Vienna, or hiking the ancient Roman road outside Siena--made far better memories.
We could have had good memories of Hawaii, too. Driving around waiting for the hotel to find our reservation one day, we found a bed and breakfast that had an actual tree house. We even stopped in and found out that the price was a reasonable two digits, not three. I still regret not staying there, but they found our reservation. Had we ditched the travel-agent's plan and simply prepared a list of unique hotels and activities instead, we would have had a great time.
Software development is the same. It's too complicated to accurately plan everything up-front. But if you prepare well instead, you can change your plan to accomodate difficult realities, take advantage of spontaneous opportunities, and get a lot of value.