I make software that is broken ALL THE TIME. And what do I do then? Find the faults and then fix them. Just because software is not perfect does not mean that I sit like a dog in a house fire saying, "this is fine."
Killing 300+ people is broken. And our obligation is to admit that it is broken, and fix that thing. When we find another thing, we admit that the system is broken there as well, and go fix that.
Trying to diminish the seriousness of 300 deaths with mealy-mouth terms like "imperfect" is pure spin. If a plane, staffed by pilots allegedly trained on how to fly it, crashes from pilot error... TWICE, the system is broken. terribly broken.
See also: Security, physical or digital.
Terrorists flew planes into the World Trade Center. The system was broken. We fixed some of it. We put on some secuity theatre too. But we didn't say, "It's impossible to fix everything, so the system is fine." We didn't shrug it off as "imperfect."
We always begin by being truthful with ourselves about the fact that we have discovered that the system is broken. And if the consequences of its broken-ness are unacceptable, we fix it.
"Imperfect" is a word that should only be used for acceptable faults. Like, "The seating in economy is imperfect." It's too close together, but we don't have planes falling from the sky because they're cramming passengers together.
---
And now a footnote: Please avoid ad hominem arguments like "please name one system you've..." If the speaker's argument has a logical fallacy, point it out. If the speaker's argument is sound, it doesn't matter whether they write faultless software, or even whether they write software at all.
It's the argument we are discussing, not the person making it.