  Development of formal proofs of correctness of programs can increase actual
and perceived reliability and facilitate better understanding of program
specifications and their underlying assumptions. Tools supporting such
development have been available for over 40 years, but have only recently seen
wide practical use. Projects based on construction of machine-checked formal
proofs are now reaching an unprecedented scale, comparable to large software
projects, which leads to new challenges in proof development and maintenance.
Despite its increasing importance, the field of proof engineering is seldom
considered in its own right; related theories, techniques, and tools span many
fields and venues. This survey of the literature presents a holistic
understanding of proof engineering for program correctness, covering impact in
practice, foundations, proof automation, proof organization, and practical
proof development.
