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

Как бы то ни было, пятая часть полученных комментариев в той или иной форме содержала конструкцию “это зависит…”, причем оказалось, что семантическая точность (в смысле “точность до 6 десятичных знаков”) каждой такой конструкции лежит в определенном спектре.

Слева (потому что левое полушарие, логика, Система 2, вот это вот все) находится полюс полной определенности. Это полностью понятная ситуация, есть формальные критерии принятия решения, область допустимых значений определена. МЫ знаем, как именно результат на выходе зависит от каких-то значений на входе.

Это зависит от значения параметра Х, измеренного способом Y. Если значение попадает в диапазон от A до B включительно, то следует I. Если значение в диапазоне от B до C включительно, то следует J.

Форма послабее уже не содержит конкретных значений, но по-прежнему может указывать на возможные входные данные и соответствующие им результаты. Это все еще довольно близко к левому полюсу, потому что возможные входные значения разделяются на какие-то категории, хотя критерии классификации не всегда четко озвучены, и полнота разбиения не гарантирована. В этом случае появляются разного рода “серые зоны”, которые, возможно, уже не осознаются, по крайней мере, внимания не привлекают. Это формулировки типа:

Все зависит от используемой архитектуры. Если у вас архитектура Х, то используйте А; если архитектура Y - используйте B.

А что делать, если у меня неизвестная архитектура Z? Или гибридная X+Y, а решения A и B взаимоисключающие? Непонятно.

Еще слабее форма “все зависит от контекста” без каких бы то ни было пояснений. Видимо, предполагается, что собеседник в курсе, какие возможны контексты и как на них нужно реагировать. Но нет никакой возможности по одной этой фразе определить, одинаково ли все представляют себе возможные контексты и соответствующие им решения.

Ну и на правом полюсе - просто фраза “it depends”. Welcome to agile engineering :)

Очевидно, что практическая ценность тем выше, чем ближе конструкция к левой части спектра.


Если исходить из того, что в каждой конкретной ситуации есть некоторый набор параметров, на основании значений которых будет принято решение, то позиция it depends вроде как сводится к тому, что в каждом случае набор параметров будет совершенно другим, ну или важность этих параметров будет распределена сильно по-разному, поэтому сравнить их нельзя и общие принципы выработать нельзя.

А если параметры все же хоть чуточку общие, то мы можем попытаться определить диапазоны значений, соответствующие одному решению, и диапазоны, соответствующие другому решению. Ну или описать принципы, то есть какие-то общие векторы/черты удачных решений (из опыта или теоретических выкладок / гипотез). Таким образом получится сместиться в левую часть спектра.


Ну и дальше нужно подумать о том, что принципы - это все же эвристики, то есть они не гарантируют получения нужного результата. А вот нарушение принципов гарантирует ли НЕдостижение этого результата?

Какой код будет лучше - тот, в котором я в меру своего понимания буду придерживаться принципов SOLID, или тот, в котором я буду их сознательно нарушать?

А потом есть ход на безмасштабность - если какие-то принципы действительно общие, то они должны применяться безмасштабно. SOLID для более высокоуровневых компонент получил новые формулировки, но сама суть этих принципов осталась прежней. И если SOLID работает на уровне классов, работает на уровне компонент, то может быть этот же набор принципов применим и к микросервисам в рамках одного продукта?