Building Software is like building a house.... except
Quite a while ago now, I heard the analogy that building good software was like building a house. You start with strong foundation, and build up. You don't start with the roof and siding. Since then, many years and projects have gone by. And as I get older (and possibly more skeptical) I feel that that analogy doesn't quite tell the whole story.
The analogy isn't necessarily wrong, but it doesn't quite tell the whole story. You see, building a house requires builders, plumbers, electricians, brick layers and/or carpenters. Not to mention, the architects, surveyors and all manner of other folks. To build the strong foundation you need all the people involved to understand what a house needs, you need those people to communicate their components to one another effectively and clearly. Simple mathematical errors can have huge knock-on effects, simple materials substitutions can mean that foundation starts of shaky. And on it goes, the taller the house gets the more people involved, the more errors can occur when people don't communicate or try and cut corners. Software development is no different. It's not enough to be a developer in the modern enterprise. You can't just be given the requirements of a multi-million dollar project and run off and get it done. Well, that's not true, I'm sure it happens all the time. But a project strung together with best intentions, eighty hour weeks and tight deadlines does not a successful future make. Without good planning, without early communication, a software project (like the house) is going to struggle later. It might stay up for years, the cracks might not show for a long time. But they will show. Maybe when you go to add that new feature in, and realize that it doesn't quite work. Unfortunately, when this happens, it won't be the management who demanded the project in under three months. It won't be the PMs who provided vague requirements based on the dreams of the management. It won't be the QAs who had very little to go on for testing, but passed things anyway (likely because the project was sold to everyone as a minimal viable product). It'll be the developers. So, software development is like building a house. Building a house where nobody wants to talk to the other people involved, everyone has ever tighter deadlines and at the end of the day blames the laborer responsible for carrying out their designs.