Оценка трудозатрат выполнения проекта по разработке ПО: практика в условиях украинской реальности
Авторы: А. Анисимов
Источник: http://habrahabr.ru/company/infopulse/blog/134719/
Вступление
К написанию данной статьи меня подтолкнул не очень давно завершившийся проект. Как и в любом другом проекте, в нем были и ошибки (в том числе и при оценке), и проблемы и интересные их решения, и, несмотря ни на что, боевой дух команды, и желание сдать проект во время, и переработки и таки сдача проекта в срок, и долгожданный отпуск. Все это стоит отдельной статьи. Но главное — был бесценный опыт, на основании которого создана эта статья.
Очень часто, мы оцениваем проект и сильно ошибаемся. И вроде как из-за мелочей, которые появляются по ходу проекта, но которые, в действительности, можно было бы и обнаружить и учесть заранее.
Статья содержит простые и в тоже время полезные рекомендации и метод расчета оценок трудозатрат проектов и будет интересна руководителям проектов, архитекторам, системным аналитикам, продавцам ИТ решений и всем остальным, кто занимается оценкой работ по проектам с фиксированной ценой (fixed price projects).
В статье мы займемся только оценкой трудозатрат по работе над проектом, оценка длительности выполнения и стоимости – это совсем другая история.
В статье я описываю свой личный опыт оценки проектов, и,
конечно же, у вас могли быть другие ситуации и свои методы и
рекомендации оценивания.
Для большего понимания сути, смысла и «духа» статьи рекомендую сначала просмотреть:
- выступление Сергея Мартыненко «Написание тестов, как вид тестирования требований»[1], на которое я буду часто ссылаться в ходе данной статьи. Важно понимать, что правильно сформулированные цели и требования – это большой и важнейший шаг к успеху проекта
 - и презентацию Сергея Бережного
«My Story: «Путь овертаймов» [2]. По большому счету данная презентация к теме статьи не имеет, но имеет отношение к неправильно оцененным трудозатратам.
 
Статья содержит такие разделы:
- Украинские реалии при выполнении проекта
 - Проблемы и их решения
 - Подготовка к оценке
 - Перечень работ для оценивания
 - Оценка работ по написанию кода
 - Цифры и коэффициенты из практики
 - Пример расчета
 
Украинские реалии при выполнении проекта
На отечественном рынке преобладают проекты с фиксированной ценой (когда бюджет и сроки планируются заранее, при заключении договора). При оценке проекта, команда кроме стандартных рисков и проблем должна учитывать «современный и эффективный» подход заказчиков, которые, хотят совместить:
- С одной стороны, получение точных оценок по бюджету и срокам до написания ТЗ, включение их в договор, и далее, при выполнении проекта, жесткий контроль этого бюджета и сроков.
 - Со второй — гибкость со стороны команды разработчиков, реализацию всех появляющийся по ходу проекта требований заказчика (т.к. заказчик часто до середины проекта сам не знает, чего хочет).
 - С третьей – несмотря на непонимание, того, что и как должно быть реализовано, нещадно «режут» задачи плана проекта (для уменьшения стоимости) в том числе и функции, которые все равно придется выполнять команде.
 
