Я признаюсь. В 2023 году я потратил три недели на создание системы плагинов для фреймворка автоматизации тестирования. Настраиваемые раннеры тестов. Плагины с горячей перезагрузкой. Контейнер внедрения зависимостей. Всё по-взрослому.
Никто так и не написал ни одного плагина.
Фреймворк работал в CI с одной и той же конфигурацией каждый раз. «Расширяемость», которую я построил, использовали ровно ноль человек. Я мог бы сдать весь проект за 4 дня без архитектуры плагинов.
Как возникает излишнее усложнение
Всё начинается с разумной мысли: «А что, если нам понадобится расширить это позже?»
Эта мысль — ловушка. Потому что «позже» редко выглядит так, как вы себе представляли, а абстракции, построенные под воображаемые требования, обычно мешают реальным.
Вот прогрессия, которую я наблюдал в себе:
- Написать простую функцию ✅
- Подумать: «это должно быть настраиваемым» ⚠️
- Добавить объект конфигурации
- Подумать: «разным окружениям могут понадобиться разные реализации» ⚠️
- Добавить интерфейс и фабричный метод
- Подумать: «возможно, нам понадобится менять это во время выполнения» 🚩
- Добавить внедрение зависимостей
- Осознать, что никому никогда не требовалось это менять
- Поддерживать абстракцию вечно, потому что удалить её сложнее, чем оставить
Три вопроса
Прежде чем добавлять любую абстракцию, я теперь задаю:
1. «Кто-нибудь на самом деле просил об этом?»
Если ответ «нет, но могут попросить» — не делайте. YAGNI (You Aren't Gonna Need It — Вам это не понадобится) — самый нарушаемый принцип в разработке.
2. «Какова стоимость добавления этого позже по сравнению с сейчас?»
Если я могу добавить абстракцию за 2 часа, когда она действительно понадобится, нет смысла строить её сейчас «на всякий случай». Стоимость преждевременной абстракции (поддержка кода, который никто не использует) почти всегда выше, чем стоимость добавления её позже.
3. «Могу ли я объяснить, зачем это существует, одним предложением?»
«Мы используем внедрение зависимостей, потому что нам нужно менять платёжного провайдера между Stripe и Braintree в разных окружениях». Это реальная причина.
«Мы используем внедрение зависимостей, потому что это лучшая практика». Это не причина. Это карго-культ.
Как выглядит простой код
\\
