Управление проектами

индекс
176,80

Gantt против Backlog

Доброго времени суток!

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

Интересность момента заключается в том, что мы переосмыслили возможности Gantt диаграммы для работы с Agile проектами. До штурма, я и мои коллеги думали об этой диаграмме как об одном из многих способов отображения плана проекта и его прогресса. В таком приближении мы имеем список задач, список разработчиков, календарь и массив отчетов от команды о прогрессе, которые можем показывать в разных представлениях — Gantt, PERT и Backlog.

Оказалось, что мы заблуждались. Кроме «локального» негативного результата мы получили довольно важные обобщения на уровне идеологии и философии управления Agile проектами.


Предыстория

Мы разрабатываем онлайн инструмент для работы с планами проектов в разных режимах отображения. Мы начали с детерминантных процессов и реализовали диаграммы Gantt и PERT с критическим путем. Сейчас подключаем эмпирические процессы, такие как Скрам. Общая идеология, которую мы предлагаем пользователям сервиса — интеграция обоих типов процессов.

Итак, у нас есть общий детерминантный план проекта, смоделированный при помощи Gantt диаграммы. Теперь мы начинаем Скрам итерацию. Нам нужно вырезать диапазон задач из этого Gantt-а, который включен в итерацию и иметь возможность переключать представление между диаграммами Gantt и Backlog. Первая модель, которую мы начали имплементировать, задумывалась просто: на странице плана итерации есть две соответствующие закладки, переключаясь между которыми, пользователь видит либо Gantt либо Backlog итерации. При этом репортинг по задачам построен так: пользователь периодически (от двух до восьми раз в день) пишет в систему короткие сообщения, или твитты, состоящие из двух полей. Первое поле — классический твитт — короткий текст с описанием статуса имплементации и второе — число, соответствующее времени, оставшемуся до завершения задачи в часах. При переключениях между закладками «Gantt» и «Backlog» эти данные должны попадать либо в «клеточки» Backlog-а:
image

либо пересчитываться в прогресс задачи на Gantt-е:
image

Все началось, когда программист (Володя), который реализовывал этот функционал, разослал сообщение, что у него возникли серьезные логические противоречия во время имплементации. Мы собрались возле доски с фламастерами и начали мозговой штурм.

Проблема

Володя описал 2 противоречия с которыми он столкнулся:
1. Если по задаче приостанавливается выполнение, то Gantt демонстрирует постепеный «фантомный» прогресс по задаче. Причем чем длиннее простой, тем больший прогресс показывается;
2. Невозможно показать перемещение ресурсов. Распределение людей по задачам в Скраме очень динамично и это становится проблемой для Gantt.

Давайте покопаемся в проблеме. Итерация имеет свойства небольшого самостоятельного проекта. Если менеджер нарисовал Gantt для этой итерации, то мы должны придерживаться его графика, чтобы иметь привязку к тому, что было запланировано. Мы не должны постоянно обновлять длительности или зависимости между задачами. Прогресс разработчиков должен показываться внутри жесткой структуры из не изменяющихся задач и их зависимостей.

В этой схеме мы вычисляем прогресс задачи на Gantt по такой формуле: progress% = 100 * hours_spent / (hours_spent + hours_left), где progress% — это прогресс в процентах, hours_spent — это количество потраченных часов и hours_left — последняя оценка в оставшихся на имплементацию часах. Эта формула работает до тех пор, пока мы не выходим за плановую длительность задачи. Представим себе спекулятивный пример: по задаче ничего не сделано, на ее реализацию нужно 8 часов, мы забыли про эту задачу и вернулись к ней через месяц. Прогресс будет равен 100 * 20*8 / (20*8 + 8) = 95%! При не начавшейся работе!

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

Перемещение людей между задачами на Gantt также требует радикальной переделки структуры задач и связей. Результат — во время спринта Gantt быстро теряет актуальность.

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

Абстракция

Уже давно было замечено, и высказано, кажется, Эйнштейном, что «серьезная проблема на может быть решена на том-же уровне, на котором она возникла». Мы на время выкинули детали и начали искать принципиальные отличия между Gantt-ом и Backlog-ом. И нашли…

Было сформулировано несколько слоганов (лаконичных и емких идей), которые определили дальнейший ход штурма:
— Gantt — статическая диаграмма, а Backlog — динамическая.
— Backlog проецируется в последовательность Gantt диаграмм — никак не на одну диаграмму.
— Каждому дню в Backlog соответствует отдельная Gantt диаграмма.

Немного деталей добавилось после сопоставления степеней свободы у этих двух диаграмм…

Степени свободы Backlog:
— длительность задач
— исполнители задач
— количество задач в итерации

Cтепени свободы Gantt:
— прогресс выполнения задачи

Наконец, нам удалось сформулировать решение проблемы, которое «зацепило» не только страницу плана, но и идеологию всего приложения…

Решение

