### Лекция 1. Основы программной инженерии

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

Программное обеспечение - это система, включающая в себя: компьютерные программы; документацию; данные, необходимые для корректной работы программ.

Проектирование ПО - это процесс создания спецификаций ПО на основе исходных требований к нему.

Проект ПО - совокупность спецификаций ПО (включающих модели и проектную документацию), обеспечивающих создание ПО в конкретной программно-технической среде.

ПО можно разбить на два класса: «малое» и «большое».

«Малое» программное обеспечение имеет следующие характеристики:

- решает одну несложную, четко поставленную задачу;
- размер исходного кода не превышает нескольких сотен строк;
- скорость работы программного обеспечения и необходимые ему ресурсы не играют большой роли;
- ущерб от неправильной работы не имеет большого значения;
- модернизация программного обеспечения, дополнение его возможностей требуется редко;
- как правило, разрабатывается одним программистом или небольшой группой (5 или менее человек);
- подробная документация не требуется, ее может заменить исходный код, который доступен.

«Большое» программное обеспечение имеет 2-3 или более характеристик из следующего перечня:

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

Далее рассматривается проектирование «большого» ПО, поскольку создание «малого» не вызывает больших трудностей, не требует специальной технологии и инструментов.

Классификация программных проектов по размеру группы разработчиков и длительности проекта:

- небольшие проекты - проектная команда менее 10 человек, срок от 3 до 6 месяцев;
- средние проекты - проектная команда от 20 до 30 человек, протяженность проекта 1-2 года;
- крупномасштабные проекты - проектная команда от 100 до 300 человек, протяженность проекта 3-5 лет;
- гигантские проекты - армия разработчиков от 1000 до 2000 человек и более (включая консультантов и соисполнителей), протяженность проекта от 7 до 10 лет.

С конца 60-х годов прошлого века до сегодняшних дней продолжается так называемый «кризис ПО». Выражается он в том, что большие проекты выполняются с превышением сметы расходов и/или сроков отведенных на разработку, а разработанное ПО не обладает требуемыми функциональными возможностями, имеет низкую производительность и качество. По результатам исследований американской индустрии разработки ПО, выполненных в 1995 году Standish Group (www.standishgroup.com), только 16% проектов завершились в срок, не превысили запланированный бюджет и реализовали все требуемые функции и возможности. 53% проектов завершились с опозданием, расходы превысили запланированный бюджет, требуемые функции не были реализованы в полном объеме. 31% проектов были аннулированы до завершения. Для двух последних категорий проектов бюджет среднего проекта оказался превышенным на 89%, а срок выполнения - на 122%. В последние годы процентное соотношение трех перечисленных категорий проектов незначительно изменяется в лучшую сторону.

1995 | 1996 | 1998 | 2000 | 2004 | 2006 | 2009
31% отменены | 40% | 28% | 23% | 18% | 19% | 24%
53% ущербны | 33% | 46% | 49% | 53% | 46% | 44%
16% успешны | 27% | 26% | 28% | 29% | 35% | 32%

Причины неудач:

- нечеткая и неполная формулировка требований;
- недостаточное вовлечение пользователей в работу над проектом;
- отсутствие необходимых ресурсов;
- неудовлетворительное планирование и отсутствие грамотного управления проектом;
- частое изменение требований и спецификаций;
- новизна и несовершенство используемой технологии;
- недостаточная поддержка со стороны высшего руководства;
- недостаточно высокая квалификация разработчиков, отсутствие необходимого опыта.

При планировании проектов зачастую по тем или иным причинам устанавливаются невыполнимые сроки, закладываются недостаточные ресурсы. Таким образом, возникают безнадежные проекты (death march projects). Признаки безнадежного проекта:

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

Другой причиной неверного планирования является заблуждение относительно производительности проектировщиков. В большом проекте общая производительность группы разработчиков не равна сумме производительностей отдельных членов группы (посчитанной как если бы они работали в одиночку). Об этом в книге «Мифический человеко-месяц» пишет Фредерик Брукс. Выводы Брукса:

