ОБЗОРЫ

Идея совместной сетевой работы над программным проектом возникла, пожалуй, вместе с первыми экспериментами по организации связи между компьютерами, проведенными в Массачусетском технологическом институте в конце 50-х годов. Массовое же признание она получила с появлением доступных модемов для настольных ПК, а развитие э-почты и глобальной сетевой инфраструктуры дало возможность людям из разных городов и стран объединяться, не выходя из дома, в работе по созданию ПО произвольной сложности. Так, на сайте SourceForge.Net, самом популярном у разработчиков общедоступных программ в открытых текстах (только зарегистрированных пользователей SourceForge.Net уже насчитывается более миллиона), в феврале велось 95 тыс. подобных проектов.

Столь высокая популярность идеи совместной виртуальной разработки программ оказала определенное влияние и на концепции программирования. Так как разработчики в этих проектах участвуют, как правило, в свободное время, основной объем работы приходится на автономное кодирование в домашних условиях, без связи в реальном времени с другими участниками. Поэтому классические проектные принципы, подразумевающие постоянное общение и возможность периодических коллективных обсуждений "вживую", к такой деятельности неприменимы. Тщательное продумывание всех требований к создаваемому ПО тоже не приносит желаемого результата, поскольку главным здесь становится не столько формализация нужд заказчика (ведь в некоммерческих проектах обычно создается массовый продукт, требования к которому могут гибко меняться), сколько необходимость разделения задачи на множество максимально независимых модулей. Но при этом важно, чтобы реализация ключевых архитектурных требований к системе (так называемая сквозная функциональность) была аккуратно и равномерно распределена ("размазана") между модулями. Классические структурные и объектные подходы помогают здесь слабо, так как ориентированы на реализацию в модулях и классах достаточно независимых алгоритмических элементов, что само по себе хорошо, но не позволяет эффективно выделить в эти автономные модули сквозную функциональность. Поэтому наработанные в них идеи воплощаются в таких технологиях, как аспектно-ориентированное программирование (запатентованное IBM), которое усиливает ООП средствами аспектной декомпозиции, ориентированными на создание сверхсложных систем.

CodeStriker анализирует различия в исходных текстах

На практике, конечно, современные методологические достижения теории программирования в силу сложности и подчас патентной закрытости применяются далеко не в каждом совместном проекте. Под совместным, коллективным программированием сегодня понимаются не формализованные методики, а ориентированные на Интернет гибкие и адаптивные подходы, в которых нет явно выделенных фаз проектирования и тестирования. За последние 10 лет фактически родился новый метод (collaborative programming) совместного и открытого создания и распространения программ в исходных текстах. Модификация их доступна фактически всем желающим, а с помощью различных лицензий наподобие GNU обеспечена важная для западных разработчиков ситуация, когда у создателей некоего продукта нет юридического лица, конкретной компании, владеющей результатами деятельности, а сами участники находятся подчас в разных странах с совершенно различными законодательными подходами к авторским и имущественным правам на ПО.

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

Superversion поддерживает диаграммы

Так как в начале работы обычно очень сложно судить об успехе и потенциальных возможностях проекта, участники, как правило, договариваются о разделении "шкуры медведя" прямо пропорционально вкладу каждого из них. Этот очевидный на первый взгляд принцип в обычных коммерческих проектах, что интересно, не работает, поскольку разница в окладе и премиях у программистов, чья реальная производительность порой разнится на порядки, редко достигает даже 100%. Кроме того, опытные организаторы подобных проектов перед желающими поучаствовать в подобной деятельности сразу ставят важное условие: "оставить свой эгоизм за дверью". Отношения "я лучший программист, чем ты, а теперь давай работать вместе" быстро разрушают хрупкие взаимоотношения в ситуациях, где все основано на энтузиазме, а работать на призрачную перспективу будущего дохода надо еще очень долго и за счет собственных ресурсов. Поэтому и средняя результативность подобных проектов относительно невысока. Так, на SourceForge.Net из упомянутых 95 тыс. проектов 40% пока не выросло из альфа-версии, 15% добрались до беты, 13% закончились стабильным релизом, а серьезно проверены практикой лишь 12% (с другой стороны, на середину февраля это было "ровно" 1111 проектов). Остальные 20% либо неактивны, либо были закрыты и ликвидированы. Таким образом, первым китом подобных проектов можно считать организационные действия по поиску взаимопонимания между всеми участниками проекта на длительный период времени.

