This book deals with the presentation and systematic design of mathematical proofs, including correctness proofs of algorithms. Its purpose is to show how completeness of argument, an important constraint especially for the correctness of algorithms, can be combined with brevity. The author stresses that the use of formalism is indispensible for achieving this. A second purpose of the book is to discuss matters of design. Rather than addressing psychological questions, the author deals with more technical questions like how analysis of the shape of the demonstrandum can guide the design of a proof. This technical rather than psychological view of heuristics together with the stress on exploiting formalism effectively are two key features of the book. The book consists of two independently readable parts. One part includes a number of general chapters discussing techniques for clear exposition, the use of formalism, the choice of notations, the choice of what to name and how to name it, and so on. The other part consists of a series of expositional essays, each dealing with a proof or an algorithm and illustrating the use of techniques discussed in the more general chapters.