- самая частая причина провала - нехватка времени;
- иногда работы нельзя ускорить, не испортив результат;
- человеко-месяц - опасное заблуждение, поскольку предполагается, что количество людей и месяцы можно поменять местами;
- разделение задачи между несколькими людьми вызывает накладные затраты;
- если проект не укладывается в срок, то добавление людей задержит его еще больше;
- «серебряной пули» нет!

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

Особенности современных проектов ПО:

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

Разработка ПО имеет следующие специфические особенности:

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

Путем выхода из кризиса ПО стало создание программной инженерии (software engineering). Инженерия ПО (software engineering) - совокупность инженерных методов и средств создания ПО. Фундаментальная идея программной инженерии: проектирование ПО является формальным процессом, который можно изучать и совершенствовать.

Освоение и правильное применение методов и средств программной инженерии позволяет повысить качество, обеспечить управляемость процесса проектирования.

Этапы становления и развития SE:

- 70-е и 80-е годы - систематизация и стандартизация процессов создания ПО (структурный подход);
- 90-е годы - начало перехода к сборочному, индустриальному способу создания ПО (объектно-ориентированный подход).

Программная инженерия применяется для удовлетворения требований заказчика ПО. Основные цели программной инженерии:

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

Основным понятием программной инженерии является понятие жизненного цикла ПО. Жизненный цикл ПО (software lifecycle) - это период времени, который начинается с момента принятия решения о необходимости создания ПО и заканчивается в момент его полного изъятия из эксплуатации.

Основной нормативный документ, регламентирующий ЖЦ ПО - стандарт ISO/IEC 12207 "Information Technology - Software Life Cycle Processes" (ГОСТ Р ИСО/МЭК 12207-99). В рамках технологий создания ПО понятие ЖЦ уточняется, но указанные стандарты не нарушаются. Процесс стандартизации ведётся довольно интенсивно. Стандарт ISO/IEC 12207 имеет несколько редакций с 1995 по 2008 год.

С точки зрения статической структуры ЖЦ является совокупностью процессов ЖЦ.

Процесс ЖЦ - набор взаимосвязанных действий, преобразующих некоторые входные данные и ресурсы в выходные.

Каждый процесс характеризуется задачами, методами их решения, действующими лицами, результатами. Процессы ЖЦ протекают параллельно. Каждый процесс разделен на набор действий, каждое действие - на набор задач. Каждый процесс, действие или задача инициируется и выполняется по мере необходимости, причем не существует заранее определенных последовательностей выполнения. Группы процессов ЖЦ (ISO/IEC 12207:1995):

- основные (приобретение, поставка, разработка, эксплуатация, сопровождение);
- вспомогательные (документирование, управление конфигурацией, обеспечение качества, верификация, аттестация, совместная оценка, аудит, разрешение проблем);
- организационные (управление, создание инфраструктуры, усовершенствование, обучение).

Для ознакомления приведем содержание процессов ЖЦ.

Процесс приобретения включает следующие действия: инициирование приобретения; подготовку заявочных предложений; подготовку и корректировку договора; надзор за деятельностью поставщика; приемку и завершение работ. Действующие лица: заказчик, поставщик. Задачи приобретения: определение заказчиком своих потребностей в ПО; анализ требований к ПО; принятие решения о приобретении ПО; выработка плана приобретения и заявочных предложений; выбор поставщика; подготовка и заключение договора с поставщиком; контроль за соблюдением условий договора; корректировка договора при необходимости.

Процесс поставки включает в себя следующие действия: инициирование поставки; подготовку ответа на заявочные предложения; подготовку договора; планирование и выполнение поставки; контроль поставки; проверку и оценку. Действующие лица: заказчик, поставщик. Задачи поставки: оценка поставщиком заявочных предложений; подготовки и заключение договора с заказчиком, контроль со стороны поставщика за соблюдением условий договора, принятие решения о привлечении субподрядчика или выполнении работ своими силами, выработка плана управления проектом и др.

