В Шенноне у киля Boeing-707. Ночной кошмар проектировщика и заказчика ;-)

Главная Статьи Разработки Интересы О себе

 

Статья, которую Вы видите, была создана на основе анализа типичных заблуждений, очень распространённых у разработчиков программного обеспечения и их начальников. В русскоязычном Интернете почти нет ресурсов, где эта тема бы бы затронута достаточно глубоко, что и подвигло меня на её создание. Я пытаюсь обобщить свой почти 20-летний опыт разработчика, руководителя проектов и директора по ИТ на конкретных примерах. Возможно, Вы найдёте для себя что-то полезное.

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


Всё перечисленное обычно имеет вполне разумное объяснение и единственным эффективным лекарством для проекта становится его реинжиниринг. Пора дать определение: "Реинжиниринг - это полное или частичное перепроектирование системы для достижения скачкообразных улучшений". Следует особо остановится на термине "улучшение". Многие склонны считать, что любое улучшение предполагает, что оно делается ради заказчика и так или иначе доступно пользователю. К сожалению, это ошибочное и вредное заблуждение очень распространено.

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

Рассмотрим основные типы компаний, занимающихся разработкой программного обеспечения:

Как же рассчитать экономическую целесообразность и экономический эффект, особенно если программное обеспечение непосредственно товаром не является? Алгоритм расчёта несложен: возьмите любой проект сопоставимой сложности и трудозатратам из числа уже выполненных. Для него вы можете полностью посчитать по факту затраты предприятия. Грубо можно заработную плату всех задействованных сотрудников умножить на два за весь период создания и развития проекта. Далее вам понадобится прототип с использованием того самого нового подхода, который вам предстоит обсчитать. Обычно прототип представляет собой одну или несколько подсистем, функционально эквивалентных старым, но с переработанным (или написанным заново) кодом и внутренним наполнением. После этого несложно вычислить коэффициент как отношение количества строк в старой подсистеме к количеству строк в прототипе. Всё! Ваша задача решена, точность оценки вполне достаточна для оценки экономического эффекта и беседы с финансистом.
Из моего личного опыта, получаемый коэффициент очень близок к истине. Так в 2008 году я функционально повторил и даже перекрыл по возможностям систему верхнего уровня для нефтедобычи, состоящую из более 140 тысяч строк кода на C++. После глубокого реинжиниринга там осталось только 38 тысяч, коэффициент =3.68. Примерно во столько же раз теперь отличается трудоёмкость сопровождения этого комплекса, которая ранее вызывала слабость в коленях и дурные сновидения ;-) Теперь это любые изменения делаются играючи.

Почему так происходит? Дело в том, что как бы не осуществлялось руководство проектом, со временем в нём накапливаются "симметричные изменения". Под этим термином я понимаю схожие фрагменты кода, в которых, однако, есть небольшие отличия. В описанном выше проекте таких мест было иногда до трёх! То есть, для того, чтобы поправить какую-то величину, было необходимо найти по тексту 2-3 фрагмента кода, где эти изменения фактически нужно было сделать. Конечно, это скорее всего было следствием ошибки архитектора. При правильном подходе этого вроде бы не должно было случиться, но в реальных системах это происходит почти всегда. И кому легче от знания, что его предшественник допустил стратегическую ошибку? Никому! Важно уметь из этой ситуации выходить с наименьшими затратами и реинжиниринг проекта даёт возможность это сделать.
Даже если компания продаёт что-то другое, необходимо помнить, что косвенно все затраты на создание ПО, всё одно, включены в себестоимость изделия. Не стоит, конечно, утилитарно понимать под сокращением расходов только банальное увольнение программистов. Как правило, проект бывает не один и высвободившиеся силы можно перенацелить на другие задачи. К таким задачам может относиться создание полигонов и стендов для тестирования, улучшение документации и многое другое, до чего руки обычно просто не доходят.

Необходимо отдельно остановиться на такой скользкой теме, как документация. Данная тема является традиционно больной для всей ИТ-индустрии, а не только разработки ПО. В 90% компаний документации либо нет совсем, либо лучше бы её не было. Это вполне объяснимо т.к. разработка хорошей документации по друдоёмкости сопоставима с разработкой программного продукта. Да ещё ведь за актуальностью документации надо постоянно следить, иначе пользы от неё не будет никакой. Конечно, всегда находится немало желающих на этом экономить, а результатом обычно является потеря управляемости проекта в самый неподходящий момент. Самое время привести критерии, когда без документации обойтись можно:

Во всех остальных случаях документация необходима. Более того, она часто позволяет экономить время на увязывание компонентов системы между собой и сокращает дрязги среди разработчиков на порядок. Итак, документация совершенно необходима, если: Всё перечисленное сказано о проектной документации, которая должна составляться руководителем проекта. Обычно в ней укрупненно описывают основные идеи, заложенные в архитектуру комплекса или его подсистем. Детальное же описание сообщений протокола, API и используемых структур для удобства правильнее выделять в виде приложений. Создание проектной документации после создания системы - глупость. Основная концепция должна быть написана до начала работ, а детальные описания могут создаваться в процессе реализации. Но никак ни наоборот!
Пользовательская же документация (руководство пользователя) пишется "техническим писателем". Это маркетинг чистой воды, поэтому о пользовательской документации пусть болит голова у директора по продажам. Правда, это не отменяет необходимости проверить данный документ на предмет технических ошибок во избежании различных недоразумений.

Не секрет, что любую идею можно довести до абсурда. Нередко к этому приводят внутренние принципы оплаты труда в компании. Например, нет ничего абсурднее требования чтобы "комментарии составляли не менее 40% текста программы" или "все используемые переменные должны быть описаны в заголовке файла". Как правило, к таким требованиям все относятся формально и пользы делу это не приносит. Мне как-то в руки попадал фрагмент кода одной крупной системы, разработчикам которой платили за написанные ими строки кода. Мало того, что весь исходник был искусственно раздут, так ещё в нём встречались блоки, куда управление заведомо никогда попасть не может ;-). Видимо, кто-то очень хотел срубить побольше денег и таким образом повышал свою "производительность труда". А теперь представьте себе, что Вам лет через 10-15 нужно что-то изменить в такой системе? Каково будет разбираться в той куче мусора, которая была "для денег"?!

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

Предание гласит, что при проектировании советского лунохода конструкторы долго не могли решить какие колёса ставить на луноход. Если маленькие - луноход может забуксовать и увязнуть, а если большие - придётся переделывать головную часть ракеты т.к. луноход не поместится под обтекатель. В этой ситуации Генеральный конструктор взял решение на себя и издал приказ: "Приказ №... Пыли на Луне нет. Королёв".

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

Некоторые подходы, способные помочь при реинжиниринге проекта, Вы найдете в статьях, размещённых на этом сайте.

 

© Пчелинцев А.В. 2009-2011. Использование материалов допускается только с разрешения автора.

Используются технологии uCoz