← На главную

Сэнди Метц: откатывай общий код, не поддавайся sunk cost fallacy

21.06.2026 16:08 · hackernews

Дублирование кода гораздо дешевле, чем неверная абстракция — к этому тезису Сэнди Метц возвращается в своём блоге, перепечатывая старую заметку из рассылки Chainline. Она описывает типичный паттерн, который ведёт к катастрофе.

Всё начинается безобидно. Программист A замечает дублирование. Он выделяет его в общую абстракцию — новый метод или класс — и с гордостью заменяет повторяющиеся куски. Код кажется идеальным. Проходит время. Появляется новое требование, которое почти вписывается в абстракцию. Программист B чувствует себя обязанным сохранить существующий код. Он добавляет параметр и условную логику. Следующее требование — ещё один параметр. Ещё одно условие. Пока код не превращается в непроходимые дебри.

И вот тут появляетесь вы. Существующий код давит своим авторитетом: раз он такой сложный, значит, на него потрачены огромные усилия, и выбросить его — грех. Это ловушка sunk cost fallacy. Метц настаивает: не поддавайтесь. Когда абстракция перестала быть правильной, самый быстрый путь вперёд — назад. Нужно отменить выделение: встроить общий код обратно во все места вызова. В каждом вызове оставить только те строки, которые реально нужны этому конкретному месту, удалив всё лишнее. Так исчезают и сама абстракция, и все накрученные условия.

После такой «размотки» часто выясняется, что каждый вызов на самом деле делал что-то своё, а общая часть была иллюзией. Когда старый код полностью удалён, можно заново выделить настоящие абстракции — те, которые действительно нужны. Метц советует не копить условия и параметры, а abandon wrong abstraction sooner rather than later. Если вы уже начали добавлять параметры и ветвления в общий код — абстракция неверна. Не пытайтесь спасти вложенные усилия, вернитесь назад, чтобы потом пойти в правильном направлении.

В конце статьи — анонс второго издания книги 99 Bottles of OOP. Она вышла для Ruby, JavaScript и PHP, в форматах epub, kepub, mobi и pdf. Одна покупка даёт доступ ко всем версиям.

Читать оригинал →