Gantt не применим для плана Agile (или эмпирической) итерации. Это — зона действия Backlog-а или подобных ему динамических диаграмм. Граница детерминантного и эмпирического процесса пролегает между уровнем общего плана проекта и его фаз с одной стороны, и уровнем итерации — с другой.

В нашем приложении (пока) нету описанных уровней, мы работаем с отдельными планами как с документами. Когда мы создаем новый план, мы спрашиваем пользователя с каким процессом он идет — с детеминантным или эмпирическим. Сделав этот выбор, пользователь однозначно определяет подход к визуализации проекта. На странице плана в детерминантном подходе пользователь видит закладки Gantt и PERT, в эмпирическом — Backlog и Burndown.

Светлых Вам мыслей!
–2
22 марта 2010, 00:01
3

комментарии (11)

+1
adontz #
А почему вы пользуетесь spent-left вместо required-left? Тогда ведь не будет фантомного прогресса. А в плане итерации сроки уже прописаны. Вобщем я что-то не уловил суть и получилось, что вы сами себе создали проблему, а потом решали.
+1
adrobnych #
hours_left и required_left — мне кажется одно и то-же.

Давайте посчитаем. Пусть первая (плановая) оценка задачи — 16 часов.

Разработчик рапортовал такие оценки: 12 8 8 8 8 8 0. Тоесть, например он был переключен на другую задачу. Посмотрим какой процент получается на Гантте на 6й день: 6*8/(6*8 + 8) — это 86%.

Чтобы этот эффект не наблюдался, мы должны каждый день перерисовывать Гантт.
+1
adontz #
Нет, я имел ввиду что вместо (spent)/(spent+left) использовать (spent)/(required)

То есть первая формула лучше когда у нас нет оценки времени, но вторая на спринте будет корерктна, потому что оценка времени как раз есть. Причём spent это время прошеднее с начала спринта, а время потраченное на задачу.

Ганта перерисовывать придётся, но зачем же его рисовать если потом работать не по плану? Это уже плохое планирование спринта.
0
adrobnych #
Если я правильно вас понял, предлагается зафиксировать длительность задачи… Тогда в нашем случае мы получим на 6й день 6*8 / 16 = 300%… не работает…

Во время спринта делается каждодневная оценка оставшегося времени по задаче. И некоторые задачи могут улетать за их первую оценку, сделанную во время планирования спринта. Это жизнь.

Вот несколько примеров, чтобы выйти на общую точку понимания:

задача сделана раньше плана:
план — 24. Отчеты — 24 12 0

задача совпала с планом:
план — 24. Отчеты — 24 16 8 0

задача не вписалась в план:
план — 24. Отчеты — 24 28 20 12 4 0
обычно такое случается, если находятся непредвиденные проблеммы с логикой или архитектурой.

0
adontz #
1) Вы путаете прошедшее время и время потраченное на задачу

2) Еслиу вам в рамках спринта меняется оценка времени значит спринт или задача или оба сразу слишком крупные.
0
Wott #
Блин, по-моему у Вас где- в консерватории проблема…

как минимум
— если задача приостановлена, то ее надо разрывать в ганте. Фактически появляется одна подзадача выполненная на 100% и новая на 0%.
— если активные изменения в назначенных на задачу, то это излишняя детализация в WBS.
0
Wott #
и да, Вы постоянно путаете человеко-часы и просто часы, например для формулы
progress% = 100 * hours_spent / (hours_spent + hours_left) это все человеко-часы, то есть обьем проделанной работы, и если месяц ничего не делалось, то hours_spent как был так и останеться 0
0
adontz #
>> Вы постоянно путаете человеко-часы и просто часы,

Вот я тоже это написал, только по-деревенски :-)
0
adrobnych #
Задача состоит в том, чтобы один бэклог автоматически трансформировать в один Гантт.

Именно такая операция невозможна.

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

Здесь рассматривается логика приложения. Представте, что мы находимся на странице плана итерации в режиме беклог. Что мы должны увидеть, если на этой странице пользователь нажимает кнопку «Gantt»?

Не получится просто ему показать одну Гантт диаграмму. Ему таких диграмм нужно сгенерировать столько, сколько рабочих дней показано в одном бэклоге. Поскольку в Скраме каждый день мы все планируем заново.
0
Wott #
Эээ, опять же гант — это не столько форма отображения сколько форма планирования. Если у вас 10 задач и 10 программеров тусуются между ними постоянно, то гант будет выглядеть как 10 параллельных задач.

вам нужно отображать прогресс? Ну так делайте это для задач независимо ото всего, не надо мучить гант для этого.
0
adrobnych #
Помучить Гантт — это же интересно :)

Это может привести к интересным идеям — например к чему-то типа Гантт 2.0. Где график Гантта как-то совмещен с каждодневными оценками.

А с тем что «совремнный» Гантт — больше «форма планирования», согласен

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.