Привет, Хабр!
Меня зовут Даниил, я product lead в «Магнит Фудтех». Это направление входит в бизнес-группу «Магнит OMNI», объединяющую три вертикали: сервис доставки, маркетплейс «Магнит Маркет» и программу лояльности «Магнит Плюс». Сегодня хочу рассказать о важном инструменте работы любого продакта, в бэклоге которого несколько десятков задач, — скоринге.
Что такое скоринг и зачем он нужен
Скоринг — метод оценки и приоритизации задач. Есть много разных подходов к приоритезации задач, но цель у них одна: с минимальными усилиями помочь команде определить, какими задачами заняться в первую очередь, чтобы выполнить бизнес-цели и оправдать ожидания клиентов. Самые популярные методологии приоритизации — RICE и ICE.
Многие продакты ведут бэклог в Jira, а скоринги считают в Excel или Google Docs. Так делал и я. Однако у такого способа есть свои недостатки: во-первых, надо постоянно поддерживать актуальность списка тикетов в Excel — убирать выполненные и добавлять новые задачи. Во-вторых, неудобно, когда задачи в одном месте, а скоринговый балл — другом. В результате скоринг в Excel всегда в полуактуальном состоянии, и привести его в порядок за пару минут не так-то просто.
При этом мне всегда казалось, что скоринг — это неотъемлемая часть бэклога. Однако стандартные возможности Jira не предусматривают ведение скоринга. Конечно, там можно создать поле со скоринговым баллом, однако это не избавило бы меня от возни с расчетами в Excel, а цифры пришлось бы переносить в Jira и актуализировать вручную. Поэтому я начал искать искать способ перенести расчет скоринга в Jira.
Structure спешит на помощь
Решением стал плагин Structure. Не буду подробно рассказывать о его функционале: достаточно сказать, что Structure — один из самых мощных и гибких плагинов Jira. Используя Structure, я смог создать табличный вид бэклога с расчетом скорингового балла по методологии RICE. Верю, что такой инструмент будет полезен и другим продактам, поэтому делюсь с вами.
Как создать скоринг с помощью Structure
Приступим:
Прежде чем заняться составлением новой структуры, необходимо добавить в ваш проект поля, на основании которых будет считаться скоринг в Jira. Для этого нужно попросить ваших Jira-админов добавить 4 поля в задачи всех типов в вашем проекте.
Поля, которые нужно добавить, со списками выбора значений в них:Охват (Reach):
0–10%;
10–20%;
20–30%;
30–40%;
40–50%;
50–60%;
60–70%;
70–80%;
80–90%;
90–100%.
Влияние (Impact):
< 0,1 млн ₽;
0,1–0,5 млн ₽;
0,5–1 млн ₽;
1–2 млн ₽;
2–5 млн ₽;
5–10 млн ₽;
10–20 млн ₽;
20–50 млн ₽;
50–100 млн ₽;
100+ млн ₽.
Уверенность в оценке (Confidence):
1. Я и/или кто-то рядом со мной верит в идею (ничем, кроме веры, не подтверждено).
2. 5+ жалоб «очень болит, поправьте».
3. Реализовано у конкурента.
5. Проведены исследования/расчёты, в ходе которых подтвердили, что решение поможет с проблемой.
7. Получен успешный тест части функциональности меньшего объема.
8. Критичный тех.долг.
10. Системный стандарт рынка / результат A/B-теста / требование legal или compliance / я так уже делал в другой компании и это работает.
Усилия (Effort):
меньше 1 дня;
3–4 дня;
1–2 недели;
месяц-полтора;
квартал.
Нумерация в списке «Уверенность в оценке» кажется нарушенной, однако. на самом деле это не нумерация, а веса, присвоенные каждому из вариантов. Вы можете изменить списки выбора в зависимости от ваших потребностей.
После того, как админ Jira добавил новые поля в проект, создаем новую Структуру.
В созданную Структуру добавляем задачи из своего проекта в статусах, которые мы будем считать бэклогом. Для этого жмем «Автоматизация» → «+» → «Вставить» → «JQL-запрос».
Вставляем примерно такой JQL запрос:project = OMS — тут вставляем код своего проекта;
and status in ("TO DO") — тут пишем статусы, в которых тикет в вашем проекте считается бэклогом;
and issuetype in (Story,Epic) — фильтр по типам задач. Мы с командой договорились, что стори и эпики регистрирует только продакт;
and "Epic Link" is EMPTY – чтобы в бэклоге не отображались задачи из эпиков, иначе эпик и все входящие в него тикеты будут дублироваться.
Текст запроса нужно скорректировать под ваш проект, а комментарии — убрать. С ними запрос работать не будет.Выходим из режима «Автоматизация». В структуру подтянется список задач, выбранных запросом.
Добавляем в структуру столбцы «Охват», «Влияние», «Уверенность в оценке» и «Оценка трудозатрат». На моем скрине поля названы немного по-другому, но это не так важно.
После этого добавляем в Структуру столбец типа «Формула», чтобы рассчитать скоринговый балл.
Присваиваем столбцу с формулой название «Скоринговый балл» и вставляем в него код из блока ниже. Если ваши списки выбора отличаются от моих, то вам нужно будет отредактировать код, внести значения из своих списков выбора и сопоставить их веса. Сделать это несложно — уверен, вы справитесь.
ifdefined(issueType):
// этот блок кода поможет проверить, заполнены ли поля для расчёта скоринга. Если они не заполнены - не считаем скоринговый балл;
if impact != Undefined
and reach != Undefined
and confidence != Undefined
and effort != Undefined
:
// этот и следующие блоки кода - преобразование значений списка выбора в соответствующие числа;
// impact - название переменной для сопоставления столбца эконом.эффект;
// impact_score - переменная для сохранения количества баллов по экономическому эффекту;
with impact_score = if (
impact = '< 0,1 млн.руб';1
;impact = '0,1-0,5 млн.руб';2
;impact = '0,5 - 1 млн.руб';3
;impact = '1 - 2 млн.руб';4
;impact = '2 - 5 млн.руб';5
;impact = '5 - 10 млн.руб';6
;impact = '10-20 млн.руб';7
;impact = '20-50 млн.руб';8
;impact = '50-100 млн.руб';9
;impact = '100+ млн.руб';10
):
with reach_score = if (
reach = '0-10%';1
;reach = '10-20%';2
;reach = '20-30%';3
;reach = '30-40%';4
;reach = '40-50%';5
;reach = '50-60%';6
;reach = '60-70%';7
;reach = '70-80%';8
;reach = '80-90%';9
;reach = '90-100%';10
):
with confidence_score = if (
confidence = '1. Я и/или кто-то рядом со мной верит в идею (ничем, кроме веры, не подтверждено)';1
;confidence = '2. 5+ жалоб "очень болит, поправьте"';2
;confidence = '3. Реализовано у конкурента';3
;confidence = '5. Проведены исследования/расчёты, в ходе которых подтвердили что решение поможет с проблемой';5
;confidence = '7. Получен успешный тест части функциональности меньшего объема';7
;confidence = '8. Критичный тех.долг';8
;confidence = '10. Системный стандарт рынка / результат A/B-теста / требование legal или compliance / я так уже делал в другой компании и это работает';10
):
with effort_score = if (
effort = 'Меньше дня-день';1
;effort = 'Несколько дней (3-4)';2
;effort = '1-2 недели';5
;effort = 'Месяц';20
;effort = 'Квартал';60
):
//сама формула расчёта скорингового балла с округлением до 1 знака после запятой
ceiling(impact_score reach_score confidence_score / effort_score; 1)
После этого мы увидим список несопоставленных переменных в блоке «Имена».
Чтобы устранить ошибки, нажимаем на каждую переменную с красным восклицательным знаком. В появившемся окне выбираем название столбца с соответствующим ей выпадающим списком значений.
Сопоставив все поля, закрываем окно настройки формулы.
Теперь скоринговый балл в нашей Структуре рассчитывается автоматически.
Сохраняем созданную структуру, чтобы столбцы не съезжали и не пропадали. Для этого в правом углу нажимаем на «Базовый вид», дальше на «Сохр.как» и придумываем имя. После этого выбираем сохраненный вид в качестве вида по умолчанию.
Profit! Наслаждаемся полученным результатом.
Теперь список тикетов в вашей структуре всегда актуален, а еще вы сможете прямо здесь выставлять значения каждой компоненты и сразу получать рассчитанный скоринговый балл. Больше никаких Excel-файлов и ручных обновлений — только порядок и эффективность!