При неудачном управлении проектом (если команда идет на поводу у заказчика) команда легко превышает сроки и бюджет, т.к. контракт подписан и бюджет согласован, далее работает в себе убыток.
Понятно, что винить только заказчика во всем – неправильно. Нужно понимать, что оценка проекта часто проводится без достаточного анализа требований, недостаточно и неправильно расписываются задачи, и очень часто, в оценку включается только программирование, в недостаточном количестве учитывается тестирование и управление. При подписании контракта продавцы идут навстречу заказчику, снижая цену, а в ходе проекта недостаточно жестко отстаивает свою позицию команда (руководитель проекта в первую очередь, но в данном случае стоит говорить «команда», т.к. все участники должны быть нацелены на результат и в случае участник видит/предвидит проблему должен ее доносить руководителю).
Кроме этого, есть еще один фактор – разнообразие проектов, систем и технологий, и недостаток квалифицированных специалистов. Это значит, что при планировании проекта архитектор или руководитель проекта могут не учесть, что могут в команду получить специалиста, который ранее не выполнял подобных задач или с специалиста с недостаточной квалификацией. Понятно, что в этом случае производительность будет ниже ожидаемой.
Как же можно поступить в этой ситуации? Как оценить проект так, чтобы предполагаемые трудозатраты были достаточно точными?
Для начала стоит рассмотреть проблемы и попытаться найти их решение.
Проблемы и их решения
1. Заказчик хочет знать точные цифры по стоимости и срокам проекта до подписания договора
Решение:
1.1. Выявить и сформулировать критерии приемки работ. Как это сделать? Посмотрите [1]. Суть в том, что нужно заказчику задать правильные вопросы: «Как вы узнаете, что проект успешен ?» и «Кто, кому и как будет сдавать систему?», а также у человека, который будет принимать решение получить ответ на вопрос «что нужно сделать, чтобы проект был принят»
1.2. Выявить как можно больше требований и, самое главное, ограничений к проекту (т.е. не только функциональные, но и не функциональные требования)
1.3. Протестировать требования. Если говорить более простым языком, требуется проверить, что написанные требования реалистичны, непротиворечивы, и сформулированы так, что можно однозначно проверить соответствует ли им решение. Опять же рекомендую посмотреть [1]
1.4. Исходя из этого, расписать как можно детальнее перечень задач (смотрите дальше в статье)
2. Заказчик хочет видеть более-менее детальный перечень работ, который при согласовании стоимости проекта, при первой же возможности режет самым неподходящими способами
Решение:
В плане работ важно выделять все задачи, а не только «видимые»
Например, есть требования пользователей по просмотру определенных данных. Команда выявила, какие задачи нужно реализовать и оценила общий объем работ в 56 часов, разбив их таким образом:
- Возможность просмотра всех записей – 8 часов
 - Возможность фильтрации по полю 1 – 8 часов
 - Возможность фильтрации по полю 2 – 8 часов
 - сортировка по полю 1 – 8 часов
 - сортировка по полю 2 – 8 часов
 - группировка по полю 1 – 8 часов
 - группировка по полю 2 – 8 часов
 
