The author considers what it takes to develop truly reliable software systems, and what the role is of program verification in all this. One problem he focuses on is the difficulty of writing good specifications, particularly in making sure that those specifications are complete. Reality can be surprisingly good in showing that our painfully constructed software design requirements are incomplete or even incorrect.