процесс разработки


Давным-давно, в одной далекой галактике корпорация “Пупкин-Трейд”, дистрибьютор ароматизированных плющевых медведей в уездном городе Н, захотела внедрить информационную систему. Выбор пал на стандартный продукт “2D Предприятие”. Быстро выяснилось, что используемую у них модель складского учета невозможно представить в системе: отсутствуют необходимые атрибуты и операции, жизненный цикл единиц хранения и близко не похож на реальность, возможные настройки системы не позволяют даже в первом приближении решить проблему. Перед маленькой, но гордой компанией остро встал вопрос “Что делать?”.

Эта проблема настолько распространена, что в ту самую минуту, в которую вы читаете эту статью, в нескольких местах страны грустные люди тихо кроют матом коробочные продукты, не стыкующиеся с таким важным технологиями. С ней сталкивается практически любая организация, желающая автоматизировать (хотя правильнее было бы сказать “информатизировать”) свою деятельность. Технологические процессы каждой организации хотя бы в некоторых аспектах уникальны. В результате, при попытке использования готовых продуктов автоматизации деятельность выясняется, что часть деятельности не может быть адекватно представлена в стандартной информационной модели.

История показала, что есть три основных решения.

Приведение системы поддержки процесса в соответствие с технологией

Тут, опять-таки, есть несколько основных способов:

  • Заменить выбранную систему на другую, более функциональную и богатую настройками. Основной риск заключается в том, что новая система, лучше соответствуя технологическому процессу, может быть заметно дороже или (а и иногда и “к тому же”) хуже качеством.
  • Написать с нуля свою систему, полностью удовлетворяющую требованиям. Вариант хорош тем, что “отменяет” большую часть ограничений на конечный результат: вы сможете сделать именно то что вам нужно. Основная проблема этого подхода в том, что затраты на разработку и поддержку, вероятно, превысят запланированные в несколько раз. Так практически всегда случается в разработке софта, но за эти-то внутренние поделки вам никто не платит.
  • Написать расширение к существующей системе. Альтернатива предыдущего варианта с разменом простоты написания на дополнительные ограничения и зависимость от чужого API.

Приведение технологии в соответствие с поддерживающей системой

Это может быть как хорошим, так и очень плохим вариантом. Все зависит от того, насколько новый процесс будет лучше или хуже старого и от того, чего вам будет стоить переход. Бывает, что в отсутствии информации о классических решениях типичных проблем люди создают очень экзотические технологии, не дающие особых преимуществ по сравнению со стандартными: типичное проявление синдрома изобретения велосипеда в организационном пространстве. В этом случае стоит воспользоваться случаем и заменить доморощенное решение стандартным. С другой стороны, часто бывает, что стандартная технология не годится. Такие случаи надо распознавать заранее, иначе попытка внедрения стандартной технологии приведет к очень болезненным последствиям.

Организация эффективной работы при несоответствии системы и технологии друг другу

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

Например, Trac, коим мы активно пользуемся, поддерживает только очень базовый жизненный цикл тикета: new -> accepted -> fixed. Нет отдельного статуса “in progress”. Нет статуса “тикет выполнен и передан на контроль качества”. Нет возможности настраивать жизненный цикл. Кроме того, наш текущий проект сильно выиграл бы от поддержки еще одного-двух дополнительных статусов.

Тоже мне проблема… Вместо “in progress” используем статус “accepted” (который нам по прямому назначению не нужен). Все остальные статусы вообще отображаются добавлением к тикету соответствующих комментариев. В результате имеем более-менее решенные проблемы поддержки нужных функций. При этом не надо писать не строки кода, не надо выбирать менее удобную в основных функциях систему, не надо страдать от полного отсутствия нужного функционала.

Другой пример. Посмотрим на комментарий, подтолкнувший меня к написанию этого поста:

# Алексей says: Я вот обнаружил, что для моего проекта Trac не очень подходит, а хотелось бы, т.к. интерфейс действительно удобный. В Trac понятия “version” и “milestone” привязаны к проекту целиком. В моём же проекте есть тесно зависимые по документации, но сильно отличающиеся по срокам релиза/версиям части. Поэтому, хотя Trac и поддерживает несколько проектов на одном компьютере, и даже исходники никто не мешает хранить в одном репозитории, я не могу пользоваться Trac, т.к. документация и тикеты не могут быть общими на несколько проектов, а версию/дату релиза невозможно сделать разными для частей одного проекта.

В данном случае, речь, очевидно, идет о необходимости отслеживания нескольких параллельных цепочек версий. Поскольку Trac этого не поддерживает, Алексей считает что Trac не подходит для этого проекта.

Позволю себе не согласиться. Кто мешает включить название или код “части системы” в имена Trac\’овских версий и Milestone\’ов? Да, это не так удобно как возможность включать в проект несколько параллельно идущих подпроектов, но пользоваться системой с неудобным интерфейсом гораздо хуже.

Сколько стоит неудобный интерфейс

Давайте посчитаем. Предположим, что у нас есть две багтреккинговых системы на выбор. В первой любая операция с багом (создание, назначение, комментирование, закрытие и т.д.) из-за плачевной юзабилити занимает на 3 минуты больше чем во второй (я сталкивался и с большими различиями). Возьмем небольшой проект: 4 человека. Среднее количество новых багов и задач за неделю будет в районе 40 штук. Пусть за весь жизненный цикл над багом совершается в среднем 4 операции: создание, назначение разработчику, исправление, проверка исправления. Потери времени, вызванные неудобным UI, будут равняться 40 x 4 x 3 = 480 минут в неделю. Это два часа на каждого члена команды! Я даже не считаю здесь потери, вызванные раздражением участников команды от того, как неудобно пользоваться багтреккингом, хотя можно предположить, что они тоже немаленькие.

