Rabbit hole

Это выражение в английском языке примерно обозначает сложности, которые возникают после того как начинаешь решать вроде бы простую проблему и проваливаешься как Алиса в кроличью нору.

Думаю что каждому инженеру знакомо то чувство, когда чинишь маленький баг а через день приходишь в сознанение с наполовину отрефакторенным проектом.

Такие норы часто непонятны менеджерам и бизнес людям, для которых задача "добавить кнопочку" выглядит работой на 1 час а не на 2 дня.

На той неделе мне нужно было добавить возможность деактивировать объявления в наш проект adopt.com.ua. Выглядит просто, да? Поменять где-то там статус с "опубликовано" на "деактивировано" и делов. Но не всё так просто :) Оказалось что год назад я неосмотрительно не предусмотрел этой функции и для обозначения активно объявление или нет сделал булево поле is_approved. Когда добавляют объявление, оно попадает модераторам на проверку, его проверяют и публикуют. За всё отвечает один флаг.

Как деактивировать объявление? Если делать это с помощью флага, то получается что объявление попадет в список "на проверку" так как будет считаться "новым". Можно добавить костылик, сделать еще одно поле типа "было уже опубликовано". Но правильно конечно будет сделать для объявления жизненный цикл и стейт машину "новое"->"опубликовано"<->"деактивировано". И тут началось.

Напиши миграцию, добавь новое поле. Проставь это поле вместо старого булевского флага везде где это было. Поправь фронтэнд где есть отдельные закладки для непроверенных и так как они сделаны по dry, то там передавался булев параметр, надо переписать шаблон. Добавь еще одну вкладку для деактивированных. Добавь кнопочки для деактивации и активации в админке. Добавь кнопки для деактивации в пользовательской части. Поправь контроллер для пользовательской части чтобы там были эти методы. Поправь нотификации для модераторов. Теперь надо чтобы старая кнопка "опубликовать", которая сохраняла и публиковала, проставляла новый статус. Но вот незадача, в rails на кнопки нельзя вешать параметры просто так, а так как мне нужно отделять "сохранить" от "сохранить и опубликовать" то это превратилось в еще одну проблему... Ой, а еще мы не можем назвать скоуп (метод) класса new потому что очевидно это зарезервированное слово. Не забудь после миграции вручную проставить статус старым объявлениям. Залей на продакшен, убедись что работает там.

Спустя 2 часа кнопка была готова. Конечно, большое количество работы было вызвано некорректным изначальным дизайном, но в нашей жизни скорее всего таких случаев будет значительно больше, нежели "правильных".

Очень классно эту метафору передает вот это видео:


Понравился материал? Подписывайся на мой телеграм канал: https://t.me/full_of_hatred