Программная инженерия. Теория и практика
Шрифт:
Введение
Иан Соммервилл в своей книге «Инженерия программного обеспечения» определяет программную инженерию как интегрирование принципов математики, информатики и компьютерных наук с инженерными подходами, разработанными для производства осязаемых материальных артефактов. Дисциплина программной инженерии включается в круг вопросов компьютинга (англ. computing) и может рассматриваться как инженерная область, имеющая более тесные связи со своей базовой дисциплиной – компьютерными науками, чем другие инженерные области [1]. Среди других инженерных дисциплин она качественно выделяется нематериальностью программного обеспечения и дискретной природой его функционирования. Основываясь на математике и компьютинге, программная инженерия занимается разработкой систематических моделей и надежных методов производства
Термин «инженерия программного обеспечения» появился впервые в 1968 г. на конференции НАТО «Инженерия программного обеспечения» и должен был спровоцировать размышления относительно текущего в то время «кризиса программного обеспечения». С тех пор он стал использоваться для определения как профессии, так и области исследований, посвященных созданию программного обеспечения, которое имеет более высокое качество, более доступно, поддерживаемо и быстрее строится.
Так как эта область относительно молода по сравнению со своими сестринскими областями инженерии, все еще продолжаются дебаты вокруг того, что представляет собой «инженерия программного обеспечения» и удовлетворяет ли она понятию инженерии. Этот спор развивается естественным образом, начавшись с попыток рассматривать создание программного обеспечения только как программирование. Разработка программного обеспечения – термин, иногда предпочитаемый практиками в промышленности, которые рассматривают разработку программного обеспечения как несравнимо более мощную и конструкционно-емкую методологию в сравнении с процессом написания кода программистом.
Все же несмотря на юность профессии, будущее области радужно. Так, Money Magazine и Salary.com оценили профессию разработчика программного обеспечения как лучшую работу в Америке в 2006 г.
В настоящее время существует как минимум три основополагающих документа в области программной инженерии. Это SWEBOK (Software Engineering Body of Knowledge) – документ, подготавливаемый комитетом Software Engineering Coordinating Committee, в который вовлечено сообщество IEEE Computer Society (IEEE-CS). Назначение SWEBOK – в объединении знаний по инженерии программного обеспечения (разработке программного обеспечения), Второй документ – Software Engineering Code of Ethics and Professional Practice, посвящен этическим и профессиональным стандартам для инженерии ПО, выпущен в 1998 г. Третий документ (SE2004), выпущенный в 2004 г., посвящен составлению учебного плана по программной инженерии.
Эти документы созданы совместными усилиями IEEE-CS и Association for Computing Machinery (ACM) и призваны определить следующее:
• необходимый набор знаний и рекомендуемые практики;
• этические и профессиональные стандарты;
• учебную программу для студентов, аспирантов и продолжающих обучение.
В рамках изучения дисциплины «Программная инженерия» сложно охватить весь объем накопленных в этой области знаний. Этот учебник представляет собой попытку собрать основные компоненты необходимых наборов знаний, умений и рекомендуемых практик в рассматриваемой дисциплине. В первую очередь он предназначен для студентов, обучающихся по направлению подготовки «Прикладная информатика». Также он будет небезынтересен людям, непосредственно занимающимся разработкой и проектированием различных информационных систем, в аспекте систематизации и актуализации знаний по программной инженерии.
Учебник состоит из теоретического курса и практикума. Для успешного освоения теории необходимо использовать так называемые карты памяти. Обратите внимание, что первые карты памяти нужно рисовать «вручную». Впоследствии, особенно при «массовом» процессе использования карт памяти, целесообразно пользоваться инструментами. Мы рекомендуем продукт Comapping (www.comapping.com).
Часть заданий и вопросов на отдельную тему часто необходимо выполнять после освоения всего курса вообще, так как они содержат ссылки на другие темы – как назад, так и вперед.
Относительно всего теоретического материала правомочно одно стандартное задание – нарисовать все содержание в виде одной карты памяти на листе формата А4 (можно А3, но не больше). Такие задания целесообразно выполнять сразу после изучения. Полезность такого подхода связана с тем, что такие карты памяти легко рисуются (при наличии навыка) и очень легко проверяются.
Часто задания с помощью карт памяти оказываются не совсем картами памяти. Исчезает центральный объект, вместо него появляется произвольный «плоский» граф. Также полезно оказывается рисовать имена связям. Мы все равно называем такие графы картами памяти, чтобы терминологически не усложнять ситуацию.
Теоретический курс
1. Методы и средства программной инженерии
Понятие программной инженерии. Основные определения: информатика, системотехника, бизнес-реинжиниринг. Программное обеспечение: определение, свойства.
1.1. Введение в программную инженерию
Чем программирование отличается от программной инженерии [2]? Тем, что первое является некоторой абстрактной деятельностью и может происходить во многих контекстах. Можно программировать для удовольствия, для того, чтобы научиться (например, на уроках, на семинарах в университете), можно программировать в рамках научных разработок, а можно заниматься промышленным программированием. Как правило, это происходит в команде. При этом необходимо точно понимать, что нужно заказчику, выполнить работу в определенные сроки и результат должен быть нужного качества – того, которое удовлетворит заказчика и за которое он заплатит. Чтобы удовлетворить этим требованиям, программирование «обрастает» различными дополнительными видами деятельности: разработкой требований, планированием, тестированием, конфигурационным управлением, проектным менеджментом, созданием различной документации (проектной, пользовательской и пр.).
Разработка программного кода предваряется анализом и проектированием (первое означает создание функциональной модели будущей системы без учета реализации для осознания программистами требований и ожиданий заказчика; второе – предварительный макет, эскиз, план системы на бумаге). Трудозатраты на анализ и проектирование, а также форма представления их результатов сильно варьируются в зависимости от видов проектов и предпочтений разработчиков и заказчиков.
Требуются также специальные усилия по организации процесса разработки. В общем виде это итеративно-инкрементальная модель, когда требуемая функциональность создается порциями, которые менеджеры и заказчик могут оценить, и тем самым есть возможность управления ходом разработки. Однако эта общая модель имеет множество модификаций и вариантов.
Разработку системы также необходимо выполнять с учетом удобств ее дальнейшего сопровождения, повторного использования и интеграции с другими системами. Это значит, что система разбивается на компоненты, удобные в разработке, годные для повторного использования и интеграции, а также имеющие необходимые характеристики по быстродействию. Для этих компонент тщательно прорабатываются интерфейсы. Сама же система документируется на многих уровнях, создаются правила оформления программного кода, оставляются многочисленные семантические следы, помогающие создать и сохранить, поддерживать единую, стройную архитектуру, единообразный стиль, порядок.
Все эти и другие дополнительные виды деятельности, выполняемые в процессе промышленного программирования и необходимые для успешного выполнения заказов, и будем называть программной инженерией (software engineering). Хотя еще в 70-х гг. прошлого столетия академиком А.П. Ершовым термин software engineering переводился на русский язык как «технология программирования», программная инженерия – более современный, но менее традиционный перевод этого же термина, предложенный в конце 90-х И.В. Поттосиным. Получается, что так мы обозначаем, во-первых, некоторую практическую деятельность, а во-вторых, специальную область знания, или, другими словами, научную дисциплину. Ведь для облегчения выполнения каждого отдельного проекта, для возможности использовать разнообразный положительный опыт, достигнутый другими командами и разработчиками, этот самый опыт подвергается осмыслению, обобщению и надлежащему оформлению. Так появляются различные методы и практики (best practices) – тестирования, проектирования, работы над требованиями, архитектурных шаблонов, а также стандарты и методологии, касающиеся всего процесса в целом (например, MSF, RUP, CMMI, Scrum). Вот эти-то обобщения и входят в программную инженерию как в область знания.