Но в действительности под этими задачами есть базовая функциональность – создание таблиц в БД, хранимых процедур или представлений для выборки, создание бизнес-объектов, подключение их к модулю безопасности, подключение к модулю протоколирования, конфигурации и прочее.
Что будет, если заказчик скажет: нет это слишком долго. Давайте уменьшать, и уберет задачи по группировке и сортировке(минус 32 часов). При этом продавцу, который обсуждает работы по проекту «крыть нечем». А с другой стороны за 24 часа весь объем в принципе не успеть.
Поэтому я рекомендую выделить базовую функциональность, убрать которую можно только убрав всю задачу целиком. В данном примере — эта задача «Выборка данных из базы данных» занимает, допустим, 28 часов, а остальные задачи — по 4 часа.
Это позволит при торгах более правильно вести себя продавцу, не подставляя к тому же команду. Убрав ненужные функции, все равно останется достаточное количество времени на разработки.
3. Детальный анализ требований, написание ТЗ и более-менее четкая область работ по проекту происходит после подписания договора
Решение:
3.1. Выявить как можно больше требований и ограничений к проекту, которые требуется реализовать в системе и как каждое требование правильно сформулировать и проверить [1].
3.2. Очень часто получается так, что пункты, которые заказчик убрал, все равно всплывают и их приходится делать, и поэтому, чтобы защитить себя, в договор, кроме плана проекта, нужно вносить и пункт ограничивающий рамки проекта. В него следует внести все пункты которые заказчик убрал из предлагаемого плана, а также другие пункты, которые команда видит и считает явно выходящими из рамок проекта. Все методологии разработки ПО акцентируют на это внимание. Фактически это может быть оформлено как приложение к договору или как часть технического задания.
3.3. Очень важно определить работы, что должно быть выполнено силами заказчика. Это также требуется зафиксировать в договоре (приложении к договору, техническом задании) с указанием сроков выполнения
4. Практически до середины проекта заказчик сам не знает, чего хочет (не говоря о стадии сбора требований)
Решение:
4.1. Включить временные рамки возможных изменений (т.е. на каких этапах изменения, в принципе, возможны)
4.2. Запланировать периодические демонстрации (например, на этапах сбора требований и планирования – раз в неделю, на этапе разработки – раз в две недели ) в учитывать трудозатраты по их подготовке и проведению
Демонстрации следует проводить не только для бизнес-заказчиков, но и для сотрудников других подразделений заказчика, потенциально вовлеченных в проект (системные администраторы, ключевые пользователи, служба безопасности и т.п.)
Это позволит на ранних этапах получить замечания, обсудить проблемы, позволит пользователю привыкнуть к интерфейсу и функционалу
5. Заказчик хочет, чтобы команда гибко подходила к его пожеланиям (изменения, дополнения) и реализовывала их в рамках проекта, а не в рамках последующих доработок, и при этом заказчик категорически ничего не хочет слышать про изменение бюджета проекта
Решение:
5.1. В план проекта явно включаем время на возможные изменения (закладываем буфер по срокам и по бюджету, вне заложенных рисков), которые по требованию заказчика будут потрачены на нужные ему изменения и доработки. Это, во-первых, дает возможности по работе над изменениями в рамках проекта, а во вторых заставляет заказчика вдумчиво относиться к запросам на изменение, т.к. этот ресурс уже явно ограничен
5.2. Учесть возможность итерационного подхода к разработке и спланировать эти итерации. Учесть количество встреч, поставок, демонстраций и прочее.
5.3. Как написано выше, в договор (как приложение к договору, или в техническое задание) включаем пункт, описывающий все то, что выходит за рамки проекта и от чего заказчик явно отказался.
6. Заказчик хочет видеть множество документации по системе.
Решение:
Включаем в расчет стоимости проекта стоимость на создание документации (как вы увидите ниже, сумма может получиться существенная)
7. В случае, если проектная команда формируется заново, есть риск, что квалификация того или иного специалиста может оказаться ниже ожидаемой.
РешениеПри планировании задач и времени на их выполнение, необходимо ориентироваться на специалистов на уровень ниже, чем ожидается привлечь к проекту
8. ИТ технологии и задачи становятся все сложнее, что все сложнее выявить подводные камни выбранных технологий на ранних стадиях проекта
Решение:
8.1. Нужно закладывать в план определенное время на риски, которое команда может использовать по своему усмотрению
8.2. Как можно раньше выполняем задачи, связанные с рискованными технологиями
С чего начать
- Как писал ранее, поймите, что нужно сделать, чтобы достигнуть цели проекта и сдать [1]
 - Выявить как можно больше требований и ограничений к проекту. Не забудьте выявить требования к: 
a. Документации. Если вы не знаете, какая документация к ПО бывает – можно обратиться, например, к ГОСТ (ЕСПД) 19.101-77 «Виды программ и программных документов» [3] или спецификациям других методологий, и исходя из этого предложить заказчику перечень, из которого он сможет выбрать нужное
b. Нефункциональным требованиям [4], которые, например, могут включать: локализацию, резервное копирование, мониторинг, протоколирование, безопасность, миграция данных, первоначальная заливка данных, требования к установке, требования к конфигурированию.
Такую информацию можно получить у служб ИТ-поддержки заказчика и безопасности. - Протестировать полученные требования [1]
 - Как можно детальнее распишите перечень задач, так чтобы каждая задача имела вполне измеримые сроки выполнения. Например, на этапе оценки проекта задачи разбивать и оценивать можно до дня
 - В оценке должны участвовать специалисты по разным направлениям: руководитель проекта, разработчик, тест-инженер, специалист по развертыванию и внедрению, специалист по удобству использования, специалист по управлению продуктом (product manager, им может быть то же аналитик)
 
Перечень работ для оценивания
Прежде, чем перейдем к конкретным цифрам и коэффициентам, рассмотрим какие задачи нужно не забыть включить в перечень задач
Этап анализа и сбора требований
- Встречи с заказчиком для проведения интервью и доклада о результатах
 - Написание документа требований
 - Тестирование требований
 - Написание и согласование договора и других инициирующих проект документов
 
Проектирование решения 
- Написание ТЗ
 - Написание архитектуры решения
 - Тестирование ТЗ и архитектуры решения
 - Обучение специалистов предметной области
 - Установка сред разработки и тестирования
 - Написание тест-плана и вариантов тестирования системы
 - Встречи с заказчиком
 
