18 лекция
.docЛекция 18. Результативность программистской проектной деятельности
Для характеристики результатов проекта с точки зрения их применения вне проектной деятельности вводится понятие результативности, которая рассматривается как показатель, определяемый деятельностями, использующими продукты проекта. С этой точки зрения приводится классификация рабочих продуктов проекта, которая соотносится с уровнями зрелости организаций, занимающихся разработкой программного обеспечения. Указывается на необходимость определения границ применимости методов и методик при распространении опыта. Обсуждается соотношение между технологичным производством и автоматизированной инструментальной поддержкой методологий.
Ключевые слова: результативность проектной деятельности, рабочий продукт, контроль, наблюдение, средства автоматизации, познаваемость продукта, познаваемость процесса разработки, оценивание, измерения, зрелость процессов разработки, уровни зрелости, лестница развития, опыт, метод, методика, автоматизация, автоматизация методологии, технологизация производственного процесса, этапы жизненного цикла, автоматизированная поддержка этапов жизненного цикла, CASE-система, универсальная CASE-система, специальная CASE-система, RUP, UML.
Программистская деятельность в целом может рассматриваться как производство средств автоматизации пользовательской деятельности. В связи с этим можно ставить вопросы о том, в какой мере обеспечивается требуемая автоматизация, удовлетворяет ли она тех, для кого предназначена, какой ценой, т.е. за счет расхода каких ресурсов это достигается. Ответы на подобные вопросы, относящиеся к конкретному программному проекту, мы объединяем понятием результативности проектной деятельности.
Результативность определяется как внешний по отношению к проектной деятельности показатель, отражающий взгляд на него со стороны всех инициаторов работ, заинтересованных в успешном выполнении проекта. Можно сказать, что результативность — оборотная сторона контроля и наблюдения, хотя и не все аспекты этих составляющих проектной деятельности выражаются в результативности: за рамками остаются те аспекты, которые внешних наблюдателей не интересуют. Вместе с тем результативность охватывает и такие характеристики использования разработки, которые не укладываются в цели проекта. Например, для анализа неудач — внешняя по отношению к проекту деятельность — плохо организованный проект может дать больше информации, чем нормально завершившаяся разработка, а значит, с точки зрения этой деятельности он оказывается более результативным, чем успешный проект.
Результативность — оценочная, но не только итоговая характеристика проекта. Во многом результативность разработки обусловлена тем, как организован проект, в какой мере принятая организационная методика способствует получению рабочих продуктов проекта. Эта сторона результативности указывает на целесообразность рассмотрения способности компании организовывать результативные процессы разработки проектов. Сейчас в связи с этим принято говорить об уровнях зрелости процессов разработки программного обеспечения в организации.
Существенным фактором результативности процесса разработки программного обеспечения является то, в какой степени он сам поддержан средствами автоматизации. Чем больше рутинных действий перекладывается на инструменты, тем проще и производительнее становится деятельность разработчиков, а потому более результативным может оказаться процесс в целом. Здесь результативность обусловлена не просто поддержкой деятельности сотрудников, а тем, что эта поддержка является инструментальной частью методологии, применяемой для данного проекта. Следовательно, при изучении результативности следует обратить внимание на стратегии автоматизации методологий.
Результативность — это понятие, которое связывает все стороны деятельности менеджера проекта. Если отвлечься от конкретного содержания и условий выполнения проектов, то в конечном итоге деятельность менеджера можно рассматривать как составляющую проектной деятельности в целом, которая имеет своей целью повышение результативности выполнения проекта. Этой цели подчинены и контакты с заказчиком, и руководящие действия с коллективом, и управляющая составляющая менеджерской работы.
Рабочие продукты
Любой программный проект реализуется затем, что бы в конечном счете получить изделие — продукт, полезный для конечных пользователей. Уже в этом очевидном утверждении неявно содержатся два требования, общие для всех программных разработок:
• познаваемость продукта — необходимо, чтобы пользователь был в состоянии понимать:
-
что можно получать, используя предлагаемую программную систему;
-
чего нельзя ожидать от нее;
-
как активизировать функции системы;
как трактовать (для применения) получаемые результаты;
• познаваемость процесса разработки продукта — необходимо, чтобы разработчики были в состоянии:
-
развивать проект;
-
принимать согласованные решения;
-
сбалансировано выполнять коллективную работу.
Как для того, так и для другого требуются дополнительные усилия, затраты ресурсов и, в конечном итоге, выпуск документов, сопровождающих проект и его программный результат. Что это за документы? Могут ли, должны ли они использоваться за пределами проекта? Как минимизировать затраты на их создание? Вот далеко не полный перечень вопросов, на которые следует знать ответы еще в самом начале работы над проектом.
Прежде чем обсуждать их, рассмотрим одну любопытную точку зрения (метафору) на программный проект, высказанную еще в конце семи-1есятых годов Ф.Я. Дзержинским [13]. Суть ее в том, что любая документация оказывалась бы ненужной, если бы можно было сопровождать каждую поставку программы ее автором. Иными словами, идеальная документация — это разработчик программного продукта; он в состоянии давать адресные и самые квалифицированные консультации, конструктивно отвечать на вопросы пользователей. Таким образом, в точке зрения Дзержинского отражен взгляд на документацию как на заместителя разработчика при используемой программе. Отсюда следует и критерий качества документации: она тем лучше, чем точнее имитирует непосредственное взаимодействие разработчиков с пользователями. Взгляд на документацию как на заместителя разработчика позволяет сделать явным разграничение между видами документов для разных вариантов использования: в разных ситуациях требуются различные консультации и разъяснения.
Подобная точка зрения на документацию высказывалась и ранее (см., например, [2]), но потом была почему-то забыта. И очень часто на составление документов, сопутствующих программам, смотрят как на обузу, заслуживающую внимания лишь постольку, поскольку она требуется стандартами приемки программ. Нередки высказывания о том, что сегодня система помощи заменяет документацию. Но даже если оставить в стороне качество систем помощи, то все равно очевидно, что она в принципе не решает вопросы познаваемости процесса производства и отвечает требованию познаваемости продукта лишь в той части, которая касается непосредственного применения.
В первом приближении можно указать на следующие виды рабочих продуктов проекта.
• Программные продукты. Это не только целевая программная система, но и компоненты программного обеспечения, выделенные дл* внешнего применения (библиотеки, библиотеки классов и др.)- *
программным продуктам следует отнести также инструменты, появляющиеся в рамках проекта: были построены в ходе работ над проектом, использовались в нем для тех или иных целей (например, для построения специальных структур данных).
-
Документы для пользователей. Это все те бумажные и электронные текстовые материалы (возможно, с рисунками, схемами и т.д.), которые отвечают требованию познаваемости программного продукта.
-
Документы для сопровождения и развития. Назначение этих документов — поддержка работ, связанных с обслуживанием пользователей программного продукта.
Все ли виды рабочих продуктов проекта учтены в этом перечне? Безусловно, нет: здесь представлен лишь уровень, который можно назвать группой целевых продуктов, связанных с непосредственным использованием тех результатов проектной деятельности, для продуцирования которых она была организована. У любого проекта есть и другие, не менее существенные результаты. В первую очередь это опыт, полученный в ходе производства, то есть то, что позволяет разработчикам делать следующий проект быстрее, с более высоким качеством, с меньшим расходом ресурсов.
Опыт в том виде, как только что он был определен, нельзя описать точно, а тем более использовать независимо от разработчиков. Но можно попытаться описывать следы формирования получаемого опыта, которые проявляются в ходе развития проекта, с тем чтобы обеспечить возможность повторения процесса, адаптируя его к условиям нового проекта, исправляя допущенные ошибки и т.д. Словом, можно говорить о группе продуктов, которые отражают процесс развития проекта.
-
Планы, контрольные мероприятия и другие материалы, с помощью которых осуществляется управление развитием проекта.
-
Задания, отчеты об их выполнении, технические предложения и другие материалы, формирующие процесс выполнения проекта как коллективную деятельность.
-
Соглашения, правила и регламенты коммуникаций между разработчиками, которые используются в ходе выполнения проекта.
Есть еще одна группа продуктов, которая выделяется в связи с деятельностью наблюдения за производственным процессом, формированием целевых продуктов и их применением. Эта деятельность оказывает опосредованное влияние на процесс, предоставляя ему свои результаты. Но эти же результаты могут использоваться независимо от проекта. Таким образом, выделяется группа продуктов, отражающих наблюдение за проектом.
• Сведения об оценивании развития целевых продуктов. Обычный подход к прогнозированию успешности разработки с точки зрения достижения ее целей связывается с применением различных оценочных методик. В ходе развития проекта они позволяют оценить, в какой мере текущие результаты соответствуют получению требуемых продуктов. Результаты оценочной деятельности имеют смысл не только в рамках данного проекта. Они могут оказаться полезными, например, для принятия решений в аналогичных ситуациях в будущем. В полной мере это возможно, если оценочные сведения надлежащим образом оформлены документально.
-
Сведения об измерениях целевых продуктов в их развитии. В соответствии с определенными метриками, отражающими различные аспекты качества продукта, периодически выполняются замеры, результаты которых могут быть представлены как документы, т.е. в виде продукта, используемого не только как инструмент управления, но и в иных, не зависящих от проекта целях.
-
Сведения о наблюдении за процессами производства, сопровождения и поддержки. Ритмичность работ, соответствие сроков их выполнения планам, другие показатели, полезные для управляемого развития процесса, отраженные в соответствующих документах, могут использоваться и без непосредственной связи с данным проектом. Их можно рассматривать как опытные данные для различного применения, например, в качестве основы классификации проектов.
-
Сведения о распространении продуктов. Данные о том, как распространяются продукты проекта, могут использоваться не только для организации работ фазы использования, но и в других целях. Так, сравнивая их с первоначальными гипотезами, можно сделать выводы о качестве прогноза и предварительной оценки конкурентоспособности продукта.
Примечательным и характерным свойством рабочих продуктов является их независимость от проекта, возможность самостоятельного использования. Следовательно, как программные, так и документные результаты проектной деятельности имеют право именоваться рабочими продуктами только в том случае, когда они надлежащим образом оформлены, что, в свою очередь, означает необходимость планирования ресурсов для такого оформления. Об этом часто забывают, и тогда распространение опыта разработки возможно лишь в очень узких пределах.
Итак, мы выделяем три группы рабочих продуктов, отражающие три аспекта проекта: цель, процесс, наблюдение за процессом. Эту классификацию не следует догматизировать. Для конкретных целей она может быть, к примеру, более дробной. Так, для изучения методов руководства коллективами вполне вероятно определение специальной группы, отражающей кадровую политику менеджера проекта, для анализа опыта использования какого-либо назначения полезно выделить специальную группу продуктов, ассоциированную с его применением, и т.д. Любая классификация, связанная с результативностью, должна определяться в соответствии с тем пониманием этого термина, которое больше подходит для конкретного использования. В рассматриваемом нами случае группы рабочих продуктов выделены для представления понятия уровней зрелости производства программного обеспечения, чему и посвящен следующий раздел.
Уровни зрелости процессов разработки программного обеспечения
В организациях, претендующих на то, что их процессы разработки программного обеспечения гарантируют результативность выполнения проектов, должна быть предусмотрена возможность убедиться в этом. Иными словами, на уровень рабочих продуктов обязательно выносятся не только целевая группа, но и описания процессов в разных формах, доступных для независимого от проектной деятельности изучения.
Этот аспект замечен и зафиксирован в модели зрелости процессов разработки программного обеспечения SW-CMM [18] (см. лекцию 5). Поскольку одной из основных целей модели является построение организационной процедуры сертификации организаций, разрабатывающих программное обеспечение, она исходит из стандартизованной классификации организаций, распределения их по нескольким уровням. На каждом из уровней в принципе может достигаться определенная результативность проектов, отслеживание которой — задача специальной деятельности, обеспечивающей процедуру сертификации достоверной информацией. Исходным материалом для этой деятельности являются все рабочие продукты проектов, в частности документы, отражающие процесс развития и контроля реализации проекта. Ее основной сертификационный результат — отнесение организации к одному из пяти уровней зрелости:
-
Начальный (initial) уровень. Находясь на начальном уровне, организация обычно не может обеспечить устойчивый процесс разработки и сопровождения программного обеспечения. В организации отсутствует культура управления, из-за неэффективного планирования и плохого согласования работ продуктивность производственного процесса непредсказуема. Успешные проекты возможны, но как рабочие продукты оформляются лишь результаты целевой группы.
Повторяемый (repeatable) уровень. На этом уровне планирование и управление новым проектом базируются на опыте работы с подобными проектами. Характерным качеством ведения проектов на повторяемом уровне является возможность воспроизведения успешных практик прежних проектов. Если в организации как рабочие продукты оформляются лишь результаты целевой группы, то единственная возможность для такого воспроизведения — это назначение на новые проекты менеджеров, которые уже хорошо зарекомендовали себя в предыдущих проектах. Это тот случай, когда процессы развития проекта и наблюдения группы не отражаются в рабочих продуктах, а представлены лишь в фольклорном варианте. Осознание неустойчивости такого положения приводит к стремлению все более точно фиксировать опыт документально. Иными словами, повторяемый уровень диктует необходимость формирования рабочих продуктов для каждой группы.
-
Определенный (defined) уровень, или уровень становления. На этом уровне в организации принят стандарт проведения разработки и сопровождения программного обеспечения, в рамках которого обеспечена интеграция процессов построения и управления. Разработка и сопровождение полностью документированы, что позволяет организовать наблюдение и контроль выполнения проектов. В материалах СММ такой стандарт называется стандартным производственным процессом организации. Для конкретных проектов стандартный производственный процесс адаптируется с целью учета его особенностей, в результате чего определяются критерии готовности, качества и т.д., а также механизмы контроля. За счет ясной определенности процессов руководство организации получает точную картину развития проектов. Продуктивность производственного процесса на определенном уровне характеризуется как стандартная и согласованная. На этом уровне к рабочим продуктам каждой из групп предъявляются дополнительные требования: они должны быть представлены таким образом, чтобы специфика проекта явно отделялась от стандартизованного содержания, то есть чтобы при производстве рабочих продуктов максимально повышалась возможность их независимого от проекта применения.
Управляемый (managed) уровень. Согласно СММ, этот уровень характеризуется внедрением в организацию количественных показателей качества как для программных продуктов, так и для процессов их разработки. Производственные процессы управляемого уровня оснащены средствами для проведения четко определенных и согласованных измерений. Продуктивность производственного процесса на управляемом уровне характеризуется как предсказуемая, так как процесс функционирует в заданных и измеряемых пределах. Иначе говоря, предполагается, что за счет количественных показателей качества удается организовать наблюдение за любой проектной деятельностью, которое позволяет удерживать траекторию в области допустимости. Дополнительные требования к рабочим продуктам этого уровня заключаются в том, что конкретизируется и получает статус обязательного стандарта группа продуктов, отражающих измерения и наблюдение за проектом*. 5. Оптимизирующий (optimizing) уровень. Работа над прожектами ведется как на управляемом уровне, но организация в целом сосредоточена на усовершенствовании производственного процесса. Она обладает средствами выявления слабых мест процесса и его улучшения с цельно предотвращения дефектов. Внедряются новшества, использующие передовые методы программной инженерии, которые распространяются для улучшения качества разработок всех проектов.. В рамках оптимизационного уровня налажены механизмы оценки не только выполненных проектов (это идет от предыдущего уровня), но и возможны* новаций во всех аспектах проектирования**. Таким образом, ассортимент используемых рабочих продуктов не ограничивается тем, что появляется по ходу выполнения целевых проектов. Необходимые для оптимизирующего уровня продукты могут разрабатываться специально. Несколько иронично оптимизирующий уровень иногда называют «нирваной проектной деятельности» [47].
Модель СММ предполагает, что любая организация, согласившаяся с принятым подходом к развитию, берет на себя обязательства продвигаться вверх по лестнице развития зрелости (см. рис. 18.1). В этом движении не последнее место занимает эволюция представления о том, какими должны быть рабочие продукты. И единственное, за что можно критиковать подход в целом, — это стремление втиснуть все схемы менеджмента в прокрустово ложе унифицированных процедур слежения за развитием проектов с помощью раз и навсегда «хорошо себя зарекомендовавших» практик.
Не нужно особой проницательности, чтобы обнаружить, что успешными чаще оказываются проекты, в которых уделяется внимание
* Представляется, что количественные показатели и измерения полезны для оценки результативности проектов. Однако вопрос в том, что и как нужно измерить. Многочисленные попытки ответить на него таким образом, чтобы в получаемых показателях качество отражаюсь с функциональной точностью, предпринимались в течение более чем тридцати лет, но, к сожалению, к ошу-тимым результатам они не привели. Неудачи связаны не талью с тем, что понятие «качество» не определено строго, что оно меняется от методологии к методлогии, что субъективная составляющая качества превалирует над объективной. Их причины глуЬке и принципиальнее. Ие вдаваясь в детали обсуждения этого предмета, которое выходит за рам.и нашего курса, отметим, что коренные причины проблем количественных показателей обуслоаены существенной креативностью программистской деятельности, а надежных критериев качества любой деятельности такого рода просто не существует. Тем не менее вместо точных измерены в обычной практике прибегают к оценкам, что зачастую (но далеко не всегда!) оказывается достаточным. См. замечания по поводу количественных показателей и измерний качества в предыдущей сноске-
сопутствующим продуктам. Отсюда может создаваться впечатление причинно-следственной связи, зависимости успешности от дополнительных продуктов. В результате появляется стремление к технологизации развития программных проектов на основе повторения опыта разработок, уделяющих внимание не только организации процесса, но и отражению его в рабочих продуктах второй и третьей групп. Интерес к такому подходу подогревается тем, что, анализируя сопутствующие продукты, можно наблюдать процесс отстраненно, независимо от проекта, а значит, организовать независимый контроль со стороны заказчика. Эту попытку отследить уровень технологичности процесса разработки программных проектов демонстрирует модель СММ.
Предполагается, что стандартизация процессов, прогрессирующая по мере развития организации, способствует качеству этих продуктов и совершенствованию методик их разработки. На деле же оказывается, что опыт хороших решений в одних ситуациях совершенно ничего не дает в условиях других проектов.
Обычная и естественная практика формирования методов и методик заключается в следующем (см. рис. 18.2). В некоторой разработке появляются решения, претендующие на обобщение. Производится анализ этих претензий и, если подтверждается осуществимость переноса опыта на другие ситуации, то формируется метод.
Действительно полезные методы неоднократно применяются, и это служит основанием для еще одного обобщения. Так возникают методики применения хороших решений в различных ситуациях (их часто неправильно называют методологиями — см. сноску на странице 87).
• Искушение распространения удачного опыта за пределы его области применимости.
Любой перенос опыта или метода должен сопровождаться проверкой адекватности его в новых условиях. К сожалению, этого чаще всего не делают даже при формировании метода, а уж при создании методик и подавно. В результате нет ориентиров, которые бы указывали на то, где данный подход работает, а где может давать сбои, нет стимулов к изучению проблемных ситуаций, а значит, и к конструированию принципиально новых методов взамен комбинаторного манипулирования.
В качестве примера рассмотрим каноническую для объектно-ориентированного подхода с использованием UML рекомендацию составлять три вида диаграмм классов: концептуальные, специфицирующие и реализационные, которые отражают разные стадии уточнения разрабатываемой системы классов [25]. Обычно указывают, какие из средств UML нужно применять для диаграмм каждого вида. Однако UML-нотация — это универсальная система, и нет никакой возможности объяснить ей, что вот сейчас составляются концептуальные диаграммы, а потом нам потребуются специфицирующие и далее реализационные диаграммы. Во всех трех случаях используются одни и те же средства, а значит, один метод, различия классов диаграмм системно не поддерживаются, т.е. методическая рекомендация остается на уровне пожелания, которое могут игнорировать.
• Многие методы просто противоречивы и при их объединении в одной методике вместо ожидаемого дополнения достоинств происходит их нейтрализация и пышным цветом расцветают недостатки объединяемых методов.
Здесь опыт программирования демонстрирует столько примеров, что даже трудно остановиться на чем-то одном. Укажем лишь на тот же UML, сочетающий в себе поддержку явно противоречивых стилей, на возможность употребления семантически бессмысленных связей и т.д. В методологиях иллюстрацией может служить требование измерения качества без определения того, соответствует ли понимание качества в данном проекте предполагаемому при использовании конкретного инструмента.
Все это с очевидностью прослеживается в истории стандартизации производственных процессов в области разработки программных систем, и модель СММ в полной мере отражает обе проблемы. • Третья проблема может быть охарактеризована как груз стандартов. Суть ее в том, что по мере развития методических предложений и рекомендаций и превращения их в стандартизованные предписания, которые нужно выполнять неукоснительно, появляется все больше обязательных требований к процессу ведения проекта. Если бы программирование можно было рассматривать как императивную деятельность, то обязательность требований к процессу была бы вполне мотивирована*. Однако, как мы уже отмечали в разделе «Жесткие и гибкие стратегии в методологиях программирования» лекции 5, креативность процесса разработки программ делает эту мотивацию несостоятельной. Обязательные требования к процессу не дают преимуществ, а лишь усложняют его, делая «монументальным», громоздким и негибким. Естественная реакция на такое положение — отказ от тяжеловесных стандартов — отражена в концепциях быстрых методологий, зафиксированных в Agile Manifesto [31].
Движение по лестнице уровней зрелости при беглом взгляде выглядит замечательно: на каждом шаге результативность проектов повышается, за счет внедрения регулярных методов растут управляемость и качество производственного процесса. Однако какая результативность здесь имеется в виду? Не оказывается ли стремление к СММ-овской зрелости самоцелью, уводящей в сторону от основного предназначения
* В связи с этим хочется привести аргумент из реального спора с одним из апологетов императивности программистской деятельности: «Мы вправе не знать, почему летает самолет, но если будем поступать так-то и так-то, как поступают при строительстве самолетов в компании «Боинг», то в результате получим машину, которая непременно полетит. Также и с программами: мы знаем, какие практики хорошо себя зарекомендовали, а потому давайте следовать им неукоснительно». На возражение, что в этом случае мы сможем строить только такие программы, которые придуманы ранее, был ответ (не лишенный логики!): «Именно это и требуется со стороны практического применения программных систем».