Seriously, though: software "engineering" could actually earn the name, if we had rigorous professional standards, regulatory oversight, and product liability.
Seriously, though: software "engineering" could actually earn the name, if we had rigorous professional standards, regulatory oversight, and product liability.
You don't see that happening with aviation software where requirements are set in stone.
Apple does that and they couldn't be further apart from aerospace engineering quality. Their software and hardware has been historically littered with problems and bugs.
I'm well aware of the admixture of folklore, experience, and caffeine-fueled inspiration that constitutes much of the software that runs our world.
We can not prove everything, as others pointed out the fundamental issue here is the "halting problem". However, this doesn't mean we can't prove anything. Wikipedia says:
> In computability theory, Rice's theorem states that all non-trivial, semantic properties of programs are undecidable.
I often feel like the "trick" is to push the trivial stuff to be as useful as possible. You can work from several vectors: 1. You build better static analyzers (difficult and computationally expensive the further you push it - but that's what we're doing) 2. reduce the complexity of the "analyzed thing" (high level language, assembly,...) to allow for easier analysis, while still being useful (a assembly language only supporting 'nop' is trivial to analyze, but pretty useless overall; otoh you can disallow some constructs in C to make the language easier to analyze).
There are of course other forms of "provably correct". E.g. programming in a language that has proofs attached to it, like coq [which is the name of a proof assistant]. Disclaimer: I've never used coq myself, but know plenty who do. I think that's something that might interest you. [And thanks to the genius who christened that tool: No, seriously, I'm not trying to be rude!]
[edit] Didn't check that link, but maybe you find it interesting https://www.cs.princeton.edu/courses/archive/spring13/cos510... There are of course other approaches than coq, e.g. Isabelle is often mentioned. See the "See also" on https://en.wikipedia.org/wiki/Coq
I'd also point out that in MechE/CivE fields, you're still dependent on materials (and maintenance) working as advertised. It's also often the case that operating conditions just end up being different from what was designed for or certain failure modes weren't considered. See, e.g. the Citibank Building in NYC http://www.slate.com/blogs/the_eye/2014/04/17/the_citicorp_t...
The big issue is that writing a useful specification can be hard. Especially if you want to also make the specification easy to check.
A side issue is that your proof will make assumptions about how a computer works that are simplified.
From need a better MTBF? Throw a couple more inline flip-flops.
[1] https://en.m.wikipedia.org/wiki/Metastability_(electronics)
Can I tell your customers that the software you're selling them is only built for "low consequence" applications?