Abstract. This paper uses a framework drawn from work in the philosophy of science to characterize the concepts of program correctness that have been used in software engineering, and the contrasting methodological approaches of formal methods and testing. It is argued that software engineering has neglected performative accounts of software development in favour of those inspired by formal logic.