ТВОРЧЕСТВО

ПОЗНАНИЕ

 

Если что-то использовалось в проекте или относилось к проекту, мы помещали это в систему.

Зачем это нужно
При помещении всех файлов проекта в систему управления исходным кодом вы получаете большие преимущества. Во-первых, неважно, что это за файл и когда вы подключились к работе над проектом, — вы почти наверняка найдёте нужный файл в системе управления исходным кодом, а это весьма ценно. Разработчик сможет найти планы тестирования, технический писатель — функциональные спецификации, а новый сотрудник — нужную информацию без предварительного знакомства с историей создания проекта. Во-вторых, храня все файлы проекта в системе управления исходным кодом, вы сможете использовать функции маркировки и блокирования файлов, управления версиями и ведения истории.
Например, в NuMega была возможность отслеживать изменения в планах, тестовых сценариях и документации для всего проекта. К тому же мы могли помечать целые наборы тестовых сценариев и пользовательской документации для каждого внутреннего этапа и для каждого основного или неосновного выпуска. Мы могли с точностью до символа воссоздать все файлы (не только файлы исходного кода) любого выпуска в истории проекта.
Особо отмечу включение в систему NuMega средств сборки: компиляторов, компоновщиков, заголовков и т.д. Чёткое управление этими средствами критично для обслуживания сборочной среды проекта. Официальная сборочная среда была всегда доступна в системе управления исходным кодом. Все разработчики и машины, на которых собирался проект, должны были использовать один и тот же набор файлов. Без исключений.
Так как для сборки продукта мы не полагались на локальные файлы (не содержащиеся в системе управления версиями), мы задействовали идентичную сборочную среду во всём проекте. Этот простой подход сэкономил нам немало времени. До применения такой системы мы постоянно сталкивались с проблемами при сборке из-за несовместимости между компиляторами разработчиков или искали труднонаходимые ошибки во время выполнения, вызванные несоответствием библиотек или заголовков.
И последнее (но не менее ценное) преимущество — централизация файлов в системе управления исходным кодом обеспечивает простое резервное копирование всего проекта. Одной командой мы могли создать резервную копню или просто скопировать весь проект на другой диск или другую машину.
Каковы их технологические возможности
Помимо функциональных возможностей, описанных ранее, команда в NuMega нуждалась в поддержке пяти жизненно необходимых технологических возможностей. Хотя они специфичны для наших продуктов и компании, многие из них стандартны для большинства проектов в отрасли. Это:
• управление разработкой нескольких редакций продукта;
• управление разработкой нескольких версий одной редакции;
• применение общих компонентов, как в рамках одного, так и нескольких проектов компании;
• компоновка продукта на основе самого свежего набора файлов с исходным кодом (или на основе другого набора исходных файлов);
• поддержка локальных сборок для отдельных разработчиков.
Как ими управлять
Одна из главных задач в управлении проектом по разработке ПО — это контроль сложности проекта. Труднее всего справляться с исходным кодом и управлением конфигурацией. Хотя наше решение было не идеальным, оно все равно работало и помогло нам без особых проблем укладываться в сроки.
Мы использовали систему управления исходным кодом 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, для одного из продуктов было создано три каталога по именам разработчиков:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73