The title is, of course, an exaggeration, but is a major part of the intent of this course. It is intended for serious programmers who need to develop large or complex codes, or to write applications that will be used and worked on by other people or over a long time (years). It will describe some of the design and coding techniques that can make debugging easier (sometimes even semi-automatic), and reduce the overall development and maintenance effort by spending a bit more time during design and coding.
It is applicable to any conventional language, from Python to Fortran to Java to C++ and even assembler, and will describe the techniques in generic terms. It should be regarded as part of the practical end of software engineering - everything covered will be something that the speaker has found to be useful in practice.
Introduction and Principles (also in the form of a Handout for the MPhil )
Checking and Diagnostics (also in the form of a Handout for the MPhil )