I discovered an interesting analogy: software systems are like cities. In very many ways.
1. They are continuously changing/evolving
It would be absurd to expect that a city can be first designed, and then built in one go. And then, it functions till the end of times without major changes.
2. They are designed by many autonomous people
Even if there is one chief architect when designing a city, if can not have control over everything. It can provide stylistic guidelines, and design the bird-view looks of the city, and maybe some key buildings at best. But nobody can control the whole design, all the high-impact decisions that are made during the building of a city.
3. The passage of time shows
The age of the building shows, so does the age of software. In the software world, it is sometimes called software erosion.
4. Components may not fit together perfectly
The city does not provide a uniform look, even if it tries to. Buildings are designed by different people, following different guidelines. Sometimes two buildings standing next to each other differ so much that it hurts the eye. Still, until they function well enough, we have to live with the fact.
5. Design is not always carried through implementation due to lack of resources
Even if the plan is nice, lack of time or money can interfere during the implementation, leaving the end result simplified, altered or half finished.
So, if you ever find yourself in the situation when you have to manage expectations about software systems, think about this analogy.