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

— А вы уверены, что вы сможете сделать эти задачки? - спросил менеджер перед началом нового спринта у своей команды, в которой было 4 разработчика (включая меня) и 2 тестировщика. 

Ненавижу такие вопросы, обращенные к группе людей. Менеджер как бы перекладывает с себя ответственность на команду, мол если не сделаете - то сами виноваты, я же вас спрашивал… Да и как он ожидает получить ответ? Нам по порядку выстроившись в очередь отвечать? И дальше если большинство (типа у нас тут демократия, ага) скажет “Уверен”, то стартанем спринт, а если нет - то … то что? Уберем пару задачек, как делали в прошлый раз? Зато потом в середине спринта разработчики освободились и мы вкинули еще несколько тикетов в активный спринт. Джира в такие моменты даже показывает предупреждение: “Будьте аккуратны! Вы собираетесь вмешаться в скоуп спринта!” (да не такое, да, я в курсе, но похожее: “Sprint scope will be affected by this action.”)

— Скорость нашей команды - 100sp, а мы уже набрали задач на 150sp. Вы точно все успеете?

Повторил. Явно перекладывает с себя ответственность. 

Does your dog bite? No, but it can hurt you in other ways. "SHOW YOUR BURNDOWN DIAGRAM"
Does your dog bite? No, but it can hurt you in other ways. "SHOW YOUR BURNDOWN DIAGRAM"

… Прошло две недели …

— Итак, скорость нашей команды - 100sp по результатам статистики нескольких прошедших спринтов. Все время мы берем в спринт задач по сумме больше нашей скорости. И все время в конце спринта у нас остаются задачи, которые мы пообещали выдать, но не закончили работу над ними. Давайте подумаем, как мы можем сделать так, чтобы мы успевали выполнять все, что заявляем в начале спринта? - задал вопрос менеджер команде на ретро.

Казалось бы. Проанализируй задачи, что остались не выполненными, сделай самостоятельный вывод, подумай сам своей головой над возможным решением этой проблемы… В конце то концов, ты же ходишь на всей наши дейли! Ты же в курсе кто чем занят был! Ты же сам видел, как прошел наш 2-ух недельный спринт… Но нет. Все менеджеры не любят ничего делать своими руками? Все менеджеры любят делегировать?

Я уже думал над этой проблемой не один раз. Мы никогда не сможем закончить наш спринт так, чтобы brundown график оказался в нуле. И я не могу понять, почему менеджер не может это понять. Я попал в этот проект давно, еще задолго до того, как этот менеджер присоединился к нам. Я помню, как и раньше нам задавали эти вопросы другие руководители… Но знаете, чего я не могу вспомнить? Вы не поймите неправильно, я пытаюсь, отчаянно ищу воспоминания, но не нахожу их… Воспоминания о том, как менеджер хотя бы один раз предложил самостоятельно решение этой проблемы.

— Окей. У меня есть доказательство того, что мы всегда будем видеть Committed > Completed в конце спринта. - сказал я. О, я уверен в том, что говорю. Такое бывает редко, обычно я сомневаюсь. Но сейчас, без всякого сомнения, я готов предоставить свои изъяснения на суд… на суд кого? Менеджера, который не заслужил уважения? Нет, на суд коллег. С ними мы на равных, а поэтому их мнение стоит очень дорого.

— Всегда? - с усмешкой переспросил менеджер.

Его здесь не было год назад, и два, и три. “Всегда?” - да что он хочет этим сказать?! Эта проблема не решается уже 4 года. И это только в этом проекте. У меня были и другие проекты с Agile, и этими графиками в джире. И было все то же самое. Может быть раньше я не придавал этому значения, потому что был слишком мал. А может быть потому, что не боялся менять проекты. “Всегда?” - как будто он знает, как будто он видел другие команды без этих проблем, но не хочет нам о них рассказывать. Как добрый папочка, который хочет, чтобы его ребенок самостоятельно на своих ошибках нашел правильный путь.

— Всегда. Я докажу.


Представим, что у нас есть команда из 1 разработчика и 1 тестировщика. Разработчик может выполнить 6 sp за спринт, а тестировщик — 4 sp. У нас будут двухнедельные спринты. Каждая задача должны быть сначала сделана разработчиком, а затем протестирована. Только после этого результат можно отдавать клиенту. Предположим, что это первый спринт в проекте. Давайте посмотрим, как он пройдет.

