waterfall aspect as of the mix of routine and unexpected. Construction, also, is generally thought of as cut and dried, but the daily reality often requires flexibility and creativity.
this is a great point ... I've done several building (re)constructions at non trivial scale (well for me) and have never witnessed a blueprint get perfectly instantiated ... many times available building materials, skills, manpower (1 person doing something versus 10), etc...but I think the biggest delta always resulted due to the fact that blueprints are always out of date the moment they are drawn.
back to the bridge analogy ... I still think its good; as long as you also add that, unlike the real world, that we often start building bridges before we understand the final destination of the span, or worst change the destination in mid construction.
This would be disastrous for most real world construction projects (and hence the analogy breaks right done) ... but we are fine in software because it is so 'flexible'.
I do think that there are limits to how many times you can be 'flexible' during the lifetime of a software project; just because it was easy to change your mind early on, doesn't imply you should do so later on ... over time there should be 'crystallization' as fundamental truths of the system appear.
By having a flexible data model a system should be able to weather changes ... its when code calcifies is where the real problems arise.