Who gets it perfectly right the first time?
There was an interesting argument I was a witness to a few days ago. The basic premise was, a developer was complaining about the lack of thought that went into a particular area of a particular piece of software.
He was right. The most basic amount of thought had been put into it, and the thought that had been put into it was wrong. It was causing him some distress (shall we say…) and the conversation was getting quite heated.
At this point in time, one of the company principles came out of his office, and in defense of the software said something along the lines of, and I’m paraphrasing, “Nobody ever gets it perfectly right the first time. I suppose you always get things right the first time, yes?”.
He was right as well. Nobody ever gets it right the first time. We all have to make decisions based on what we know at the time, and then we have to live with the consequences.
However, there’s not getting it perfectly right the first time, and there’s really not getting it right the first time. In considering this, I arrived at the following long-winded and possibly pointless analogy:
Lets say one day you decided to be a furniture mover. You decide, based on nothing other than the fact you like the colour, (and that it’s got an MP-3 CD player, built-in GPS, and self-parking) that you’ll use a Hyundai i30. When you get to your first job, things start out well enough. You’re able to pack a couple of boxes onto the back seat, you get a hatstand in the front passenger seat, and some clothes get shoved into the boot.
At this point, the home-owner comes out and asks how you plan on moving her 24-foot long, solid marble dining table. In a burst of inspiration, you hire a boilermaker and weld a bunch of steel tubing onto the car making a nice flat area on top. With a great deal of effort, you get the dining table onto the roof, and the car’s wheels bury themselves into the wheel arches.
With the car fully loaded, you decide to set off for the next house. Except you can’t open the drivers door. There’s a steel support strut welded to it now, holding up the dining table on the roof. No problem though, you just smash out the windscreen and climb in over the dash.
You buckle in, turn the engine over, put the automatic transmission into drive, depress the accelerator and… nothing. The engine is revving, you can hear the transmission straining, but the car doesn’t move. Not a problem, you decide. You climb back out the windscreen, jump in a cab and dash to the Hyundai service centre. “Three i30 engines, please!”, you ask confidently. (Let’s just imagine this is possible, for the sake of artistic license…) The smiling and helpful service manager drops three new engines into the back of your cab, and you head back to the house.
You stand back and admire yours and your boilermaker’s skill. You’ve removed the engine from under the bonnet, and bolted an engine to each wheel. Magically, (because this is an analogy – I think…) all the engines hook up to the cars controls perfectly. You climb back in over the dash and fire them all up. Delicately, you squeeze down on the accelerator and the car pulls away from the curb. At this point in time, the heavens open up and a storm like you’ve never seen pounds the car with water droplets the size of dachshunds.
You jam on the breaks, praying that the dining table doesn’t slide off the front of the jury-rigged assembly holding it up. You reach into the boot and grab one of the shirts. Handing it to the boilermaker you say, “Every ten meters, wipe my face with this.”. At this point, the boilermaker turns to you and says “You didn’t put much thought into this, did you. You should’ve just got a truck with a pan…”. But he doesn’t get to finish the sentence as you cut him off with a tirade about how little he knows about the moving business, and how he should think twice before telling you anything about moving because you’re the moving expert. Etcetera.
Now, let’s do the alternate universe. You’ve decided to be a furniture mover. So, you sit down and thing, “What kind of vehicle will I need to help me carry around furniture?”. Logic dictates that you scribble down a list of things you think people might ask you to move for them – televisions, beds, lounges, fridges, dining tables, boxes, small dogs – and you decide that a medium sized truck with a 20-foot long pantech would be what you want.
You turn up for the first job and the owner mentions they’ve got a 24-foot long, solid marble dining table. Being a reasonable person, you realise you may have made a mistake with the size of the pantech. A quick call to the pantech supermart confirms that they have a 30-foot long one there that they can swap out with yours in about 30 minutes. You tell the owner that it’s not a problem and you’ll be back in an hour.
An hour later you return with your 30-foot long pantech, fit all the owner’s belongings – including the dining table – and are able to drive to the new house even though it’s bucketing down.
I’m sorry that this has been quite a long and seemingly senseless exposition, but my point is, while nobody ever gets it perfect the first time, you can come close with a little bit of thought.
In the software world, it’s impossible to think of every possible variable that will impact the development and operation of any software you’re going to write. You can, however, still take a reasoned and logical approach and consider a fairly significant proportion of the important things. Using that list, you’re then able to formulate an approach for what you have to do based on actual requirements and logic. Not to mention, with some idea of the scope of the problem, you can then consider applying best-practises and industry norms to help speed up the process.
Without making these considerations, you’ll wind up trying to move a 24-foot long dining table with a small Korean hatchback. Justifying your mistake by telling yourself that you made the best decision at the time based on nothing other than ego, or a desire for the shiny-new, or factory options, is ridiculous.
Making an informed decision based on reality and a pre-existing body of knowledge will always mean that, even if you get it wrong, it may be good enough for now, and it will be a lot easier to move it closer to what you really need later on. Don’t be afraid of your limitations, be open about what you know, and be willing to accept you’re wrong. Then fix it.