I really like metaphors. They make it easier to understand and explain complex and abstract things easily. One of the most used metaphors in software development is the house building metaphor.
But unfortunately it isn't a good fit for modern software development,
First of all a house is built from the basement to the roof. One floor after another.
In software development we have layers but usually we don't complete a whole layer before starting to work on the next one.
Also if we do test driven development for example we are constantly refactoring (which is the equivalent of reconstruction of the house). If I would see workers constantly building, moving and removing walls I would be very irritated but it's basically what we are doing with constant refactoring.
Another difference is that you can't start to build the house without an exact plan. You shouldn't differ from the plan by more than a few millimeters but in software development it's often counterproductive to have a big plan. (But you should have a plan anyway but "Big design upfront" is really an anti-pattern)
Additionally the customer usually doesn't change it's mind while it's house is being built. But it's not an exception that the software developer's customer comes up with new and changed requirements during the development phase.
But unfortunately I don't have an idea for a better software building metaphor.