Основная идея всех гибких моделей заключается в том, что применяемый в разработке ПО процесс должен быть адаптивным. Они декларируют своей высшей ценностью ориентированность на людей и их взаимодействие, а не на процессы и средства. По сути, так называемые, гибкие методологии это не методологии, а набор практик, которые могут позволить (а могут и нет) добиваться эффективной разработки ПО, основываясь на итеративности, инкрементальности, самоуправляемости команды и адаптивности процесса.
После определения трудоемкости работ необходимо определить график их выполнения и общие сроки реализации проекта — составить расписание работ по проекту. Базовое расписание — утвержденный план-график с указанными временными фазами проекта, контрольными точками и элементами иерархической структуры работ.
Базовое расписание может быть наиболее наглядно представлено диаграммой Ганта. В этой диаграмме плановые операции или элементы иерархической структуры работ перечислены с левой стороны, даты отображаются сверху, а длительность операций показана горизонтальными полосками от даты начала до даты завершения.
Базовое расписание это, как правило, элемент контракта с заказчиком. Контрольные точки (вехи) должны служить точками анализа состояния проекта и принятия решения «GO/NOT GO», поэтому они должны зримо демонстрировать статус проекта. Контрольная точка «Проектирование завершено» — плохо. Наиболее эффективный подход — метод последовательных поставок: контрольная точка «Завершено тестирование требований 1, 3, 5, 7»
Если работы не связаны между собой, то любую из них мы можем начинать и завершать, когда нам удобно. Все работы можно делать параллельно и в этом случае минимальная длительность проекта равна длительности самой долгой работы. Однако, на практике между работами существуют зависимости, которые могут быть «жесткими», например, анализ — проектирование — кодирование — тестирование и документирование конкретной функции; или «нежесткими», которые могут пересматриваться или смягчаться. Например, последовательное выполнение задач конкретным исполнителем (можно перепланировать на другого исполнителя) или разработка базового ПО, которая должна предшествовать разработке прикладного ПО. В этом случае можно создавать «заглушки» эмулирующие работу базового ПО. Таким образом, диаграмма Ганта для расписания проекта выглядит как гамак, составленный из множества цепочек взаимосвязанных работ с единой точкой начала и завершения.
Цели проекта должны отвечать на вопрос, зачем данный проект нужен. Цели проекта должны описывать бизнес-потребности и задачи, которые решаются в результате исполнения проекта. Целями проекта могут быть:
Изменения в Компании. Например, автоматизация ряда бизнес-процессов для повышения эффективности основной производственной деятельности Реализация стратегических планов. Например, завоевание значительной доли растущего рынка за счет вывода на него нового продукта. Выполнение контрактов. Например, разработка программного обеспечения по заказу. Разрешение специфических проблем. Например, доработка программного продукта в целях приведения его в соответствие с изменениями в законодательстве.
Цели должны быть значимыми (направленными на достижение стратегических целей Компании), конкретными (специфичными для данного проекта), измеримыми (т.е иметь проверяемые количественные оценки), реальными (достижимыми). Четкое определение бизнес-целей важно, поскольку существенно влияет на все процессы и решения в проекте. Проект должен быть закрыт, если признается, что достижение цели невозможно или стало нецелесообразным. Например, если реальные затраты на проект будут превосходить будущие доходы от его реализации.
Результаты проекта отвечают на вопрос, что должно быть получено после его завершения. Результаты проекта должны определять:
Какие именно бизнес-выгоды получит заказчик в результате проекта. Какой продукт или услуга. Что конкретно будет произведено по окончании проекта. Высокоуровневые требования. Краткое описание и при необходимости ключевые свойства и/или характеристики продукта/услуги.
Следует помнить, что результаты проекта должны быть измеримыми. Это означает, что при оценке результатов проекта должна иметься возможность сделать заключение достигнуты оговоренные в концепции результаты или нет.
Соответствующий раздел документа концепция проекта создания «Автоматизированной системы продажи документации» будет выглядеть следующим образом.
Цели и результаты проекта
Стив Макконнелл в своей книге приводит тест программного проекта на выживание. Этот чек-лист из 33-х пунктов, который я считаю необходимым процитировать с небольшими корректировками. Руководитель программного проекта должен его периодически использовать для внутреннего аудита своих процессов.
Чтобы программный проект стал успешным, необходимо:
Четко ставить цели. Определять способ достижения целей. Контролировать и управлять реализацией. Анализировать угрозы и противодействовать им. Создавать команду.
Ставим цели
1.1. Концепция определяет ясные недвусмысленные цели.
1.2.Все члены команды считают концепцию реалистичной.
1.3. У проекта имеется обоснование экономической эффективности.
1.4. Разработан прототип пользовательского интерфейса.
1.5. Разработана спецификация целевых функций программного продукта.
1.6. С конечными пользователями продукта налажена двухсторонняя связь Определяем способ достижения целей
2.1. Имеется детальный письменный план разработки продукта.
2.2. В список задач проекта включены «второстепенные» задачи (управление конфигурациями, конвертация данных, интеграция с другими системами).
2.3. После каждой фазы проекта обновляется расписание и бюджет.
2.4. Архитектура и проектные решения документированы.
2.5. Имеется план обеспечения качества, определяющий тестирование и рецензирование.
2.6. Определен план многоэтапной поставки продукта.
2.7. В плане учтены обучение, выходные, отпуска, больничные.
2.8. План проекта и расписание одобрен всеми участниками команды. Контролируем и управляем реализацией
3.1. У проекта есть куратор. Это такой топ-менеджер исполняющей компании, который лично заинтересован в успехе данного проекта.
3.2. У проекта есть менеджер, причем только один!
3.3. В плане проекта определены «бинарные» контрольные точки.
3.4. Все заинтересованные стороны могут получить необходимую информацию о ходе проекта.
3.5. Между руководством и разработчиками установлены доверительные отношения.
3.6. Установлена процедура управления изменениями в проекте.
3.7. Определены лица, ответственные за решение о принятии изменений в проекте.
3.8. План, расписание и статусная информация по проекту доступна каждому участнику.
3.9. Код системы проходит автоматическое рецензирование.
3.10. Применяется система управления дефектами. Анализируем угрозы
4.1. Имеется список рисков проекта. Осуществляется его регулярный анализ и обновление.
4.2. Руководитель проекта отслеживает возникновение новых рисков.
4.3. Для каждого подрядчика определено лицо, ответственное за работу с ним. Работаем над созданием команды
5.1. Опыт команды достаточен для выполнения проекта.
5.2. У команды достаточная компетенция в прикладной области.
5.3. В проекте имеется технический лидер.
5.4. Численность персонала достаточна.
5.5. У команды имеется достаточная сплоченность.
5.6. Все участники привержены проекту.
Оценка и интерпретация теста
Оценка: сумма баллов, каждый пункт оценивается от 0 до 3:
0 — даже не слышали об этом; 1 — слышали, но пока не применяем; 2 — применяется частично; 3 — применяется в полной мере.
Поправочные коэффициенты:
для малых проектов (до 5 человек) — 1.5; для средних (от 5 до 20 человек) — 1.25.
Результат:
<40 — завершение проекта сомнительно. 40-59 — средний результат. В ходе проекта следует ожидать серьезные проблемы. 60-79 — хороший результат. Проект, скорее всего, будет успешным. 80-89 — отличный результат. Вероятность успеха высока. >90 — великолепный результат. 100% шансов на успех.
Этот чек-лист перечисляет, что надо делать для успеха программного проекта, но не дает ответ на вопрос как это следует делать. Именно об этом пойдет речь в остальных лекциях.
IEEE Std 610.12-1990, IEEE Standard Glossary of Software Engineering Terminology. IEEE Std 1074-1995, IEEE Standard for Developing Software Life Cycle Processes. «Руководство к своду знаний по программной инженерии». The Guide to the Software Engineering Body of Knowledge, SWEBOK, IEEE Computer Society Professional Practices Committee, 2004. David Rubinstein, «Standish Group Report: There's Less Development Chaos Today». 2007 Брукс Фредерик, «Мифический человеко-месяц, или Как создаются программные комплексы», Пер. с англ., СПб., Символ-Плюс, 1999. «PMBOK. Руководство к Своду знаний по управлению проектами», 3-е изд., PMI, 2004. Уолкер Ройс, «Адаптивный стиль управления программными проектами». Открытые системы. 2006. № 1. Ершов А. П., «О человеческом и эстетическом факторе в программировании». Информатика и образование. 1993. № 6. Paulk, Mark C., and others, Capability Maturity Model for Software, Version 1.1 (CMU/SEI-93-TR-24). Pittsburgh, Pa.: Software Engineering Institute, Carnegie Mellon University, 1993. Филипп Крачтен, «Введение в Rational Unified Process», Вильямс, 2002 г. «MSF, Microsoft, Microsoft Solutions Framework», Отдел MSF, Microsoft, 2002. M. Pomeroy-Huff, J. Mullaney, R. Cannon, M. Sebern, «The Personal Software Process (PSP) Body of Knowledge», version 1.0, SPECIAL REPORT CMU/SEI, 2005 Watts S. Humphrey, «The Team Software Process (TSP)», Technical Report CMU/SEI, 2000 Kent Beck, and others, «Manifesto for Agile Software Development», 2001 А. Коуберн, «Люди как нелинейные и наиболее важные компоненты в создании программного обеспечения», Humans and Technology Technical Report, Oct.1999 (русский перевод — К.Максимов, А.Максимова) А. Коуберн, «Каждому проекту своя методология», Humans and Technology Technical Report, TR 99.04, Oct.1999 (русский перевод — К.Максимов, А.Максимова). С. Макконнелл, «Остаться в живых. Руководство для менеджеров программных проектов», «Питер», 2006.
«PMBOK. Руководство к Своду знаний по управлению проектами», 3-е изд., PMI, 2004. Стивен Р. Кови, «7 навыков высокоэффективных людей. Мощные инструменты развития личности», 2-е изд., М., Альпина Бизнес Букс, 2007 Брукс Фредерик, "Мифический человеко-месяц, или Как создаются программные комплексы", Пер. с англ., СПб., Символ-Плюс, 1999. Кьелл А. Нордстрем, Йонас Риддерстрале, «Бизнес в стиле фанк. Капитал пляшет под дудку таланта», Стокгольмская школа экономики в Санкт-Петербурге, 2005.
«PMBOK. Руководство к Своду знаний по управлению проектами», 3-е изд., PMI, 2004. С. Макконнелл, «Сколько стоит программный проект», «Питер», 2007. Брукс Фредерик, «Мифический человеко-месяц, или Как создаются программные комплексы», Пер. с англ., СПб., Символ-Плюс, 1999.
«PMBOK. Руководство к Своду знаний по управлению проектами», 3-е изд., PMI, 2004.
5 Интернет-источник идеи, к сожалению, восстановить не удалось.
Том ДеМарко, Тимоти Листер, «Вальсируя с Медведями. Управление рисками в проектах по разработке программного обеспечения», М., Компания p.m.Office, 2005. «Microsoft Solutions Framework. Дисциплина управления рисками MSF», вер. 1.1, 2002 «PMBOK. Руководство к Своду знаний по управлению проектами», 3-е изд., PMI, 2004. С.Макконнелл, «Сколько стоит программный проект», «Питер», 2007. Ньюэл М.В., «Управление проектами для профессионалов. Руководство по подготовке к сдаче сертификационного экзамена PMP», КУДИЦ-Образ, 2006. Barry W. Boehm. «A Spiral Model of Software Development and Enhancement, Computer, May 1988. Barry Boehm, et al. «Software cost estimation with COCOMO II». Englewood Cliffs, NJ:Prentice-Hall, 2000 © 2005 Том ДеМарко, Тимоти Листер.
С. Макконнелл, «Сколько стоит программный проект», «Питер», 2007. Function Point Counting Practices Manual, Release 4.2, IFPUG, 2004. Barry Boehm. «Software engineering economics». Englewood Cliffs, NJ:Prentice-Hall, 1981 Barry Boehm, et al. «Software cost estimation with COCOMO II». Englewood Cliffs, NJ:Prentice-Hall, 2000. «Function Point Programming Languages Table», Quantitative Software Management, Inc., 2005.
С. Архипенков, "Руководство командой разработчиков программного обеспечения. Прикладные мысли", 2008 Стивен Р. Кови, «7 навыков высокоэффективных людей. Мощные инструменты развития личности», 2-е изд., М., Альпина Бизнес Букс, 2007. Манфред Кетс де Врис, «Мистика лидерства. Развитие эмоционального интеллекта», М., Альпина Бизнес Букс, 2005. Hersey P., Blanchard K.H. "Management of Organizational Behavior", 6th ed., Englewood Cliffs: Prentice-Hall, 1993. Л. Томпсон, «Создание команды», М., Вершина, 2005.
«PMBOK. Руководство к Своду знаний по управлению проектами», 3-е изд., PMI, 2004. С. Макконнелл, «Сколько стоит программный проект», «Питер», 2007. Том Демарко, Тимоти Листер, «Человеческий фактор: успешные проекты и команды», Спб. Символ-Плюс, 2005.
Данный раздел описывает исходные допущения и ограничения. Допущения, как правило, тесно связаны с управлением рисками, о котором мы будем говорить далее. В разработке ПО часто приходится формулировать риски в виде допущений, тем самым передавая его заказчику. Например, оценивая проект разработки и внедрения по схеме с фиксированной ценой, мы должны записать в допущения предположение о том, что стоимость лицензий на стороннее ПО не изменится, до завершения проекта.
Ограничения, как правило, сокращают возможности проектной команды в выборе решений. В частности они могут содержать:
Специфические нормативные требования. Например, обязательная сертификация продукта, услуги на соответствие определенным стандартам. Специфические технические требования. Например, разработка под заданную программно-аппаратную платформу. Специфические требования к защите информации.
В этом разделе также уместно сформулировать те требования к системе, которые могут ожидаться заказчиком по умолчанию, но не включаются в рамки данного проекта. Например, в данный раздел может быть включен пункт о том, что разработка программного интерфейса (API) для будущей интеграции с другими системами заказчика не входит в задачи данного проекта.
Содержание этого раздела для нашего проекта-примера выглядит следующим образом.
Допущения и ограничения
5.1. Проектирование прикладного ПО выполняется с использованием UML1.
5.2. Средством разработки ПО является Symantec Visual Cafe for Java2.
5.3. В качестве промежуточного ПО сопровождения и поддержки каталога используется ОО БД «Poet»3.
5.4. Нагрузка на систему не должна быть более 100 одновременно работающих пользователей.
5.5. В рамки проекта не входят:
5.5.1. Защита системы от преднамеренного взлома.
5.5.2. Разработка B2B API и интеграция с другими системами.
В методике используются пять факторов масштаба SF;, которые определяются следующими характеристиками проекта:
PREC — прецедентность, наличие опыт аналогичных разработок (Very Low — опыт в продукте и платформе отсутствует; Extra High — продукт и платформа полностью знакомы) FLEX — гибкость процесса разработки (Very Low — процесс строго детерминирован; Extra High — определены только общие цели). RESL — архитектура и разрешение рисков (Very Low — риски неизвестны/не проанализированы; Extra High — риски разрешены на 100%) TEAM — сработанность команды (Very Low — формальные взаимодействия; Extra High — полное доверие, взаимозаменяемость и взаимопомощь). PMAT — зрелость процессов (Very Low — CMM Level 1; Extra High — CMM Level 5)
Значение фактора масштаб, в зависимости от оценки его уровня, приведены в Таблица 14
Таблица 14. Значение фактора масштаба, в зависимости от оценки его уровня
Оценка уровня фактора | ||||||
PREC | 6.20 | 4.96 | 3.72 | 2.48 | 1.24 | 0.00 |
FLEX | 5.07 | 4.05 | 3.04 | 2.03 | 1.01 | 0.00 |
RESL | 7.07 | 5.65 | 4.24 | 2.83 | 1.41 | 0.00 |
TEAM | 5.48 | 4.38 | 3.29 | 2.19 | 1.10 | 0.00 |
PMAT | 7.80 | 6.24 | 4.68 | 3.12 | 1.56 | 0.00 |
Мой список из пяти главных причин провала программных проектов — следующий:
Требования заказчика отсутствуют / не полны / подвержены частым изменениям. Отсутствие необходимых ресурсов и опыта. Отсутствие рабочего взаимодействия с заказчиком. Неполнота планирования. «Забытые работы». Ошибки в оценках трудоемкостей и сроков работ.
Это звучит банально, но сколько бы раз об этом не твердили ранее, по-прежнему, приходится сталкиваться с программными проектами, в которых отсутствуют какие-либо определенные цели и требования. Цитата из жизни: «Была бы разработана хорошая программа, а какой процесс автоматизировать с ее помощью, мы найдем». К этому можно добавить только одно: «Когда человек не знает, к какой пристани он держит путь, для него никакой ветер не будет попутным» (Сенека Луций Аней, философ, 65-3 до н.э.)
К часто упускаемым требованиям можно отнести:
Функциональные Программы установки, настройки, конфигурации. Миграция данных. Интерфейсы с внешними системами. Справочная система. Общесистемные Производительность. Надежность. Открытость. Масштабируемость. Безопасность. Кросплатформенность. Эргономичность.
Как правило, эти требования «всплывают» при подготовке и проведении приемо-сдаточных испытаний и могут сильно задержать проект по времени и увеличить трудозатраты на его реализацию. Чтобы этого не происходило, следует достигать соглашения с заказчиком по всем перечисленным пунктам предпочтительнее еще на стадии инициации проекта. Например, если требования портируемости продукта на разные аппаратно-программные платформы нет, то это целесообразно включить в раздел концепции с допущениями проекта.
Если вероятность изменений требований проекта высока, то возможны следующие подходы для реагирования на данный риск:
Переоценка проекта каждый раз, когда требования добавляются / изменяются (уклонение). Итерационная разработка. Контракт с компенсацией затрат на основе «Time & Materials» (передача риска Заказчику). Учет в оценках трудоемкости и сроков возможности роста требований, например, на 50% (резервирование риска).
ГОСТ 19 «Единая система программной документации» и ГОСТ 34 «Стандарты на разработку и сопровождение автоматизированных систем» ориентированы на последовательный подход к разработке ПО. Разработка в соответствии с этими стандартами проводится по этапам, каждый из которых предполагает выполнение строго определенных работ, и завершается выпуском достаточно большого числа весьма формализованных и обширных документов. Таким образом, строгое следование этим гостам не только приводит к водопадному подходу, но и требует очень высокой степени формализованности разработки. На основе этих стандартов разрабатываются программные системы по госзаказам в России.
Идентификация рисков — это выявление рисков, способных повлиять на проект, и документальное оформление их характеристик. Это итеративный процесс, который периодически повторяется на всем протяжении проекта, поскольку в рамках его жизненного цикла могут обнаруживаться новые риски.
Исходные данные для выявления и описания характеристик рисков могут браться из разных источников.
В первую очередь это база знаний организации. Информация о выполнении прежних проектов может быть доступна в архивах предыдущих проектов. Следует помнить, что проблемы завершенных и выполняемых проектов, это, как правило, риски в новых проектах.
Другим источником данных о рисках проекта может служить разнообразная информация из открытых источников, научных работ, маркетинговая аналитика и другие исследовательские работы в данной области. Наконец, многие форумы по программированию могут дать бесценную информацию о возникших ранее проблемах в похожих проектах.
Каждый проект задумывается и разрабатывается на основании ряда гипотез, сценариев и допущений. Как правило, в описании содержания проекта перечисляются принятые допущения — факторы, которые для целей планирования считаются верными, реальными или определенными без привлечения доказательств. Неопределенность в допущениях проекта следует также обязательно рассматривать в качестве потенциального источника возникновения рисков проекта. Анализ допущения позволяет идентифицировать риски проекта, происходящие от неточности, несовместимости или неполноты допущений.
Для сбора информации о рисках могут применяться различные подходы. Среди этих подходов наиболее распространены:
Опрос экспертов Мозговой штурм Метод Дельфи Карточки Кроуфорда
Цель опроса экспертов — идентифицировать и оценить риски путем интервью подходящих квалифицированных специалистов. Специалисты высказывают своё мнение о рисках и дают им оценку, исходя из своих знаний, опыта и имеющейся информации. Этот метод может помочь избежать повторного наступления на одни и те же грабли.
Требования не ясны. | Отсутствие описания сценариев использования системы. | Задержка начала разработки прикладного ПО. Большой объем переработок. | Задержки в сроках сдачи готового продукта и дополнительные трудозатраты. |
Недостаток квалифицированных кадров. | Архитектура и код низкого качества. | Большое число ошибок. Большие затраты на их исправление. | Задержки в сроках сдачи готового продукта и дополнительные трудозатраты. |
Текучесть кадров. | Частая смена участников команды. | Низкая производительность при вводе новых участников в проект. | Задержки в сроках сдачи готового продукта и дополнительные трудозатраты. |
Программная инженерия есть применение определенного систематического измеримого подхода при разработке, эксплуатации и поддержке программного обеспечения .
Термин software (программное обеспечение, ПО) ввел в 1958 году всемирно известный статистик Джон Тьюкей (John Tukey). Термин software engineering (программная инженерия) впервые появился в названии конференции НАТО, состоявшейся в Германии в 1968 году и посвященной так называемому кризису программного обеспечения. С 1990-го по 1995 год велась работа над международным стандартом, который должен был дать единое представление о процессах разработки программного обеспечения. В результате был выпущен стандарт ISO/IEC 12207 . В 2004 году в отрасли был создан основополагающий труд «Руководство к своду знаний по программной инженерии» (SWEBOK) , в котором были собраны основные теоретические и практические знания, накопленные в этой отрасли.
Во избежание двусмысленностей, но не претендуя на академичность, позволю себе ввести рабочие определения ряда терминов, которые я буду в дальнейшем активно использовать.
Программирование — процесс отображения определенного множества целей на множество машинных команд и данных, интерпретация которых на компьютере или вычислительном коплексе обеспечивает достижение поставленных целей.
Цели могут быть любые: воспроизведение звука в динамике ПК, расчет траектории полета космического аппарата на Марс, печать годового балансового отчета и т.д. Важно то, что они должны быть определены. Это звучит банально, но сколько бы раз об этом не твердили ранее, по-прежнему, приходится сталкиваться с программными проектами, в которых отсутствуют какие-либо определенные цели.
Это отображение может быть очень простым, например, перфорирование машинных команд и данных на перфокартах. А может быть многоступенчатым и очень сложным, когда сначала цели отображаются на требования к системе, требования — на высокоуровневую архитектуру и спецификации компонентов, спецификации — на дизайн компонентов, дизайн — на исходный код.
Далее исходный код при помощи компиляторов и сборщиков отображается на код развертывания, код развертывания — на вызовы функций ПО окружения (ОС, промежуточное ПО, базы данных), которое может располагаться на множестве компьютеров, объединенных в сеть, и только после этого — в машинные команды и данные.
Профессиональное программирование (синоним производство программ) — деятельность, направленная на получение доходов при помощи программирования.
Принципиальным отличием от просто программирования является то, что имеется или, по крайней мере, предполагается некоторый потребитель, который готов платить за использование программного продукта. Отсюда следует важный вывод о том, что профессиональное производство программ это всегда коллективная деятельность, в которой участвуют минимум два человека: программист и потребитель.
Профессиональный программист — человек, который занимается профессиональным программированием.
Профессионального программиста следует отличать от профессионала (мастера в программировании). Разброс профессионального мастерства в программировании достаточно широк и далеко не каждый, кто зарабатывает на жизнь программированием, является мастером, но об этом позже.
Программный продукт — совокупность программ и сопроводительной документации по их установке, настройке, использованию и доработке.
Согласно стандарту жизненный цикл программы, программной системы, программного продукта включает в себя разработку, развертывание, поддержку и сопровождение. Если программный продукт не коробочный, а достаточно сложный, то его развертывание у клиентов, как правило, реализуется отдельными самостоятельными проектами внедрения. Сопровождение включает в себя устранение критических неисправностей в системе и реализуется часто не как проект а, как процессная деятельность. Поддержка заключается в разработке новой функциональности, переработке уже существующей функциональности, в связи с изменением требований, и улучшением продукта, а также устранение некритических замечаний к ПО, выявленных при его эксплуатации (Рисунок 1).
Жизненный цикл программного продукта завершается выводом продукта из эксплуатации и снятием его с поддержки и сопровождения.
Ранее мы уже говорили, что процесс производства программного обеспечения, применяемый в проекте, должен основываться на итеративности, инкрементальности, самоуправляемости команды и адаптивности. Главный принцип: не люди должны строиться под выбранную модель процесса, а модель процесса должна подстраиваться под конкретную команду, чтобы обеспечить ее наивысшую производительность.
В программной инженерии многие уже признали, что наиболее эффективные производственные процессы складываются в самоуправляемых и самоорганизующихся рабочих командах. Идеи командного менеджмента на Западе зародилась в начале 80-х годов. Эффективность команд в новых экономических условиях одними из первых оценили такие гиганты, как Procter & Gamble и Boeing . Доктрина командного менеджмента предполагает ясность общих ценностей и целей, самоорганизацию и самоуправление совместной деятельностью, взаимный контроль, взаимопомощь и взаимозаменяемость, коллективную ответственность за результаты труда, всемерное развитие и использование индивидуального и группового потенциалов.
Если на Западе идеи командного менеджмента только зарождаются, то для России они имеют давние традиции. С XIII века в России существовали производственные артели — различные формы добровольных объединений людей с целью осуществления общей хозяйственной деятельности. Артель была добровольным товариществом совершенно равноправных работников, призванных на основе взаимопомощи и взаимовыручки решать практически любые хозяйственные и производственные задачи. Известный российский писатель и революционер, А.И. Герцен видел в коллективизме, в уникальности существующей сельской общины, в городской артели и в самобытной воинской организации казачества характерную черту жизни и психологии русского народа. Позднее во времена СССР широкое распространение на производстве получили рабочие бригады, а в научно-исследовательских институтах — временные научные творческие коллективы, которые объединялись на основе общности цели, взаимопомощи и коллективной ответственности за результат.
За 50 лет развития программной инженерии накопилось большое количество моделей разработки ПО. Интересно провести аналогию между историей развития методов, применяемых в системах автоматического управления летательными аппаратами, и эволюцией подходов к управлению программными проектами.
«Как получится». Разомкнутая система управления. Полное доверие техническим лидерам. Представители бизнеса практически не участвует в проекте. Планирование, если оно и есть, то неформальное и словесное. Время и бюджет, как правило, не контролируются. Аналогия: баллистический полет без обратной связи. Можно, но недалеко и неточно.
«Водопад» или каскадная модель. Жесткое управление с обратной связью. Расчет опорной траектории (план проекта), измерение отклонений, коррекция и возврат на опорную траекторию. Лучше, но не эффективно.
«Гибкое управление». Расчет опорной траектории, измерение отклонений, расчет новой попадающей траектории и коррекция для выхода на нее. «Планы — ничто, планирование — все» (Эйзенхауэр, Дуайт Дэвид)
«Метод частых поставок». Самонаведение. Расчет опорной траектории, измерение отклонений, уточнение цели, расчет новой попадающей траектории и коррекция для выхода на нее.
Классические методы управления перестают работать в случаях, когда структура и свойства управляемого объекта нам не известны и/или изменяются со временем. Эти подходы так же не помогут, если текущие свойства объекта не позволяют ему двигаться с требуемыми характеристиками. Например, летательный аппарат не может развить требуемое ускорение или разрушается при недопустимой перегрузке. Аналогично, если рабочая группа проекта не может обеспечить требуемую эффективность и поэтому постоянно работает в режиме аврала, то это приводит не к росту производительности, а к уходу профессионалов из проекта.
Когда структура и свойства управляемого объекта нам не известны, необходимо использовать адаптивное управление, которое, дополнительно к прямым управляющим воздействиям, направлено на изучение и изменение свойств управляемого объекта.
Продолжая аналогию с управлением летательными аппаратами — это расчет опорной траектории, измерение отклонений, уточнение цели, уточнение объекта управления, адаптация (необходимое изменение) объекта управления, расчет новой попадающей траектории и коррекция для выхода на нее.
Для того чтобы понять структуру и свойства объекта и воздействовать на него с целью их приведения к желаемому состоянию, в проекте должен быть дополнительный контур обратной связи — контур адаптации.
Известно, что производительность разных программистов может отличаться в десятки раз. Утверждаю, что производительность одного и того же программиста может так же отличаться в десятки раз. Заставьте лучшего в мире бегуна бегать в мешке, и он покажет в 10 раз худший результат. Заставьте лучшего программиста заниматься «сизифовым трудом»: плодить документацию (которую, как правило, никто не читает) в угоду «Методологии» (именно с большой буквы М), — и его производительность снизится в 10 раз.
Поэтому, помимо чисто управленческих задач руководитель, если он стремится получить наивысшую производительность рабочей группы, должен направлять постоянные усилия на изучение и изменение объекта управления: людей и их взаимодействия.
Качественный анализ рисков включает в себя расстановку рангов для идентифицированных рисков. При анализе вероятности и влияния предполагается, что никаких мер по предупреждению рисков не производится.
Качественный анализ рисков включает:
Определение вероятности реализации рисков. Определение тяжести последствий реализации рисков. Определения ранга риска по матрице «вероятность — последствия». Определение близости наступления риска. Оценка качества использованной информации.
Для качественной оценки вероятности реализации риска и определения тяжести последствий его реализации применяется, как правило, общепринятые в организации шкалы, примеры которых мы приводили ранее.
Для определения ранга риска используется матрица вероятностей и последствий (Рисунок 26). Ранг риска определяется произведением веса вероятности и значимости последствий.
Могут, конечно, существовать и более сложные шкал для оценок вероятностей, значимости последствий и ранга рисков. Встречались шкалы, которые
содержали до 10 градаций. Но, на мой взгляд, наиболее прагматичный подход — это использовать трехуровневое ранжирование.
Продолжая рассмотрение примера проекта создания «Автоматизированной системы продажи документации», матрица рангов главных выявленных рисков может выглядеть следующим образом (Таблица 5).
Таблица 5. Матрица рангов главных выявленных рисков проекта создания «Автоматизированной системы продажи документации»
Требования не ясны | Очень вероятно | Катастрофические | 9 |
Недостаток квалифицированных кадров. | Очень вероятно | Критичные | 6 |
Текучесть кадров. | Возможно | Критичные | 4 |
Рисунок 26. Ранг риска и матрица вероятностей и последствий
Для оценки рисков необходима точная и адекватная информация. Использование неточной информации ведет к ошибкам в оценке. Неверная оценка риска также является риском.
Критерии оценки качества используемой при анализе информации выглядят следующим образом:
Номер: R-101 | Категория: Технологический. |
Причина: Недостаток квалифицированных кадров. | Симптомы: Разработчики будут использовать новую платформу — J2EE. |
Последствия: Низкая производительность разработки | Воздействие: Увеличение сроков и трудоемкости разработки. |
Вероятность: Очень вероятно. | Степень воздействия: Критичная. |
Близость: Очень скоро. | Ранг: 6. |
Исходные данные: «Содержание проекта», «План обеспечения ресурсами», Протоколы совещаний №21 от 01.06.2008, №27 от 25.06.2008. |
Одна из задач фазы инициации проекта это выявить и описать всех его участников. Согласно к участникам проекта относятся все заинтересованные стороны (stakeholders), лица и организации, например заказчики, спонсоры, исполняющая организация, которые активно участвуют в проекте или чьи интересы могут быть затронуты при исполнении или завершении проекта. Участники также могут влиять на проект и его результаты поставки.
К ключевым участникам программного проекта, как правило, относятся:
Спонсор проекта — лицо или группа лиц, предоставляющая финансовые ресурсы для проекта в любом виде. Заказчик проекта — лицо или организация, которые будут использовать продукт, услугу или результат проекта. Следует учитывать, что заказчик и спонсор проекта не всегда совпадают. Пользователи результатов проекта. Куратор проекта — представитель исполнителя, уполномоченный принимать решение о выделении ресурсов и изменениях в проекте. Руководитель проекта — представитель исполнителя, ответственный за реализацию проекта в срок, в пределах бюджета и с заданным качеством. Соисполнители проекта. Субподрядчики и поставщики.
Содержание этого раздела в концепции-примере будет иметь вид.
Ключевые участники и заинтересованные стороны
6.1.Спонсор проекта — директор Департамента информатизации ОАО «XYZ» В.Васильев.
6.2. Заказчик — начальник Отдела «123» Ф.Федотов
6.3. Пользователи автоматизированной системы:
6.4. Клиенты ОАО «XYZ» (поиск и заказ документации).
6.5. Руководство ОАО «XYZ» (анализ деятельности Отдела «123»).
6.6. Сотрудники производственных департаментов ОАО «XYZ» (сопровождение каталога).
6.7. Сотрудники Отдела «123» (обработка заявок и поставка документации).
6.8. Сотрудники департамента информатизации ОАО «XYZ» (администрирование системы).
6.9. Куратор проекта — начальник отдела заказных разработок И.Иванов.
6.10. Руководитель проекта — ведущий специалист отдела заказных разработок МП П.Петров. Соисполнители:
7.1. Поставщик оборудования и операционно-системного ПО — ООО «Альфа».
7.2. Поставщик базового ПО — ООО «Бета».
Количественный анализ производится в отношении тех рисков, которые в процессе качественного анализа были квалифицированы как имеющие высокий и средний ранг.
Для количественного анализа рисков могут быть использованы следующие методы:
Анализ чувствительности. Анализ дерева решений. Моделирование и имитация.
Анализ чувствительности помогает определить, какие риски обладают наибольшим потенциальным влиянием на проект. В процессе анализа устанавливается, в какой степени неопределенность каждого элемента проекта отражается на исследуемой цели проекта, если остальные неопределенные элементы принимают базовые значения. Результаты представляются, как правило, в виде диаграммы «торнадо». Рисунок 27 представляет пример такой диаграммы, которая отражает влияние на проектные трудозатраты различных факторов профессионализма разработчиков ПО .
Рисунок 27. Влияние факторов профессионализма разработчиков ПО на трудозатраты по проекту.
Анализ последствий возможных решений проводится на основе изучения диаграммы дерева решений, которая описывает рассматриваемую ситуацию с учетом каждой из имеющихся возможностей выбора и возможного сценария. Рисунок 28 представляет пример диаграммы дерева решений на дугах которой проставлены вероятности и затраты при развитии событий по тому или иному сценарию. Критерием для принятия решения служит математическое ожидание потерь от его принятия.
Рисунок 28. Пример анализ дерева решений при выборе покупать или производить необходимую для проекта библиотеку визуальных компонентов (VCL).
При моделировании рисков проекта используется модель для определения последствий от воздействия подробно описанных неопределенностей на результаты проекта в целом. Моделирование обычно проводится с помощью метода Монте-Карло.
Интересный пример подобной модели — система Riskology от Демарко и Листера, который иллюстрирует применение метода Монте-Карло для получения информации о том, какой запас времени будет необходим для того, чтобы преодолеть влияние всех неуправляемых рисков проекта, приведен в источнике .
Модель позволяет учесть пять основных (Рисунок 29) и пять дополнительных рисков проекта.
У каждого проекта должна быть концепция. Если проект небольшой, то для изложения концепции часто достаточно несколько абзацев. Однако, стартовать проект без концепции, это все равно, что отправлять корабль в плавание, не определив для него пункт назначения.
Концепция проекта разрабатывается на основе анализа потребностей бизнеса. Главная функция документа — подтверждение и согласование единого видения целей, задач и результатов всеми участниками проекта. Концепция определяет что и зачем делается в проекте.
Концепция проекта это ключевой документ, который используется для принятия решений в ходе всего проекта, а также на фазе приемки — для подтверждения результата. Она содержит, как правило, следующие разделы:
Название проекта Цели проекта Результаты проекта Допущения и ограничения Ключевые участники и заинтересованные стороны Ресурсы проекта Сроки Риски Критерии приемки Обоснование полезности проекта
В качестве примера, который позволит иллюстрировать теоретическое изложение основ управления проектами, возьмем реальный проект разработки ПО для автоматизации одного из подразделений крупной производственной компании. Назовем его «Автоматизированная система продажи документации».
Краткая легенда проекта. Заказчик ОАО «XYZ» является одним из ведущих производителей сложных технических изделий. Отдел «123», входящий в ОАО «XYZ», отвечает за продажу дополнительной сопроводительной документации для клиентов ОАО.
Дополнительная документация не входит в стандартную поставку, поскольку владелец этого технического изделия не всегда сам его эксплуатирует, а передает в эксплуатацию другой компании, которая становится клиентом «XYZ», и закупает у нее эксплуатационную документацию. Ремонт и техобслуживание конкретного изделия может выполнять третья компания, которой уже потребуется детальная техническая документация по ремонту и обслуживанию. Она также становится клиентом «XYZ» и закупает у нее требуемую продукцию.
Основная функция отдела «123» — получение и обработка заказов на дополнительную документацию, согласно ежегодно рассылаемому каталогу. В связи с переездом отдела «123» в новое здание, была поставлена задача на разработку и поставку системы, автоматизирующей основную деятельность отдела «123».
Текст документа Концепция проекта, который будет приводиться в качестве примера, будем выделять цветом фона.
Критерии приемки должны определять числовые значения характеристик системы, которые должны быть продемонстрированы по результатам приемосдаточных испытаний или опытной эксплуатации и однозначно свидетельствовать о достижении целей проекта.
В рассматриваемом примере раздел «Критерии приемки» будет выглядеть следующим образом:
Критерии приемки. По итогам опытной эксплуатации система должна продемонстрировать следующие показатели:
11.1. Средние затраты сотрудников Отдела «123» на регламентную обработку одного заказа не превышают 4 чел.*час.
11.2.Срок регламентной обработки 1-го заказа не более 2 недель.
11.3. Время поиска и предоставления информации о наличии дополнительной документации не более 1 мин.
11.4. Время предоставления информации о сделанных заказах и истории их обработки не более 1 мин.
11.5. Система хранит всю информацию о сделанных заказах и истории их обработки.
11.6. Показатель доступности системы 98%.
Задача проекта — достижение конкретной бизнес-цели, при соблюдении ограничений «железного треугольника» (Рисунок 6). Это означает, что ни один из углов треугольника не может быть изменен без оказания влияния на другие. Например, чтобы уменьшить время, потребуется увеличить стоимость и/или сократить содержание.
Рисунок 6. «Железный треугольник» ограничений проекта
Согласно текущей редакции стандарта PMBOK , проект считается успешным, если удовлетворены все требования заказчика и участников проекта. Поэтому у проекта разработки ПО сегодня не три, а четыре фактора успеха:
Выполнен в соответствие со спецификациями. Выполнен в срок. Выполнен в пределах бюджета. Каждый участник команды уходил с работы в 18:00 с чувством успеха.
Этот четвертый фактор успеха должен стать воспроизводимым, если предприятие хочет быть эффективным. Для успешного проекта характерно постоянное ощущение его участниками чувства удовлетворения и гордости за результаты своей работы, чувства оптимизма. Нет ничего более гибельного для проекта, чем равнодушие или уныние его участников.
Эффективность это отношение полученного результата к произведенным затратам. Нельзя рассматривать эффективность, исходя только из результативности: чем больше ты производишь, чем больше делаешь, тем выше твоя эффективность. С таким подходом можно «зарезать на ужин курицу, несущую золотые яйца». Затраты не следует путать с инвестициями. Оплата аренды, электроэнергии, коммунальные платежи — затраты. Создание и закрепление эффективной команды — это стратегическое приобретение компании. Обучение участников проекта — инвестиции. Вложение в людей — это увеличение числителя в формуле эффективности. Уход из компании всех профессионалов после проекта, выполненного по принципу «любой ценой», — затраты, причем очень тяжело восполняемые. Нарастающая конкуренция указывает на совершенно четкий тренд в мировой экономике — персонал — это форма инвестиций, активов, которые нужно уметь наращивать, управлять и сохранять. Сегодня люди — это капитал.
Современное предприятие обязано относиться к своим работникам так же, как к своим лучшим клиентам. Главный капитал современной компании — это знания. Большая часть этих знаний неотъемлема от их носителя — человека. Те предприятия, которые этого не поняли, не выживут потому, что не смогут быть эффективными. Сегодня эффективное предприятие — это сервис. Предприятие, с одной стороны, предоставляет услуги и продукты своим клиентам, а с другой, — рабочие места для профессионального персонала. Принципы «Одно предприятие на всю жизнь», «Работай продуктивно, а предприятие о тебе позаботится» — уходят в прошлое. Посмотрите на рынок рабочей силы в ИТ — правила устанавливают профессионалы.
Свое представление о вопросах, связанных с формированием и руководством командами разработчиков ПО, я подробно изложил в книге . В этой лекции остановимся только на ключевых моментах этой деятельности.
В работе руководителя проекта есть две стороны: управление и лидерство, которые одинаково важны и не могут существовать в отрыве друг от друга. Нельзя быть лидером материальных ресурсов, денежных потоков, планов, графиков и рисков. Ими необходимо управлять. Потому что у вещей нет права и свободы выбора, присущих только человеку.
Интеллектуальными людьми невозможно управлять. Творческие команды можно только направлять и вести. «Высокопроизводительное управление в отсутствие эффективного лидерства подобно упорядочению расстановки стульев на палубе тонущего «Титаника». Никакой успех в управлении не компенсирует провала в лидерстве» .
Эффективные команды не образуются сами по себе, они кристаллизуются вокруг признанного лидера. Как не бывает лидеров без последователей, так и не бывает команд без лидеров. Поэтому первый шаг руководителя при создании эффективной команды — это стать лидером, вокруг которого сможет сплотиться рабочий коллектив. Лидера нельзя назначить.
Лидерство, это в первую очередь, это умение управлять своей собственной жизнью и только потом другими людьми. Сверхвысокое значение коэффициента интеллекта IQ, к сожалению, в этом не поможет. Личная эффективность человека на 80% определяется его коэффициентом эмоционального интеллекта EQ (Emotional Intelligence) — способностью понимать и эффективно взаимодействовать с другими людьми. Хорошая новость. В отличие от IQ, который формируется в ранней молодости и затем практически не меняется, EQ можно повышать на протяжении всей жизни. Если, конечно, прилагать к этому усилия.
Лидер должен получить признание команды. Для того этого необходимо:
Признание командой профессиональной компетентности и превосходства лидера. Полное доверие команды к действиям и решениям лидера, признание его человеческих качеств, убежденность в его честности, порядочности, вера в его искренность и добросовестность.
В нашу задачу не входит детальное описание метода COCOMO II, поэтому мы рассмотрим только случай предварительной оценки трудоемкости программного проекта. Для этой оценки необходимо оценить для проекта уровень семи множителей трудоемкости M,-:
PERS — квалификация персонала (Extra Low — аналитики и программисты имеют низшую квалификацию, текучесть больше 45%; Extra High — аналитики и программисты имеют высшую квалификацию, текучесть меньше 4%) RCPX — сложность и надежность продукта (Extra Low — продукт простой, специальных требований по надежности нет, БД маленькая, документация не требуется; Extra High — продукт очень сложный, требования по надежности жесткие, БД сверхбольшая, документация требуется в полном объеме) RUSE — разработка для повторного использования (Low — не требуется; Extra High — требуется переиспользование в других продуктах) PDIF — сложность платформы разработки (Extra Low — специальные ограничения по памяти и быстродействию отсутствуют, платформа стабильна; Extra High — жесткие ограничения по памяти и быстродействию, платформа нестабильна) PREX — опыт персонала (Extra Low — новое приложение, инструменты и платформа; Extra High — приложение, инструменты и платформа хорошо известны) FCIL — оборудование (Extra Low — инструменты простейшие, коммуникации затруднены; Extra High — интегрированные средства поддержки жизненного цикла, интерактивные мультимедиа коммуникации) SCED — сжатие расписания (Very Low — 75% от номинальной длительности; Very High — 160% от номинальной длительности)
Влияние множителей трудоемкости в зависимости от их уровня определяется их числовыми значениями, которые представлены в матрице, приведенной ниже, (Таблица 15).
Таблица 15. Значения множителей трудоемкости, в зависимости от оценки их уровня
Оценка уровня множителя трудоемкости | ||||||||
PERS | 2.12 | 1.62 | 1.26 | 1.00 | 0.83 | 0.63 | 0.5 | |
RCPX | 0.49 | 0.60 | 0.83 | 1.00 | 1.33 | 1.91 | 2.72 | |
RUSE | n/a | n/a | 0.95 | 1.00 | 1.07 | 1.15 | 1.24 | |
PDIF | n/a | n/a | 0.87 | 1.00 | 1.29 | 1.81 | 2.61 | |
PREX | 1.59 | 1.33 | 1.22 | 1.00 | 0.87 | 0.74 | 0.62 | |
FCIL | 1.43 | 1.30 | 1.10 | 1.0 | 0.87 | 0.73 | 0.62 | |
SCED | n/a | 1.43 | 1.14 | 1.00 | 1.00 | 1.00 | n/a |
Из этой таблицы, в частности, следует, если в нашем проекте низкая квалификация аналитиков, то его трудоемкость возрастет примерно в 4 раза по сравнению с проектом, в котором участвуют аналитики экстра-класса. И это не выдумки теоретиков, а отраслевая статистика!
Модели (или, как еще любят говорить, методологии) процессов разработки ПО принято классифицировать по «весу» — количеству формализованных процессов (большинство процессов или только основные) и детальности их регламентации. Чем больше процессов документировано, чем более детально они описаны, тем больше «вес» модели.
Наиболее распространенные современные модели процесса разработки ПО представлены на Рисунке 3.
Рисунок 3 Различные модели процесса разработки ПО и их распределение по «весу»
Управление рисками должно осуществляться на протяжении всего проекта. Не вести мониторинг рисков в ходе проекта — все равно, что не следить за уровнем топлива при поездке на автомобиле.
Мониторинг и управление рисками — это процесс идентификации, анализа и планирования реагирования на новые риски, отслеживания ранее идентифицированных рисков, а также проверки и исполнения операций реагирования на риски и оценка эффективности этих операций.
В процессе мониторинга и управления рисками используются различные методики, например, анализ трендов и отклонений, для выполнения которых необходимы количественные данные об исполнении, собранные в процессе выполнения проекта.
Мониторинг и управления рисками включает в себя следующие задачи:
Пересмотр рисков. Аудит рисков. Анализ отклонений и трендов.
Пересмотр рисков должен проводиться регулярно, согласно расписанию. Управление рисками проекта должно быть одним из пунктов повестки дня всех совещаний команды проекта. Неплохо начинать каждый статус митинг с вопроса: «Ну и какие еще неприятности нас ожидают?» Идентификация новых рисков, и пересмотр известных рисков происходит с использованием процессов, описанных ранее.
Аудит рисков предполагает изучение и предоставление в документальном виде результатов оценки эффективности мероприятий по реагированию на риски, относящихся к идентифицированным рискам, изучение основных причин их возникновения, а также оценку эффективности процесса управления рисками.
Тренды в процессе выполнения проекта подлежат проверке с использованием данных о выполнении. Для мониторинга выполнения всего проекта могут использоваться анализ освоенного объема и другие методы анализа отклонений проекта и трендов (см. ). На основании выходов этих анализов можно прогнозировать потенциальные отклонения проекта на момент его завершения по показателям стоимости и расписания. Отклонения от базового плана могут указывать на последствия, вызванные как угрозами, так и благоприятными возможностями.
Известно, что ни одна задача не будет решена за любое, отведенное на это время, если человек не захочет ее сделать. Он всегда найдет для оправдания этого 100 «объективных» причин, вместо того, чтобы найти хотя бы один способ решения задачи. У каждого участника рабочей группы должна быть личная цель (внутренняя мотивация), которую он сможет достичь, продвигая проект к успеху.
Начните с себя! Вам нужно четко понимать, в чем состоит ваш выигрыш в случае успешного завершения проекта. Добиться от участников приверженности проекту больше, чем имеете вы сами, вам не удастся. Если у участника нет такой значимой личной цели, избавьтесь от него. Иначе вам придется потратить все свое время на «промывание его мозгов» и попытки мотивировать его на эффективную работу.
Мотивация должна начинаться с подбора сотрудников в команду. В старой экономике людей нанимали за умения и обучали нужному отношению к делу. В новой экономике необходимо поступать с точностью до наоборот: нанимать за нужное отношение к делу и учить необходимым умениям.
Люди не рождаются победителями, они ими становятся. Кандидата стоит нанимать только в случае, если вы можете предложить ему возможность стать победителем. Настоящий лидер предлагает не работу, а возможности.
Все люди разные, а ситуаций, в которых они могут находиться в ходе проекта, бесчисленное множество. Бойтесь стереотипов. Если вы не учитываете индивидуальные особенности конкретной личности, то эффективность ваших взаимодействий сильно снижается. Модель объекта управления нам неизвестна, следовательно, не может существовать исчерпывающий набор правил, типа «если..., то...», по которым смог бы действовать руководитель. Поэтому, сколько людей и ситуаций, столько и вариантов решений должен иметь эффективный руководитель в своем запасе. «Если у руководителя в руках только молоток, то все вокруг будут похожи на гвозди».
Руководитель при поиске решения опирается на свой багаж знаний и умений. Он пытается понять каждого участника, классифицировать состояние, найти в своем опыте похожую ситуацию и адаптировать ранее использованное успешное решение применительно к данному конкретному случаю.
Таким образом, руководитель стремится помочь человеку (объекту управления) перейти в новое более эффективное с точки зрения целей проекта состояние.
Затем руководитель должен наблюдать за результатами своего воздействия — это и есть дополнительный контур обратной связи. Необходимо помнить, что понять человека можно, только слушая и слыша, что он говорит. Руководитель, который в течение недели не пообщался индивидуально с каждым из своих прямых подчиненных, зря получает зарплату. И совсем не обязательно разговор должен идти о статусе проектных работ. Порой, достаточно поговорить о погоде, кино или футболе. После этого руководитель анализирует полученные результаты и аккумулирует новый опыт (положительный или отрицательный) в своей «базе знаний».
Чем опытней руководитель, тем точнее он может распознать и классифицировать сложившуюся ситуацию, тем больше в его «базе знаний» прецедентов, используя которые, он может синтезировать решение для данного конкретного случая. Именно поэтому в управлении программными проектами в первую очередь ценится опыт руководителя и только потом, возможно, его звания и знания.
Программист состоит из четырех компонентов: тело, сердце, разум и душа.
Телу необходимы деньги и безопасность. Сердцу — любовь и признание. Разуму — развитие и самосовершенствование. Душе — самореализация.
Предоставьте все это вашим сотрудникам, и эффективность их труда возрастет многократно. В противном случае люди, которые хотят побеждать, найдут все это в другой команде, а в вашей останутся только неудачники.
Microsoft Solutions Framework (MSF) — это гибкая и достаточно легковесная модель, построенная на основе итеративной разработки. Привлекательной особенностью MSF является большое внимание к созданию эффективной и небюрократизированной проектной команды. Для достижения этой цели MSF предлагает достаточно нестандартные подходы к организационной структуре, распределению ответственности и принципам взаимодействия внутри команды.
В программостроении уже стало банальностью то, что разработчики без достаточного основания называют слишком оптимистичные сроки. Среди руководителей даже распространено неписаное правило: умножать на 2 оценку трудоемкости, которую сделал программист. Это пессимистичный подход. Реалисты умножают на π = 3.14 .
Действительно, так иногда приходится поступать, если это программист, который только вчера отладил свою первую программу «Hello world!». Но если помочь молодым специалистам научится анализировать задачу, проектировать решение, составлять план работы, эффективно его реализовывать и анализировать полученные результаты, то можно будет не вспоминать, чему равно число π.
Еще один распространенный источник занижения сроков — необоснованные ожидания на применение новых технологий и средств разработки. Эти ожидания, как правило, не оправдываются. Согласно статистике, приведенной Демарко, средняя производительность в программном производстве растет всего лишь на 3–5% в год.
Часто «агрессивное» расписание проекта появляется из-за того, что руководство и/или заказчик боятся переоценить проект, полагая, что согласно закону Паркинсона, работы по проекту займут все отведенное для него время. Следствием подобных опасений является, как правило, директивное занижение сроков реализации проекта.
Нереалистичность оценок — один из серьезнейших демотивирующих факторов для участников. Недооценка приводит к ошибкам планирования и неэффективному взаимодействию. Например, было запланировано тестирование, а релиз еще не готов. Следствие — простой тестировщиков увеличение трудозатрат.
Если расписание излишне агрессивное, то с целью сэкономить время, недостаточно внимания уделяется анализу требований и проектированию. Исправление ошибок, допущенных на этих этапах, приведет к существенным дополнительным затратам.
Половина всех ошибок программирования возникают из-за стресса, вызванного излишним давлением фактора сроков. Ошибки исправляются наспех, обходными путями. В результате будет получен большой проблемный код и постоянно растущие затраты на исправление ошибок и внесение изменений. Позднее обнаружение ошибок приводит к тому, что затраты на их исправление увеличиваются в 50–100 раз.
Мне пришлось наблюдать проект, который вместо первоначально слишком оптимистично запланированных шести месяцев растянулся на три года. Хотя, если бы он был адекватно оценен, то он мог бы быть реализован за один год. Нереальные сроки, постоянное давление, сверхурочные, авралы приводят к тому, что затраты на проект растут экспоненциально и неограниченно.
Если участники проектной команды адекватно мотивированы на выполнение проектных работ с наименьшими затратами, то, на мой взгляд, этого достаточно, чтобы проект был реализован в минимально возможные сроки. О мотивации мы еще будем говорить (см. ).
Этот раздел концепции должен содержать краткое технико-экономическое обоснование проекта:
Для кого предназначены результаты проекта. Описание текущей ситуации «As Is». Какие у потенциального заказчика существуют проблемы. Каким образом результаты проекта решают эти проблемы («To Be»). Насколько значимо для клиента решение данных проблем (оценка экономического эффекта). Какие преимущества в итоге из этого может извлечь компания-исполнитель проекта.
Соответствующий раздел в концепции проекта-примера будет иметь следующий вид.
Обоснование полезности проекта
12.1. Для Заказчика:
12.1.1. Повышение производительности обработки заказов в 2 раза.
12.1.1.1. "As Is": 2500 заказов/год по 8 чел.*час.
12.1.1.2. "To Be": 2500 заказов/год по 4 чел.*час.
12.1.1.3. Экономия: 2500 * 4 * $50 = $500 000 в год.
12.1.2. Повышение оперативности контроля
12.1.2.1. "As Is": Ежемесячная отчетность.
12.1.2.2. "To Be": Отчетность on-line.
12.1.3. Повышение удовлетворенности клиентов:
12.1.3.1. Сокращение срока обработки заказа в 2 раза.
12.1.3.2. Сокращение времени на поиск необходимой документации в 10 раз
12.1.3.3. Повышение оперативности обновления каталога 10 раз. 12.2. Для компании-исполнителя:
12.2.1. Высокая стратегическая ценность. Дает устойчивое увеличение рынка и завоевание нового рынка.
12.2.2. Финансовая ценность выше среднего. Ожидаемые доходы от проекта не менее чем в 1.3 раза превышают расходы.
Анализ функциональных точек — стандартный метод измерения размера программного продукта с точки зрения пользователей системы. Метод разработан Аланом Альбрехтом (Alan Albrecht) в середине 70-х. Метод был впервые опубликован в 1979 году. В 1986 году была сформирована Международная Ассоциация Пользователей Функциональных Точек (International Function Point User Group — IFPUG), которая опубликовала несколько ревизий метода .
Метод предназначен для оценки на основе логической модели объема программного продукта количеством функционала, востребованного заказчиком и поставляемого разработчиком. Несомненным достоинством метода является то, что измерения не зависят от технологической платформы, на которой будет разрабатываться продукт, и он обеспечивает единообразный подход к оценке всех проектов в компании.
При анализе методом функциональных точек надо выполнить следующую последовательность шагов (Рисунок 37):
Определение типа оценки. Определение области оценки и границ продукта. Подсчет функциональных точек, связанных с данными. Подсчет функциональных точек, связанных с транзакциями. Определение суммарного количества не выровненных функциональных точек (UFP). Определение значения фактора выравнивания (FAV). Расчет количества выровненных функциональных точек (AFP).
Рисунок 37. Процедура анализа по методу функциональных точек
Длительность проекта в методике COCOMO II рассчитывается по формуле:
где
С = 3,67; D = 0,28;
PMNS — трудоемкость проекта без учета множителя SCED, определяющего сжатие расписания.
Как мы отмечали ранее (см. ), для того чтобы адекватно спланировать проект и оценить его трудоемкость, необходимо выполнить предварительное проектирование программного продукта. В результате декомпозиции мы получаем некоторое количество компонентов (N), которые составляют программный продукт.
Следует понимать, что суммарная трудоемкость проекта не равна простой сумме трудоемкостей разработки каждого из компонентов:
Простая сумма не учитывает взаимосвязи компонентов и трудозатраты на их интеграцию.
Методика COCOMO II определяет следующую последовательность вычисления трудоемкости проекта при многокомпонентной разработке.
Суммарный размер продукта рассчитывается, как сумма размеров его компонентов:
Базовая трудоемкость проекта рассчитывается по формуле:
Затем рассчитывается базовая трудоемкость каждого компонента:
На следующем шаге рассчитывается оценка трудоемкости компонентов с учетом всех множителей трудоемкости, кроме множителя SCED.
И, наконец, итоговая трудоемкость проекта определятся по формуле:
Стив Макконнелл пишет, что мы от природы склонны верить, что сложные формулы вида
всегда обеспечивают более точные результаты, чем простые формулы
Трудоемкость = КоличествоФакторов х СредниеЗатратыНаФактор
Однако, далеко не всегда это так. Сложные формулы, как правило, очень чувствительны к точности большого числа параметров (в приведенном примере формул COCOMO II содержится 21 параметр), которые надо задать, чтобы получить требуемые оценки.
Первое, что необходимо понимать при оценке проекта, это то, что любая оценка это всегда вероятностное утверждение. Если мы просто скажем, что трудоемкость данного пакета работ составляет М чел.*мес. (Рисунок 34), то это будет плохой оценкой потому, что одно единственное число ничего не скажет нам о вероятности того, что на реализацию этого пакета потребуется не более, чем М чел.*мес. Вряд ли мы можем считать себя «предсказамусами», которые точно знают что произойдет в будущем и сколько потребуется затрат на реализацию этого пакета работ.
Рисунок 34. Точечная оценка трудоемкости пакета работ ничего не скажет нам о вероятности того, что на реализацию этого пакета потребуется не более, чем М чел.*мес.
Для того, чтобы понять, откуда берется неопределенность, рассмотрим простейший пример, попытаемся оценить трудоемкость добавления поля ввода телефонного номера клиента к уже существующей форме. Менеджер, наблюдающий работу программистов только со стороны, скажет, что эта работа потребует не больше 15 минут рабочего времени. Человек, умудренный программистским опытом, скажет, что эта работа может занять от 2 до 200 часов, и чтобы дать более точную оценку ему надо получить ответы на ряд вопросов:
Может ли вводиться несколько номеров? Должна ли быть проверка номеров на действительность? Простая или сложная проверка? Если реализуем простую проверку, то не захочет ли клиент заменить ее на более сложную? Должна ли проверка работать для иностранных номеров? Можно ли воспользоваться готовым решением? Каково должно быть качество реализации? Вероятность ошибки после поставки? Сколько времени потребуется на реализацию и отладку? (зависит от конкретного исполнителя).
Второй шаг — это определение области оценки и границ продукта. В зависимости от типа область оценки может включать:
Все разрабатываемые функции (для проекта разработки) Все добавляемые, изменяемые и удаляемые функции (для проектов поддержки) Только функции, реально используемые, или все функции (при оценке продукта и/или продуктов).
Третий шаг. Границы продукта (Рисунок 38) определяют:
Что является «внешним» по отношению к оцениваемому продукту. Где располагается «граница системы», через которую проходят транзакции передаваемые или принимаемые продуктом, с точки зрения пользователя. Какие данные поддерживаются приложением, а какие — внешние.
Рисунок 38. Границы продукта в методе функциональных точек
К логическим данным системы относятся:
Внутренние логические файлы (ILFs) — выделяемые пользователем логически связанные группы данных или блоки управляющей информации, которые поддерживаются внутри продукта. Внешние интерфейсные файлы (EIFs) — выделяемые пользователем логически связанные группы данных или блоки управляющей информации, на которые ссылается продукт, но которые поддерживаются вне продукта.
Примером логических данных (информационных объектов) могут служить: клиент, счет, тарифный план, услуга.
Общий объем продукта в не выровненных функциональных точках (UFP) определяется путем суммирования по всем информационным объектам (ILF, EIF) и элементарным операциям (транзакциям EI, EO, EQ).
Первое, что необходимо сделать, это определить тип выполняемой оценки. Метод предусматривает оценки трех типов:
Проект разработки. Оценивается количество функциональности поставляемой пользователям в первом релизе продукта. Проект развития. Оценивается в функциональных точках проект доработки: добавление, изменение и удаление функционала. Продукт. Оценивается объем уже существующего и установленного продукта.
Помимо функциональных требований на продукт накладываются общесистемные требования, которые ограничивают разработчиков в выборе решения и увеличивают сложность разработки. Для учета этой сложности применяется фактор выравнивания (VAF). Значение фактора VAF зависит от 14 параметров, которые определяют системные характеристики продукта:
Обмен данными (0 — продукт представляет собой автономное приложение; 5 — продукт обменивается данными по более, чем одному телекоммуникационному протоколу). Распределенная обработка данных (0 — продукт не перемещает данные; 5 — распределенная обработка данных выполняется несколькими компонентами системы). Производительность (0 — пользовательские требования по производительности не установлены; 5 — время отклика сильно ограничено критично для всех бизнес-операций, для удовлетворения требованиям необходимы специальные проектные решения и инструменты анализа. Ограничения по аппаратным ресурсам (0 — нет ограничений; 5 — продукт целиком должен функционировать на определенном процессоре и не может быть распределен). Транзакционная нагрузка (0 — транзакций не много, без пиков; 5 — число транзакций велико и неравномерно, требуются специальные решения и инструменты). Интенсивность взаимодействия с пользователем (0 — все транзакции обрабатываются в пакетном режиме; 5 — более 30% транзакций — интерактивные). Эргономика (эффективность работы конечных пользователей) (0 — нет специальных требований; 5 — требования по эффективности очень жесткие). Интенсивность изменения данных (ILF) пользователями (0 — не требуются; 5 — изменения интенсивные, жесткие требования по восстановлению). Сложность обработки (0 — обработка минимальна; 5 — требования безопасности, логическая и математическая сложность, многопоточность). Повторное использование (0 — не требуется; 5 — продукт разрабатывается как стандартный многоразовый компонент). Удобство инсталляции (0 — нет требований; 5 — установка и обновление ПО производится автоматически). Удобство администрирования (0 — не требуется; 5 — система автоматически самовосстанавливается). Портируемость (0 — продукт имеет только 1 инсталляцию на единственном процессоре; 5 — система является распределенной и предполагает установку на различные «железо» и ОС). Гибкость (0 — не требуется; 5 — гибкая система запросов и построение произвольных отчетов, модель данных изменяется пользователем в интерактивном режиме).
14 системных параметров (degree of influence, DI) оцениваются по шкале от 0 до 5. Расчет суммарного эффекта 14 системных характеристик (total degree of influence, TDI) осуществляется простым суммированием:
TDI = ∑ DI
Расчет значения фактора выравнивания производится по формуле
VAF = (TDI *0.01) + 0.65
Например, если, каждый из 14 системных параметров получил оценку 3, то их суммарный эффект составит TDI = 3 * 14 = 42. В этом случае значение фактора выравнивания будет: VAF = (42 * 0.01) + 0.65 = 1.07
Каждый проект разработки ПО имеет свою организационную структуру, которая определяет распределение ответственности и полномочий среди участников проекта, а также обязанностей и отношений отчетности. Чем меньше проект, тем больше ролей приходится совмещать одному исполнителю.
Роли и ответственности участников типового проекта разработки ПО можно условно разделить на пять групп:
Анализ. Извлечение, документирование и сопровождение требований к продукту. Управление. Определение и управление производственными процессами. Производство. Проектирование и разработка ПО. Тестирование. Тестирование ПО. Обеспечение. Производство дополнительных продуктов и услуг.
Группа анализа включает в себя следующие роли:
Бизнес-аналитик. Построение модели предметной области (онтологии). Бизнес-архитектор. Разрабатывает бизнес-концепцию системы. Определяет общее видение продукта, его интерфейсы, поведение и ограничения. Системный аналитик. Отвечает за перевод требований к продукту в функциональные требования к ПО. Специалист по требованиям. Документирование и сопровождение требований к продукту. Менеджер продукта (функциональный заказчик). Представляет в проекте интересы пользователей продукта.
Группа управления состоит из следующих ролей:
Руководитель проекта. Отвечает за достижение целей проекта при заданных ограничениях (по срокам, бюджету и содержанию), осуществляет операционное управление проектом и выделенными ресурсами. Куратор проекта. Оценка планов и исполнения проекта. Выделение ресурсов. Системный архитектор. Разработка технической концепции системы. Принятие ключевых проектных решений относительно внутреннего устройства программной системы и её технических интерфейсов. Руководитель группы тестирования. Определение целей и стратегии тестирования, управление тестированием. Ответственный за управление изменениями, конфигурациями, за сборку и поставку программного продукта.
В производственную группу входят:
Проектировщик. Проектирование компонентов и подсистем в соответствие с общей архитектурой, разработка архитектурно значимых модулей. Проектировщик базы данных. Проектировщик интерфейса пользователя. Разработчик.
Проектирование, реализация и отладка отдельных модулей системы.
В большом проекте может быть несколько производственных групп, ответственных за отдельные подсистемы. Как правило, проектировщик выполняет роль лидера группы и управляет своим подпроектом или пакетом работ. Стоит не забывать, что руководитель проекта делегирует полномочия, но не ответственность.
Группа тестирования в проекте состоит из следующих ролей:
Проектировщик тестов. Разработка тестовых сценариев. Разработчик автоматизированных тестов. Тестировщик. Тестирование продукта. Анализ и документирование результатов.
Участники группы обеспечения, как правило, не входят в команду проекта. Они выполняют работы в рамках своей процессной деятельности. К группе обеспечения можно отнести следующие проектные роли:
Технический писатель. Переводчик. Дизайнер графического интерфейса. Разработчик учебных курсов, тренер. Участник рецензирования. Продажи и маркетинг. Системный администратор. Технолог. Специалист по инструментальным средствам. Другие.
В зависимости от масштаба проекта одну роль могут исполнять несколько человек. Например, разработчики, тестировщики, технические писатели. Некоторые роли всегда должен исполнять только один человек. Например, Руководитель проекта, Системный архитектор. Один человек может исполнять несколько ролей. Возможны следующие совмещения ролей:
Руководитель проекта + системный аналитик (+ системный архитектор) Системный архитектор + разработчик Системный аналитик + проектировщик тестов (+ технический писатель) Системный аналитик + проектировщик интерфейса пользователя Ответственный за управление конфигурациями + ответственный за сборку и поставку (+ разработчик)
Крайне нежелательно совмещать следующие роли:
Разработчик + руководитель проекта Разработчик + системный аналитик. Разработчик + проектировщик интерфейсов пользователя. Разработчик + тестировщик
Не раз приходилось наблюдать, как в критические периоды проекта его менеджер-разработчик с увлечением правит очередные баги, а проектная команда в полном составе стоит у него за спиной и наблюдает за этим процессом.
Это плохой пример руководства проектом.
Программисты любят и умеют программировать. Пусть они этим и занимаются. Не стоит загружать программистов несвойственной для них работой. В каждом проекте разработки программного продукта много других работ: бизнес-анализ, проектирование эргономики, графический дизайн, разработка пользовательской документации. Эти работы с программированием не имеют ничего общего. Для них требуются совершенно другая квалификация и другой склад мышления.
При кустарном производстве программ эти задачи, как правило, поручаются программистам, которые это делать не умеют и не любят. Получается обычно плохо, да еще и дорого. В силу своей интроверсии, граничащей с аутизмом, программист просто не в состоянии увидеть свою программу чужими глазами — глазами пользователей. Никто уже не хочет работать с программами с технологической парадигмой навороченного пользовательского интерфейса — кустарным творением программистов — когда для того чтобы работать с системой, надо обязательно знать, как она устроена. Это типичное творение программиста, которому гораздо важнее видеть, как работает его программа, чем разбираться в том, что она делает для пользователя. Поэтому, необходимо привлекать в проектную команду бизнес-аналитиков, эргономистов, художников-дизайнеров, документалистов. Разделение труда и специализация — залог перехода от кустарного производства к более эффективному промышленному производству.
Из профессиональных программистов получаются отличные тестировщики. Лучшая команда тестирования, которую я встречал, была в Luxoft. Это были маститые программисты из одного академического НИИ с опытом 20-30 лет. Они не осваивали новые программистские технологии, но исключительно эффективно ломали то, что было сделано на их основе. Однако, совмещать одновременно роли программиста и тестировщика — плохая практика. Хороший программист убежден, что он пишет программы правильно и ему психологически тяжело допустить, что где-то в его коде может быть ошибка.
А ошибки есть всегда!
Организационная структура проекта обязательно должна включать в себя эффективную систему отчетности, оценки хода выполнения проекта и систему принятия решений. Можно рекомендовать еженедельные собрания по статусу проекта, на которых анализируются риски, оцениваются результаты, достигнутые на предыдущей неделе, и уточняются задачи на новый период.
В модели Scrum рекомендуются ежедневные совещания по состоянию работ — «Stand Up Meeting», но мне кажется, что это применимо, скорее, для небольших рабочих групп от 3 до 5 разработчиков. Хотя в критические периоды проекта, приходилось проводить и ежедневные совещания.
Важно помнить, что организационная структура проекта — «живой» организм. Она начинает складываться на стадии планирования и может меняться в ходе проекта. Нестабильность организационной структуры (частые замены исполнителей) — серьезная проблема в управлении сложными программными проектами, поскольку существует время вхождения в контекст проекта, которое может измеряться месяцами.
Том Демарко в своей книге пишет: «Проект без риска — удел неудачников. Риски и выгода всегда ходят рука об руку». В первой лекции мы уже говорили о том, что, в силу специфики отрасли, программная инженерия остается и, в ближайшем будущем, будет оставаться производством с высоким уровнем рисков. Если задуматься, то все, что мы делаем, управляя проектом разработки ПО, направлено на борьбу с рисками не уложиться в срок, перерасходовать ресурсы, разработать не тот продукт, который требуется. Определение риска было дано в предыдущей лекции.
Риск это проблема, которая еще не возникла, а проблема — это риск, который материализовался. Риск характеризуется следующими характеристиками (Рисунок 24):
Причина или источник. Явление, обстоятельство обусловливающее наступление риска. Симптомы риска, указание на то, что событие риска произошло или вот-вот произойдет. Первопричина нам может быть не наблюдаема, например, заразились гриппом. Мы наблюдаем некоторые симптомы — поднялась температура. Последствия риска. Проблема или возможность, которая может реализоваться в проекте в результате произошедшего риска. Влияние риска. Влияние реализовавшегося риска на возможность достижения целей проекта. Воздействие обычно касается стоимости, графика и технических характеристик разрабатываемого продукта. Многие риски происходят частично и оказывают соразмерное отрицательное или положительное воздействие на проект.
Риск это всегда вероятность и последствия. Например, всегда есть вероятность того, что метеорит упадет на офис центра программных разработок, и это будет иметь катастрофические последствия для проекта. Однако вероятность наступления этого события настолько мала, что мы в большинстве проектов принимаем это риск и не пытаемся им управлять.
Майк Ньюэлл, вице-президент компании PSM Consulting, рассказывал, как он объясняет аудитории на своих лекциях, что такое риск. Он предлагает сыграть в кости на таких условиях, если на кубике выпадает шестерка, то выигрывает он.
Если — любое другое число, то выигрывает слушатель. Ставка по 1 доллару. Обычно, большая часть аудитории соглашается сыграть на таких условиях. Майк поднимает ставки: $10, $100, $1000. Постепенно количество желающих поиграть становится все меньше и меньше. При ставке $1000, как правило, желающих рисковать не остается.
Принято выделять две категории рисков:
«Известные неизвестные». Это те риски, которые можно идентифицировать и подвергнуть анализу. В отношении таких рисков можно спланировать ответные действия. «Неизвестные неизвестные». Риски, которые невозможно идентифицировать и, следовательно, спланировать ответные действия.
Методика COCOMO позволяет оценить трудоемкость и время разработки программного продукта. Впервые была опубликована Бари Боэмом в 1981 году в виде результат анализа 63 проектов компании «TRW Aerospace». В 1997 методика была усовершенствована и получила название COCOMO II. Калибровка параметров производилась по 161 проекту разработки. В модели используется формула регрессии с параметрами, определяемыми на основе отраслевых данных и характеристик конкретного проекта.
Различаются две стадии оценки проекта: предварительная оценка на начальной фазе и детальная оценка после проработки архитектуры.
Формула оценки трудоемкости проекта в чел.*мес. имеет вид:
где
SIZE — размер продукта в KSLOC EMi — множители трудоемкости SFj — факторы масштаба n=7 — для предварительной оценки n=17 — для детальной оценки
Главной особенностью методики является то, что для того, чтобы оценить трудоемкость, необходимо знать размер программного продукта в тысячах строках исходного кода (KSLOC, Kilo Source Lines Of Code). Размер программного продукта может быть, например, оценен экспертами с применением метода PERT.
Если мы провели анализ продукта методом функциональных точек, то его размер может быть рассчитан с использованием собственных статистических данных или с использованием статистики по отрасли (Таблица 13).
Таблица 13. Оценка количества строк, необходимых на реализацию одной не выровненной функциональной точки для некоторых распространенных языков программирования.
Assembler | 172 | 86 | 320 |
C | 148 | 9 | 704 |
C++ | 60 | 29 | 178 |
C# | 59 | 51 | 66 |
J2EE | 61 | 50 | 100 |
JavaScript | 56 | 44 | 65 |
PL/SQL | 46 | 14 | 110 |
Visual Basic | 50 | 14 | 276 |
Standish Group, проанализировав работу сотен американских корпораций и итоги выполнения нескольких десятков тысяч проектов, связанных с разработкой ПО, в своем докладе с красноречивым названием «Хаос» пришла к следующим неутешительным выводам (Рисунок 2):
Только 35 % проектов завершились в срок, не превысили запланированный бюджет и реализовали все требуемые функции и возможности. 46 % проектов завершились с опозданием, расходы превысили запланированный бюджет, требуемые функции не были реализованы в полном объеме. Среднее превышение сроков составило 120%, среднее превышение затрат 100%, обычно исключалось значительное число функций. 19 % проектов полностью провалились и были аннулированы до завершения.
Рисунок 2. Результаты анализа успешность программных проектов за 2006 год
Сразу дам ответы на вечные российские вопросы «Кто виноват?» и «Что делать?».
Кто виноват? Никто. Как никто не виноват в том, что на небе тучи, что идет дождь, что дует ветер. Поскольку самого-то «хаоса» не было, и нет, а есть лишь Богом данная (для атеистов — объективная) реальность, которая заключена в особой специфике производства программ, по сравнению с любой другой производственной деятельностью, потому что то, что производят программисты — нематериально, это коллективные ментальные модели, записанные на языке программирования. И с этой спецификой мы обязаны считаться, если, конечно, не хотим «дуть против ветра».
Что делать? Управлять людьми. Успех, а равно и провал, проектов по производству ПО лежат в области психологии.
Гуру программирования Ф. Брукс в 1975 году писал : «Программист, подобно поэту, работает почти непосредственно с чистой мыслью. Он строит свои замки в воздухе и из воздуха, творя силой воображения. Трудно найти другой материал, используемый в творчестве, который столь же гибок, прост для шлифовки или переработки и доступен для воплощения грандиозных замыслов».
То, что производят программисты нематериально — это коллективные мысли и идеи, выраженные на языке программирования.
Я не говорю, что производство ПО суперсложная интеллектуальная деятельность. Отрасль еще только зарождается. Время вхождения в профессию сильно меньше, чем в других инженерных дисциплинах. Разрабатывать ПО точно не сложнее, чем делать ракеты. Просто в силу уникальности отрасли опыт профессионалов, накопленный в материальном производстве и изложенный в стандарте PMI PMBOK , мало способствует успеху в управлении программным проектом. Управлять разработкой ПО надо иначе.
Творчество — это интеллектуальная деятельность человека, законы которой нам неизвестны. Если бы мы знали законы творчества, то и картины, и стихи, и музыку, и программы уже давно бы создавали компьютеры. Творческое начало это то, что роднит программирование с наукой и искусством.
Творчество в программировании начинается с определения целей программы и заканчивается только тогда, когда в ее коде, написанном на каком-либо языке программирования, поставлена последняя точка. Попытки разделять программистов на творческую элиту, архитекторов и проектировщиков, и нетворческих программистов-кодеров не имеют под собой объективных оснований. Даже если алгоритм программы строго определен математически, два разных программиста его закодируют по-разному, и полученная программа будет иметь разные потребительские качества.
Творчество неразрывно связано с вдохновением, а это субстанция капризная и непредсказуемая (помните знаменитый сон Д. И. Менделеева, про Периодическую таблицу элементов его имени?). Знаю только, что без вдохновения в программировании не обойтись. И чем сложнее задача, тем труднее извлечь это вдохновение из подсознания. Иногда для этого требуются часы, а иногда недели.
Программирование это не искусство, в том смысле, что оно не является творческим отражением и воспроизведением действительности в художественных образах. Об искусстве в программировании можно и должно говорить только в смысле умения, мастерства, знания дела, как и в любой другой профессии. И как в любой другой профессии программистское мастерство может доставлять истинное эстетическое наслаждение, но только для людей, причастных к этой профессии.
Программирование это не наука. Наработки математиков в области логики, теории информации, численных методов, реляционной алгебры, теории графов и некоторых других дисциплинах на долю процента не покрывают сложность программистских задач. В программировании нет системы знаний о закономерностях создания программ. Даже выдающиеся программисты не возьмут на себя смелость утверждать об архитектуре новой программной системы то, что она будет успешной. Хотя в программировании уже накоплен определенный опыт провалов, который может позволить искушенному программисту увидеть в архитектуре новой системы антипаттерны — источники серьезных будущих проблем. Но не более того.
Существующее состояние программной инженерии напоминает большую поваренную книгу с многочисленными описаниями рецептов однажды успешно приготовленных блюд из ингредиентов, которых в будущем уже не будет. Завтра в новой системе будут другие вычислительные машины, технологии, языки программирования, инструменты и окружающее ПО, новые проблемы взаимодействия с которыми обязательно придется решать.
Профессиональное творчество программиста принципиально отличается от творчества в науке и искусстве. Программистские задачи с каждым годом становятся все сложнее и объемнее, а сроки, за которые требуется решить эти задачи, наоборот, с каждым годом сокращаются. Поэтому современные программы создаются коллективами от нескольких до тысяч программистов, в то время как творческие деятели науки и искусства работают, как правило, в одиночку.
Есть еще нечто, что отличает труд профессионального программиста от ученого, художника, композитора и поэта. Предметом деятельности ученых являются упрощенные модели, в которых они могут абстрагироваться от большинства деталей реального мира, не существенных для их целей. Математик, доказывая новую теорему о тензорах, не заботится ни о чем, кроме системы постулатов, положенных в основание дифференциальной геометрии. Физик, описывая динамику жидкости в трубе, абстрагируется от того, как движутся и сталкиваются молекулы и от того, как движутся планеты вокруг Солнца.
Деятели искусства тоже во многом оперируют абстракциями. Поэту, композитору, художнику достаточно лишь сделать намек, абрис объекта творчества, и на этом его работа закончена. Остальное пусть додумывает читатель, слушатель, зритель.
Программист тоже работает с абстракциями, но ему приходится держать в голове гораздо больше абстракций, чем любому ученому. Абстракции сопутствуют программисту на всех уровнях разработки программы от описания ее целей до исполняемого машинного кода. И этих уровней могут быть десятки. И на каждом уровне абстракций их деталей становится все больше и больше.
Дополнительно к абстрактному мышлению, программист должен обладать сильно выраженным системным мышлением, чтобы удерживать многочисленные взаимосвязи, существующие на всех уровнях программистских абстракций, а также взаимосвязи между этими уровнями. Еще одной сложностью является то, что все эти абстракции и взаимосвязи между ними изменяются во времени, и программист должен учитывать эту динамику.
Кроме того, программист должен обладать маниакальной усидчивостью, сосредоточенностью и упорством для перебора всех возможных вариантов поведения своих абстракций и доскональной проработки всех деталей. Проработка должна быть абсолютно точной и не должна содержать ни одной ошибки, неправильного, лишнего или отсутствующего символа исходного кода (а это порой миллионы строк). Инструменты программирования: синтаксические анализаторы, компиляторы и проч., — лишь незначительно помогают в этой работе.
Еще одна особенность, которая присуща программистскому творчеству, это постоянное обновление информационных технологий, которые программисту необходимо знать и успешно применять в своей работе. Поэтому профессиональный программист должен, как сказал один из наших прежних вождей, «учиться, учиться и учиться». Программист должен удерживать в голове, постоянно пополнять и активно применять на практике гигабайты профессиональной информации. Это устройство компьютеров, компьютерных сетей и сетевые протоколы.
Это операционные системы и языки программирования. Это программные интерфейсы промежуточного ПО и прикладных библиотек с особенностями и багами их реализации в конкретных продуктах. Это технологические стандарты, технологии разработки и инструменты, которые их поддерживают. Это архитектуры программных систем, паттерны и антипаттерны проектирования и много-много другой информации.
Еще в начале 70-х замечательный ученый академик А.П.Ершов сказал : «Программист должен обладать способностью первоклассного математика к абстракции и логическому мышлению в сочетании с эдисоновским талантом сооружать все, что угодно, из нуля и единиц. Он должен сочетать аккуратность бухгалтера с проницательностью разведчика, фантазию автора детективных романов с трезвой практичностью экономиста». Образно можно сказать, что программист должен сочетать в себе легкость и полет таланта Моцарта с усидчивостью и скрупулезностью Сальери.
Программирование — не искусство и не наука — это ремесло. Сегодня мы так же далеки от индустриальной разработки программ, как и 50 лет назад.
А поскольку это ремесло, то человек, научившийся писать программы на C++, будет так же далек от профессионала, как ученик третьего класса средней школы, научившийся писать по-русски, от А. С. Пушкина или Ф. М. Достоевского. Путь к мастерству в ремесле лежит только через опыт. Нельзя научиться программированию, читая книги. Как нельзя по книгам научиться писать романы, картины, стихи, музыку. А еще программистам нужен постоянный труд самоусовершенствования и саморазвития. Поэтому далеко не все, кто пишет программы, становятся профессионалами.
Почему-то, если мы говорим о поэтах, художниках, композиторах, то разброс творческой производительности никого не удивляет. «Творческий полет», «творческий застой» — это про деятелей искусства. А когда говорим о неравномерности производительности программистов, то многие менеджеры начинают с этим спорить, и пытаются «пинать» программистов, как будто это заставит их думать быстрей.
Не заставит. Но может заставить уволиться или заняться имитацией работы.
Правда, существуют еще инженерные дисциплины такие, как строительство, машиностроение, авиастроение и другие отрасли материального производства, в которых над созданием новых изделий трудятся сотни тысяч человек. Очень велик соблазн провести аналогию с этими отраслями и говорить об индустриальном подходе к разработке ПО. Не получается.
Упрощенно, путь от идеи до ее реализации в этих отраслях выглядит следующим образом: НИР-ОКР-завод. В верхней части этой пирамиды находятся отраслевые НИИ, которые производят идеи и занимаются проектированием новых изделий. На втором этаже пирамиды работают конструкторы в конструкторских бюро, в задачу которых входит реализация нового проекта в чертежах деталей и технологиях изготовления и сборки. На нижнем уровне находятся производственные мощности — заводы, на которых инженеры и рабочие воплощают «в железе» чертежи и технологии.
Если проводить аналогию, то программисты работают исключительно на вершине описанной пирамиды. Программирование — это проектирование и только проектирование. Роль конструкторского бюро для программного проекта выполняют компилятор и сборщик программ. А программистским аналогом завода, который переводит конструкторскую документацию в продукт, доступный потребителю, служит вычислительный комплекс, на котором развертывается и выполняется созданная программа.
А теперь давайте вспомним, сколько НИР так и остались на бумаге, не дойдя до ОКР, и сколько еще ОКР закончилось закрытием тематики. Я думаю, что процент инноваций, дошедших до производства от общего числа проектов, выполненных в отраслевых НИИ, будет сравним с процентом успешных программных проектов. И давайте еще учтем, что ученые в НИИ опираются на достаточно хорошо изученные законы математики, физики и химии, а программирование, как мы отмечали выше, пока остается лишь ремесленным производством.
Для коллективного программистского творчества скорее уместна аналогия с созданием художественного кинофильма или театрального спектакля.Количество провальных проектов в этих областях ничуть не меньше, чем в программировании. Дай Бог, если хотя бы пятая часть кинофильмов не «ложится на полки» после первого показа. Об этом же пишет авторитет в управлении программными проектами У.Ройс : «Менеджеры программных проектов смогут добиться большего, если будут применять методы управления, характерные для киноиндустрии».
И еще одна аналогия программных проектов с кинематографом. Наличие даже самых звездных актеров не обеспечивает успех фильма. Только талантливый режиссер способен организовать и вдохновить актеров на создание шедевра, открыть новые звезды. А талантливых режиссеров, как, впрочем, и талантливых менеджеров программных проектов, к сожалению, не так много, как хотелось бы.
Организационная структура это согласованное и утвержденное распределение ролей, обязанностей и целей деятельности ключевых участников проекта. Она в обязательном порядке должна включать в себя систему рабочих взаимоотношений между рабочими группами проекта, систему отчетности, оценки хода выполнения проекта и систему принятия решений. Следует помнить, что организационная структура проекта — «живой» организм. Она начинает складываться на стадии планирования и должна меняться по ходу проекта.
И еще. Нестабильность организационной структуры — частая смена исполнителей — может стать серьезной проблемой в управлении проектом, поскольку, существует цена замены, которая определяется временем вхождения нового участника в контекст проекта.
Планирование реагирования на риски — это процесс разработки путей и определения действий по увеличению возможностей и снижению угроз для целей проекта. Данный процесс начинается после проведения качественного и количественного анализа рисков.
Запланированные операции по реагированию на риски должны соответствовать серьезности риска, быть экономически эффективными в решении проблемы, своевременными, реалистичными в контексте проекта и согласованными со всеми участниками.
Согласно возможны четыре метода реагирования на риски: ¦ Уклонение от риска (risk avoidance).
Передача риска (risk transference). Снижение рисков (risk mitigation). Принятие риска (risk acceptance).
Уклонение от риска предполагает изменение плана управления проектом таким образом, чтобы исключить угрозу, вызванную негативным риском, оградить цели проекта от последствий риска или ослабить цели, находящиеся под угрозой (например, уменьшить содержание проекта). Некоторые риски, возникающие на ранних стадиях проекта, можно избежать при помощи уточнения требований, получения дополнительной информации или проведения экспертизы. Например, уклониться от риска можно, если отказаться от реализации рискованного функционального требования или самостоятельно разработать необходимый программный компонент, вместо ожидания поставок продукта от субподрядчика.
Передача риска подразумевает переложение негативных последствий угрозы с ответственностью за реагирование на риск на третью сторону. Передача риска просто переносит ответственность за его управление другой стороне, но риск при этом никуда не девается. Передача риска практически всегда предполагает выплату премии за риск стороне, принимающей на себя риск. Например, заказ на стороне разработки рискованного компонента по фиксированной цене. В IT часто приходится формулировать риски в виде допущений, тем самым передавая его заказчику. Например, оценивая проект внедрения, мы можем записать допущение о том, что производитель не изменит стоимость лицензий на базовое ПО.
Обеспечение качества еще одна из базовых областей знаний в программной инженерии. Относительно того, что такое качество ПО и как его эффективно обеспечивать, можно рассуждать очень и очень долго. В нашем курсе мы ограничимся утверждением о том, что обеспечение качества это важная работа, которая должна быть спланирована заранее и выполняться по ходу всего программного проекта, а не только во время приемо-сдаточных испытаний.
При планировании этой работы необходимо понимать, что продукт проекта не должен обладать наивысшим возможным качеством, которое недостижимо за конечное время. Необходимое качество продукта определяется требованиями к нему. И еще. Основная задача обеспечения качества это не поиск ошибок в готовом продукте (выходной контроль) а их предупреждение в процессе производства. Для примера, гладкость обработки детали на токарном станке только случайно может оказаться соответствующей требуемому качеству в 1 микрон, если шпиндель, в котором крепится деталь, плохо центрован.
План управления качеством должен включать в себя следующие работы:
Объективную проверку соответствия программных продуктов и технологических операций применяемым стандартам, процедурам и требованиям. Определение отклонений по качеству, выявление их причин, применение мер по их устранению, а также контроль исполнения принятых мер и их эффективности. Представление высшему руководству независимой информации о несоответствиях, не устраняемых на уровне проекта.
Помимо перечисленных разделов план проекта должен включать еще:
План управления рисками Оценку трудоемкости и сроков работ
Эти вопросы будут рассмотрены далее в специальных лекциях.