This book is based on object-oriented techniques applied to software engineering. It is neither a general software engineering book which surveys all available methods nor a programming book about algorithms and data structures. Instead, we focus on a limited set of techniques and explain their application in a reasonably complex environment, such as a multi-team development project including twenty to sixty participants. Consequently, this book also reflects our biases, our strengths, and our weaknesses. We hope, nevertheless, that all readers will find something they can use. The book is structured into twelve chapters organized into four parts which can be taught as a semester long course.