This work provides an in-depth survey of current tools, techniques and research in reverse engineering and software maintenance. The growth in demand for software maintenance has contributed to a "software crisis" and this is analyzed with the suggestion of various long-term educational and technical solutions. Using real examples, process models are detailed and techniques involving object-oriented design abstraction are developed. Examples are provided in COBOL, FORTRAN, C and Prolog, and there are three major case studies in COBOL and FORTRAN. Theoretical foundations are given in the Z specification language, and techniques for the integration of structured and formal methods are provided.