Правило Сэнди Метц 2016 года: дублирование дешевле неправильной абстракции
Разработчик выносит повторяющийся код в общую функцию. Следующее требование почти подходит, поэтому он добавляет параметр. Потом флаг. Потом условие. Спустя десять лет эссе, описавшее это сползание, снова на виду, и лекарство, которое оно прописывает, — откатиться назад: вернуть код по месту, удалить, вывести заново.
Ловушка — спираль невозвратных затрат. Каждое почти-подходящее требование прикручивают к абстракции вместо того, чтобы отклонить, пока код не превращается в клубок булевых флагов, который никто не может осмыслить. Её лозунг: «самый быстрый путь вперёд — назад». Верните код в каждое место вызова, обрежьте мёртвые ветки, соберите заново.
Тред разошёлся в том, выживает ли это в реальных командах. Один лагерь говорит, что лозунг превращают в оружие, чтобы благословлять вечную халтуру; другой называет саму постановку категориальной ошибкой. А когда копии поддерживает модель, одинаковость, что тихо расходится, становится отдельной опасностью.
Жизненный цикл, заканчивающийся клубком флагов
Эссе 2016 года, поднимающееся на главную в 2026-м, обычно заслуживает это долговечностью, и у текста Сэнди Метц есть строчка, которую цитируют по памяти: «дублирование гораздо дешевле неправильной абстракции».
Жизненный цикл, который она описывает, точен. Разработчик видит повторяющийся код и выносит его в общую абстракцию. Приходит новое требование, которое почти, но не совсем, подходит. Вместо того чтобы отказаться от абстракции, следующий разработчик передаёт параметр, потом добавляет условие, потом ещё одно. И так до тех пор, пока код не превратится в непостижимые заросли веток, чьи допустимые сочетания никто не может перечислить.
Почему никто не отступает
Рефлекс невозвратных затрат удерживает развалину на плаву: абстракция уже есть, поэтому каждый разработчик чувствует себя обязанным её чтить, а не удалять. Рецепт Метц действует в обратную сторону. Верните абстракцию обратно в каждое место вызова. Удаляйте теперь уже мёртвые ветки вызов за вызовом. Затем выведите более чистые абстракции из того, чем требования стали на самом деле сегодня. «Самый быстрый путь вперёд — назад». Аргумент собрал 433 голоса и 300 комментариев, и тред добавил ту половину, которую запись в блоге оставляет за скобками.
Половина, которую текст не договаривает
Самое полезное дополнение пришло от того, кто видел выступление Метц вживую.
«Я смотрел её доклад об этом, и в этом посте не хватает половины уравнения… Неправильная абстракция означает, что в итоге у вас класс/функция/модуль с огромным числом конфигураций через булевы и enum-параметры.» — комментатор, смотревший доклад Метц на эту тему
Скептиков беспокоило то, как лозунг используют, стоит ему покинуть стены доклада.
«Я буквально ни разу не видел, чтобы команды дублировали код ответственно и позже убирали дубли в нужный момент.» — инженер, описывающий практику собственных команд
Более резкое возражение вовсе отвергло саму дихотомию.
«Если это дублирование, то по определению это одна и та же абстракция. Базовая единица программирования — это намерение, а не код.» — разработчик, ссылающийся на свой github.com/dmos62
И правило столкнулось с режимом отказа, которого не было в 2016-м: его поднял читатель, задумавшийся, кто теперь правит копии.
«…код, сгенерированный и продублированный без нормальной абстракции, а затем сопровождаемый LLM, которой нельзя доверить одинаковую правку каждый раз, когда она встречает шаблон» — комментатор, взвешивающий цену дублирования в масштабах клиентской базы
У правила появилась поправка на эпоху моделей
Принцип держится, но его запас прочности сузился. Метц предполагала, что человек в конце концов откатит дублирование назад. Тяжёлые случаи из треда — команды, которые никогда не убирают дубли, и модели, которые незаметно применяют шаблон вразнобой по копиям, — оба бьют по этому допущению. Честная переформулировка уже: дублирование дешевле неправильной абстракции лишь тогда, когда кому-то можно доверить одинаковую правку в каждой копии. Когда этот кто-то — модель, дрейфующая от шаблона к шаблону, дешёвый вариант тихо перестаёт быть дешёвым.
Получайте такие разборы каждый день
Главные истории Hacker News — на email, в Telegram или RSS.
Швейцарский Apertus открыт до самых данных — и без единого GPU
EPFL, ETH Zürich и национальный суперкомпьютерный центр выпустили базовую модель, где опубликованы и обучающие данные, и код, и веса, и элайнмент. Необычная часть: лицензия предупреждает, что вывод может содержать персональные данные, и выдаёт вам файл хешей с запросами на удаление, чтобы вы сами их отфильтровали.