There is no reason software systems can't be engineered, just like other constructions are.
The primary reason they aren't is money, which is also the secondary reason. And the tertiary. I worked in a place that did software development that way. Gather all the requirements. Then define exactly what the software does so you can figure out what things are required that weren't written down. Then, having spent 1 or 2 years iterating this process (for anything non-trivial)to lock down all the requirements, write all the code. Once the code is written, send all of it to test. Fix any actual bugs, but any missing functionality due to missed requirements or design flaws waits for the next version. Now, having spent 2 to 3 years developing you can release it. It runs as perfectly as possible, the few bugs remaining are well known and thoroughly documented, and it cost about 5 times as much and took 3 times as long to develop as code that was developed with a more agile process. For the code that is running avionics or other "criticality one" type systems, and where the hardware design is locked down for a decade or more, this is appropriate.
That's probably less than 5% of all software developed. For the rest an agile continuous release system is faster, cheaper, and produces software that is Good Enough.