Открыть сервис

Принцип YAGNI

Принцип YAGNI (акроним от англ. You Aren’t Gonna Need It — «Вам это не понадобится») — это принцип разработки программного обеспечения, предписывающий реализовывать только ту функциональность, которая необходима для выполнения текущих требований, и избегать добавления кода «на вырост», на случай гипотетических будущих потребностей. Относится к числу базовых принципов экстремального программирования (XP) и гибкой методологии разработки (Agile).

История и происхождение

Принцип YAGNI был сформулирован в конце 1990-х годов в рамках методологии экстремального программирования, созданной Кентом Беком. Впервые термин получил широкое распространение в книге Кента Бека «Extreme Programming Explained: Embrace Change» (1999). По словам автора, YAGNI является прямым следствием принципа «делай самую простую вещь, которая может сработать» (Do The Simplest Thing That Could Possibly Work, DTSTTCPW).

Идея YAGNI возникла как реакция на распространённую в традиционных методологиях разработки практику «закладывания на будущее» — добавления в код избыточной гибкости, абстракций и параметров, которые, по мнению разработчика, могут понадобиться в следующих версиях продукта. Опыт показал, что в большинстве случаев такие предсказания оказываются неверными, а затраты на поддержку неиспользуемого кода превышают потенциальную выгоду.

Основное содержание принципа

YAGNI предписывает разработчикам:

  • Реализовывать только те функции, которые явно требуются в текущем спринте или итерации.
  • Не писать код, который может понадобиться «когда-нибудь потом».
  • Не добавлять параметры, конфигурации и абстракции, пока в них не возникнет непосредственная необходимость.
  • Удалять неиспользуемый код, даже если он кажется потенциально полезным.

Принцип тесно связан с понятием «простого дизайна» (Simple Design), который является одним из четырёх основных принципов экстремального программирования. Простой дизайн, согласно XP, должен удовлетворять всем текущим тестам, не содержать дублирования, выражать намерения программиста и содержать минимально возможное количество классов и методов.

Обоснование и аргументация

Сторонники YAGNI приводят несколько аргументов в его пользу:

  1. Экономия времени и ресурсов. Разработка любой функции требует времени на проектирование, кодирование, тестирование и документирование. Если функция не нужна сейчас, эти затраты оказываются напрасными. По оценкам, от 30% до 50% кода в типичных проектах никогда не выполняется в production-среде.
  1. Снижение сложности. Каждая дополнительная строка кода увеличивает когнитивную нагрузку на разработчиков, усложняет понимание системы, замедляет рефакторинг и увеличивает вероятность ошибок. Избыточный код, который никто не использует, становится «мёртвым грузом».
  1. Уменьшение стоимости изменений. Вопреки интуиции, код, написанный «на вырост», часто не облегчает, а затрудняет внесение будущих изменений. Он может быть основан на неверных предположениях о будущих требованиях, что приводит к необходимости его переписывания. Вместо того чтобы предугадывать будущее, YAGNI предлагает реагировать на изменения по мере их возникновения.
  1. Снижение рисков. Неиспользуемый код может содержать скрытые дефекты, которые проявятся только при случайном выполнении (например, в результате рефакторинга). Кроме того, он может создавать ложное впечатление о стабильности системы.

Критика и ограничения

Принцип YAGNI не является абсолютным и имеет критиков. Основные возражения:

  • Игнорирование долгосрочного планирования. Чрезмерно жёсткое следование YAGNI может привести к архитектурной «близорукости», когда система оказывается неспособной к эволюции без полного переписывания. Например, если не заложить интерфейсы для работы с разными базами данных, переход на другую СУБД может потребовать огромных затрат.
  • Проблема рефакторинга. YAGNI предполагает, что рефакторинг всегда возможен и дёшев. Однако в реальных проектах, особенно с большим техническим долгом, рефакторинг может быть затруднён или невозможен без серьёзных сбоев.
  • Конфликт с принципом DRY. В некоторых случаях попытка избежать дублирования (Don’t Repeat Yourself) требует создания абстракций, которые могут быть не нужны в данный момент. Разработчику приходится выбирать между нарушением DRY (созданием дублирующегося кода) и нарушением YAGNI (созданием избыточной абстракции).
  • Субъективность. Определение того, что «нужно сейчас», а что «на вырост», часто является субъективным и зависит от опыта разработчика. Новички могут трактовать YAGNI как отказ от любой архитектурной работы, что приводит к хаотичному коду.

Взаимосвязь с другими принципами

YAGNI часто рассматривается в контексте других принципов разработки:

  • KISS (Keep It Simple, Stupid) — принцип простоты, с которым YAGNI тесно связан: оба призывают избегать излишней сложности.
  • DRY (Don’t Repeat Yourself) — принцип избегания дублирования. YAGNI может вступать с ним в конфликт, как описано выше.
  • SOLID — набор принципов объектно-ориентированного проектирования. YAGNI не противоречит SOLID, но ограничивает их применение: например, принцип открытости/закрытости (Open/Closed) не требует заранее создавать абстракции для всех возможных расширений.
  • Big Design Up Front (BDUF) — противоположная методология, предполагающая детальное проектирование всей системы до начала кодирования. YAGNI является прямой антитезой BDUF.

Применение в различных методологиях

YAGNI наиболее характерен для экстремального программирования и гибких методологий (Agile), где изменения требований считаются нормой. В Scrum принцип реализуется через ограничение объёма работ в спринте и фокус на завершении запланированных задач.

В методологиях с жёсткой фиксацией требований на ранних этапах (каскадная модель, Waterfall) YAGNI применяется реже, так как предполагается, что требования известны заранее и не будут меняться. Однако даже в таких проектах практика показывает, что избыточное проектирование часто оказывается вредным.

В сообществе разработчиков на языках с динамической типизацией (Python, Ruby, JavaScript) YAGNI часто трактуется более широко: отказ от преждевременной оптимизации, избыточных типов и сложных архитектурных паттернов.

Примеры из практики

Пример 1 (нарушение YAGNI). Разработчик добавляет в класс User метод getFullName(), который возвращает имя и фамилию, хотя в текущей версии приложения отображается только имя. Через месяц выясняется, что в разных частях приложения требуется разный формат отображения (например, сначала фамилия, потом имя). Метод приходится переписывать, а старый код удалять.

Пример 2 (следование YAGNI). Разработчик не добавляет поддержку нескольких языков в интерфейс, пока не поступило явное требование от заказчика. Когда требование появляется, он использует библиотеку интернационализации и рефакторит код. В результате затраты на локализацию оказываются такими же, как если бы он делал это заранее, но без риска ошибиться в предположениях.

Источники

  1. Бек К. «Экстремальное программирование: разработка через тестирование». — СПб.: Питер, 2003.
  2. Мартин Р. «Чистый код: создание, анализ и рефакторинг». — СПб.: Питер, 2010.
  3. Фаулер М. «Рефакторинг: улучшение существующего кода». — М.: Вильямс, 2019.
  4. Хант Э., Томас Д. «Программист-прагматик. Путь от подмастерья к мастеру». — М.: Лори, 2018.
  5. Coplien J. O. «Advanced C++ Programming Styles and Idioms». — Addison-Wesley, 1992.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →