Аттрактор ЛоренцаИзучение Кеневина натолкнуло меня на мысль, что я плохо понимаю домен Хаоса. Собственно, я решил в нем получше разобраться и наткнулся на очень интересные аналогии, которыми и делюсь.

Поведение простое и сложное

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

Если поезд из города А до города Б, расстояние между которыми 100 км, доедет за 2 часа, то за сколько поезд доедет, если увеличит скорость на 5 км/ч?

Каждый понимает, что если поезд чуть-чуть увеличит скорость движения, то приедет в город Б чуть-чуть раньше. Малые изменения в начальных условиях приводят к малым изменениям в конечных результатах. Именно к такому эффекту мы привыкли и ожидаем его повсюду. При покупке молока за 50 и 55 рублей за литр мы ожидаем получить примерно одинаковое качество. Общаясь с коллегой, получающем зарплату, близкую к нашей, мы ожидаем примерно одинаковый уровень компетенций. Загрузив фильм за 15 минут, мы ожидаем, что фильм в 2 раза меньше по объему загрузится в два раза быстрее.

В реальном мире существует огромное количество систем, которые обладают иным поведением. К примеру, поток машин. Если мы немножко поменяем угол движения машины А и машины Б, то они столкнуться, что приведет к пробке.

Машины изменяют направление движения

Как видно из рисунков, конечные состояния систем сильно различаются.

Нормальное движениеПробка

Другой пример - это запуск кораблика-соломинки в ручейке (эх, ностальгия!). Вы с другом запустили соломинки, почти с одного места и почти одинаковой формы. Они резво плывут, ноздря к ноздре. Проходят один поворот, другой, подплывают к небольшому водовороту и тут… ваша палочка делает один круг, второй и только потом вырывается. А соломинка друга преспокойно обходит водоворот по большему радиусу. На этом неприятности не заканчиваются. Ваш кораблик вышел с другой дуги и вот он уже зацепился за некстати оказавшийся листик и завис. Щелбан проигран!

Зависимость от начальных условий еще называют эффектом бабочки и оно берет свое начало из статьи одного из основоположников теории хаоса Эдварда Лоренса “Вызывает ли взмах крыла бабочки в Бразилии торнадо в Техасе?”. Картинка, приведенная в начале статьи, называется аттрактором Лоренса и по форме напоминает бабочку.

Эффект бабочки

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

Метеорологи знакомы с этим явлением уже многие годы, поэтому при составлении прогнозов они учитывают время удвоения - отрезок времени, в течении ошибка между нашей моделью и реальностью вырастает больше, чем в два раза. На данным момент оно равно примерно 2 дням. Столь короткое время делает моделирование погоды на неделю маловероятными, а на две недели - ничем не отличающимся от гадании на кофейной гуще. К счастью, есть еще синоптики, но о них позже.

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

единицы(n+1) = K * единицы(n),

то есть число единиц в конце следующей итерации зависит каким-то образом о числа единиц предыдущего спринта(-ов). Команда смотрит на статистику и говорит: “Ну, в этот раз мы готовы взять задач на 13 поинтов”, а менеджер уходит с радостной мыслью “10 поинтов они точно сделают!”

К сожалению, состояние системы намного более сложное. Я выделяю 4 параметра:

  • Б - баги. Мы никогда не знаем точного числа багов в системе и не можем точно их предсказать
  • З - знание системы разработчиками. Суммарное знание системы постоянно растет, однако в отдельных частях системы оно как растет, так и убывает. Мы не можем точно оценить, насколько хорошо разработчики знают систему.
  • С - состояние команды. Сюда я отношу как физическое состояние (число больных или отсутствующих, духота в офисе и тому подобное), так и душевное (личные обстоятельства, низкая мотивация из-за неудачного релиза)
  • Т - требования, которые могут изменяться по ходу итерации - “а давай сюда еще одну кнопень воткнем!”

Получается, что состояние системы = F(Б,З,С,Т)

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

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

Вероятностный прогноз

При построении прогноза метеорологи используют, в числе прочих, метод Монте-Карло. Они берут множество различных начальных условий, отличающихся на известную величину ошибки, и прогоняют их множество раз. Если расхождение в получившихся состояниях в рамках времени удвоение небольшое, то прогноз считают высоковероятным. Если расхождение превышает какую-то константу, то прогноз низковероятен.

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

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

Любые оценки - это вероятностные распределения (об этом пишут многие. К примеру, Михаил Дубаков или Ларри Маккероун). Независимо от того, как вы получили оценку - через эксперта или моделируя - она все равно будет вероятностным распределением. Возможно, комбинируя оба подхода, вы получите лучшие результаты.

Пример того, как использовать метод Монте-Карло для оценки задач, найдете по ссылке http://www.youtube.com/watch?v=r38a25ak4co.

Масштаб оценки

Наверняка многие знают, что при оценке задач на итерации не рекомендуется опускаться слишком в низкие материи, разбирая классы, модули и тому подобное. Эффект бабочки дает четкое объяснение и этому явлению.

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

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

#NoEstimates

Еще один логичный вывод из эффекта бабочки: чем короче период прогнозирования, тем лучше прогноз. В идеале - один день, за что активно ратуют сторонники #NoEstimates.

И последнее

Не надо ругать метеорологов. Они не виноваты :)

Рекомендую к прочтению:

Картинка взята отсюда