Программисты склонны «есть слона по кусочкам», разбивая сложные системы на логические блоки, которые можно комбинировать достаточно произвольно. В итоге на каждом из уровней описание ведётся в тех терминах, в которых это удобно. Кроме того, так эффективнее достигается низкая связность между участками кода, отвечающими за разные операции, что позволяет изменять их независимо друг от друга.
Такой подход выливается в большое количество паттернов различного уровня, описывающих как способы представления данных, так и алгоритмику и общую структуру программных решений. Эти паттерны затем применяются как внутри программных продуктов для взаимодействия модулей, так и для организации взаимодействия между разными программными продуктами. API многих библиотек для популярных языков программирования следуют тем или иным паттернам и соглашениям, упрощающим совместное использование кода: так, в C++ для итерации по коллекции элементов используются итераторы, а в C# и Java — перечислители. Кроме того, системы межпроцессного взаимодействия, такие, как, например, ActiveX, также позволяют системам взаимодействовать в этих терминах, невзирая на разницу в используемых технологиях.
Некоторые, возможно, возразят в том смысле, что классические парадигмы (такие как программирование без возможности создавать сложные пользовательские типы данных), принятые, к примеру, в языке C, тоже позволяют эффективно выстраивать среду для повторного использования кода. Это верно, однако тот факт, что большинство современных платформ, предполагающих взаимодействие многих компонентов (COM, Java, .Net и т. д.) используют именно объектно-ориентированный подход, на наш взгляд, говорит о большем удобстве такого решения.
В этом смысле открытие интерфейсов всеми компонентами в масштабе операционной системы выглядит как следующий логичный шаг к улучшению взаимодействия — шаг, который почему-то до сих пор не был сделан.