Сколько стоит отсутствие нужной функции

Предположим, что наша багтреккинговая система не поддерживает какую-то нужную функцию, например, статус “in progress”. Для чего может быть нужен этот статус? Только для формирования отчета о выполняющихся в настоящий момент задачах. В зависимости от проекта этот отчет используется от пары раз в неделю до десятка раз в день. Допустим, что мы заменяем статус “in progress” статусом “assigned”, которым иначе бы не пользовались. В этом случае потери времени невелики - нужно просто научить всех участников проекта пользоваться одним статусом вместо другого. Теперь предположим, что мы вынуждены добавлять дополнительную информацию в название багов, а затем формировать отчет в полуавтоматическом режиме, что помимо потери времени на обучение ведет к потере 3 минут при каждом просмотре отчета. Если отчетом пользуются 5 раз в неделю, то мы теряем 15 минут за неделю, если 50 раз - порядка 150 минут за неделю.

Очевидно, что в приведенном примере замена более удобной системы на более функциональную является чистым проигрышем времени.

Подведем итоги

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

Процесс разработки ПО со временем обрастает множеством вспомогательных инструментов. Не только теми, которые помогают лучше писать, компилировать или тестировать код, но и теми, чье единственное предназначение - упорядочивать рабочий процесс. Вот практически минимальный набор для небольшого проекта: система контроля версий, багтреккинговая система, wiki. Действительно ли это нужно вашему проекту?

Зачем это нужно

Могу вывести несколько эмпирических закономерностей появления потребности в определенных инструментах:

  • Система контроля версий нужна даже для соло-проектов. Очень важна возможность не думать о ведении истории и о резервном копировании старых версий. Настолько важна, что глупо от нее отказываться для любого проекта длиннее пары дней, результаты которого могут вам понадобиться больше одного раза.
  • Пока разработчик один, обсуждать найденные ошибки можно и по электронной почте. Как только в проекте появляется два разработчика, вам становится нужен багтреккинг: как решение проблемы единого хранилища информации об ошибках. Эти же соображения относятся к планам работ, которые лучше всего вести в той же багтреккинговой системе. Туда же должны попадать все “заявки” от заказчиков - как сообщения об ошибках и неудобствах, так и запросы на добавление нового функционала.
  • Когда проекту становится нужна wiki? Как только написанием и редактированием документации начинает заниматься более одного человека. Я считаю, что в идеале написанием и редактированием документации должны хоть немного зниматься все разработчики. В противном случае страдает как качество и полнота документации, так и качество и полнота осмысления проекта его участниками. Первое - ерудна, но от второго проект будет очень сильно страдать. Для аутсорсинга wiki обладает еще одним преимуществом - чтобы документы читали, и программистам и заказчикам нужна возможность сделать это легко и просто. Чтение через браузер вполне подходит. Скачивание отдельных doc-файлов с FTP – не очень. Если документация лежит на FTP, то, как показывает мой опыт, практически никто до этого FTP не добирается.

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

Все в одном

Trac banner Есть замечательный инструмент, который обеспечит вас “базовым набором” для управления проектом. Я говорю о Trac. Это багтреккинговая система, wiki и тесная интеграция с subversion в одном флаконе. Основная цель Trac в том, чтобы обеспечить проект основным инструментарием управления, как можно меньше путаясь при этом под ногами участников. Заявленная цель достигнута: Trac действительно объединяет в себе практически все необходимые функции инструмента управления проектом и одновременно по минимуму заставляет участников проекта заниматься ненужной работой. В других багтреккинговых системах, которыми я пользовался, рутинные и не очень нужные операции отнимают гораздо больше ценного человеческого времени.

Что мне понравилось в Trac

  • Автоматическое закрытие бага при помещении исправления в source control. Если вы пользуетесь Subversion, то разработчику достаточно написать в комментарий “Fixes #89. Now database exceptions are handled properly” при очередном коммите - и баг номер 89 будет отмечен как fixed с соответствующим комментарием. Вот так выглядит такой баг в истории изменений: Trac ticket closed by commit
  • Wiki для всей документации. Огромный шаг вперед по сравнению с набором несвязанных документов, разбросанных по FTP / файловому серверу. Вы получаете:
    • Возможность с легкостью создавать ссылки между документами
    • Полную историю изменений любого документа
    • Беспроблемное совместное редактирование
  • Timeline. Функция Timeline позволяет получить единый отчет о всех изменениях в коде, документации и багах. Позволяет постоянно “держать руку на пульсе” прогресса работ. Очень удобно не только для менеджера, но и для разработчиков, у которых по определению мало времени на отслеживание текущей ситуации.
  • Интегрированный просмотр изменений. Любое изменение кода можно просмотреть в виде раскрашенного diff прямо в Trac. Эта возможность экономит много времени при ревью исправлений или изменений - не нужно смотреть в одном окне историю изменений, а в другом - искать эти изменения в логе Subversion и генерить diff; вместо этого достаточно просто открыть ссылку в Trac. Вот как это выглядит: Viewing changeset in Trac

Что не понравилось

  • Долгая и сложная инсталляция. Trac требует для своей работы несколько сторонних компонентов, которые надо ставить отдельно. Инсталляция всего этого зоопарка на моем хостинге отняла у меня около 7 часов, заполненных попытками все это правильно поставить. И это при наличии инструкции. Впрочем, установка под root была бы заметно проще. Помимо инсталляции ядра, я потратил несколько часов на то, чтобы настроить автоматическое изменение багов по результатам коммитов в subversion - так ничего и не добился. Буду пробовать еще, но доказательство сложности инсталляции налицо.

Материалы по теме

« Previous PageNext Page »