Как грумить задачу: чек-лист с примерами

Как грумить задачу: чек-лист с примерами

 timramone

Наша разработка постоянно растет, поэтому приходится онбордить по несколько человек в месяц и каждому рассказывать, как правильно грумить задачи. Обучать груму «вручную» больно, потому что это отнимает много времени, какие-то знания теряются по дороге и выскакивают ошибки, которых можно было избежать. Чтобы облегчить жизнь лидам и новичкам, мы собрали чек-лист с описанием этапов грума и примерами. Он будет полезен разработчикам продуктовых компаний, которые онбордят или которых недавно приняли в штат. Чек-лист поможет разбивать задачи на этапы, чтобы ничего не терялось и результат соответствовал ожиданиям.

Все примеры ниже — специфичные и подойдут не каждому, они построены в основном на продуктах Mindbox «Рассылки» и «Программа лояльности». Продукты помогают нашим клиентам запускать автоматические рассылки по триггерам (действиям или событиям), чтобы не спамить пользователей, выдавать промокоды и выстраивать бонусные системы. Если поймете, что чек-лист полезен, можете заменить примеры на свои и использовать.

Ниже подробнее о том, как сделать качественный грум:

  • цель грума,
  • необходимый минимум,
  • уточнение требований и контекста,
  • типичные этапы,
  • особенности при доработке механик.

Цель грума

Цель грума — провалидировать решение с командой перед тем, как брать задачу в работу. Для этого нужно:

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

Необходимый минимум

Контекст

Зачем задача нужна бизнесу:

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

Список этапов

Краткое описание этапов реализации — минимум по одному предложению на каждый этап. Желательно, чтобы каждый этап можно было ревьюить и мержить отдельно. При этом этапы нужно добавлять по необходимости и не пытаться во всех задачах разгрумить все аспекты.

Приемочные критерии

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

Уточнение требований и контекста

Валидация проблемы

Какую проблему решаем? Точно ли нужно ее решать именно так? Не нужно ли более общее решение?

Консистентность системы

Не позволяем ли мы создавать один и тот же функционал двумя способами без особых на то причин?

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

Страница проблем в админке Mindbox. Фильтр не такой, как на других страницах, в нем всего один параметр — статус проблемы

Сценарии приемки

Как проверить, что приемочные критерии выполнены?

BDD-тест (behavior driven development)

В задаче сложная бизнес-логика с большим количеством неочевидных сценариев? Если да, нужен BDD-тест.

При этом нужно учесть, что мы пишем тесты в коде, — у бизнес-аналитика нет фреймворка для тестов.

Примеры, когда понадобилась детальная подготовка тестовых сценариев от бизнес-аналитика:

Кейсы дедубликации и безопасности операций

Кейсы фильтров по времени относительно текущего из контекста

Фича-тоггл

Как тестировать новые изменения на части клиентов: с помощью фичи-тоггла или другим способом?

Объем железа

Начинаем ли хранить терабайты новых данных или расходовать много CPU? Если да, то нужно обновить модель железа.

Поведение в случае отказов

Как ведем себя в случае отказов, если сервис недоступен, LRT лежал, был регулярный даунтайм БД?

LRT (long running task) — обработчик фоновых задач.

Проблемы

Нужно ли заводить проблемы в каком-то из сценариев?

Под проблемами мы понимаем сообщения для клиентов о том, что какие-то автоматические механики в админке работают неправильно, в чем ошибка и как ее исправить. Например:

  • настроена автоматическая выдача промокодов, а промокоды в пуле закончились;
  • настроено списание бонусов по событию, а у клиента нет баллов, и баланс станет отрицательным;
  • в шаблоне письма что-нибудь делим на количество заказов, а заказов ноль — получается, что делим на ноль.

Ограничение доступа

Какие должны быть ограничения доступа: пермиссии персонала, авторизация?

Типичные этапы

Two-phase-миграция

Как именно будет происходить миграция: изменения в базе данных, контрактах сервисов, наборе топиков Kafka? Не сломается ли обратная совместимость?

UI и бэкенд

Отдельно ли редактируем метаданные и рантайм, который их использует? Стандартный пример задачи на блоки в сценариях: UI, бэкенд для UI, рантайм — все отдельно.

Примеры подэпиков в эпике сценариев:

Нагрузочные тесты


Нужны ли нагрузочные тесты? Какой риск хотим снять, используя нагрузочный тест?

Метрики, алерты, хартбит

Какие метрики используем?

Описание этапов

Место для начала и копипасты

Только если другие члены команды плохо знакомы с этой частью кода.

Нюансы реализации

Только важные и неочевидные, не надо расписывать «до бетона» реализацию каждого класса.

Тест-кейсы

Только важные и неочевидные. Полный список нужных тестов описывать не надо — его можно окончательно составить только в процессе реализации.

Пример, как надо. Несколько кейсов при отложенной отправке:

Интерфейсы классов или контрактов сервисов

Только важные и неочевидные, которые хочется обсудить перед реализацией.

Пример, как надо. Классы, их взаимодействие и интерфейсы при привязке заказов к рассылкам:

Схема данных в БД

В том числе — какие нужны индексы и типы полей.

Пример. Этап задачи о модели связи заказа с рассылкой:

Этап, после которого можно мержить код

Важно грумить так, чтобы задачи можно было ревьюить небольшими частями. +300 строк — норм, +1500 — нет.

Пример. В каждой задаче о новом виде проблемы написано, что можно мержить отдельно:

Гарантия консистентности при параллельных запросах

Особенности при доработке механик

Этот блок — специфика Mindbox, но может пригодиться тем, кто работает над созданием админок.

Новые поля

Новые поля должны валидироваться, экспортироваться, импортироваться, фильтроваться, отображаться в UI, логироваться и копироваться.

Новая сущность и связь

Новая сущность должна синхронизироваться с сервисом зависимостей, а новая связь — отправляться в сервис зависимостей.

Авторы

Тёма Рудневский, разработчик, техлид

Николай Андрейчук, разработчик, техлид


Источник статьи


Report Page