Лекция №2. Основные инженерные подходы к созданию программ

advertisement
Лекция №2.
Основные инженерные подходы к созданию программ
Традиционно инженеры стремились, а некоторые из них, не снижая качества проектов, добивались
значительного сокращения сроков проектирования. Инженерный технологический подход определяется
спецификой комбинации стадий разработки, этапов и видов работ, ориентированной на разные классы
программного обеспечения и особенности коллектива разработчиков.
Основные группы инженерных технологических следующие:
Подходы со слабой формализацией не используют явных технологий и их можно применять только для
очень маленьких проектов, как правило, завершающихся созданием демонстрационного прототипа. К
таким подходом относят так называемые ранние технологические подходы, например подход
"кодирование и исправление".
Строгие (классические, жесткие, предсказуемые) подходы рекомендуется применять для средних,
крупномасштабных и гигантских проектов с фиксированным объемом работ. Одно из основных
требований к таким проектам — предсказуемость.
Гибкие (адаптивные, легкие) подходы рекомендуется применять для небольших или средних проектов
в случае неясных или изменяющихся требований к системе. При этом команда разработчиков должна
быть ответственной и квалифицированной, а заказчики должны принимать участие в разработке.
Ранние технологические подходы не используют явных технологий, поэтому их применяют только для
очень маленьких проектов, как правило, завершающихся созданием демонстрационного прототипа. В
качестве примера подхода, не использующего формализации, рассмотрен подход "кодирование и
исправление".
Каскадные технологические подходы задают некоторую последовательность выполнения видов работ,
обычно изображаемую в виде каскада. Иногда их называют подходами на основе модели водопада.
Классический каскадный подход (от англ. pure waterfall — чистый водопад) считается "дедушкой"
технологических подходов к ведению жизненного цикла. Его можно рассматривать как отправную точку
для огромного количества других подходов. Сформировался классический каскадный подход в период с
1970 по 1985 г. Специфика "чистого" каскадного подхода такова, что переход к следующему виду работ
осуществляется только после того, как завершена работа с текущим видом работы. Возвраты к уже
пройденным видам работ не предусмотрены.
Каскадно-возвратный подход преодолевает недостаток классического подхода благодаря возможности
возврата к предыдущим стадиям и пересмотру или уточнению ранее принятых решений.
Каскадно-итерационный подход предусматривает последовательные итерации каждого вида работ до
тех пор, пока не будет достигнут желанный результат.
Каскадный подход с подвидами работ очень близок подходу с перекрывающимися видами работ.
Особенность его в том, что с точки зрения структуры, проект достаточно часто может быть разделен на
подпроекты, которые могут разрабатываться индивидуально. В данном подходе требуется
дополнительная фаза тестирования подсистем до объединения их в единую систему.
Спиральная модель (spiral model) была предложена Барри Боэмом (Barry Boehm) в середине 80-х годов
XX в. с целью сократить возможный риск разработки. Фактически, это была первая реакция на
устаревание каскадной модели. Спиральная модель использует понятие прототипа — программы,
реализующей частичную функциональность создаваемого программного продукта. Создание
прототипов осуществляется в несколько витков спирали, каждый из которых состоит из "анализа риска",
1
"некоторого вида работ" и "верификации. Отличительной особенностью этой модели является
специальное внимание рискам, влияющим на организацию жизненного цикла.
Боэм формулирует десять наиболее распространённых (по приоритетам) рисков:
 Дефицит специалистов.
 Нереалистичные сроки и бюджет.
 Реализация несоответствующей функциональности.
 Разработка неправильного пользовательского интерфейса.
 «Золотая сервировка», перфекционизм, ненужная оптимизация и оттачивание деталей.
 Непрекращающийся поток изменений.
 Нехватка информации о внешних компонентах, определяющих окружение системы или
вовлечённых в интеграцию.
 Недостатки в работах, выполняемых внешними (по отношению к проекту) ресурсами.
 Недостаточная производительность получаемой системы.
 «Разрыв» в квалификации специалистов разных областей знаний.
