Barbara Liskov, at MIT, designs in 1974 the CLU programming language, which rigorously introduces the concept of the "abstract data type": a way of organizing code in which the internal details of how a data structure is implemented remain completely hidden from the rest of the program, which can only interact with it through a defined set of public operations. This separation between a component's public interface and the internal details of its implementation, today known as "encapsulation", becomes a founding principle of object-oriented programming, present in later languages such as C++, Java, or Python. Liskov also formulates in 1987, together with Jeannette Wing, the "Liskov substitution principle": a formal rule establishing exactly under what conditions one data type can safely substitute for another within a program without altering its correct behavior — for example, precisely determining, mathematically, when it is safe to treat a "square" as a special case of "rectangle" in a program, and when that relationship produces subtle errors. The principle becomes one of the five fundamental principles of object-oriented design (the SOLID principles), taught as standard in any modern software engineering education.