Software development has been compared to many things. I'd like to propose another comparison: Evolution.
Why another metaphor?
A metaphor enables you to think about a problem in a different way, thus possibly gaining new insight. It is also useful for explaining something to someone who otherwise wouldn't understand what you are talking about. Or to use software development wording: It is an abstraction.
The ideas of evolution are well known and considered valid in the scientific sense. It is also area of abundant scientific work, which actually might be useful in the context of software development. Compare this to other metaphors like gardening and crafting.
And of course I think it fits.
Let's start in the beginning. A new software development project starts with ideas. Ideas about what the software will be able to do, ideas about all the features it will have and ideas about in which way the software will be implemented. But on their own these ideas are nothing. The moment you stop thinking about them they cease to exist. If you don't push the ideas forward, nobody else will.
This is similar to the primordial soup. In which many pieces, i.e. molecules needed for life existed. But these molecules couldn't yet reproduce themselves. And many of these molecules fell apart before finally some where 'lucky' enough to form droplets which met the requirements of the definition of life, although they where so extremely primitive, they can hardly be compared with our ideas of life. Consider the description wikipedia gives.
These would combine in ever-more complex fashions until they formed coacervate droplets. These droplets would "grow" by fusion with other droplets, and "reproduce" through fission into daughter droplets, and so have a primitive metabolism
This could only happen because they existed in a suitable environment: They had enough energy (from the sun and vulcanism) but not so hot that everything was boiled immediately. All the needed materials where there suspended in water, so they could interact easily often and fast.
Compare that to your ideas of the next software project. Maybe you don't have the energy to drive your idea forward. Maybe you don't have the right partners to work with, maybe you don't have the necessary tools. All these might be reasons a software project dies, before its first steps. But if you manage to bring your ideas into a suitable environment, you'll be able to create a first prototype, a sketch, of what your product will be. This sketch is important. If you make it to complicated you won't get there within this century, just as the dinosaurs weren't created directly from the primordial soup.
Once you have this first prototype, things get really interesting. Again you need the suitable environment. But if you have that, features will get added to your application, and it will grow, both in size and in complexity. This in itself will create new ideas for features. Sometimes these features will be added to your piece of software, but sometimes they will form into an independent software project. While your project moves a long and gathers features and complexity, it will move with different speed. Sometimes features will get added on a daily bases. Sometimes you will be busy cleaning up stuff, doing small tuning for days in a row, with hardly any new features, and sometimes you (hopefully) will decide, that a cluster of features really does not help the application, and throw it from your code base.
Again the similarities to evolution are abundant. Life sure grew in size and complexity. And many kind of life could only appear because other forms of life where already there: Almost all animals need oxygen, which only exists in the atmosphere because of plants. Carnivores would get extinct pretty fast if there weren't other animals for food. Similar things are true for parasites. Evolution also doesn't proceed with a steady pace. There where times, when new species evolved extremely fast, and of course we all know about the extinction of dinosaurs, which is only one case of many cases where nature decided to drop a couple of features.
I hope you enjoyed my comparison so far. But I claimed, that metaphors like this are actually useful. So let's see, what we can get out of this one:
- The environment is important. There is no life on Venus, because it is to hot. There is most probably no life on Pluto, because it is to cold, and there is hardly any life if at all on mars, because it is to dry (among other things). I'd say the same is true for software development. You need a good (integrated development) environment, office, coworkers and boss, to develop great software.
- If you want to create something really great, a detailed plan is only useful if you are a god who can control everything, and event that is disputed.
- You can't expect to control a software development project by changing one aspect of the environment. If you have fish, and want evolve them into animals living on land, drying up the oceans will kill the fish, but not create mammals. But making land available for testing, getting plants there for food, and convincing some of the fishes, that they will be safe from sea-born predators on land will eventually convince some of them to develop lungs. This will take time and constant pushing.
- Simpler is better. Humans seem to think they own the world. The opposite is true. There are many more species, individuals and kilograms of bacteria then humans. Same is true for ants.
- How ever careful you engineer the environment, sometimes accidents like the human species just happen. In these cases starting over might be your only option.