Шкаф с недоделанными фичами: практичная система спасения заброшенной разработки
Узнайте, как превратить наполовину сделанные фичи из кладбища потраченных усилий в структурированный, видимый «шкаф фич», откуда команда сможет безопасно доставать, переиспользовать и доделывать работу, не начиная с нуля.
Шкаф с недоделанными фичами: простая система, чтобы спасать заброшенную разработку, не начиная с нуля
У каждой команды они есть: наполовину сделанные фичи, застрявшие в ветках, забытых тикетах и пыльных Pull Request’ах. Они уже слишком продвинуты, чтобы удалить их без сожаления, но слишком хаотичны, чтобы подхватить без боли. В итоге они просто лежат и тихо отъедают вашу ментальную энергию.
Вместо того чтобы делать вид, что этот незавершённый код не существует, или мотаться между чувством вины и амнезией, можно дать ему нормальный дом — шкаф с недоделанными фичами.
Думайте о нём как о структурированной системе, которая помогает:
- Сделать заброшенную работу видимой, а не закопанной
- Сохранить достаточно контекста, чтобы её было безопасно переиспользовать
- Превратить большие неизвестные в маленькие, чётко очерченные задачи по спасению
- Решать, когда спасать, а когда отпускать
В этом посте разберём, как спроектировать и запустить шкаф фич, который держит ваш код (и совесть) в порядке.
Почему нужен «шкаф фич», а не кладбище
У большинства команд уже есть де-факто кладбище:
- Старые ветки с названиями вроде
final-final-wip - Тикеты в JIRA, перекинутые в «Blocked» и тихо забытые
- PR’ы в статусе
Draft, которые так и не взрослеют до merge
Проблема не в том, что работа остановилась — это нормально. Проблема в другом:
- Нет видимости — никто не может ответить на вопрос: «Какая недоделанная работа у нас уже есть?»
- Нет контекста — даже если что-то нашли, нет внятного описания, что готово, а чего нет.
- Нет процесса принятия решений — фичи висят вечно; их никто не спасает и не убивает окончательно.
Шкаф фич переворачивает это с ног на голову:
Шкаф с недоделанными фичами — это видимый, кураторский список незавершённой работы, описанной по простому, единому шаблону и управляемой по понятным правилам: когда стоит спасать, а когда — сознательно отпускать.
Это не место, куда код уходит умирать. Это место, откуда он либо:
- Аккуратно спасается в виде небольших доработок, или
- Осознанно архивируется с чётким «нет», а не с вечным подвешенным состоянием.
Шаг 1. Сделайте шкаф фич видимым
Начните с создания одного общего списка, который виден всем. Не так важно, какой инструмент вы выберете, важно, чтобы он был:
- Централизованным — один список, а не много
- Поисковым — чтобы можно было искать по названию фичи, области или технологии
- Простым в обновлении — иначе им никто не будет пользоваться
Хорошие варианты:
- Отдельная доска/колонка в вашем проектном инструменте:
Шкаф с недоделанными фичами - Страница в Notion/Confluence с таблицей записей
- GitHub Project board с отдельным label, например
half-finished
Минимальный набор полей для каждой записи:
- Название — понятное имя фичи или инициативы
- Владелец (исторический) — кто последний над этим работал
- Статус — например, «Кандидат», «Готово к спасению», «Архив»
- Ссылки — на ветку/PR/тикеты
Теперь этот список — ваш единый источник правды о том, «что мы начали, но не закончили».
Шаг 2. Используйте простой шаблон для каждой недоделанной фичи
Когда вы добавляете что‑то в шкаф, не ограничивайтесь ссылкой. Зафиксируйте минимальный набор деталей, который позволит разработчику в будущем безопасно это подхватить.
Используйте стандартный шаблон:
Шаблон недоделанной фичи
- Краткое описание: 2–3 предложения о том, что делает эта фича и зачем её начали.
- Технологии / Область: например, React + TypeScript (frontend), Node.js API, миграция PostgreSQL и т.п.
- Что сделано:
- Список пунктов с завершёнными частями
- Пометка, какие части покрыты тестами или проверены вручную
- Чего не хватает:
- Список оставшихся задач, неизвестных и решений, которые нужно принять
- Подводные камни / Риски:
- Известные баги, проблемы с производительностью, сложные edge‑кейсы
- Архитектурные моменты («затрагивает auth», «меняет логику биллинга»)
- Текущее состояние:
- Ссылки на ветки/PR’ы
- Дата последнего обновления
- Исходный контекст:
- Почему работу остановили (смена приоритетов, изменение scope, блокирующие зависимости и т.д.)
Это не должно быть длинно. Главное — ясность, а не исчерпывающее досье. Вы даёте будущему «вам» достаточно карты, чтобы решить, стоит ли вообще это спасать.
Совет: сделайте шаблон копируемым блоком в документации, чтобы его можно было заполнить за 5–10 минут.
Шаг 3. Превратите заброшенные фичи в маленькие задачи по спасению
«Доделать недоделанную фичу» — плохая задача. Она расплывчатая, пугающая и плохо оценивается по времени.
После того как шаблон заполнен, следующий шаг — нарезать фичу на маленькие, чётко очерченные rescue‑задачи. Например:
Вместо:
- «Закончить новый дашборд отчётности»
Разбейте на:
- «Подключить API дашборда к существующему metrics endpoint’у»
- «Сделать пагинацию и базовые фильтры»
- «Добавить happy‑path‑тесты для API дашборда»
- «Подключить feature flag и конфигурацию rollout’а»
Каждая задача по спасению должна:
- Быть достаточно маленькой, чтобы комфортно поместиться в один спринт
- Иметь чёткое определение готовности (Definition of Done)
- Содержать ссылку обратно на запись в шкафу
Цель в том, чтобы разработчик мог:
- Открыть запись в шкафу
- Понять состояние по шаблону
- Взять rescue‑задачу и доставить ощутимый результат
Шаг 4. Приоритизируйте по влиянию и усилиям, а не по давности и чувству вины
Худший способ расставлять приоритеты по спасению:
- «Это самое старое, надо доделать» (ошибка, связанная с давностью)
- «Мы уже столько сюда вложили, надо закончить» (синдром невозвратных затрат)
Относитесь к спасению так же, как к любой другой работе: ему нужна бизнес‑логика.
Оценивая кандидатов из шкафа, спрашивайте:
- Влияние: Если фича будет доделана сейчас, какую пользу она принесёт?
- Решает ли она всё ещё актуальную боль пользователя?
- Соответствует ли стратегическому направлению продукта?
- Усилие: Сколько работы реально осталось, исходя из шаблона?
- Это пара дней или несколько недель?
- Риск: Не принесёт ли продолжение работы технических или организационных рисков?
Можно использовать простую модель оценки:
- Влияние: 1–5
- Усилие: 1–5 (обратная шкала; 1 = много, 5 = мало)
- Риск: 1–5 (обратная шкала; 1 = рискованно, 5 = безопасно)
Сортируйте по сумме Влияние + Усилие + Риск и берите в работу записи с самыми высокими баллами. Так решения остаются рациональными, а не эмоциональными.
Шаг 5. Задайте правила: когда спасать, а когда архивировать
Не всё, что попало в шкаф, нужно спасать. Наоборот, у здорового шкафа есть постоянный поток архивации.
Задайте понятные правила, чтобы не бесконечно откладывать сложные решения.
Примеры правил:
Спасать, если:
- Фича всё ещё попадает в текущую продуктовую стратегию и roadmap
- Оставшийся объём работы малый или умеренный, а не огромный
- Зависимости или блокеры, из‑за которых работу остановили, уже решены
- В команде есть хотя бы один человек, готовый и способный взять на себя спасение
Архивировать, если:
- Исходная пользовательская потребность уже не актуальна или решена лучше другим способом
- Технологический стек так изменился, что спасение займёт больше сил, чем старт с нуля
- Код не проходит базовые требования к качеству/архитектуре по сегодняшним стандартам
- Никто не может внятно объяснить ценность или замысел фичи, даже после ревью
Когда решаете архивировать, делайте это осознанно:
- Пометьте запись в шкафу как «Архив»
- Добавьте одну строчку с причиной («Заменено новым биллинговым флоу, Q3 2025»)
- Решите, удалить ли код/ветку или оставить только как справочный материал
Чётко сказанное «нет» намного лучше, чем вечно висящая «зомби‑работа».
Шаг 6. Заложите время на спасение в регулярное планирование
Если ждать «свободного времени» для спасения фич, этого не произойдёт.
Вместо этого закладывайте время на rescue‑работу прямо в спринты или итерации:
Варианты:
- Фиксированный процент: например, 10–15% ёмкости каждого спринта — на спасение из шкафа и уборку
- Ротация по спасению: в каждом спринте 1–2 разработчика фокусируются на rescue‑задачах
- Тематические спринты: периодически делайте спринт «Rescue & Refine», чтобы закрыть самые ценные элементы
Во время планирования:
- Посмотрите на приоритезированный список шкафа
- Вытащите несколько самых полезных rescue‑задач в спринт
- Убедитесь, что они оценены как обычные тикеты и имеют явных ответственных
Так работа по спасению становится частью нормального процесса, а не побочной активностью «если вдруг останется время».
Шаг 7. Требуйте базовый уровень качества для всего, что спасаете
Спасение недоделанной работы не должно означать слепое принятие технического долга. Задайте минимальные стандарты качества и структуры для спасаемого кода:
- Структура кода: соответствует текущим паттернам и архитектуре (или есть план рефакторинга в рамках спасения)
- Тесты: новая или изменённая логика должна быть тестируемой; тесты добавляются как часть rescue‑задач
- Документация: хотя бы базовые docstring’и, комментарии или заметки в README, где это уместно
- Feature flags / rollout: для рискованных или пользовательских фич должна быть возможность контролировать их включение
Если существующий код невозможно довести до этих стандартов за разумные усилия, это сильный сигнал архивировать, а не спасать.
Так ваш шкаф превращается в источник высокодоходной работы, а не в свалку будущих головных болей.
Собираем всё вместе
Итак, здоровый шкаф с недоделанными фичами выглядит так:
- Видимый список: одно место, где собирается вся незавершённая работа
- Простой шаблон: для каждой записи понятно, что сделано, чего не хватает, какие технологии и подводные камни
- Rescue‑задачи: крупная, размытая работа нарезана на маленькие, чётко очерченные тикеты
- Приоритизация по влиянию: вы выбираете, что спасать, исходя из ценности, а не чувства вины
- Явные правила: понятные критерии, когда спасать, а когда архивировать
- Плановое время: спасение заложено в спринты, а не делается «если вдруг успеем»
- Стандарты качества: спасённая работа должна соответствовать базовым требованиям к поддерживаемости
Когда это работает, наполовину сделанные фичи перестают быть тихим налогом и превращаются в структурированный backlog потенциальных побед. Вы не выбрасываете полезную работу, избавляетесь от невидимой когнитивной нагрузки, и команда формирует более здоровые привычки — как в начале инициатив, так и в умении вовремя их останавливать.
В кодовой базе всегда будут незавершённые нитки. Цель не в том, чтобы полностью их устранить, а в том, чтобы управлять ими осознанно. Шкаф с недоделанными фичами как раз и даёт это: спокойный, прозрачный и практичный способ решить, что заслуживает второго шанса, а что можно наконец отпустить.