Методы и средства инженерии программного обеспечения

ВВЕДЕНИЕ В ПРОГРАММНУЮ ИНЖЕНЕРИЮ И ЖИЗНЕННЫЙ ЦИКЛ ПО


 

Разработка и использование компьютерных программ  в настоящее время стало  массовой деятельностью.  Более семи миллионов человек занимаются  их разработкой, а сотни  миллионов  активно  используют их  в своей профессиональной деятельности [1]. Практически нет ни одной сферы деятельности (экономика, медицина, бизнес, коммерция, промышленность и т.д.), где бы программное обеспечение (ПО) не использовалось для автоматизации и  улучшения этой деятельности. Спрос на ПО постоянно увеличивается, его сложность растет, а ошибки в ПО остаются.

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

Примерно каждые 10 лет происходит смена языков программирования и  операционных сред для описания и функционирования программ. Это предполагает изменение ранее изготовленных и функционирующих  программ в  новые языки и операционные среды. На это тратятся  огромные людские и финансовые ресурсы. Так,  при изменении  формата даты (2000 год)  в программах и микросхемах на десятках  млн. компьютеров участвовало  более 2 млн. программистов, а  затраты составили сотни млн. долларов. Переделка (реинженерия) ранее созданных  прикладных Фортран программ в  новые  языки (С, Java и др.) и условия функционирования требует больших капиталовложений и привлечения  программистов  из третьих стран и  СНГ.

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


Процесс формирования  знаний в информатике и Computer Science  послужил толчком для формирования самого претенциозного проекта 90-х годов  в истории развития вычислительной техники – японский проект ЭВМ 5 поколения, который должен был сделать переворот в области проектирования и программирования ПО [2]. В этом проекте предполагалось, что  в  суперкомпьютеры будут заложены огромные интеллектуальные знания в виде экспертных систем, баз знаний, систем вывода новых знаний и т.п. Общение с такими суперкомпьютерами  будет осуществляться голосом, образами, речью, а из постановок задач будут  выводиться готовые решения без написания  соответствующих программ. Этот проект не был реализован, так как знания специалистов–разработчиков таких компьютеров не были достаточно полными и совершенными и, кроме того,  уровень интеллектуализации знаний на то время  не был достаточно глубоко разработанным, чтобы идеи японского проекта воплотить в реальную  аппаратуру и  встроить в нее высоко интеллектуальные  системы автоматизации постановок задач.
Проектирование и создание новых компьютерных систем, в том числе из готовых  компонентов (Reusing) и систем,  теоретически и практически осуществляется с учетом современных возможностей платформ и распределенных сред, в которых компоненты распределяются по разным узлам сети и взаимодействуют между собой  через сетевые протоколы. Появились новые методы и  подходы  к разработке ПО: структурный, объектно-ориентированный, компонентный, аспектный, визуальный – UML, агентно-ориентированный, сервисный и др. [3-13].
Разработано огромное количество разнообразных инструментальных средств поддержки процесса проектирования ПО и методов оценки качества, производительности, стоимости и т.п. Процесс разработки ПО и методы оценки продукта,  процессов ЖЦ  стандартизованы (ISO/IEC 12207 [14],  15504 [15], ISO 9126[16-18] и др.). Все это способствует повышению уровня проектирования, тестирования, прогнозирования надежности и оценки качества ПО.          


