The entire range of activities used to design and develop software, with some connotation of “good practice”. Topics encompassed include user requirements elicitation, software requirements definition, architectural and detailed design (see program design), program specification, program development using some recognized approach such as structured programming, systematic testing techniques, program correctness proofs, software quality assurance, software project management, documentation, performance and timing analysis, and the development and use of software engineering environments. Further, software engineering is generally expected to address the practical problems of software development, including those encountered with large or complex systems. Thus, while there is some emphasis on formal methods, pragmatic techniques are employed where necessary. In its entirety, software engineering addresses all aspects of the development and support of reliable and efficient programs for the entire range of computer applications.