Процесс разработки включает в себя следующие действия: подготовительную работу; анализ требований к ПО; проектирование архитектуры ПО; детальное проектирование ПО; кодирование ПО; тестирование ПО; интеграцию ПО; установку ПО; приемку ПО. Действующие лица: разработчик, заказчик. Задачи разработки: выбор модели ЖЦ ПО и согласование с заказчиком; определение требований к ПО (функциональных и нефункциональных); определение состава компонентов ПО и создание документации по каждому компоненту; моделирование и спецификация компонент ПО; планирование интеграции компонент; создание исходных текстов компонент; поиск и исправление ошибок в исходных текстах и документации; сборка ПО; развертывание ПО; оценка результатов.

Процесс эксплуатации включает в себя следующие действия: подготовительную работу; эксплуатационное тестирование; эксплуатацию; поддержку пользователей. Действующие лица: оператор (организация, эксплуатирующая ПО), пользователи. Задачи эксплуатации: выработка плана эксплуатации и эксплуатационных стандартов; составление процедур локализации и разрешения проблем эксплуатации; поиск ошибок в ПО перед вводом в эксплуатацию его новых версий; оказание помощи пользователям и консультирование.

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

Процесс документирования включает в себя следующие действия: подготовительную работу; проектирование и разработку документации; выпуск документации; сопровождение.

Процесс управления конфигурацией в себя следующие действия: подготовительную работу; создание базы знаний о ПО (конфигурации); контроль за конфигурацией; учет состояния конфигурации; оценку конфигурации; управление выпуском и поставку ПО. Конфигурация ПО - это совокупность сведений о его функциональных и физических характеристиках на всех стадиях ЖЦ ПО. Основная задача управления конфигурацией: организация, систематический учет и контроль внесения изменений в ПО.

Процесс обеспечения качества включает в себя следующие действия: подготовительную работу; обеспечение качества продукта; обеспечение качества процесса; обеспечение других показателей качества ПО. Задачи обеспечения качества: гарантированное соответствие ПО требованиям заказчика, зафиксированным в договоре; гарантированнее соответствие процессов ЖЦ ПО, методов разработки, квалификации персонала установленным стандартам.

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

Процесс аттестации состоит в определении полноты соответствия разработанного ПО требованиям заказчика. Основная задача аттестации - оценка достоверности тестирования ПО. Как правило, для аттестации привлекают независимых экспертов.

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

Процесс аудита состоит в определении полноты соответствия проекта условиям договора.

Процесс разрешения проблем предусматривает анализ и разрешение проблем, возникающих в течение ЖЦ ПО.

Процесс управления включает в себя следующие действия: подготовительную работу; планирование; выполнение и контроль; проверку и оценку; завершение. Задачи управления: проверка достаточности имеющихся ресурсов; составление графиков работ; оценка затрат; выделение ресурсов; распределение ответственности; оценка рисков.

Процесс создания инфраструктуры состоит в выборе и поддержке технологии разработки ПО, стандартов и инструментальных средств; выборе и установке аппаратных и программных средств, необходимых для разработки, эксплуатации и сопровождения ПО.

Процесс усовершенствования предусматривает оценку, измерение, контроль и усовершенствование процессов ЖЦ ПО. Основная задача усовершенствования - повышение производительности труда.

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

В обновленной версии ISO/IEC 12207:2008 рассматриваются больше процессов ЖЦ:

Группа процессов договора: приобретение и поставка.

Группа организационных процессов: управление моделью ЖЦ, управление инфраструктурой, управление проектным портфолио, управление кадрами, управление качеством.

Группа технических процессов: определение интересов участников, анализ требований к системе, проектирование системной архитектуры, реализация, интеграция системы, аттестация, установка, приёмка, эксплуатация системы, сопровождение, вывод из эксплуатации.

Группа процессов ПО (software-specific processes) включает три подгруппы: процессы создания ПО (группа из 7 пр.); процессы поддержки ПО (8 процессов); процессы повторного использования ПО (3 процесса).

Сравнение номенклатуры процессов ЖЦ в двух версиях стандарта ISO/IEC 12207 отражает происходящее в программной инженерии накопление опыта.

