This is the removal of unnecessary details. An example of abstraction is the map of the tube.

This is specifically representational abstraction, it is not geographically correct, but it contains all the information necessary to use the tube. Other examples of abstraction are:
- A computer model of a car
- Using a coffee machine to make a coffee
- A builder using a model of a new estate that uses simplified versions of houses
Abstraction is used in high level programming languages. Unlike machine or assembly code, when writing in machine code you don't have to worry about where variables are stored in memory or how exactly a computer is carrying out specific functions.
Abstraction by generalisation:
This is the grouping of common characteristics to arrive at a 'is a kind of' relationship. An example of this is object-oriented programming.
Data abstraction:
This is when they way the data is actually represented is hidden, for example if coding in a high-level language with strings, you do not know and don't have to worry about how this is represented in computer memory.
Abstract data types such as queues and trees are a logical description of data but do not explain how the data is actually stored in a computer.
Procedural abstraction:
Abstraction separates the physical reality of a problem from the logical view, meaning you don't have to know anything about the physical reality and can still interact with the program.
Procedural abstraction means using a procedure to carry out certain steps. These procedures can be used by programmers without them knowing the actual code of the procedure. They can even use them to create new procedures.
Problem decomposition:
Most computational problems need to be broken down into sub-problems before they can be solved.
A way to do this is top-down design. In top-down design a problem is broken down into tasks, then each task is broken down into more tasks etc. This can be represented with a hierarchy chart.

Problem decomposition makes it easier to test and maintain a program.
Computational problems
Every computational problem has an input and an output. An input is relevent information, and an output is the solution.
If people who don't know the code of a procedure want to use it, there must be certain steps taken to make sure there are no issues with their input.
- Any arguments that would cause the procedure to not work would need to be found
- Preconditions would have to be specified to stop people using these arguments