В программировании разделение проблем (Separation of concerns) означает разделение программы на отдельные части. Например, код разделяется на несколько независимых между собой классов, образуя модули, которые можно применять по отдельности в текущей или уже другой, новой программе. Такие разделенные части программы называют - модульными. Модули также могут быть разделены на некие подсистемы, используемые уже в пределах конкретного модуля, для которых эти подсистемы определены. Допустим, внутренние части модуля можно разделить на отдельные уровни для работы с данными, их отображением, с пользовательскими запросами.

Вся ценность такого разделения во многом упрощает разработку программы. С кодом такой программы намного проще работать, нежели с кодом программы, который определен в одном файле и где все части переплетены между собой. Модульный код можно всегда повторно использовать, легче обновлять и поддерживать. Во многом важность в том, что при изменении одного куска модульного кода, есть возможность совершенно не знать содержимое всех остальных частей. Такой код должен быть изолирован от других методов и не влиять на другие части.

Модульное или объектно-ориентированное программирования определяется выбранным языком программирования (например, C++ или C#), в которых для решаемой проблемы можно использовать такие архитектурные паттерны проектирования, как MVC или MVP.

Разделение проблем используется повсеместно, допустим, даже в наборе интернет-протоколов (Internet Protocol Suite), где все протоколы были разделены на слои, что позволило при разработке следующих протоколов заниматься лишь одним слоем, не затрагивая другие. Например, протокол SMTP  занимается проведением сеанса электронной почты над транспортным сервисом (TCP) и не знает о том, как функционирует этот сервис.

Таким образом, цель разделения проблем - проектировать, понимать и управлять кодом как можно лучше.