Developing Software is Like Planting a Tree
So how do trees and software development relate? An example will help explain:
You just bought a nice house in a new neighborhood. In typical eco-friendly fashion the builder knocked down anything and everything that was alive before building your new home. Now you have zero shade in your yard and you would really like to have something aesthetically nice to look at – besides your half dead sod.
You decide you would like to buy a tree. You go to the “tree farm” and see that there are some really nice big trees. The guy selling them tells you that the larger the tree the more likely it won’t survive the transfer. For some reason the smaller trees handle the shock of being moved better.
After looking at the prices you conclude that you can only afford a small 2 inch tree. It looks okay at the farm and the guy selling it assures you it will grow fast. You pay to have it brought home. A couple of guys show up with a backhoe and dig a really big hole. The tree arrives and they put it into the hole and cover the roots. Once they are gone you quickly realize that the grand tree you envisioned (and the desired shade) are no where to be found. The tree looks a little pathetic. It is really nothing more than a twig sticking out of the ground. There aren’t even any leaves yet.
So your choices are:
a) Nurture the tree – it will grow slowly and over time it will become a grand old oak of the yard giving you exactly what you wanted
b) Go back to the farm and get a bigger tree – pay a lot of money, dig a bigger hole, and hope that the tree survives
So how is this like software?
Software development should follow the first model. It should be about small controlled projects that slowly grow over time in a controlled and planned way. If you start out with a huge project: you pay a lot of money, you have to dig a really big hole, and there is no guarantee the project will survive. The more controlled and smaller projects may not delivery everything you wanted/expected, but they won’t die on you either. They can be nurtured into meeting your expectations vs. having to completely replace it if it doesn’t.
So say you have this small tree in the ground and a few weeks go by. You figure out that you really wanted an Oak tree but you got a Birch. Now the Birch tree gives you some of the things you desired: shade, aesthetics, but it doesn’t provide everything: size, lifespan. So you go back to the tree farm and order the correct tree. The guys come out and dig up the Birch and haul it away. Now you are starting over with a new tree. It will probably survive, but it may not. It isn’t as large as the Birch, but it will get there.
In software the same thing happens all the time. Companies realize they have an application that doesn’t meet their needs. It has some of the things they want, but not in the way they want. So they toss it and build an application that meets their current needs/wants. Unfortunately those needs and wants change almost before the new tree is in the ground and they have to do it all over again.
If software project teams spent a little more time planning up front; looking at the current needs and possible future needs, then the projects can be structured in a way to more easily reuse some of its pieces. Of course planning isn’t enough. You have to have the vision to grow your “tree”. You have to use the right technology to enable that and you have to support the additional efforts it takes to get you there. Is the added cost of a few dollars today vs. the cost of completely replacing something really that much?
Go plant a tree and make it grow. Stop chopping down all my shade!