Разработка и внутреннее тестирование 
- Еженедельные встречи разработчиков
 - Программирование
 - Улучшение кода
 - Демонстрации (подготовка и проведение)
 - Первая установка решения на среду тестирования
 - Прохождение тест кейсов
 
Тестирование на стороне заказчика 
- Первая установка в тестовую среду заказчика
 - Поставки бета версий
 - Доработка и исправление неисправностей
 
Внедрение 
- Установка на рабочий сервер
 - Обучение пользователей
 - Написание инструкций
 
Дополнительно 
- Время на риски
 - Время на изменения
 - Управление проектом
 
Первым делом следует оценить срок работ по программированию решения, после этого можно применять дополнительные коэффициенты и предположения для расчета полного срока проекта.
Оценка работ по написанию кода
Для оценки работ по разработки рекомендую придерживаться таких правил:
* Для достижения цели проекта разбейте ее на пользовательские действия (User stories), которые разбейте на задачи, которые в свою очередь на подзадачи и т.д. И так до тех пор, пока каждая задача станет понятной человеку уровня младший специалист (Junior Developer), и будет иметь четкие критерии, как проверить ее реализацию
* Не забывайте выделять базовые задачи, которые нельзя исключать
Не забудьте учесть такие задачи:
- Создание утилиты установки
 - Создание утилиты конфигурации (возможно, их будет несколько: первичная настройка, настройка системных параметров, настройка безопасности) 
 - Создание утилиты первичной заливки данных и, возможно, утилиту миграции на новую версию 
 - Создание утилит диагностики (утилиты, которые помогут проверить, все ли установлено правильно, и помогут выявлять неисправности) 
 - Создание модуля протоколирования (логирования). Даже если заказчику он не нужен – он в значительной мере поможет выявлять ошибки и недостатки. 
 - Создание модуля безопасности
 
Цифры и коэффициенты из практики
- Для введения в проект нового человека и установку ему среды разработки, запланируйте не менее 40 часов (1 неделя)
 - Еженедельные встречи разработчиков – 4 часа каждую неделю для каждого разработчика
 - Первичная установка решения на тестовый сервер – запланируйте 80 часов (2 недели)
 - Для подготовки каждой демонстрации – 8 часов (время которое требуется архитектору для сборки и проверки модулей перед демонстраций; 8 часов если в проекте 3 разработчика, если разработчиков больше – то аналогично увеличиваем)
 - Встречи (демонстрации) с заказчиком – каждая встреча по 4 часа (на встречу по моему опыту лучше ездить троим: руководитель проекта, архитектор, аналитик или специалист по тестированию)
 - Первая установка в тестовую среду заказчика – 40 часов
 - Первая установка в рабочую среду заказчика – 40 часов
 - Подготовка и отправка каждой поставки – 8 часов (это включает компиляция, упаковка, написание процесса установки, помощь в установке)
 - Доработка и исправление неисправностей (refactoring) – 25% от разработки
 - Задачи по тестированию 30-50% от времени, потраченного на разработку (разработку документа требований, разработку ТЗ, функционала и прочее)
 - Время на риски – по крайней мере, 10% от общего времени
 - Время на изменения – по крайней мере, 10% от общего времени
 - Управление проектом – 15% от всего времени проекта
 - Доработка и исправление неисправностей – 25% от времени на разработку
 - Аналитик в среднем создает 3 страницы утвержденной документации в день
 
Пример расчета
Допустим, в результате оценки получились некоторые цифры
- Проанализировав задачи на разработку (включая проектирование) у нас получилось 1200 человеко-часов.
Принимаем решение, что задачи по разработке будут вести 3 разработчика. Тогда работы по разработке будут занимать 10 недель. - Требуется писать и согласовывать много документации, включающее требования, ТЗ, архитектуру решения, инструкции пользователям и прочее. Общий полезный объем на выходе – 400 страниц
 - Приложение имеет сложную бизнес-логику, поэтому тестирования много (поэтому берем 40% от разработки)
 - Планируем 5 встреч с заказчиком для выявления требований
 - Планируем 3 встречи с заказчиком для согласования видения и проекта решения
 - Планируем 4 демонстрации продукта заказчику на этапе разработки
 - Планируем 10 поставок на тестовую среду заказчика
 