1-й спринт

Разработчик получил две задачи по 5 sp (Dev 3 sp (это значит, что на разработку в этой задаче отведено 3 стори поинта) + QA 2 sp (а на тестирование 2 стори поинта)). Committed = 10 sp. 

Первый понедельник: разработчик начинает работать над задачей 1. 

Конец первой пятницы: разработчик передал задачу 1 на тестирование. 

Второй понедельник: разработчик начинает работать над задачей 2, тестировщик начинает проверять задачу 1. 

Конец второй пятницы: разработчик передал задачу 2 на тестирование, тестировщик закрыл задачу 1. 

В конце первого спринта у нас есть 1 незакрытая задача: задача 2. Она готова полностью разработана, но еще не протестирована. Скорость команды по диаграмме в Jira: 5 sp (Committed SP = 10 sp, Completed SP = 5 sp).

2-й спринт 

Разработчик получил две задачи по 5 sp (Dev 3 sp + QA 2 sp), а также у нас есть задача 2, которую надо протестировать. Итак, Committed = 15 sp (Задача 2 (старая) + Задача 3 (новая) + Задача 4 (новая)). 

Первый понедельник: разработчик начинает работать над задачей 3, тестировщик начинает проверять задачу 2.

Конец первой пятницы: разработчик передал задачу 3 на тестирование, тестировщик закрыл задачу 2. 

Второй понедельник: разработчик начинает работать над задачей 4, тестировщик начинает проверять задачу 3. 

Конец второй пятницы: разработчик передал задачу 4 на тестирование, тестировщик закрыл задачу 3. 

В конце второго спринта у нас есть 1 незакрытая задача: задача 4. Скорость команды по диаграмме Jira: 10 sp (Заданные SP = 15 sp, Завершенные SP = 10 sp).

n-й спринт

То же самое, что и 2-й спринт. 

Таким образом, у нас всегда будет Committed > Completed. То есть тестировщик всегда будет не успевать протестировать то, что разработчик закончил разрабатывать в конце недели.

Единственное, о чем мы можем здесь поговорить, это насколько велика разница между Committed и Completed. Если мы попробуем разбить задачу 5 sp на две разные задачи по 2.5 sp и возьмем в спринт 4 задачи вместо двух, мы можем получить другой результат. Давайте посмотрим:

4 задачи по 2.5 sp (Dev 1.5 sp + QA 1 sp). Если вы выполните расчеты, как в примере выше, то в конце n-го спринта получите: Committed = 12.5 sp, Completed = 10 sp. Мы уменьшили разницу между Committed и Completed просто используя декомпозицию.

Затем мы можем попробовать декомпозировать еще сильнее: 8 задач по 1.25 sp (Dev 0.75 sp + QA 0.5 sp). В n-м спринте: Committed = 11.25 sp, Completed = 10 sp. Думаю, вы поняли суть. 

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


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

Попросить разработчиков тестировать свои задачи… Я это уже слышал. Это не просто маленький штрих в наших процессах. Это полностью новый процесс. Зачем нам тогда вообще в таком случае тестировщики? Надо чтобы все были “универсальными” в команде. И это то, о чем мы сами должны были додуматься и предложить на ретро? Можно ли вообще такие вопросы на ретро обсуждать? … Предположим, что он имел ввиду что-то другое… Скажем, он имел ввиду, что надо просто разработчикам писать больше интеграционных и автоматических тестов, performance тестов. Ух, как же в таком случае увеличится стоимость поддержки этого добра. У нас уже автотесты запускаются по 4-5 часов. И это немного тестов там еще написано. А чего только стоит разбирать в ручную flaky падения в этом ворохе логов? Исходному коду уже почти 10 лет… Технического долга я надекомпозировал на 3 человеко года, и это только поверхностный взгляд и очень приблизительная оценка. Автотесты нужно оптимизировать, потому что они были написаны не девелоперами, и там просто гектары возможностей для улучшений. И мы все это знаем, просто нам не дают ресурсов этим заниматься. Надо фичи пилить. И если вдруг мы решим вкладываться в расширение автотестов и интеграционных тестов, то скорость разработки упадет очень сильно. Неужели он этого не понимает?

