Эксплуатация и сопровождение

Под сопровождением будем понимать все действия по повышению надежности программного продукта после завершения отладки и разработку усовершенствованных версий. Пожалуй, основным принципом сопровождения является закон Биледи (Laszlo Веladу): используемый программный продукт подвергается непрерывным изменениям для поддержания его экономической выгоды [Гласс, Нуазо 19831].

Перечислим четыре основные класса задач, решаемых на этапе сопровождения.

· Адаптация, как правило, заключающаяся в модификации функций.

· Усовершенствование, заключающееся обычно в добавлении новых функций.

· Коррекция или исправление ошибок.

· Предупреждение проблем, которые могут возникнуть в будущем.

Эти категории задач достаточно условны и проблема может быть перенесена из одной категории в другую

Для решения указанных задач выбирается один из следующих, наиболее подходящих типов сопровождения [Conger 1994], под которым будем понимать степень вмешательства в программу:

· незначительные (локальные) изменения;

· реструктурирование кода — повторная разработка небольшой части про граммы. При этом интерфейс этой части с остальной программой остается неизменным;

· реинжиниринг — перестройка существующего программного продукта. Обычно реинжиниринг применяется для приведения кода программы в соответствие с современными методологиями программирования (например, объектно-ориентированной);

· программирование заново.

На выбор типа сопровождения влияют два фактора.

· Класс решаемой задачи. Как правило, коррекция программы влечет незначительную степень вмешательства, а усовершенствование и адаптация — реструктурирование и реинжиниринг.

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

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

Существует ряд методов, которые помогают добиться высокого качества сопровождения.

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

Самодокументируемость изменений.

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

· если никто из коллег не выступит против (в случае пассивного сопротивления);

· если все одобрят изменение (в случае активного сопротивления).

Проиллюстрируем процесс сопровождения на примере таких программ, к компиляторы. Поскольку они имеют ряд особенностей, характерных для сопровождения [Safопоv 199б] то перечислим эти особенности в порядке более общих к более специфическим.

Функционирование на нескольких аппаратных платформах.

Наличие большого количества пользователей.

Необходимость тщательного тестирования.

Наличие устаревших алгоритмов.

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

Источниками (“возбудителями’) основных классов задач сопровождения могут быть:

· пользователи компилятора, находящие ошибки;

· разработчики взаимозависимых компонентов (например, отладчика);

· инженеры, сопровождающие компилятор (например, предлагая повысить эффективность компилятора).

Теперь рассмотрим — как четыре основных класса задач по сопровожден решаются применительно к компиляторам.

· Адаптация компиляторов предполагает их приспособление к изменившимся условиям работы системы. Все причины изменений могут быть сведены к трем основным.

· Архитектурные изменения. Например, важнейшим типом адаптации является перенос компилятора на другую архитектуру.

· Изменения в операционной системе. Например, операционная система может начать поддерживать многопоточное исполнение, начиная с не которой версии.

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

Усовершенствование компиляторов предполагает внесение в них изменений в интересах заказчика. Выделим несколько основных направлений усовершенствования.

· Повышение эффективности. Например, оптимизация алгоритмов семантического анализа.

· Повышение надежности. Информацию к размышлению здесь можно получить после обработки программы на языке С утилитой расширенного синтаксического анализа 1iп или утилитой поиска ошибок времени исполнения beheck.

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

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

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

Предупреждение проблем может быть проиллюстрировано ставшей уже классической “проблемой 2000 года”.