Правило Сэнди Метц 2016 года: дублирование дешевле неправильной абстракции

Разработчик выносит повторяющийся код в общую функцию. Следующее требование почти подходит, поэтому он добавляет параметр. Потом флаг. Потом условие. Спустя десять лет эссе, описавшее это сползание, снова на виду, и лекарство, которое оно прописывает, — откатиться назад: вернуть код по месту, удалить, вывести заново.

Вкратце

Ловушка — спираль невозвратных затрат. Каждое почти-подходящее требование прикручивают к абстракции вместо того, чтобы отклонить, пока код не превращается в клубок булевых флагов, который никто не может осмыслить. Её лозунг: «самый быстрый путь вперёд — назад». Верните код в каждое место вызова, обрежьте мёртвые ветки, соберите заново.

Тред разошёлся в том, выживает ли это в реальных командах. Один лагерь говорит, что лозунг превращают в оружие, чтобы благословлять вечную халтуру; другой называет саму постановку категориальной ошибкой. А когда копии поддерживает модель, одинаковость, что тихо расходится, становится отдельной опасностью.

Жизненный цикл, заканчивающийся клубком флагов

Эссе 2016 года, поднимающееся на главную в 2026-м, обычно заслуживает это долговечностью, и у текста Сэнди Метц есть строчка, которую цитируют по памяти: «дублирование гораздо дешевле неправильной абстракции».

Жизненный цикл, который она описывает, точен. Разработчик видит повторяющийся код и выносит его в общую абстракцию. Приходит новое требование, которое почти, но не совсем, подходит. Вместо того чтобы отказаться от абстракции, следующий разработчик передаёт параметр, потом добавляет условие, потом ещё одно. И так до тех пор, пока код не превратится в непостижимые заросли веток, чьи допустимые сочетания никто не может перечислить.

Почему никто не отступает

Рефлекс невозвратных затрат удерживает развалину на плаву: абстракция уже есть, поэтому каждый разработчик чувствует себя обязанным её чтить, а не удалять. Рецепт Метц действует в обратную сторону. Верните абстракцию обратно в каждое место вызова. Удаляйте теперь уже мёртвые ветки вызов за вызовом. Затем выведите более чистые абстракции из того, чем требования стали на самом деле сегодня. «Самый быстрый путь вперёд — назад». Аргумент собрал 433 голоса и 300 комментариев, и тред добавил ту половину, которую запись в блоге оставляет за скобками.

Половина, которую текст не договаривает

Самое полезное дополнение пришло от того, кто видел выступление Метц вживую.

«Я смотрел её доклад об этом, и в этом посте не хватает половины уравнения… Неправильная абстракция означает, что в итоге у вас класс/функция/модуль с огромным числом конфигураций через булевы и enum-параметры.» — комментатор, смотревший доклад Метц на эту тему

Скептиков беспокоило то, как лозунг используют, стоит ему покинуть стены доклада.

«Я буквально ни разу не видел, чтобы команды дублировали код ответственно и позже убирали дубли в нужный момент.» — инженер, описывающий практику собственных команд

Более резкое возражение вовсе отвергло саму дихотомию.

«Если это дублирование, то по определению это одна и та же абстракция. Базовая единица программирования — это намерение, а не код.» — разработчик, ссылающийся на свой github.com/dmos62

И правило столкнулось с режимом отказа, которого не было в 2016-м: его поднял читатель, задумавшийся, кто теперь правит копии.

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

У правила появилась поправка на эпоху моделей

Принцип держится, но его запас прочности сузился. Метц предполагала, что человек в конце концов откатит дублирование назад. Тяжёлые случаи из треда — команды, которые никогда не убирают дубли, и модели, которые незаметно применяют шаблон вразнобой по копиям, — оба бьют по этому допущению. Честная переформулировка уже: дублирование дешевле неправильной абстракции лишь тогда, когда кому-то можно доверить одинаковую правку в каждой копии. Когда этот кто-то — модель, дрейфующая от шаблона к шаблону, дешёвый вариант тихо перестаёт быть дешёвым.

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 5 из 29 Читать дальше
🚀Tech

Швейцарский Apertus открыт до самых данных — и без единого GPU

EPFL, ETH Zürich и национальный суперкомпьютерный центр выпустили базовую модель, где опубликованы и обучающие данные, и код, и веса, и элайнмент. Необычная часть: лицензия предупреждает, что вывод может содержать персональные данные, и выдаёт вам файл хешей с запросами на удаление, чтобы вы сами их отфильтровали.

★ 236 · 💬 83 · apertvs.ai · 3 мин