Особенность спиральной модели — в разработке итерациями. Причем каждый следующий
итерационный прототип будет обладать большей функциональностью.
Главная задача — как можно быстрее показать пользователям системы работоспособный продукт, тем
самым активизируя процесс уточнения и дополнения требований. Основная проблема спирального
цикла — определение момента перехода на следующий этап. Для ее решения необходимо ввести
временные ограничения на каждый из этапов жизненного цикла.
Каркасные подходы представляют собой каркас для видов работ и включают их огромное количество.
Рациональный унифицированный подход к выполнению работ (rational unified process-RUP),
использует итеративную модель разработки. В конце каждой итерации (в идеале продолжающейся от 2
до 6 недель) проектная команда должна достичь запланированных на данную итерацию целей, создать
или доработать проектные артефакты и получить промежуточную, но функциональную версию
конечного продукта.
Полный жизненный цикл разработки продукта состоит из четырех фаз, каждая из которых включает в
себя одну или несколько итераций:
1. Начало (Inception).
2. Уточнение (Elaboration).
3. Построение (Construction).
4. Внедрение (Transition).
Основные особенности данного подхода:
• итеративность с присущей ей гибкостью;
• контроль качества с возможностью выявления и устранения рисков на самых ранних этапах;
• предпочтение отдается моделям, а не бумажным документам;
• основное внимание уделяется раннему определению архитектуры;
• возможность конфигурирования, настройки и масштабирования.
Синтезирующее программирование предполагает синтез программы по ее спецификации.
Автоматическая генерация программ по спецификациям возможна для некторых языков спецификаций,
таких как SDL(Specification and Description Language), UML (англ. Unified Modeling Language —
унифицированный язык моделирования).
2
Сборочное (расширяемое) программирование предполагает, что программа собирается путем
повторного использования уже известных фрагментов.
Сборочное программирование тесно связано с методом повторного использования кода, причем как
исходного, так и бинарного. Выделяют несколько разновидностей технологических подходов
сборочного программирования, которые в значительной степени определяются базисной методологией.
1. Модульное сборочное программирование — исторически первый подход, который базировался на
процедурах и функциях методологии структурного программирования.
2. Объектно-ориентированное сборочное программирование базируется на методологии объектноориентированного программирования и предполагает распространение библиотек классов в виде
исходного кода или упаковку классов в динамически компонуемую библиотеку.
3. Компонентное сборочное программирование предусматривает распространение классов в бинарном
виде и предоставление доступа к методам класса через строго определенные интерфейсы, что позволяет
снять проблему несовместимости компиляторов и обеспечивает смену версий классов без
перекомпиляции использующих их приложений. Существуют конкретные технологические подходы,
поддерживающие компонентное сборочное программирование — COM (DCOM, COM+), CORBA, Net.
4. Аспектно-ориентированное сборочное программирование, при котором концепция компонента
дополняется концепцией аспекта — варианта реализации критичных по эффективности процедур.
Аспектно-ориентированное сборочное программирование заключается в сборке полнофункциональных
приложений из многоаспектных компонентов, инкапсулирующих различные варианты реализации.
Конкретизирующее программирование предполагает, что частные, специальные программы
извлекаются из универсальной программы. Наиболее известная технология конкретизирующего
программирования — это подход с применением паттернов проектирования.
Дополнительно к паттернам существуют каркасы (framework) — наборы взаимодействующих классов,
составляющих повторно используемый дизайн для конкретного класса программ. Каркас диктует
определенную архитектуру приложения, в нем аккумулированы проектные решения, общие для
проектной области.
Развитием и одновременно альтернативой каскадных подходов является группа подходов быстрой
разработки. Все эти подходы объединяют следующие основные черты:
• итерационную разработку прототипа;
• тесное взаимодействие с заказчиком.
Эволюционное прототипирование. Первый прототип при эволюционном прототипировании обычно
включает создание развитого пользовательского интерфейса, который может быть сразу же
продемонстрирован заказчику для получения от него отзывов и возможных корректив. Основное
начальное внимание уделяется стороне системы, обращенной к пользователю. Далее до тех пор, пока
пользователь не сочтет программный продукт законченным, в него вносится необходимая
функциональность.
Итеративная разработка. Первый прототип итеративной разработки уже должен включать
завершенное ядро системы. Таким образом, в нем уже сосредоточена большая часть функциональности.
Очередные итерации должны помочь пользователю определиться с доводкой пользовательского
интерфейса и генерируемых систем отчетов и других выходных данных.
Постадийная разработка предназначена устранить недостаток двух предыдущих подходов —
невозможность определения сроков завершения проекта. Начиная разработку, разработчик достаточно
хорошо знает, что будет собой представлять создаваемый программный продукт. Основная задача
постадийной разработки — предоставить заказчику работающую систему как можно раньше. Далее
заказчик сможет добавлять новую функциональность и получать очередную версию системы. Однако
каждая из версий, получаемых по завершении стадий, является работающей.
3
Адаптивные технологические подходы были задуманы как подходы, поддерживающие изменения.
Данные подходы ориентированы на человека, а не на процесс.
Экстремальное программирование. Наиболее концентрированно идеи быстрой разработки программ
оказались выражены в подходе экстремального программирования (extreme programming) (XP).
Экстремальное программирование позволяет привлечь конечных пользователей для тестирования уже
на ранних этапах проектирования и разработки системы. При этом заказчик обращается к
разработчикам с просьбой изготовить программную систему. На протяжении всей работы над проектом
необходимо присутствие представителя заказчика. Проект делится на три этапа:
— этап планирования реализации: заказчики пишут сценарии работы системы на основе списка
историй — возможных применений системы, программисты адаптируют их к разработке, после чего
заказчики выбирают первоочередной из написанных сценариев;)
— итерационный этап: заказчики пишут тесты и отвечают на вопросы разработчиков, пока последние
программируют;
— этап выпуска версии: разработчики устанавливают систему, заказчики принимают работу.
Адаптивная разработка. В основу подхода адаптивной разработки (Adaptive Software Development —
ASD) положены три нелинейных перекрывающих друг друга этапа — обдумывание, сотрудничество и
обучение. Автор данного подхода Джим Хайсмит (Jim Highsmith) обращает особое внимание на
использование идей из области сложных адаптивных систем.
Результаты планирования (которое само здесь является парадоксальным) в адаптивной разработке
всегда будут непредсказуемыми. При обычном планировании отклонение от плана является ошибкой,
которую исправляют. При данном подходе отклонения ведут к правильным решениям.
Программисты должны активно сотрудничать между собой для преодоления неопределенности в
подходе адаптивной разработки. Руководители проектов должны обеспечить хорошие коммуникации
между программистами, благодаря чему программисты сами находят объяснения на возникающие
вопросы, а не ждут их от руководителей.
Обучение является постоянной и важной характеристикой подхода. И программисты, и заказчики в
процессе работы должны пересматривать собственные обязательства и планы. Итоги каждого цикла
разработки используются при подготовке следующего.
4
Download