Исходя из этого, принимаем решение, что для данной оценки будем ориентироваться на следующий состав команды:
- 3 разработчика
 - 1 тест инженер
 - 1 бизнес — аналитик
 - 1 системный аналитик (архитектор, он же будет выполнять инфраструктурные задачи)
 - 1 руководитель проекта
 
Теперь распишем задачи и время на выполнение. При этом по задачам связанным с созданием документации и ее тестирования ячейки пустые, внизу таблицы единое поле, содержащее сводную информацию исходя из создания документов на 400 страниц.
| Задачи | 
Роли | 
Количество человек | 
Время | 
Всего | 
| Этап анализа и сбора требований | 
  | 
  | 
  | 
  | 
  | 
Руководитель, аналитик, архитектор | 
3 | 
5раз х 4часа | 
60 | 
  | 
Аналитик, архитектор | 
    | 
    | 
    | 
  | 
тест инженер | 
  | 
  | 
  | 
  | 
Руководитель проекта | 
1 | 
  | 
  | 
| Проектирование решения | 
  | 
  | 
  | 
  | 
  | 
Аналитик, архитектор | 
  | 
  | 
  | 
  | 
архитектор | 
1 | 
40 | 
40 | 
  | 
тест инженер | 
  | 
  | 
  | 
  | 
Все | 
7 | 
40 | 
280 | 
  | 
Архитектор, разработчики | 
4 | 
16 | 
64 | 
  | 
тест инженер или архитектор  | 
1 | 
40 | 
40 | 
  | 
тест инженер | 
  | 
  | 
  | 
  | 
Руководитель, аналитик, архитектор | 
3 | 
3 раза х 4часа | 
36 | 
| Разработка и внутреннее тестирование | 
  | 
  | 
  | 
  | 
  | 
Архитектор, разработчики | 
4 | 
10 встреч по 4 часа | 
160 | 
  | 
Разработчики | 
3 | 
400 | 
1200 | 
  | 
архитектор | 
1 | 
3 х 100 | 
300 | 
  | 
архитектор | 
1 | 
4 демонстрации по 8 часов | 
32 | 
  | 
Архитектор, руководитель проекта, аналитик | 
3 | 
3 х 4  | 
36 | 
  | 
тест инженер | 
1 | 
  | 
480 | 
  | 
специалист по тестированию или архитектор  | 
1 | 
80 | 
80 | 
| Тестирование на стороне заказчика | 
  | 
  | 
  | 
  | 
  | 
архитектор  | 
1 | 
  | 
40 | 
  | 
архитектор | 
1 | 
10 поставок по 8 часов | 
80 | 
  | 
Разработчики | 
2 | 
  | 
300 | 
| Внедрение | 
  | 
  | 
  | 
  | 
  | 
архитектор | 
  | 
  | 
40 | 
  | 
Аналитик  | 
1 | 
3 х 4 | 
12 | 
  | 
Аналитик | 
  | 
  | 
  | 
  | 
Часть аналитик, часть архитектор | 
  | 
135 дней по 3 страницы | 
1080 | 
  | 
Тест инженер | 
  | 
30% от ее написания | 
320 | 
| Итого | 
   | 
   | 
   | 
4680 | 
| Дополнительно | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
10% от разработки | 
120 | 
  | 
  | 
  | 
10% от разработки | 
120 | 
  | 
Руководитель проекта | 
  | 
15% от проекта | 
700 | 
| Всего | 
    | 
Приблизительно 5620 часов | 
||
Исходя из полученных данных, оценка непосредственно задач разработки (1200 часов) намного меньше полных трудозатрат (более чем в 4 раза).
Большое количество времени уходит на тестирование и оптимизацию кода, написание документации, введение в проект специалистов (включая установку среды для работы) и управление проектом.
Заключение
Повторюсь, что данные выкладки — это мои практика и наблюдения относительно определения трудоемкости (напомню, что в статье не рассматривается оценка длительности проекта и его бюджет) и, соответственно, у вас могут быть свой опыт и свои методы и рекомендации по оценке трудоемкости работ
С удовольствием выслушаю критические отзывы и замечания для улучшения данной методики.
Надеюсь, что данная статья поможет вам более обосновано и более четко давать оценки по проектам, и вовремя учитывать как можно больше «мелочей», которые могут повлиять на трудозатраты в ваших проектах.