- •З курсу
- •З курсу
- •Содержание
- •Часть I. Инженерные основы программного обеспечения 10
- •Часть II. Требования к программному обеспечению 33
- •Часть III. Моделирование программного обеспечения 52
- •Часть IV. Технологии разработки программного обеспечения 124
- •Часть V. Письменная коммуникация. Документирование проекта Программного обеспечения 145
- •Часть VI. Управление проектом программного обеспечения 192
- •Предисловие
- •Часть I. Инженерные основы программного обеспечения
- •1. Введение в программную инженерию
- •1.1. Вопросы и ответы об инженерии программного обеспечения
- •1.2. Профессиональные и этические требования к специалистам по программному обеспечению
- •2. Системотехника вычислительных систем
- •2.1. Интеграционные свойства систем
- •2.2. Система и ее окружение
- •2.3. Моделирование систем
- •2.4. Процесс создания систем
- •2.5. Приобретение систем
- •3. Процесс создания программного обеспечения
- •3.1. Модели процесса создания программного обеспечения
- •3.2. Итерационные модели разработки программного обеспечения
- •3.3. Спецификация программного обеспечения
- •3.4. Проектирование и реализация программного обеспечения
- •3.5. Эволюция программных систем
- •3.6. Автоматизированные средства разработки программного обеспечения
- •4. Технологии производства программного обеспечения
- •Часть II. Требования к программному обеспечению
- •5. Требования к программному обеспечению
- •5.1. Функциональные и нефункциональные требования
- •5.2. Пользовательские требования
- •5.3. Системные требования
- •5.4. Документирование системных требований
- •6. Разработка требований
- •6.1. Анализ осуществимости
- •6.2. Формирование и анализ требований
- •6.3. Аттестация требований
- •6.4. Управление требованиям
- •7. Матрица требований. Разработка матрицы требований
- •Часть III. Моделирование программного обеспечения
- •8. Архитектурное проектирование
- •8.1. Структурирование системы
- •8.2. Модели управления
- •8.3. Модульная декомпозиция
- •8.4. Проблемно-зависимые архитектуры
- •9. Архитектура распределенных систем
- •9.1. Многопроцессорная архитектура
- •9.2. Архитектура клиент/сервер
- •9.3. Архитектура распределенных объектов
- •9.4. Corba
- •10. Объектно-ориентированное проектирование
- •10.1. Объекты и классы объектов
- •10.2. Процесс объектно-ориентированного проектирования
- •10.2.1. Окружение системы и модели ее использования
- •10.2.2. Проектирование архитектуры
- •10.2.3. Определение объектов
- •10.2.4. Модели архитектуры
- •10.2.5. Специфицирование интерфейсов объектов
- •10.3. Модификация системной архитектуры
- •11. Проектирование систем реального времени
- •11.1. Проектирование систем реального времени
- •11.2. Управляющие программы
- •11.3. Системы наблюдения и управления
- •11.4. Системы сбора данных
- •12. Проектирование с повторным использованием компонентов
- •12.1. Покомпонентная разработка
- •12.2. Семейства приложений
- •12.3. Проектные паттерны
- •13. Проектирование интерфейса пользователя
- •13.1. Принципы проектирования интерфейсов пользователя
- •13.2. Взаимодействие с пользователем
- •13.3. Представление информации
- •13.4. Средства поддержки пользователя
- •13.5. Оценивание интерфейса
- •Часть IV. Технологии разработки программного обеспечения
- •14. Жизненный цикл программного обеспечения: модели и их особенности
- •14.1. Каскадная модель жизненного цикла
- •14.2. Эволюционная модель жизненного цикла
- •14.2.1. Формальная разработка систем
- •14.2.2. Разработка программного обеспечения на основе ранее созданных компонентов
- •14.3. Итерационные модели жизненного цикла
- •14.3.1 Модель пошаговой разработки
- •14.3.2 Спиральная модель разработки
- •15. Методологические основы технологий разработки программного обеспечения
- •16. Методы структурного анализа и проектирования программного обеспечения
- •17. Методы объектно-ориентированного анализа и проектирования программного обеспечения. Язык моделирования uml
- •Часть V. Письменная коммуникация. Документирование проекта Программного обеспечения
- •18. Документирование этапов разработки программного обеспечения
- •19. Планирование проекта
- •19.1 Уточнение содержания и состава работ
- •19.2 Планирование управления содержанием
- •19.3 Планирование организационной структуры
- •19.4 Планирование управления конфигурациями
- •19.5 Планирование управления качеством
- •19.6 Базовое расписание проекта
- •20. Верификация и аттестация программного обеспечения
- •20.1. Планирование верификации и аттестации
- •20.2. Инспектирование программных систем
- •20.3. Автоматический статический анализ программ
- •20.4. Метод "чистая комната"
- •21. Тестирование программного обеспечения
- •21.1. Тестирование дефектов
- •21.1.1. Тестирование методом черного ящика
- •21.1.2. Области эквивалентности
- •21.1.3. Структурное тестирование
- •21.1.4. Тестирование ветвей
- •21.2. Тестирование сборки
- •21.2.1. Нисходящее и восходящее тестирование
- •21.2.2. Тестирование интерфейсов
- •21.2.3. Тестирование с нагрузкой
- •21.3. Тестирование объектно-ориентированных систем
- •21.3.1. Тестирование классов объектов
- •21.3.2. Интеграция объектов
- •21.4. Инструментальные средства тестирования
- •Часть VI. Управление проектом программного обеспечения
- •22. Управление проектами
- •22.1. Процессы управления
- •22.2. Планирование проекта
- •22.3. График работ
- •22.4. Управление рисками
- •23. Управление персоналом
- •23.1. Пределы мышления
- •23.1.1. Организация человеческой памяти
- •23.1.2. Решение задач
- •23.1.3. Мотивация
- •23.2. Групповая работа
- •23.2.1. Создание команды
- •23.2.2. Сплоченность команды
- •23.2.3. Общение в группе
- •23.2.4. Организация группы
- •23.3. Подбор и сохранение персонала
- •23.3.1. Рабочая среда
- •23.4. Модель оценки уровня развития персонала
- •24. Оценка стоимости программного продукта
- •24.1. Производительность
- •24.2. Методы оценивания
- •24.3. Алгоритмическое моделирование стоимости
- •24.3.1. Модель сосомо
- •24.3.2. Алгоритмические модели стоимости в планировании проекта
- •24.4. Продолжительность проекта и наем персонала
- •25. Управление качеством
- •25.1. Обеспечение качества и стандарты
- •25.1.1. Стандарты на техническую документацию
- •25.1.2. Качество процесса создания программного обеспечения и качество программного продукта
- •25.2. Планирование качества
- •25.3. Контроль качества
- •25.3.1. Проверки качества
- •25.4. Измерение показателей программного обеспечения
- •25.4.1. Процесс измерения
- •25.4.2. Показатели программного продукта
- •26. Надежность программного обеспечения
- •26.1. Обеспечение надежности программного обеспечения
- •26.1.1 Критические системы
- •26.1.2. Работоспособность и безотказность
- •26.1.3. Безопасность
- •26.1.4. Защищенность
- •26.2. Аттестация безотказности
- •26.3. Гарантии безопасности
- •26.4. Оценивание защищенности программного обеспечения
- •27. Совершенствование производства программного обеспечения
- •27.1. Качество продукта и производства
- •27.2. Анализ и моделирование производства
- •27.2.1. Исключения в процессе создания по
- •27.3. Измерение производственного процесса
- •27.4. Модель оценки уровня развития
- •27.4.1. Оценивание уровня развития
- •27.5. Классификация процессов совершенствования
23.2. Групповая работа
Основная часть профессионального программного обеспечения разрабатывается командами программистов (от двух и до нескольких сотен человек). Но, поскольку едва ли кто-то способен эффективно работать над одной задачей в такой большой команде, эти команды делятся еще и на подгруппы. Каждая подгруппа отвечает за определенную часть проекта и работает над одной подсистемой. При грамотном подборе группа состоит не более чем из восьми человек. В группах небольшого размера легче снизить риск возникновения проблем во взаимоотношениях между членами группы. Каждая группа должна быть обеспечена круглым столом для проведения встреч. Кроме того, члены группы имеют возможность встречаться в офисах. Для таких групп нет необходимости применять сложные структуры коммуникации.
Организация команды, которая могла бы эффективно работать над программой, является достаточно сложной задачей для менеджера. Необходимо, чтобы в команде было равное соотношение технических навыков, опыта и выражения индивидуальности. Должен отметить, что хорошо функционирующая команда – это нечто большее, чем простой набор людей с необходимым соотношением навыков. В хорошей команде присутствует дух товарищества, который мотивирует сотрудников через успехи всей команды, включая и достижение собственных целей. Поэтому менеджеры должны стимулировать деятельность, направленную непосредственно на "строительство команды", чтобы содействовать формированию чувства преданности ее интересам.
Четыре основных фактора, которые в той или иной степени влияют на групповую работу:
1. Состав команды. Команда должна иметь правильное соотношение навыков, опыта и личностных качеств.
2. Сплоченность команды. Члены рабочей группы должны воспринимать себя как единую команду, а не как простую совокупность индивидуумов, работающих над одной проблемой.
3. Общение в команде. Между членами команды должны быть дружеские отношения.
4. Организация команды. Необходимо организовать команду таким образом, чтобы каждый чувствовал свою ценность и был удовлетворен своей ролью.
23.2.1. Создание команды
В начале практической деятельности для большинства специалистов по программному обеспечению основным мотивационным фактором служит работа. Поэтому в группы по разработке ПО часто включены люди, имеющие собственные соображения насчет того, как должны решаться задачи технического плана. Такой принцип подбора рабочих групп вызван постоянными жалобами на проблемы, возникающие вследствие игнорирования стандартов интерфейса, переделки системы после создания ее программного кода, ненужных нововведений в систему и т.п. Если вы хотите избежать этих проблем, то необходимое условие – правильный подбор членов рабочей группы.
Группа, в которой сотрудники дополняют друг друга, может работать намного эффективнее группы, отбор в которую проводился исключительно на основе навыков программирования. Люди, которые любят свою работу (целевая ориентация), могут стать прекрасными профессионалами. Люди с самоориентацией на наилучший результат смогут довести дело до конца. Сотрудники с внешней ориентацией успешно налаживают общение внутри группы. Кстати, я настаиваю на том, что сотрудники с внешней ориентацией – необходимое составляющее любой рабочей группы. Они настроены на общение и поэтому могут определить (и предотвратить) возникновение какого-либо напряжения или конфликтов на ранней стадии. Именно такие люди помогут разрешить личные проблемы членов команды и разногласия между ними, прежде чем те окажут влияние на всю команду.
Иногда просто невозможно организовать команду так, чтобы все ее члены взаимодополняли друг друга по личным качествам. Если такое случается, менеджер проекта обязан контролировать группу с тем, чтобы не позволить личным целям сотрудников стать выше цели организации или группы. Достичь такого контроля намного легче в том случае, если члены команды будут участвовать в каждом этапе проекта. Проявление индивидуальной инициативы будет более вероятным, если с членами группы проводить инструктаж, не упоминая той роли, которую их часть работы играет во всем проекте.
Например, возьмем инженера, который получил проект программы для кодирования и видит, что в него необходимо внести изменения, делающие его более совершенным. Если внедрять эти изменения без понимания логики исходного проекта, это может привести к конфликту с другими частями программной системы. Если вся группа включена в разработку проекта с самого начала, работник сможет оценить последствия внесения таких изменений в систему и это не приведет к возникновению конфликта с теми специалистами, которые ее проектировали.
Важное место в команде занимает лидер. Он (или она) отвечает за техническое руководство и административное управление. Лидеры группы должны быть в курсе повседневной деятельности группы, гарантируя эффективную работу команды и тесное сотрудничество с менеджерами проекта при планировании деятельности по его реализации.
Лидер – это, как правило, назначаемая должность, он подотчетен главному менеджеру проекта. Назначаемый лидер может и не быть лидером команды в прямом смысле этого слова, он ведет группу только в технических вопросах. Члены группы могут выбрать другого лидера команды. Он может лучше назначенного лидера разбираться в технических вопросах или лучше мотивировать членов группы к выполнению работы.
Иногда бывает полезным вообще разделить техническое лидерство и управление проектом. Часто случается, что компетентные в технических вопросах работники слабо разбираются в администрировании. Исполняя роль администратора, такие лидеры уже не могут вносить полноценный вклад в техническую работу команды. В этой ситуации лучше назначить администратора, который освободит лидера от ежедневных административных проблем.
Если в группу назначается лидер, который неприемлем для членов команды, это может привести к достаточно напряженной обстановке. Члены группы не будут уважать нового лидера и могут предпочесть свои интересы интересам группы. Эта проблема весьма существенна для такой быстро изменяющейся области, как инженерия ПО, где новые члены команды могут владеть более современными знаниями и опытом, чем лидеры групп, имеющие только практический опыт. Кроме того, некоторых опытных сотрудников может обидеть назначение молодого лидера, даже если он способен внести в работу новые идеи.