Вместе с тем,  новый  программный проект разрабатывается 1-2 года, а эволюционирует 6-7лет. На его сопровождение тратиться 61% затрат против 39% на его разработку. Эффективность разработчиков в зависимости от квалификации колеблется в отношении 20:200, отсюда требуется повышать уровень знаний разработчиков ПО. На сегодня ядро стабильных знаний по программной инженерии составляет 75% от тех знаний, что используются в практической программисткой деятельности.
В связи с этим мировое компьютерное сообщество пришло к  необходимости систематизации накопленных   знаний и общие из них   зафиксировать  в виде ядер знаний (Body of Knowledge – BOK) для  разных  областей информатики [19]. Для создания ядра знаний  ПО был создан  международный комитет при  американском объединении компьютерных специалистов ACM   (Association   for Computing  Machinery)  и институте  инженеров  по  электронике  и электротехнике IEEE Computer Society. В комитет вошли специалисты мирового уровня в области информатики и разработки ПО, которые  внесли свой опыт и знания, а также  систематизировали накопленные разнородные знания  и  определили (1999г.,  2001г.,  2004г.)  ядро профессиональных знаний  SWEBOK  (Software Engineering Body Knowledge)  программной инженерии [20], как основы проектирования ПО.  Ядро включает сумму знаний, распределенную по  10  специализированным областям, которые отражают отдельные  процессы проектирования  ЖЦ ПО и методы их поддержки.
 


Программная инженерия (Software Engineering) является отраслью Computer science,  изучает вопросы построения компьютерных программ, отражает закономерности ее развития, обобщает  опыт программирования в виде комплекса общих знаний и правил  регламентации инженерной деятельности разработчиков ПО. В этом определении важно рассмотреть два основных аспекта.
1. Инженерная дисциплина, по которой инженеры применяя теоретические идеи, методы и средства для разработки ПО, проводят создание ПО, согласно стандартов, регламентирующих процессы проектирования и разработки.


2. Аспекты создания ПО. Программная инженерия рассматривает такие аспекты ПО как управление проектом ПО и разработка средств, методов и теорий, необходимых для создания качественных программных систем. Эта  инженерная дисциплина    предоставляет всю необходимую информацию и стандарты для выбора наиболее подходящего метода проектирования практических задач. Не исключается и  творческий неформальный подход к созданию ПО.
Как инженерная дисциплина, она охватывает все аспекты создания ПО, начиная от формирования требований до создания, сопровождения и снятия с эксплуатации ПО, а также включает инженерные методы оценки трудозатрат,  стоимости,  производительности и качества. Т.е. речь идет именно об инженерной деятельности в программировании, поскольку ее сущность близка  к определению  инженерной деятельности в  толковом словаре [2]:
1) инженерия есть применение научных результатов, что позволяет получать пользу от свойств материалов и источников энергии;
2) как деятельность по созданию машин для предоставления полезных услуг.
В программной инженерии, инженеры – это специалисты, выполняющие практические работы по реализации программ с применением теории, методов и средств компьютерной науки. Компьютерная наука (computer science) охватывает теорию и методы построения вычислительных и программных систем, тогда как программная инженерия рассматривает вопросы практического построения ПО. Знание компьютерной науки необходимо специалистам в области программного обеспечения так же, как знание физики – инженерам-электронщикам. Если для решения конкретных задач программирования  не существует подходящих методов или теории, инженеры применяют свои знания, накопленные ими  в процессе конкретных разработок ПО, а также используя опыт работы на соответствующих  инструментальных программных средствах. Кроме того,  инженеры  должны работать в условиях  заключенных контрактов и выполнять задачи с учетом этих условий.
В отличие от науки, целью которой есть получение знаний, для инженерии знание  – это  способ получения некоторой пользы.  Как говорил известный специалист в области программой техники Ф.Брукс], «ученый строит, чтобы научиться, инженер учится, чтобы строить».