Вторым измерением ЖЦ, дополняющим структурное, но ортогональным ему, является динамическое, определяющее развитие ЖЦ во времени в виде модели жизненного цикла.

Модель ЖЦ ПО - это структура, определяющая последовательность выполнения и взаимосвязи процессов, действий и задач на протяжении всего ЖЦ.

В любой модели ЖЦ рассматривается как совокупность стадий ЖЦ.

Стадия ЖЦ - это часть ЖЦ ограниченная временными рамками, по завершении которой достигается определенный важный результат в соответствии с требованиями для данной стадии ЖЦ. Между двумя стадиями, идущими друг за другом, находится контрольная точка (веха). Так называют момент времени, разделяющий стадии жизненного цикла (или итерации, если они предусмотрены в модели ЖЦ), по наступлении которого должны достигаться результаты важные для всего проекта и должны приниматься решения о дальнейшей разработке.

Модели ЖЦ:

- каскадная (водопадная);
- эволюционная;
- основанная на формальных преобразованиях;
- итерационные (пошаговая и спиральная).

Схема каскадной модели ЖЦ:

Принципы каскадной модели: фиксация требований к системе в начале проекта; переход со стадии на стадию только после полного завершения работ на текущей стадии; недопустимость возврата на пройденные стадии; жесткая привязка процессов ЖЦ к стадиям ЖЦ.

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

Проектирование охватывает процессы: разработку архитектуры ПО, разработку структур программ в его составе и их детальную спецификацию.

Реализация или кодирование включает процессы создания текстов программ на языках программирования.

На этапе тестирования производится собственно тестирование, а также отладка и оценка качества ПО.

Ввод в действие - это развертывание ПО на целевой вычислительной системе, обучение пользователей и т.п.

Эксплуатация ПО - это использование ПО для решения практических задач на компьютере путем выполнения ее программ.

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

Обратите внимание на схожесть стадий в водопадной модели с перечнем технических процессов в ISO/IEC 12207:2008.

Достоинства: на каждой стадии формируется законченный набор проектной документации, отвечающий критериям полноты и согласованности; выполняемые в логичной последовательности стадии работ облегчают планирование сроков завершения всех работ и соответствующих затрат. Недостатки: позднее обнаружение проблем; выход из календарного графика, запаздывание с получением результатов; высокий риск создания системы, не удовлетворяющей изменившимся потребностям пользователей; избыточность документации; неравномерная нагрузка членов группы, работающей над проектом в ходе ЖЦ.

Неизбежные возвраты на предыдущие стадии в каскадной модели

На самом деле невозможно двигаться строго поступательно, необходимо возвращаться, чтобы исправлять ошибки, сделанные на ранних стадиях, устранять недоделки, учитывать меняющиеся в ходе проекта требования. В этом кроется причина недостатков водопадной модели. Недостатки не вычёркивают водопадную модель из списка применимых на практике. Для любой модели ЖЦ они должны рассматриваться как продолжения достоинств.

Особенности модели ЖЦ, основанной на формальных преобразованиях: использование специальных нотаций для формального описания требований; кодирование и тестирование заменяется процессом предобразования формальной спецификации в исполняемую программу. Достоинства: формальные методы гарантируют соответствие ПО спецификациям требований к ПО, т. о. вопросы надежности и безопасности решаются сами собой. Недостатки: большие системы сложно описать формальными спецификациями; требуются специально подготовленные и высоко квалифицированные разработчики; есть зависимость от средств разработки и нотации спецификаций.

Схема модели ЖЦ, основанной на формальных преобразованиях

Особенности итерационных моделей:

- Разработка делится на несколько итераций, в рамках каждой из которых выполняются действия по созданию части системы (на разных итерациях части разные).
- Действия не привязаны намертво к определенным стадиям ЖЦ, а выполняются по мере необходимости, повторяются, до тех пор, пока не будет получен нужный результат.
- С каждой пройденной итерацией ПО наращивается, в него интегрируются новые разработанные компоненты.

Схема пошаговой итерационной модели ЖЦ

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