— Что, если разработчики не захотят заниматься тестированием? - спросил я, ведь я знаю, что коллеги меня поддержат в этом вопросе. Никто из разработчиков не захотел бы заниматься ручным тестированием. Не потому, что “не барское это дело”, вовсе нет. Потому что у тестировщиков есть свои процессы, свои инструменты, свои метрики и подходы. Этому нужно учиться, на это нужно тратить время. Да и плюс никуда не делось то, что давно стоит во главе этого разделения: тестировщики должны разрушать, а разработчики строить. На этом конфликте рождается софт. Если поместить этот конфликт в одну голову, то в лучшем случае мы получим некачественный продукт, а в худшем - уничтоженную мотивацию.

— Конечно, разработчики не хотят тестировать. Нам нужно попросить их делать то, что они так хорошо умеют - писать код. Писать автотесты! Да, не все может быть автоматизировано, но то, что можно - надо автоматизировать. Тогда в конце спринта разработчик будет заканчивать писать автотесты, и тестировщик дотестирует ручные задачи. Committed будет равен Completed.

Да, я предполагал этот ответ. Я хотел продолжить дискуссию, но вдруг подумал: почему это вообще проблема, что Committed больше Completed? Мы делаем фичи в продукте спринт за спринтом. Улучшаем его, добавляем что-то новое. Команда не стоит на месте. 100 sp в две недели это вобще-то показатель. Его можно использовать при планировании. Но почему мы обязаны в конце спринта сдавать все, с чем спринт начали?

Project is good, but jira charts are not. Let's fix processes to fit jira charts. Why are we so unproductive?
Project is good, but jira charts are not. Let's fix processes to fit jira charts. Why are we so unproductive?

— Хорошо, давайте делать так, вы правы, - я не стал дальше спорить. Потому что понял, что следующие 4 года в проекте менеджеры продолжат задавать все тот же вопрос: «Почему Committed > Completed в ваших спринтах?»

Комментарии (4)


  1. lilillion
    14.10.2024 09:50

    Мы с командой приходили к тому, что можно коммитится не на полный объем работы, а на его часть. А оставшуюся часть, оставить на запас "если все пойдет хорошо". Ретроспективно высчитали оптимальный обьем задач, коммитимся на него с запасом (всеравно есть какая то дельта неопределенности + сразу маркировать задачи, которые не рутинные и рискуют затянутся), и также оставлять задачи, которые можем взять в работу, если у нас освободится время после приоритетных задач. Условно сделать работу на 5 без них, и на 5 со звездочкой с ними). Планирование спринта это всегда прогноз, и вряд ли он будет точным. А так у нас есть место для маневра

    И продакт сыт, и разработчики целы


  1. AllexIn
    14.10.2024 09:50

    Забавно. Никогда не встречал менеджеров, которым было бы не всё равно на эти "цифирки".
    Хотят чтобы было сделано то что запланировано, если не сделано - разбираемся почему не сделано и как сделать чтобы было сделано. И всё...


  1. sshmakov
    14.10.2024 09:50

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

    Еще вариант, примерно той же степени бредовости, - вынести тестировщиков в отдельный проект джиры.


  1. monco83
    14.10.2024 09:50

    Плюс много, очень знакомая ситуация.
    Как по мне, корень проблемы здесь лежит в разделении на фазу разработки и фазу тестирования. Если у вас не trunk-based, а один из вариантов gitflow, то в релизе всегда будет какой-то момент, когда ваш код из dev отправляется в релизную ветку. И тут получается так, что либо ваши две недели разработки, совсем не 10 дней, 10 дней минус 3,4,5 дней до отливки релиза. Либо вы заранее делите спринт на две части: неделю разработки и неделю тестирования и планируете спринт из сорока рабочих часов. Но неделя разработки в двухнедельном спринте - это очень мало для реализации требуемых фич, поэтому оценки всё равно даются нереалистичные, а разработка фич по факту переезжает в релизную ветку. Это в свою очередь приводит к ненормальному объёму миграции кода между ветками rel и dev, к ещё большему числу багов и к ещё большим затратам времени на разработку.