Декомпозиция и абстракция являются основными инструментами при разработке программы.
Декомпозиция - это разбиение задачи на ряд подзадач так, что 1) каждая подзадача имеет один и тот же уровень рассмотрения; 2) каждая задача "может быть решена независимо и 3) полученные решения могут быть объединены вместе, позволяя решить исходную проблему.
Создание программы группой разработчиков можно сравнить с написанием повести-буриме. Каждому автору дается список персонажей (объектов программы) и общий план (спецификацию программы). Даже если каждый из авторов справится с поставленной перед ним задачей, в повести скорее всего будет отсутствовать какой-либо смысл (из-за отличающегося в каждой части повести поведения персонажей). Приемлемые в отдельности решения не могут быть объединены подходящим образом, если исходная задача была разделена на части непродуманно.
Поэтому декомпозиция должна быть дополнена абстракцией.
Абстрагирование предполагает игнорирование ряда подробностей, чтобы свести задачу к более простой.
Например, в задаче по созданию повести мы должны указать черты характера и цели каждого персонажа, взаимоотношений между ними, каков должен быть общий замысел или даже смысл (но не сам текст) отдельных сцен. После выполнения этого исходная задача написания повести по-прежнему будет оставаться нерешенной, однако она значительно упростится.
Задачи абстрагирования и последующей декомпозиции типичны для процесса создания программы: декомпозиция используется для разбиения программы на компоненты, которые могут быть затем объединены, позволив решить основную задачу; абстрагирование же предполагает продуманный выбор компонент.
Мы последовательно выполняем то один, то другой из этих процессов до тех пор, пока не сведем исходную задачу к набору подзадач, решение которых известно.