Схема спиральной модели ЖЦ

Особенности спиральной модели:

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

Достоинства итерационных моделей:

- полный учет требований заказчика, большее его участие в проекте;
- равномерная нагрузка на группу разработчиков;
- раннее обнаружение проблем и их разрешение по мере возникновения;
- уменьшение рисков на каждой итерации.

Недостатки итерационных моделей: сложность планирования; плохая документированность создаваемого ПО.

Проблемой современной программной инженерии являются «тяжелые» процессы. Характеристики «тяжелого» процесса:

- необходимость документировать каждое действие разработчиков;
- множество рабочих продуктов (в первую очередь - документов), создаваемых в бюрократической атмосфере;
- отсутствие гибкости;
- детерминированность (долгосрочное детальное планирование и предсказуемость всех видов деятельности, распределение человеческих ресурсов на длительный срок, охватывающий большую часть проекта.

Противоположностью «тяжелого» процесса является «легковесный» процесс - основа быстрой или гибкой разработки ПО (agile software development). Гибкая разработка ориентируется на эффективную коммуникацию между разработчиками, высокую квалификацию разработчиков и другие факторы, позволяющие сократить расходы на «бюрократию».

Манифест гибкой разработки:

- Индивидуумы и взаимодействия ценятся выше процессов и инструментов.
- Работающее ПО ценится выше всеобъемлющей документации.
- Сотрудничество с заказчиками ценится выше согласования условий договора.
- Реагирование на изменения ценится выше соблюдения плана.

Важно, что стоящее в левой части не отменяет стоящего в правой (документация, процессы, инструменты планы важны, но в меньшей степени, чем индивидуумы, взаимодействия, работающий «софт» и реагирование на изменения).

Принципы быстрой разработки:

- Диалог «лицом к лицу» - самый эффективный способ обмена информацией.
- Избыточная «тяжесть» технологии (дополнительные рабочие продукты, планы, диаграммы, документы) стоит дорого.
- Более многочисленные команды требуют более «тяжелых» технологий.

Добавим также, что возможности «легких» процессов не безграничны. Для решения крупной задачи подойдет только «тяжелый» процесс.

Большая «тяжесть» процесса подходит для проектов с большей критичностью.

Под критичностью понимаются масштабы последствий отказа разрабатываемого ПО. Уровни критичности:

- потеря удобства;
- потеря важных данных и/или рабочего времени;
- потеря невозместимых средств, дорогостоящего оборудования;
- потеря человеческой жизни.

Примеры: I) данные выданы не в виде диаграммы, а в виде таблицы; II) «синий экран смерти»; III) взрыв ракеты «Ариан-5» 4 июня 1996 года (500 000 000$) и массовое отключение электричества в Северной Америке 14 августа 2003 г. (4-10 Гига$); IV) неправильная работа медицинской рентгеновской установки Therac-25 (3 смерти).

Возрастание обратной связи и коммуникации сокращает потребность в промежуточных продуктах.

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

Дисциплина, умение и понимание противостоят процессу, формальности и документированию.

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

Потеря эффективности в некритических видах деятельности вполне допустима.

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

### Литература к лекции 1

### Брукс Ф. Мифический человеко-месяц или как создаются программные системы. - СПб.: Символ-Плюс, 1999

### Вендров А.М. Проектирование программного обеспечения экономических информационных систем: Учебник. - М.: Финансы и статистика, 2005

### Коберн А. Быстрая разработка программного обеспечения. - М.: ЛОРИ, 2002

### Соммервилл И. Инженерия программного обеспечения. 6-е издание.: Пер. с англ.: - М.: Вильямс, 2002

### Жоголев Е. А. Технология программирования - М.: Научный мир, 2004

### Кулямин В. В. Технологии программирования. Компонентный подход. - М.: Бином. Лаборатория знаний, 2007 [http://panda.ispras.ru/~kuliamin/lectures-sdt/sdt-book-2006.pdf]

7) Амблер С. Гибкие технологии: экстремальное программирование и унифицированный процесс разработки - СПб.: Питер, 2005