In this chapter we examine abstraction. Abstraction is the most important tool, some would claim the only tool, that programmers use to control complexity. Abstraction finds applicatin in a number of different mechanisms, and we will examine these and illustrate their similarities and their differences. Finally, the chapter will end with a short history of the development of abstraction tools, illustrating how object-oriented programming fits naturally into this progression.