Таким образом, разработка программных систем можно считать инженерной деятельностью, имеющей значительные отличия от традиционной  инженерии, в которой:
–  ветви инженерии имеют высокую степень специализации, а у программной инженерии специализация заметна только в довольно узких применениях (например, операционные системы, трансляторы);
– объекты  хорошо определены и манипуляции с ними происходят в узком контексте типичных проектных решений и деталей, которые отвечают типовым требованиям заказчиков и касаются отдельных деталей, а не общих вопросов, тогда как у программной инженерии подобная типизация отсутствует;
– отдельные готовые решения классифицированы и каталогизированы, а в программной инженерии каждая новая разработка - это  новая проблема, в которой довольно тяжело рассмотреть аналогию с ранее разработанными системами.
Указанные отличия требуют проведения организационных и технических работ для превращения ее в специальность. В настоящее время мировая компьютерная общественность объединились в профессиональные комитеты и проводят такие работы: разработка ядра знаний SWEBOK, этического кодекса программиста [13],  учебных курсов подготовки соответствующих специалистов, обучение специальности, сертификация специалистов  в области программной инженерии и др.
Следующим шагом   деятельности этих организаций и комитетов  является создание общей компьютерной программы обучения – Curricula 2001 [8]. В ней содержатся рекомендации по структуре и преподаванию 15 учебных курсов по информатике (дискретные системы, программирование, теория сложности, ОС  и др.) в том числе и по программной инженерии, как дисциплины, изучающей теорию, знания и практику эффективного построения ПО на всех этапах ЖЦ, которым соответствуют области знаний в SWEBOK.
В  разработке  больших программных проектов, кроме   программистов,  принимают участие:
–  менеджеры, которые планируют и руководят проектом, отслеживают  сроки  и  затраты;
– инженеры службы хранения готовых компонентов в библиотеках  и репозитариях;


– технологи, которые  определяют инженерные методы и стандарты, регламентирующие  и регулирующие  процесс реализации проекта;
– тестировщики (контролеры),  которые проверяют правильность выполнения процесса проектирования и продуктов процессов, на основе собранных данных проводят измерения разных характеристик качества, включая  оценку   надежности ПО.
Таким образом,  возникновение программной инженерии как дисциплины разработки ПО  определено следующими  важными факторами:
– накопленным значительным объемом  интеллектуальных знаний в области создания ПО;
– появлением новых разнообразных  методов анализа,  моделирования и проектирования ПО;
– необходимостью совершенствования методов обнаружения  ошибок в ПО;
– потребностями   эффективной организации коллективов разработчиков ПО и оценки их деятельности;
– использованием готовых программных компонентов, высоко технологических средств и инструментов разработки  ПО;
– реинженерией компонентов и систем для  их  адаптации  к новым изменяющимся условиям  сред и сетей.
Программная инженерия, как инженерная дисциплина,  делает главный акцент на повышение  качества и производительности ПО за счет применения новых и усовершенствованных:  методов проектирования ПО;  готовых компонентов и методов их генерации;  методов эволюции ПО;  методов верификации и тестирования ПО; инструментальных средств поддержки; методов управления проектами, методов оценки качества, производительности, стоимости и т.п.; стандартизации процессов  разработки ПО (ISO/IEC 12207,  ISO/IEC 15504, ISO 9126 и др.), регламентирующих этапы ЖЦ; подходов к оценке продуктов и процессов.
В данном разделе темы лекций дается систематическое изложение следующих  взаимосвязанных аспектов в инженерии  проектировании ПО:
 – теоретический и интеллектуальный базис (методы, принципы, средства и методологии и др.) проектирования, представленный в ядре SWEBOK, способствующий созданию высококачественных программных продуктов и удовлетворяющих заданным заказчиком функциональных и нефункциональных  требований;
– связь теоретических аспектов  программирования  с готовыми стандартами в области программной инженерии, которые регламентируют деятельность специалистов-разработчиков ПО  и организационные мероприятия по выполнению процессов верификации, валидации, тестирования, метрического анализа и оценки промежуточных и конечного результатов этой деятельности;
– концепции обучения разработчиков ПО методам и средствам  программной инженерии, стандартным процессам ЖЦ с целью научить их методологии проектирования ПО, использующей  знания в области  программной инженерии и положений современных стандартов, регламентирующих процессы разработки, планирования,  управления программным проектом, качеством, рисками и ресурсами проекта.
 

Содержание раздела