This document discusses the history and development of data abstraction and abstract data types (ADTs). It describes early work developing the concepts of modules, partitions, and programming methodology. A key paper in 1974 proposed ADTs as a way to build reliable software using encapsulation and polymorphism. This led to the development of the CLU programming language to experimentally implement and evaluate ADTs. The document outlines the goals and mechanisms of CLU, including clusters, polymorphism, exception handling, and iterators. It discusses subsequent work on type hierarchies and the Liskov substitution principle. The power of abstraction through ADTs and modular design is established as an important approach for building reliable software systems.