The lifetime of a bridge is measured in decades to centuries, with maintenance every year or so. The lifetime of a bridge building technique is measured in centuries to millennia. A bridge that requires less maintenance is considered a superior product. A building technique that works through the ages is considered fundamental. Physics don't change, ever.
The lifetime of a typical app is measured in months to years, with a patch every month or so. The lifetime of a language or major framework is measured in years to decades. An app that doesn't get frequent patches is considered dead and to be shunned, and the same goes for a framework or language that doesn't get new features. Fundamental architectures aren't stable for more than a few decades.
The people working on bridges, however, are still people, the same as the ones working on software. They can learn techniques, design products, and improve methods at roughly the same pace. You see the intrinsic problem?
Real engineering is the product of generations upon generations of accrued knowledge. You just cannot do that for software, not right now. There are a few timeless lessons, and coders would do well to learn them, but the vast majority of it is far too fluid. I can come up with a beautifully simple and functional piece of software, sometimes, but I shouldn't have to; it should be a solved problem, in hundred years old textbooks. There's very little of that in software, and not nearly enough to build a word processor out of it.
I don't have a fix for this. I hope that a few more centuries will be enough to make software engineering into a real kind of engineering.