![image](https://habrastorage.org/webt/fx/w0/lx/fxw0lxk-yfhasr9-5kkkk1x2d08.jpeg)
Методология Лёве объединяет разработку систем и дизайн проектов, используя базовые принципы разработки ПО, корректные наборы инструментов и эффективные методы. Автор подробно описывает основы, на которых прокалываются многие архитекторы ПО, и показывает, как разложить систему на мелкие блоки или службы. Вы узнаете как вывести эффективный дизайн проекта из дизайна системы, как рассчитать время, необходимое на запуск проекта, его стоимость и риски, и даже как разработать несколько вариантов выполнения.
Метод и принципы «совершенного софта» можно применять независимо от размера проекта, компании, технологии, платформы или отрасли. Цель этой книги — решение важнейших задач современной разработки ПО, требующих исправления программных систем и проектов, ваш карьерный рост и, возможно, изменение всей IT-индустрии. Рекомендации и знания, которые вы получите, сэкономят десятилетия вашего опыта и спасут многие проекты. Эта книга принесет большую пользу разработчикам, архитекторам, руководителям проектов или менеджерам на любом этапе карьеры.
Расширенные методы планирования
Планирование проекта — весьма нетривиальная дисциплина, и в предыдущих главах
рассматривались только базовые концепции. Это было сделано намеренно, чтобы не создавать избыточных сложностей на начальном этапе. Однако область планирования проекта этим далеко не ограничивается, и в этой главе будут представлены дополнительные методы, которые принесут пользу практически в любом проекте, а не только в самых крупных или сложных. У всех этих методов есть кое-что общее: они позволяют лучше управлять риском и сложностью. Вы также увидите, как успешно справляться даже к самыми сложными и проблематичными проектами.
Божественные активности
Как следует из названия, божественные активности слишком велики для вашего проекта. Возможно, термин «слишком велики» нужно рассматривать как относительный — божественная активность слишком велика в отношении других активностей в проекте. Простой критерий для выявления божественных активностей — наличие активности, продолжительность которой отличается от средней продолжительности всех активностей проекта как минимум на одно стандартное отклонение. Впрочем, божественные активности могут быть слишком большими и в абсолютном отношении. Продолжительность в диапазоне 40–60 дней (и более) слишком велика для типичного программного проекта.
Возможно, ваши интуиция и опыт уже подсказывают вам, что от таких активностей стоит держаться подальше. Как правило божественные активности становятся обычными заполнителями для некой великой неопределенности, скрывающейся под ними. Оценки продолжительности и трудозатрат для божественной активности почти всегда имеют низкую точность. Соответственно, фактическая продолжительность может оказаться длиннее — теоретически достаточно для того, чтобы загубить проект. С такими опасностями следует разбираться как можно раньше, чтобы у вас сохранялись шансы выполнения своих обязательств.
Божественные активности также нередко искажают методы планирования проекта, описанные в книге. Они почти всегда являются частью критического пути, в результате чего многие методы управления критическим путем становятся неэффективными, потому что продолжительность критического пути и его положение в сети смещаются к божественным активностям. Ситуация усугубляется тем, что модели риска для проектов с божественными активностями выдают обманчиво низкие значения рисков. Большая часть усилий по такому проекту будет потрачена на критические божественные активности, в результате чего проект во всех практических отношениях станет проектом с высоким риском. Однако вычисление риска даст заниженные результаты, потому что другие активности, окружающие критические божественные активности, будут иметь высокий временной резерв. Если убрать эти окружающие активности, то риск моментально вырастет до 1,0 — правильный признак высокого риска, возникающего при использовании божественных активностей.
Решение проблемы божественных активностей
Лучший план действий с божественными активностями — разбиение их на меньшие независимые активности. Разбиение божественных активностей значительно улучшит качество оценки, сократит неопределенность и предоставит правильное значение риска. Но что, если объем работы будет действительно огромным? Такие активности следует рассматривать как мини-проекты и заняться их уплотнением. Начните с выявления внутренних фаз божественных активностей и поиска возможностей параллельной работы в этих фазах внутри каждой божественной активности. Если это невозможно, попробуйте сделать божественные активности менее критическими, убрав их с пути других активностей в проекте. Например, разработка имитаторов для божественных активностей снижает зависимости других активностей от самих божественных активностей. Это позволит организовать работу параллельно с божественными активностями, что сделает их менее критичными (или вообще некритичными). Имитаторы также сокращают неопределенность божественных активностей, так как устанавливаемые ими ограничения раскрывают скрытые предположения; это упрощает подробное проектирование божественных активностей.
Также следует рассмотреть возможности выделения божественных активностей в самостоятельные второстепенные проекты. Выделение во второстепенный проект особенно важно в том случае, если внутренние фазы божественной активности последовательны по своей природе. Это значительно упрощает управление проектом и отслеживание прогресса. Обязательно спланируйте точки интеграции в сети, чтобы сократить риск интеграции на завершающей стадии. Выделение божественных активностей подобным образом обычно повышает риск для остальной части проекта (после извлечения божественных активностей на долю других активностей остается намного меньший временной резерв). Обычно это хорошо, потому что в противном случае проект имел бы обманчиво низкие показатели риска. Ситуация встречается настолько часто, что низкие показатели риска часто указывают на то, что вам стоит заняться поиском божественных активностей.
Точка пересечения риска
В примере из главы 11 для включения и исключения вариантов планирования проекта использовались простые правила: риск должен быть ниже 0,75 и выше 0,3. При принятии решений о вариантах планирования можно действовать с большей точностью, не ограничивающейся простейшими правилами. На рис. 11.33 в точке минимума прямых затрат и непосредственно слева от нее кривая прямых затрат практически горизонтальна, но кривая риска имеет значительный угол наклона. Такое поведение ожидаемо, потому что кривая риска обычно достигает своего максимального значения до того, как прямые затраты достигнут своего максимума в решениях с наибольшим уплотнением. Единственная возможность достичь максимального риска до максимума прямых затрат — если изначально слева от минимума прямых затрат кривая риска растет намного быстрее кривой прямых затрат. В точке максимального риска (и немного справа от нее) кривая риска горизонтальная или почти горизонтальная, тогда как кривая прямых затрат имеет достаточно крутой угол наклона.
Отсюда следует, что слева от минимума прямых затрат должна существовать точка, в которой кривая риска прекращает расти быстрее кривой прямых затрат. Я называю эту точку точкой пересечения риска. В этой точке риск достигает максимума. Отсюда следует, что вам, вероятно, следует избегать уплотненных решений со значениями риска выше точки пересечения. В большинстве проектов точка пересечения риска совпадает со значением 0,75 на кривой риска.
Точка пересечения риска консервативна, потому что она не находится на максимуме риска, и при этом она базируется на поведении риска и прямых затрат, а не на абсолютном значении риска. Отсюда следует, что с учетом истории многих программных проектов некоторая доля осторожности никогда не повредит.
Вычисление точки пересечения
Для нахождения точки пересечения риска потребуется сравнить скорость роста кривой прямых затрат и кривой риска. Это можно сделать разными способами: аналитически — с применением базовых средств математического анализа; графически — с использованием электронной таблицы; или средствами решения числовых уравнений. В файлах, прилагаемых к этой главе, все три метода применяются почти по шаблонной схеме, так что вы сможете легко найти точку пересечения риска.
Скорость роста функции выражается ее первой производной, поэтому вы должны сравнить первую производную кривой риска с первой производной кривой прямых затрат. Модель риска в примере из главы 11 имеет форму кубического многочлена следующего вида:
Первая производная этой функции представляет собой квадратный многочлен:
В нашем примере формула риска выглядит так:
Первая производная риска:
Формула прямых затрат:
Следовательно, первая производная прямых затрат выглядит так:
Перед сравнением формул двух производных необходимо решить две проблемы. Во-первых, диапазоны значений между максимальным риском и минимальными прямыми затратами на обеих кривых монотонно убывают (что означает, что скорости роста двух кривых будут отрицательными), поэтому сравнивать нужно абсолютные значения скоростей роста. Во-вторых, исходные скорости роста несравнимы по величине. Значения риска лежат в диапазоне от 0 до 1, а значения затрат в нашем примере равны приблизительно 30. Для корректного сравнения двух производных необходимо сначала масштабировать значения риска до значений затрат в точке максимального риска.
Рекомендуемый коэффициент масштабирования определяется по формуле:
![image](https://habrastorage.org/webt/nd/jg/fo/ndjgfo0xd3kdvojillc44p7ahca.png)
где:
- tmr— время достижения максимального риска;
- R(tmr) — значение формулы риска проекта в точке tmr;
- С(tmr) — значение формулы затрат проекта в точке tmr.
Кривая риска достигает максимума в точке, в которой первая производная кривой риска R' равна 0. Решая уравнение риска для t при R' = 0, получаем значение tmr, равное 8,3 месяца. Соответствующее значение риска R равно 0,85, а соответствующее значение прямых затрат — 28 человеко-месяцев. Отношение двух значений F равно 32,93 — это и есть коэффициент масштабирования для нашего примера.
Допустимый уровень риска для проекта достигается при выполнении всех условий из следующего списка:
- Значение времени находится слева от точки минимального риска проекта.
- Значение времени находится справа от точки максимального риска проекта.
- Риск растет быстрее затрат в абсолютном значении с учетом масштабирования.
Эти условия можно объединить в следующем выражении:
Используя уравнения производных риска и прямых затрат, а также коэффициента масштабирования, получаем:
Решение уравнения дает допустимый диапазон для t:
В результате получаем не одну, а две точки пересечения — 9,03 и 12,31 месяца.
На рис. 12.1 наглядно представлено поведение масштабированных производных риска и затрат
в абсолютных значениях. Из диаграммы хорошо видно, что производная риска в абсолютном значении пересекает производную затрат в абсолютном значении в двух местах (отсюда и термин «точка пересечения»).
![image](https://habrastorage.org/webt/kj/tl/do/kjtldod6lfzedic2frchefbigec.png)
Если отложить в сторону математику, существование двух точек пересечения риска связано с семантикой точек с позиций планирования проекта. В точке 9,03 месяца риск равен 0,81; в точке 12,31 месяца риск равен 0,28. Наложение этих значений на кривую риска и кривую прямых затрат на рис. 12.2 раскрывает истинный смысл точек пересечения.
![image](https://habrastorage.org/webt/yh/-q/vr/yh-qvruzuljgug0c9mj4g4evozk.png)
Решения планирования проекта слева от 9,03-месячной точки пересечения риска слишком рискованны; решения справа от 12,31-месячной точки слишком безопасны. Между двумя точками пересечения риска уровень риска «в самый раз».
Приемлемые риски и варианты планирования
Значения риска в точках пересечения 0,81 и 0,28 хорошо согласуются с эмпирическими порогами 0,75 и 0,30. В нашем примере зона приемлемого риска включает первое уплотненное решение, нормальное решение и точки разуплотнения D4, D3 и D2 (рис. 11.35). Все эти точки являются практичными вариантами планирования. «Практичность» в этом контексте означает, что обязательства по проекту будут выполнены с разумной вероятностью. Более уплотненные решения слишком рискованны, а точка D1 слишком безопасна. Вы также можете выбрать между несколькими точками разуплотнения, определив лучшую цель для разуплотнения.
Поиск цели для разуплотнения
Как указано в главе 10, уровень риска 0,5 является точкой наибольшей крутизны на кривой риска. Это делает ее идеальной целью разуплотнения, потому что она обеспечивает наилучший результат — иначе говоря, за минимальную величину разуплотнения вы получаете наибольшее сокращение. Идеальная точка является точкой перегиба риска, а следовательно, минимальной точкой разуплотнения.
Если вы построили график кривой риска, то уже видите, где находится точка перегиба, и можете выбрать точку разуплотнения в точке перегиба или, если действовать более консервативно, справа от нее. Этот метод использовался в главе 11 для того, чтобы рекомендовать D3 на рис. 11.29 в качестве цели разуплотнения. Однако простое определение положения точки на глаз вряд ли можно признать хорошей инженерной практикой. Вместо этого следует применить методы математического анализа для последовательного и объективного поиска цели разуплотнения.
С учетом того, что кривая риска эмулирует стандартную логистическую функцию (по крайней мере между точками минимального и максимального риска), точка кривой с наибольшим углом наклона также отмечает точку перегиба кривой. Слева от этой точки кривая риска является вогнутой, справа — выпуклой. Из математического анализа известно, что в такой точке вторая производная функции равна нулю. Идеальная кривая риска и первые две ее производные показаны в графическом виде на рис. 12.3.
![image](https://habrastorage.org/webt/pq/98/ua/pq98ua47mmcfpc1trdyfpozearm.png)
Используя пример из главы 11 для демонстрации этого метода, мы получаем формулу риска в виде кубического многочлена. Первая и вторая производные:
Приравнивая вторую производную к нулю, получаем следующую формулу:
![image](https://habrastorage.org/webt/q9/c-/l5/q9c-l5drlnqxroerdysgh_98nhw.png)
Так как модель риска выглядит так:
нулевое значение второй производной достигается в точке 10,62 месяца:
![image](https://habrastorage.org/webt/el/9p/tb/el9ptbhtjntv_j9bvitxaensz0g.png)
В точке 10,62 месяца значение риска равно 0,55, что только на 10% отличается от идеальной цели 0,5. При нанесении на дискретные кривые риска на рис. 12.4 становится видно, что это значение находится в диапазоне между D4 и D3; таким образом обосновывается выбор D3 в качестве цели разуплотнения в главе 11.
![image](https://habrastorage.org/webt/x_/4z/tk/x_4ztkxutkcpfnccdxwtbjxxgog.png)
В отличие от главы 11, в которой использовалось наглядное представление диаграммы рисков, а точка перегиба определялась субъективно, вторая производная предоставляет объективный и воспроизводимый критерий. Это особенно важно при отсутствии очевидной точки перегиба, а также при смещении кривой риска вверх или вниз, когда рекомендованное значение 0,5 не подходит.
Геометрический риск
Все модели риска, представленные в главе 10, используют для вычисления риска разновидность среднего арифметического временных резервов. К сожалению, среднее арифметическое плохо справляется с неравномерными распределениями значений. Возьмем последовательность [1, 2, 3, 1000]. Среднее арифметическое этой последовательности равно 252, что совершенно не типично для имеющихся значений. Такое поведение проявляется не только при вычислении рисков, а любые попытки использования среднего арифметического для крайне неравномерного распределения приводят к неудовлетворительному результату. В таком случае лучше использовать среднее геометрическое вместо среднего арифметического.
Среднее геометрическое для последовательности значений вычисляется умножением всех n значений последовательности и последующим извлечением корня n-й степени из произведения. Для последовательности значений a1… an среднее геометрическое последовательности вычисляется по следующей формуле:
![image](https://habrastorage.org/webt/b7/bu/yg/b7buygl0id6bnq2nm3lupsythh0.png)
Например, хотя среднее арифметическое последовательности [2, 4, 6] равно 4, среднее геометрическое равно 3,63:
![image](https://habrastorage.org/webt/oj/re/2i/ojre2ixfwweqage2xd6dnhgltfq.png)
Среднее геометрическое всегда меньше или равно среднему арифметическому той же последовательности значений:
![image](https://habrastorage.org/webt/ao/mc/qz/aomcqzkid23qh_cezrsnlz02swc.png)
Два средних равны только в том случае, когда все значения в последовательности одинаковы.
Хотя на первый взгляд может показаться, что среднее геометрическое — какая-то алгебраическая странность, оно по-настоящему проявляет себя в последовательностях с неравномерным распределением значений. При вычислении среднего геометрического выбросы намного меньше влияют на результат. В примере с последовательностью [1, 2, 3, 1000] среднее геометрическое равно 8,8, что гораздо лучше представляет первые три числа последовательности.
Геометрический риск возникновения критичности
Как и в случае с арифметическим риском возникновения критичности, для вычисления геометрического риска возникновения критичности можно воспользоваться цветовым кодированием временных резервов и соответствующим количеством активностей. Вместо того чтобы умножать веса временных резервов на количество активностей, вы возводите их в эту степень. Геометрическая формула риска возникновения критичности выглядит так:
![image](https://habrastorage.org/webt/wg/td/iw/wgtdiwbfcl2lxupndrlnniy16ko.png)
где:
- WC — вес критических активностей;
- WR — вес красных активностей;
- WY — вес желтых активностей;
- WG — вес зеленых активностей;
- NC — количество критических активностей;
- NR — количество красных активностей;
- NY — количество желтых активностей;
- NG — количество зеленых активностей;
- N — количество активностей в проекте (N = NC + NR + NY + NG).
Для сети на рис. 10.4 геометрический риск возникновения критичности выглядит так:
![image](https://habrastorage.org/webt/0j/u1/f9/0ju1f9bgrrwwprhw-cwebvsyfpc.png)
Соответствующий арифметический риск возникновения критичности для той же сети равен 0,69. Как и ожидалось, геометрический риск несколько ниже арифметического.
Диапазон значений риска
Как и в случае с арифметическим риском, геометрический риск возникновения критичности имеет максимальное значение 1,0, когда все активности критичны, и минимальное значение WG/WC, когда все активности сети являются зелеными:
![image](https://habrastorage.org/webt/bc/ka/hn/bckahntbi7mrujdshlytrlf43yu.png)
Геометрический риск Фибоначчи
Для получения геометрической модели риска Фибоначчи можно использовать отношение Фибоначчи между весами. Для следующего определения весов:
![image](https://habrastorage.org/webt/jg/wm/yl/jgwmyl-wnip-_rejud1zmkt6wcq.png)
геометрическая формула Фибоначчи выглядит так:
![image](https://habrastorage.org/webt/wv/m0/yj/wvm0yjyc3fjyz0kz77wihbejtmm.png)
Диапазон значений риска
Как и в случае с арифметическим риском Фибоначчи, геометрический риск Фибоначчи имеет максимальное значение 1,0, когда все активности критичны, и минимальное значение
Геометрический риск активности
Формула геометрического риска активности использует среднее геометрическое временных резервов в проекте. Критические активности имеют нулевой временной резерв, и это создает проблему, потому что среднее геометрическое всегда будет равно нулю. Стандартное обходное решение — прибавить 1 ко всем значениям последовательности и вычесть 1 из полученного среднего геометрического.
Таким образом, формула геометрического риска активности имеет вид:
![image](https://habrastorage.org/webt/ta/oj/ki/taojkitihqnbn2oup7fasmvwpa0.png)
где:
- Fi — временной резерв для активности i;
- N — количество активностей в проекте;
- M — максимальный временной резерв по всем активностям в проекте, или Max(F1, F2, …, FN).
Для сети на рис. 10.4 геометрический риск активности будет равен:
![image](https://habrastorage.org/webt/32/sx/oj/32sxojkgtrew56bfrdz6zeuz5ew.png)
Соответствующий арифметический риск активности для той же сети будет равен 0,67.
Диапазон значений риска
Максимальное значение геометрической модели риска активности приближается к 1,0 по мере того, как все больше активностей приближается к критическому состоянию, но становится неопределенным, когда критическими становятся все активности. Геометрический риск активности имеет минимальное значение 0, когда временной резерв всех активностей одинаков. В отличие от арифметического риска активности, с геометрическим риском активности нет необходимости корректировать выбросы с аномально высоким временным резервом, и временные резервы могут не иметь равномерного распределения.
Об авторе
Джувел Лёве является ведущим архитектором ПО, специализирующимся на разработке систем и проектов.
Помог множеству компаний научиться поставлять качественный софт в соответствии с графиком и в рамках бюджета. Microsoft признает его ведущим мировым экспертом и лидером отрасли. Лёве привлекают для подготовки внутренних обзоров дизайна для C#, WCF и связанных технологий, его называют легендой программного обеспечения.
Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — Софт
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.