Методология и инструменты программной инженерии
Молодяков С.А.
В данной публикации представлены основные элементы и понятия системы знаний в программной инженерии. В рамках систематизации выделены методология, области знаний и инструменты. Области знаний программной инженерии можно соотносить с изучаемыми в университетах дисциплинами.
Надеюсь, что изложенный материал интересен не только ученым и специалистам.
Программная инженерия — это область компьютерной науки и технологии, которая занимается построением программных систем… Это инженерная дисциплина, которая связана со всеми аспектами производства программного обеспечения (ПО) от начальных стадий создания спецификации до поддержки системы после сдачи в эксплуатацию. Термин – software engineering (программная инженерия) — впервые был озвучен в октябре 1968 года на конференции подкомитета НАТО по науке и технике (г.Гармиш, Германия).
Суть методологии программной инженерии состоит в применении систематизированного, научного и предсказуемого процесса проектирования, разработки и сопровождения программных средств.
Одним из основных понятий программной инженерии является понятие жизненного цикла программного продукта и программного процесса. Жизненный цикл ПО – период времени, который начинается с момента принятия решения о необходимости создания программного продукта и заканчивается в момент его полного изъятия из эксплуатации. Этот цикл — процесс построения и развития ПО. Жизненный цикл разбивается на отдельные процессы. Процесс – совокупность действий и задач, имеющих целью достижение значимого результата.
Основными процессами (иногда называют этапами или фазами) жизненного цикла являются:
— Разработка спецификации требований (результат – описания требований к программе, которые обязательны для выполнения – описание того, что программа должна делать);
— Разработка проекта программы (результат – описание того, как программа будет работать);
— Кодирование (результат – исходный код и файлы конфигурации);
— Тестирование программы (результат — контроль соответствия программы требованиям);
— Документирование (результат – документация к программе);
— Сопровождение (внесение изменений в ПО в целях исправления ошибок, повышения производительности или адаптации к изменившимся условиям работы или требованиям).
Модель жизненного цикла ПО – структура, определяющая последовательность выполнения и взаимосвязи процессов, действий и задач на протяжении жизненного цикла. Модель жизненного цикла зависит от специфики, масштаба и сложности проекта и специфики условий, в которых система создается и функционирует. Модель задается в виде практических этапов, необходимых для создания ПО. В модели мы говорим, что и как мы будем делать. Т.е. какие процессы, с какой степенью конкретизации и в какой последовательности мы будем выполнять. Выбор модели процесса является первым шагом в создании ПО. Правильный выбор модели очень важен, т.к. во многом определяет успех проекта.
Основные концепции программной инженерии сконцентрировались и формализовались в целостном комплексе систематизированных международных стандартов, охватывающих и регламентирующих практически все процессы жизненного цикла сложных программных средств. Несколько десятков стандартов этого комплекса допускают целеустремленный отбор необходимых процессов, в зависимости от характеристик и особенностей конкретного проекта, а также формирование на их базе проблемно-ориентированных профилей стандартов для определенных типов проектов и/или предприятий. Процесс стандартизации и сертификации давно вошел и в программную инженерию, где он составляет основу промышленного производства программных продуктов.
Наиболее известными стандартами программной инженерии являются: ·
ISO/IEC 12207 — Information Technology — Software Life Cycle Processes — Процессы жизненного цикла программных средств. Стандарт содержит определения основных понятий программной инженерии. (в частности программного продукта и жизненного цикла программного продукта).
SEI CMM — Capability Maturity Model (for Software) — модель зрелости процессов разработки программного обеспечения. Стандарт отвечает на вопрос: «Какими признаками должна обладать профессиональная организация по разработке ПО?».
PMBOK — Project Management Body of Knowledge — Свод знаний по управлению проектами.
SWBOK — Software Engineering Body of Knowledge — Свод знаний по программной инженерии — содержит описания состава знаний по разделам (областям знаний) программной инженерии.
ACM/IEEE CC2001 — Computing Curricula 2001 – Академический образовательный стандарт в области компьютерных наук. Выделены 4 основных раздела компьютерных наук: Computer science, Computer engineering, Software engineering и Information systems, по каждому из которых описаны области знаний соответствующего раздела, состав и планы рекомендуемых курсов.
В настоящее время сообществом SWBOK разрабатывается расширенная версия знаний по программной инженерии, которая включает 15 областей:
- Software Requirements — требования к ПО.
- Software Design — проектирование ПО.
- Software Construction — конструирование ПО.
- oftware Testing — тестирование ПО.
- Software Maintenance — сопровождение ПО.
- Software Configuration Management — управление конфигурацией.
- Software Engineering Management — управление IT проектом.
- Software Engineering Process — процесс программной инженерии.
- Software Engineering Models and Methods — модели и методы разработки.
- Software Engineering Professional Practice — описание критериев профессионализма и компетентности.
- Software Quality — качество ПО.
- Software Engineering Economics — экономические аспекты разработки ПО.
- Computing Foundations — основы вычислительных технологий, применимых в разработке ПО.
- Mathematical Foundations — базовые математические концепции и понятия, применимые в разработке ПО.
- Engineering Foundations — основы инженерной деятельности.
Метод программной инженерии — это структурный подход к созданию ПО, который способствует производству высококачественного продукта эффективным в экономическом аспекте способом. В этом определении есть две основные составляющие: (а) создание высококачественного продукта и (б) экономически эффективным способом. Иными словами, метод – это то, что обеспечивает решение основной задачи программной инженерии: создание качественного продукта при заданных ресурсах времени, бюджета, оборудования, людей.
Обычно выделяют три группы методов: эвристические методы (heuristic methods), касающиеся неформализованных подходов; формальные методы (formal methods), обоснованные математически; методы прототипирования (prototyping methods), базирующиеся на различных формах прототипирования.
Методология программной инженерии и стандарты регламентируют современные процессы управления проектами сложных систем и программных средств. Они обеспечивают организацию, освоение и применение апробированных, высококачественных процессов проектирования, программирования, верификации, тестирования и сопровождения программных средств и их компонентов. Тем самым эти проекты и процессы позволяют получать стабильные, предсказуемые результаты и программные продукты требуемого качества.
Программные инструменты предназначены для обеспечения поддержки процессов жизненного цикла программного обеспечения. Инструменты позволяют автоматизировать определенные повторяющиеся действия, уменьшая загрузку инженеров рутинными операциями и помогая им сконцентрироваться на творческих, нестандартных аспектах реализации выполняемых процессов. Инструменты часто проектируются с целью поддержки конкретных (частных) методов программной инженерии, сокращая административную нагрузку, ассоциированную с “ручным” применением соответствующих методов.
CASE (Computer-Aided Software Engineering) – набор инструментов и методов программной инженерии для проектирования программного обеспечения, который помогает обеспечить высокое качество программ, отсутствие ошибок и простоту в обслуживании программных продуктов.
Инструменты (CASE) программной инженерии (Software Engineering Tools) [1]:
1.1. Инструменты работы с требованиями (Software Requirements Tools).
1.2. Инструменты проектирования (Software Design Tools) — инструменты для создания и проверки программного дизайна. (SADT/IDEF, UML, BPMN/BPEL, Microsoft DSL и т.п.)
1.3. Инструменты конструирования (Software Construction Tools) В соответствии с пониманием “конструирования”, заданным соответствующей областью знаний SWEBOK. Эти инструменты используются для производства и трансляции программного представления (например, исходного кода), достаточно детального и явного для машинного выполнения.
- Редакторы (program editors). Эти инструменты используются для создания и модификации программ и, возможно, ассоциированной с ними документации.
- Компиляторы и генераторы кода (compilers and code generators). Неинтерактивные (командные) трансляторы исходного кода. Компиляторы и редакторы в интегрированных средах программирования. К этому классу также относятся препроцессоры, линковщики/загрузчики, а также генераторы кода.
- Интерпретаторы (interpreters). Можно объединить интерпретаторы с компиляторами и генераторами кода, как средства непосредственной подготовки (трансляции) исходного кода к исполнению.
- Отладчики (debuggers). Эти инструменты поддерживают процесс конструирования программного обеспечения, но, в то же время, отличаются от редакторов и компиляторов.
1.4. Инструменты тестирования (Software Testing Tools)
- Генераторы тестов (test generators). Эти инструменты помогают в разработке сценариев тестирования.
- Средства выполнения тестов (test execution frameworks). Эти средства обеспечивают среду исполнения тестовых сценариев в контролируемом окружении, позволяющем отслеживать поведение объекта, подвергаемого тестированию.
- Инструменты оценки тестов (test evaluation tools). Эти инструменты поддерживают оценку результатов выполнения тестов, помогая определить в какой степени и где именно обнаруженное поведение соответствует ожидаемому поведению.
- Средства управления тестами (test management tools).
- Инструменты анализа производительности (performance analysis tools).
1.5. Инструменты сопровождения (Software Maintenance Tools) Эта тема охватывает инструменты, особенно важные для обеспечения сопровождения существующего программного обеспечения, подверженного модификациям:
- Инструменты облегчения понимания (comprehension tools). Эти инструменты помогают человеку в понимании программ. Примерами могут служить различные средства визуализации.
- Инструменты реинжиниринга (reengineering tools). Эти инструменты поддерживают деятельность по реинжинирингу, описанную в области знаний SWEBOK “Software Maintenance”.
1.6. Инструменты конфигурационного управления (Software Configuration Management Tools) Инструменты конфигурационного управления делятся на три категории:
- Инструменты отслеживания (tracking) дефектов, расширений и проблем. •
- Инструменты управления версиями. •
- Инструменты сборки и выпуска. Эти инструменты предназначены для управления задачами сборки и выпуска продуктов, а также включают средства инсталляции.
1.7. Инструменты управления инженерной деятельностью (Software Engineering Management Tools) Средства управления деятельностью по программной инженерии делятся на три категории:
- Инструменты планирования и отслеживания проектов.
- Инструменты управления рисками.
- Инструменты количественной оценки.
1.8. Инструменты поддержки процессов (Software Engineering Process Tools):
- Инструменты моделирования.
- Инструменты управления проектами.
- Инструменты конфигурационного управления, поддерживающие работу с актуальными версиями всего комплекса артефактов проекта.
- Ролевые платформы разработки программного обеспечения, охватывающие все стадии жизненного цикла и, на сегодняшний день, являющиеся развитием интегрированных средств разработки и CASE-инструментов в направлении поддержки “смежной” функциональности – управления требованиями, работ по конфигурационному управлению с поддержкой управления изменениями, тестирования и оценки качества.
1.9. Инструменты обеспечения качества (Software Quality Tools) Средства обеспечения качества делятся на две категории:
- Инструменты инспектирования. Эти средства используются для поддержки обзора (review) и аудита.
- Инструменты (статического) анализа. Эти средства используются для анализа программных артефактов, данных, потоков работ и зависимостей.
Из представленного видно, что специалист в области программной инженерии является в первую очередь не только разработчиком прикладного ПО, но и системного ПО, организатором и руководителем (менеджером проектов) промышленной разработки надежных качественных программных систем.
Хотя прошло уже много лет с момента определения термина «Программная инженерия», однако и сейчас эта область знаний все еще относительно молода по сравнению со своими сестринскими областями инженерии, есть все еще большая работа и дебаты вокруг того, что представляет собой «инженерия программного обеспечения», и удовлетворяет ли оно понятию инженерии. Не смотря на «юность» профессии программиста, будущее области программной инженерии радужно.
В заключение приведу слова Липаева В.В. [3]:
Важнейшей проблемой развития и применения современных систем, является обучение и воспитание специалистов в области программной инженерии, использование международных стандартов, способствующих высокому качеству ПО и достоверному его оцениванию. Необходимо обучение специалистов умению формализовать требования и достигать конкретные значения характеристик качества функционирования и применения сложных комплексов программ, с учетом тех ресурсов, которые нужны и доступны для обеспечения и совершенствования этого качества.
В публикации использованы открытые электронные материалы:
- Орлик С., Булуя Ю. «Введение в программную инженерию и управление жизненным циклом» (базируется на SWEBOK). http://software-testing.ru/library/around-testing/engineering/267-swebok
- Программная инженерия http://iibs.vvsu.ru/ispi/nap/pi/
- Липаев В.В. Программная инженерия в жизненном цикле программных средств http://citforum.ru/SE/lipaev/