Методология и инструменты программной инженерии

    Методология и инструменты программной инженерии

    Молодяков С.А.

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

    Программная инженерия — это область компьютерной науки и технологии, которая занимается построением программных систем… Это инженерная дисциплина, которая связана со всеми аспектами производства программного обеспечения (ПО) от начальных стадий создания спецификации до поддержки системы после сдачи в эксплуатацию. Термин – software engineering (программная инженерия) — впервые был озвучен в октябре 1968 года на конференции подкомитета НАТО по науке и технике (г.Гармиш, Германия).

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

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

    ПО1-1

    Основными процессами (иногда называют этапами или фазами) жизненного цикла являются:

    — Разработка спецификации требований (результат – описания требований к программе, которые обязательны для выполнения – описание того, что программа должна делать);
    — Разработка проекта программы (результат – описание того, как программа будет работать);
    — Кодирование (результат – исходный код и файлы конфигурации);
    — Тестирование программы (результат — контроль соответствия программы требованиям);
    — Документирование (результат – документация к программе);
    — Сопровождение (внесение изменений в ПО в целях исправления ошибок, повышения производительности или адаптации к изменившимся условиям работы или требованиям).

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

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

    Наиболее известными стандартами программной инженерии являются: ·

    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 областей:ПО2-2

    • 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]:
    Важнейшей проблемой развития и применения современных систем, является обучение и воспитание специалистов в области программной инженерии, использование международных стандартов, способствующих высокому качеству ПО и достоверному его оцениванию. Необходимо обучение специалистов умению формализовать требования и достигать конкретные значения характеристик качества функционирования и применения сложных комплексов программ, с учетом тех ресурсов, которые нужны и доступны для обеспечения и совершенствования этого качества.

    В публикации использованы открытые электронные материалы:

    1. Орлик С., Булуя Ю. «Введение в программную инженерию и управление жизненным циклом» (базируется на SWEBOK). http://software-testing.ru/library/around-testing/engineering/267-swebok
    2. Программная инженерия http://iibs.vvsu.ru/ispi/nap/pi/
    3. Липаев В.В. Программная инженерия в жизненном цикле программных средств http://citforum.ru/SE/lipaev/