Is Software Engineering Possible?
Edsger Dijkstra famously derided software engineering as &quot;how to program when you cannot&quot;.<p>But if being able to program means being able to write large programs and get them perfectly correct, then no one has ever been able to program, the great Prof. Dr. Dijkstra not excepted.  We all have puny brains next to a million lines of code.  That being the case, the study of &quot;how to program when you cannot&quot; is critical for those of us who actually need to write these large programs.<p>I like to say that software engineering is <i>the art of managing complexity</i>.  Designing abstractions to be as general as possible, with interfaces as simple and clean as possible, and minimizing coupling, makes it much easier to think about how the major components of the system interact.  And that&#x27;s the key: if it&#x27;s too hard to think about the system at a high level of abstraction, because the interfaces have too many special cases in them, more mistakes will be made.<p>I don&#x27;t think I can agree with the OP that formal verification is the only thing that can fairly be called software engineering.  I do agree that the more verification we can figure out how to do, the better.  But I would point out that well-designed abstractions are still important even when you&#x27;re doing formal verification; indeed, possibly more so, because without them, the proofs get to be even more complicated and difficult than they need to be.  It&#x27;s really the same phenomenon: systems that are hard to think about are also hard to prove things about.