
This book is about programming per se. It is about the most elementary principles of program construction—problem decomposition, invariant properties, and guarantees of progress. It is intended to appeal to both novice programmers, who wish to start on the right track, and to experienced programmers who wish to properly master their craft.
Although the subject matter of the book is 'elementary', in the sense of foundational, it is not 'easy'. Programming is challenging, and it is wrong to skirt the issues or to wrap it up in a way that makes it seem otherwise. I have lectured on this material for many years, mostly to undergraduates on computing science degrees, and, occasionally, to professional programmers. Inevitably, it is the experienced programmers who appreciate its value the most. Novice programmers have the additional hurdle of learning how to write code—too often in a highly complex programming language. For them, the problem is the programming language, whereas, of course, the programming language should not be a problem, but part of the solution.
