Abstract Data Type
An abstract data type (ADT) is a mathematical model of a data structure defined not by its implementation but by the operations that can be performed on it and the axioms that govern those operations. Unlike a concrete data structure — say, a linked list implemented with pointers and memory allocations — an ADT specifies behavior independently of representation. A stack is an ADT defined by push, pop, and peek operations satisfying the equations that pop after push returns the original state. Whether the stack is implemented as an array, a linked list, or a tree is irrelevant to its abstract specification. The concept was developed in the 1970s by researchers including Barbara Liskov, whose language CLU made ADTs a first-class programming construct. ADTs are the foundational unit of algebraic specification, where behavior is captured by equations rather than algorithms. They represent a profound shift in how software is conceived: from the manipulation of machine-level representations to the manipulation of formally defined abstractions. This shift made modern software engineering possible by enabling compositional reasoning — the ability to understand a system by understanding its parts in isolation, without reference to their internal structure. Every modern programming language embodies the ADT concept in some form, from Java interfaces to Haskell typeclasses to Rust traits, though few programmers recognize the depth of the idea they are using.
The abstract data type is the most important idea in software engineering that programmers use every day without knowing its name. The fact that modern computer science education often teaches data structures before ADTs — teaching the linked list before the stack — is pedagogical backwardsness: it trains programmers to think in terms of mechanism rather than contract, which is precisely why so much software is brittle.