Системы онлайнового ведения проектов и версионного контроля

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

Михаэль Тайманн, вице-президент Red Hat Linux, в своем интервью изданию ZdNet рассказал о трех предложениях - от агентства национальной безопасности США и компаний Hewlett-Packard и Immunix/Wirex. Речь идет о расширении версий Linux созданными ими технологиями обеспечения безопасности и защиты ядра и приложений ОС. Эти предложения обсуждались совместно с Линусом Торвальдсом, и был выработан подход, доступный всем, кто хотел бы улучшить Linux. Инициаторам предлагается договориться друг с другом и подготовить открытый набор интерфейсов ко всем расширениям безопасности, после чего эти интерфейсы будут поддержаны в Linux, причем любой разработчик сможет выпускать собственные расширения. Поэтому второй важной особенностью подобных проектов становится стандартизация интерфейсов (как минимум внутри проекта).

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

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

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

Самой распространенной общедоступной системой контроля версий считается CVS (Concurrent Versions System, www.cvs.ru). На ее основе, в частности, построена вся структура SourceForge.Net. Система эта довольно аскетична в плане возможностей и интерфейса, хотя существует графическое расширение-надстройка WinCVS (www.wincvs.org). Тем не менее, она завоевала очень большую популярность, а некоторые провайдеры даже предлагают виртуальный хостинг с поддержкой CVS. Список других общедоступных систем подобного назначения приведен в таблице.

Типичные сложности с синхронизацией нескольких версий программного кода натолкнули разработчиков на идею создания интерактивных сред программирования, ориентированных на то, чтобы процесс редактирования и расширения функциональных возможностей продукта могли вести несколько человек в реальном времени. Одной из первых таких сред стала MOO (Mud Object Oriented), созданная Стефеном Вайтом, сотрудником канадского университета Ватерлоо на базе популярного жанра Mud (multi-user dungeons) многопользовательских терминальных игр. Отличие MOO от предшественников заключалось в ориентации на объектное представление виртуального мира, программирование поведения объектов и описание связей между ними; при этом каждый разработчик может создавать и отлаживать так называемые команды сервера-интерпретатора, которые сразу становятся доступны любому его коллеге. Из таких команд строятся более сложные вычислительные последовательности и т. д. (как в языке Forth). MOO активно применялась при обучении программированию на C++ в Глобальной сетевой академии (www.mit.edu/afs/athena.mit.edu/course/other/cdsdev/old/uu-gna/), однако не содержала адекватных средств ведения крупных проектов.

Более перспективным выглядит создание динамически расширяемых языков программирования наподобие SmallTalk, дополненных централизованным хранилищем объектов и средствами версионного контроля. Идея расширения функциональных возможностей системы ее пользователями сегодня реализуется в виде встраивания в продукт среды исполнения сценариев, которая, правда, сильно ограничена областью применения самого продукта. Что касается универсальной системы дистанционного группового редактирования и отладки в реальном времени, основанной, например, на сервисной архитектуре, то эти работы пока не вышли из стадии экспериментов. Так, развиваемый при поддержке американского военного агентства передовых исследований DARPA проект Safe Language Kernel (SLK, www.cs.cornell.edu/slk/) направлен на создание оригинального ядра ОС с многоуровневой защитой и разграничением адресного пространства, набор функций которого может динамически расширяться: поддержка процесса разработки ПО реализована на уровне ядра! С помощью SLK удастся создавать сетевые серверные инфраструктуры с возможностью гибкого разграничения полномочий пользователей и подключения разнообразных внешних устройств. При этом будет гарантироваться безопасное и не требующее дополнительной аппаратной поддержки выполнение в SLK сетевых приложений.