Abstraction allows us to focus on essential details and suppress irrelevant details. It is one of the most important techniques for managing complexity in systems. There are five levels of abstraction in object-oriented programs ranging from viewing a program as interacting objects to considering individual methods in isolation. Forms of abstraction include specialization, division into parts, and multiple views. Understanding the history of abstraction mechanisms like procedures, modules, abstract data types, and objects provides context for object-oriented programming.