Friday, October 26, 2007

Планирование, учитывающее предыдущие результаты

Даже не знаю, как можно правильно перевести термин "Evidence Based Scheduling"... Джоэль Спольски разразился в своем блоге отличной статьей, посвященной объяснению вот этой вот самой штуки. Термин "Evidence Based Scheduling", похоже, придуман Джоэлем и его командой, а сам метод планирования внедрен и активно продвигается в их продукте FogBugz 6.0 (демо, которое заслуживает отдельных похвал, можно глянуть здесь, а запись выступления Джоэля - здесь). Итак, для тех, кто не любит читать "много букофф", вкратце, что же это такое и с чем его едят. Evidence Based Scheduling - это метод планирования проекта, основанный на 2-х основных принципах:
  • учет предыдущих результатов для получения реальной оценки (estimate) времени, которое будет затрачено на разработку продукта
  • прогнозирование вероятности релиза продукта в конкретный день (с использованием метода Монте-Карло)
По первому пункту, в принципе, все понятно. Есть люди, склонные переоценивать свои силы и недооценивать их, и это нужно учитывать при планировании проекта. Каждый грамотный team/dev/QA/project lead (нужное подчеркнуть) более-менее хорошо знает свою команду и может на основании эмпирических фактов проставить каждому девелоперу/QA коэффициент, на который нужно домножить его собственный estimate. Однако существует еще очень много факторов, которые могут повлиять на то, что проект затянется во времени и мы выпадем из графика или бюджета. Часть из них являются непроизводственными, например, прогулки по Интернету, общение в команде, кофе/чай, "а глянь какие фотки мы сделали на выходных!", часть - абсолютно честно относятся к разработке продукта: изучение новой технологии, митинги в команде, философские дискуссии с QA, что есть баг, а что фича и др. естественные, но от того не менее опасные для развития проекта активности. Все это невозможно предусмотреть заранее. Однако, если трекать процесс разработки продукта, то потом можно сравнить estimate с реальными данными и на основании этого сравнения сделать определенные выводы на будущее. Второй пункт вызывает больше интереса. Честно говоря, я не видел еще подобного способа прогнозирования дат релиза и отдельных mileston'ов (кто видел, подскажите продукт или где почитать). Как мы обычно планируем проект? У нас есть нижняя и верхняя граница оценки определенной задачи, мы выбираем цифру от 0.5 до 1 на этом отрезке (думаю, меньше 0.5 никто не выбирает :)), а затем устанавливаем ее для этой задачи в MS Project или кто чем пользуется. Строим диаграмму Ганта и в результате получаем приблизительные даты mileston'ов и релизов. Джоэль предлагает другой подход, который состоит в вычислении вероятности различных будущих, основанном на методе Монте-Карло. Данный подход достаточно тесно связан с предыдущими результатами работы наших программистов, которые у нас есть. Если мы случайным образом возьмем одно из предыдущих значений отношения оценки выполнения какой-либо задачи к реально затраченному времени (в идеале оно будет равно 1, но, конечно же, будут вариации), и разделим на него текущую оценку новой задачи, то мы получим другое число с учетом предыдущего результата. А теперь представим себе, что мы рассматриваем все задачи всех программистов и для каждой задачи вычисляем 100 различных новых значений, каждое с вероятностью в 1%. Тогда, сложив вместе эти значения (с учетом графика выполнения работ, выходных, праздников и т.д.), мы получим 100 вариантов развития события, 100 вариантов будущего нашего проекта. А уже сопоставив эти 100 графиков мы можем дать вероятность того, что наш проект завершится 10 декабря, 15 января или вообще 30 апреля. У такого подхода есть ряд преимуществ перед обычным, т.к. он дает большую гибкость и учитывает больше факторов, что, соответственно, делает результат более точным. Дальше нам остается только сказать себе, что вероятности 90% нам достаточно и мы можем поставить milestone в данную точку времени и пространства. Кроме этих интересных вещей, Джоэль также дает несколько советов по оценке задач:
  • только программист, который будет реализовывать функциональность, должен оценивать ее - известный совет, которым, тем не менее, часто пренебрегают, что влечет либо к тому, что lead оценивает задачи с точки зрения "среднестатистического" программиста, либо вообще себя, а потом этим занимается либо более слабый, либо просто менее знакомый с данной предметной областью/технологией программист и весь график летит в тартарары
  • время, затраченное на исправление ошибки в определенной функциональности, должно добавляться ко времени, потраченному на эту функциональность в целом - помогает хранить более точные результаты для будущей оценки и вычисления вероятностей
  • не давать менеджерам загонять программистов в более узкие оценки с целью зарелизить продукт быстрее/дешевле - это вообще отдельная песня... "а можешь ли ты скроить шапку из этого куска шкуры?" - "могу" - "а 2 шапки?" - "могу" - "а 3 шапки?" - "и 3 могу"
  • план проекта это коробка с бревнами - пункт, связанный с предыдущим: если у нас есть куча бревен и они не помещаются в коробку, но нужно либо убрать часть бревен из коробки, либо взять коробку побольше, но уж никак не пытаться уменьшить бревна в размерах
