цель у SOLID какая? Уменьшить каскад изменений. То есть по факту добиться OCP. Ну или как минимум если уж изменения случилось что бы затронуло что-то одно - SRP. Как этого добиться? Можно под клиентский код специализированные интерфейсы делать (ISP) и менять направления зависимостей так что бы оно всегда указывало от менее стабильных к более стабильным модулям (DIP). Ну и если ты начала обмазываться интерфейсами то LSP поможет убедиться что контракты выбраны правильно.
да, для соблюдения OCP на этапе проектирования нужно знать будущее. Можно пробовать "придумать будущее" - это в целом работает но скорее всего рано или поздно этот принцип будет нарушен. С SRP похожая история - что бы хорошо понимать соблюдает твой код SRP или нет нужно оч хорошо понимать откуда изменения приходят, почему они приходят и кто от них блага получает. Эти принципы больше подходят для того что бы драйвить рефакторинг. Тот рефактоинг который "пописал код часик - посмотрел что написал отрефактоил" а не "переебашить пол проекта"