Картинка: @flaviocopes
Все слышали про принцип KISS (Keep It Simple, Stupid), но как определить что простое, а что нет?
В проектировании систем, я придерживаюсь такого принципа:
Решение не должно быть сложнее решаемой проблемы.
Программисты любят сложные задачи
Вроде бы простая мысль — делай проще.
Но программисты ищут всё более и более сложные способы для решения, а простые альтернативы игнорируют или отклоняют.
Например, внедряют микросервисы когда нужно увеличить производительность.
Почему?
Простое решение неинтересно, простое решение не даёт покрасоваться, простое решение не даёт кайфа от “круто” решённой задачи. Хочется что-то посложнее, чтобы проявить себя.
Также распространённая причина — усложнение “на всякий случай”. Пишем код который сейчас не требуется, но может потребоваться когда-нибудь в будущем.
Код в проектах и технологии усложняются всё сильнее, а каждая новая проблема решается ещё большим усложнением или ещё одной новой технологией.
Это всё приводит к постоянному и быстрому росту сложности проекта. В итоге чтобы сделать какое-то простое изменение тратится неимоверное количество времени.
Отказываемся от сложных решений
Чтобы не допустить роста сложности проекта надо следовать правилу: сложность решения должна чётко соответствовать проблеме.
Решение должно быть минимально сложным, насколько это возможно.
Сознательно отказаться от сложных решений в сторону упрощения.
Устаревший, переусложнённый дизайн системы необходимо постоянно пересматривать и упрощать.
Неиспользуемый код — удалять, невостребованные пользователями фичи — выпиливать. Наводить порядок в бизнес-логике и абстракциях, в структуре кода и модели данных в БД.
Копаем глубже
Когда я замечаю излишнюю сложность решения, это может означать две вещи: либо я недооценил сложность проблемы, либо решение выбрано неудачно.
Чаще всего, сложное решение является следствием ошибки в архитектуре системы. Нередко выявление и устранение ошибки в архитектуре приводит к простым и элегантным решениям.
Согласно теории ограничений Элияху Голдратта, для любой проблемы реального мира существует решение.
Из этого делаю вывод, что сложное решение для простой проблемы не может быть оптимальным. Скорее всего мы что-то упускаем, предлагая сложное решение.
Где-то есть возможность решить проблему более простым способом, а значит надо подумать и поискать получше.