Of course I'm an excellent driver.
Raymond, Rain Man
We use driving as a metaphor for developing software. Driving is not about pointing the car in one direction and holding to it; driving is about making lots of little course corrections.
The driving story featured prominently in Extreme Programming Explained, but it is central to XP so we repeat it here. If you read XPE, you'll want to read this chapter only to see if we've somehow managed to make the story a bit more dramatic.
It was a beautiful sunny day. Kent and his mom were driving along a straight stretch of I-5 near Chico. He was about 12 years old.
"It's about time you learn how to drive," said Mom. "Really?" Excitement bubbled in Kent's chest.
"Yes. Now, what I want you to do is get the car right in between the lines and pointed absolutely straight," said Mom.
"I can do that."
Kent very carefully lines up the star on the beige Mercedes 240D dead straight to the horizon. His eyebrows raise a little at just how easy this driving thing really is. After a moment, his eyes drift to a roadside sign.
***ggggrrrrrrccccchhhh*** (hey, you try to write down a sound that combines wheels on gravel with a preadolescent yelp). Kent's mouth goes dry; his heart pounds.
"Okay," says Mom, concealing a smile, "that's not how you drive a car. Driving a car is not about getting the car pointed in the right direction. Driving a car is about constantly making little corrections. You drift a little this way, you steer a little that way. This way, that way, as long as you are driving." You don't drive software development by getting your project pointed in the right direction (The Plan). You drive software development by seeing that you are drifting a little this way and steering a little that way. This way, that way, as long as you develop the software.
One very vocal opponent of XP once used the phrase: "Ready . . . Fire . . . Aim!" The intent was clearly pejorative. How can you hit a target unless you aim first? The point, however, is that we are not trying to hit a target. Instead, we are trying to maximize the benefit of a process.
The driving metaphor helps us once again. Your first act as you get into the car is not turning the wheel so that it points toward your destination. Your first act is usually to turn on the ignition. Indeed, the initial direction of motion has little to do with your destination and much more to do with your local circumstances. You might want to back out of your garage before heading for Peoria. Though you probably have a destination in mind and a route planned, that route and destination are always subject to change. The radio may warn you of heavy traffic, causing you to change your route. Your spouse may call on the cell phone and ask you to pick up some milk, causing you to modify your destination.
Software development is a process. It can go well, or it can go badly. To keep it going well we must continually direct it. To direct it we must frequently assess the direction it is going, compare this to the direction we want it to go, and then make careful adjustments. Thus, good project management can be characterized by: "Ready . . . Fire . . . Aim . . . Aim . . . Aim . . . Aim . . . Aim . . ."