Время — деньги. Создание команды разработчиков программного обеспечения - Эд Салливан
Шрифт:
Интервал:
Закладка:
Мы использовали систему управления исходным кодом Visual Source Safe (VSS) компании Microsoft. Она предоставляет нужные нам основные функции, и у неё отличная цена — как раз для начинающего бизнеса. Хотя обсуждение VSS выходит за рамки этой книги, я расскажу о том, как мы приспособили этот продукт под наши нужды.
Основы структурыМы структурировали наши проекты по двум простым элементам: частям и продуктам. Часть — это компонент, используемый для компоновки программного продукта. Частями могут владеть разработчики, не являющиеся членами команды, работающей над проектом. Они могут обновлять свои части по собственному (однако согласуемому) графику, отличному от графика всего проекта. Продуктом являлся конечный пакет, продаваемый пользователям. Он складывался из уникальных для этого продукта частей и файлов. Храня в одном месте части и продукты, мы могли собирать различные редакции наших программ и одновременно поддерживать несколько параллельных направлений в разработке. Например, возможность выпускать исправления или пакеты обновлений, продолжая направлять все силы на разработку нового кода, была необходима и для поддержки, и для получения прибыли от следующих продуктов.
Структура и использование хранилища исходного кодаВсе файлы, используемые при разработке наших продуктов, были рассортированы по трём папкам:
• Product Name — для файлов, относящихся к продукту;
• Environment — для файлов среды разработки;
• Imports — для сторонних файлов.
Папка Product Name содержала создаваемые нами файлы, необходимые для сборки, тестирования и написания документации к продукту (табл. 5-1). В ней были подкаталоги Branch для каждого варианта, над которым мы работали. В подкаталоге Parts хранились стандартные и совместно используемые компоненты, включаемые в продукт. И, наконец, для каждой редакции продукта имелся подкаталог Product. В каждой папке Product содержались необходимые для продукта части. Чтобы эта структура работала, нужно строго соблюдать соглашения об именах и не нарушать структуру. Координация изменений в частях и продуктах также была критичной.
Табл. 5-1. Примерная структура папки «Product Name».$/Product_Name/ — Файлы, относящиеся к продукту
$/Product_Name/Branch/ — Различные направления в разработке
$/Product_Name/Parts/ — Совместно используемые файлы, входящие в продукт
$/Product_Name/Parts/Src/ — Исходный код для Parts (при необходимости совместно используется с/Products/Src)
$/Product_Name/Parts/Doc/ — Исходные файлы документации
$/Product_Name/Parts/Help/ — Исходные файлы справочной системы
$/Product_Name/Parts/Install/ — Исходный код программы установки
$/Product_Name/Parts/Patch/ — Исходный код вставок
$/Product_Name/Parts/Setup/ — Исходный код установщика
$/Product_Name/Parts/Samples/ — Исходный код с примерами
$/Product_Name/Parts/Tests/ — Исходный код тестов, тестовые задания и т.д.
$/Product_Name/Product/ — Редакции продукта Product Name (по одной папке на каждую редакцию)
$/Product_Name/Product/Output/ — Область для программ, созданных в других проектах
$/Product_Name/Product/Src/ — Исходный код продукта (при необходимости совместно используется с /Parts/Src)
$/Product_Name/Product/Doc/ — Файлы документации к продукту (совместно используется с /Parts/Doc)
$/Product_Name/Product/Help/ — Файлы справочной системы продукта (совместно используется с /Parts/Help)
$/Product_Name/Product/Imports/ — Импорт (совместно используется с /Imports)
$/Product_Name/Product/Install/ — Файлы для установки продукта (используется с /Parts/Install)
$/Product_Name/Product/Samples/ — Примеры для продукта (совместно используется с /Parts/Samples)
$/Product_Name/Product/Tests/ — Тестовые задания, тестовые сценарии (совместно используется с /Parts/Tests)
Из собственного опыта
Когда я пришёл в NuMega, для одного из продуктов было создано три каталога по именам разработчиков: Frank, Bill и Matt. Так как каждый работал над своим собственным кодом, они могли вносить изменения, не повреждая чужих файлов. Однако там было мало общего кода (одна большая структура данных для основных подсистем). Но это работало! Дальше нам нужно было увеличить команду разработчиков, и мы уже не могли обойтись без системы управления исходным кодом. Такая система позволила усложнить проект, удерживая его под контролем. Без неё я просто не могу представить ПО для разработчиков.
В папке Environment ($/Env) хранятся файлы, используемые командой разработчиков, но не являющиеся частью конечного продукта. Это все, начиная с инструментов и утилит и заканчивая стандартами создания кода и шаблонами для проекта. Папка Environment содержит файлы среды, описывающие среду с точки зрения разработчика, а также с точки зрения тестирования и документации. В NuMega мы хотели создать общую среду для команд разработчиков, и потому для этой цели мы создали специальный раздел в хранилище исходного кода. Вот примерный список подкаталогов, которые могут быть в этом разделе хранилища исходного кода (табл. 5-2):
Табл. 5-2. Примерная структура папки Environment.$/Env/Dev/ ПО среды разработки и инструментальных средств
$/Env/Dev/Bin Исполняемые модули (подкаталог для каждого инструмента)
$/Env/Dev/Src Исходный код для этих инструментов (подкаталог для каждого)
$/Env/Dev/Doc Документация для этих инструментов (подкаталог для каждого)
$/Env/Dev/Etc Прочие файлы
$/Env/Test/ Инструментальные средства и файлы для тестирования
$/Env/Test/Bin Исполняемые модули
$/Env/Test/Src Исходный код и документация для этих инструментов
$/Env/Test/Doc Документация по среде тестирования
$/Env/Test/Etc Прочие файлы
$/Env/Documentation/ Документация по среде проекта
$/Env/Documentation/Templates Шаблоны проекта, шаблоны документации и справочники по стилям
$/Env/Documentation/Plans Планы и спецификации проекта, тестовых заданий и документации
$/Env/Documentation/Process Технологические документы проекта
$/Env/Etc Прочие файлы, не вошедшие в предыдущие категории
В папке Imports ($/Imports) хранились файлы или наборы инструментов из сторонних продуктов (табл. 5-3). Сами сторонние продукты в этой папке не содержались, там были только библиотеки и заголовки. В результате в разделе Imports проводилось совсем немного изменений. Однако так как эта область использовалась для хранения различных версий сторонних продуктов, было очень важно не вносить никаких изменений без чёткого осмысления, полного тестирования и учёта связей с элементами, на которые эти изменения могли бы подействовать.
Табл. 5-3. Примерная структура папки Imports.$/Imports/RogueWave Библиотеки и заголовки RogueWave
$/Imports/ObjectSpace Библиотеки и заголовки ObjectSpace
$/Imports/Visual С Результаты компиляции, библиотеки и заголовки Visual С
$/Imports/Install Shield Библиотеки и заголовки Install Shield
$/Imports/Прочие Папки для каждого инструмента или библиотеки сторонних производителей
Компоновочная системаВ NuMega мы писали сценарий сборки продукта на выделенной «компоновочной машине». Сценарий должен был выбирать нужные для сборки продукта файлы из системы управления исходным кодом. Эта информация включала как сами средства компоновки, так и исходные файлы, библиотеки, заголовки и другие необходимые компоненты. Для ведения процесса компиляции мы выбрали Nmake — популярное средство управления компоновкой. Nmake сначала собирает все части продукта, а затей компонует окончательные исполняемые файлы продукта.
Сценарий компоновки в качестве входных данных принимал метку сборки, позволяло нам создать определённые версии продукта. Так как мы маркировали и отбирали и средства сборки, и файлы продукта, то таким образом мы гарантировали надёжность сборочной среды. Сценарии компоновки также использовали стандартные переменные окружения и макросы, так что мы собирали все части и продукты посредством одного вызова. То, что наша компоновочная машина и разработчики использовали одни и те же сценарии компоновки, позволяло собирать файлы проекта просто и без ошибок.