В общем и целом, это все. Советую прочитать статью Джоэля целиком (а также и другие его статьи), там еще много чего интересного. Вывод: FogBugz 6.0 из простой (пусть и удобной) системы багтрекинга превратился в полноценную систему управления проектами, с интересными и смелыми решениями. Интересно было бы попробовать ее в действии на реальном проекте, а то продукты MS уже как-то приелись :). Посмотрим, чем ответят разработчики других приложений. Kiwi :)

5 comments:

  1. Наверное, это что-то близкое к "вероятностному планированию". Но почему-то кажется, что нельзя мерять все по строгим законам математики пусть и инженерную дисциплину программирования. Ведь программирование, де-факто, вобрало от инженерии ровно столько, сколько и от искусства.

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

    Впрочем, поживем - увидим. Метод имеет право на жизнь =).

    ЗЫЖ А Джоэл и MS - не одного поля ягоды ;)? Впрочем, MS Project, правда, не фонтан.

    ReplyDelete
  2. "Вероятностное планирование" - это неплохо, но все-таки не совсем точный перевод. Мерять по чисто математическим законам нельзя, но и оставлять за бортом предыдущий опыт тоже глупо. Так можно наступать на одни и те же грабли постоянно. Кроме того, никто не говорит об отбрасывании "искусства" :) За тебя же estimate на задачу не компьютер придумывает. Он просто помогает учесть твой предыдущий опыт.

    Если есть сложная часть системы, которую разработчик не "может" оценить адекватно, то ему придется обращаться к более опытным людям за советом. Но я понял твою идею. Согласен, заставлять неопытного разработчика полностью составлять себе estimate, а потом еще и отвечать за него - это не просто рискованно, но даже немного аморально :) Здесь все же не нужно перегибать. Основная идея этого принципа - не нужно спускать сроки сверху, если люди сами могут их составить, учитывая свои возможности и опыт. Это будут более реальные цифры.

    По поводу сравнения FogBugz и продуктов MS - все-таки не одного и того же. И у тех, и у других есть свои достоинства и недостатки. Вот, например, в FogBugz нельзя привязывать items к исходникам, а в том же TFS - можно. Но зато FogBugz учитывает предыдущий опыт, а MS Project - нет... Разве что девлид сам будет считать эти все числа.

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

    Более того еще требуеться набрать эту статистику. Для того чтобы ускорить это необходитмо максимально мелко разбить задачи, а это в свою очереь сопряжено а) с недостаком информации на этапе планирования и б) с очень тесно связью с другими под задачами (например изменения модуля а, затрагивают б, большие задачи обычно достаточно независимы, а вот в маленьких без этого не получиться).

    Вобщемто мое ИМХО для менджмента рисков это подходит, для реальных естимейтов нет.

    ReplyDelete
  4. Estimate увеличивается не лидом, а программой, и этот "увеличенный"/"уменьшенный" estimate участвует лишь в плане, девелопер же работает по своему estimate. Кроме того, если хочется действительно обучать разработчиков делать estimate, то как раз это лучше всего делать, имея такую статистику. Вася отвел на задачу 5 часов, а справился с ней за 10. Грамотный лид укажет на этот факт мягко, без наездов, спросит, на что ушло время, попробует вместе с Васей разобраться. Возможно, разработчик просто не учел какое-то дополнительное время (написание unit-тестов, исправление багов, знакомство с какой-то областью) или же действительно неправильно оценил задачу. Значит, будет это время учитывать в будущем и здесь уже будет не "подсознательная" подгонка, а простая логика и опыт.

    Насчет набора статистики - конечно, на первом проекте ничего не получится. Что же касается разбивки на максимально маленькие задачи - то это самая первая рекомендация ко всем, кто делает estimate. Конечно же, на первых этапах, когда мы имеем лишь общее видение и требования верхнего уровня, это сделать очень сложно, поэтому и делается разброс 0.25x-4x, где x - это наш estimate, а то и больше. По мере детализации требований и разработки сначала верхнеуровневого, а потом и низкоуровневого дизайна цифра будет уточняться, а разброс - уменьшаться.

    По-моему, менеджмент рисков - это немного другая область, и как раз там данная фича поможет мало. А вот при построении плана проекта - очень даже. Есть 2 желаемые цели при разработке продукта - выдать его клиенту on time & on budget. Промазать как с первым, так и со вторым - плохо. Но промазать с обоими значениями - это еще хуже. Лучше уж уберечь себя хотя бы от промаха по срокам, что для клиента зачастую более критично.

    ReplyDelete
  5. Почитал я про этот метод, мне кажется что во многих случаях оно не сработает. Главная причина ошибок в планировании - это появление новых задач, а не неправильная оценка уже известных.

    Сегодня подробную статью на эту тему тут написал:
    http://maximkr.livejournal.com/11192.html

    ReplyDelete