Краткие теоретические аспекты технологии разработки программного обеспечения
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Содержание
Введение………………………………………………………………………
1 Краткие теоретические аспекты технологии разработки программного
обеспечения …………………………………………………….
1.1 Сущность и актуальность предмета ……………………………………..
1.2 Модели жизненного цикла программных средств (ПС) ……………….
1.3 Качество программного обеспечения (ПО) ……………………………..
1.4 Стиль программирования ………………………………………………...
1.5 Модульное программирование …………………………………………..
1.6 Методы проектирования ПС ……………………………………………..
1.7 Отладка и тестирование ПС ……………………………………………...
1.8 Надежность ПС ……………………………………………………………
1.9 Документация ПС …………………………………………………………
2
4
4
4
10
13
14
16
23
25
25
Введение
За последнее десятилетие рост производительности компьютеров,
объемов их оперативной и внешней памяти, пропускной способности внешних устройств и каналов связи качественно изменил ситуацию в вычислительной технике и сферах ее применения. Уменьшаются размеры компьютеров, потребление ими электроэнергии, а скорость вычислений возрастает.
Известно, что основной задачей первых трех десятилетий компьютерной эры являлось развитие аппаратных компьютерных средств. Это было
обусловлено высокой стоимостью обработки и хранения данных. В 80-е годы
успехи микроэлектроники привели к резкому увеличению производительности компьютера при значительном снижении стоимости.
Основной задачей 90-х годов и начала XXI века стало совершенствование качества компьютерных приложений, возможности которых целиком
определяются программным обеспечением (ПО).
Сняты практически все аппаратные ограничения на решение задач.
Оставшиеся ограничения приходятся на долю ПО.
Чрезвычайно актуальными стали следующие проблемы:
аппаратная сложность опережает наше умение строить ПО, использующее потенциальные возможности аппаратуры;
наше умение строить новые программы отстает от требований к новым
программам;
нашим возможностям эксплуатировать существующие программы угрожает низкое качество их разработки.
Ключом к решению этих проблем является грамотная организация
процесса создания ПО, реализация технологических принципов промышленного конструирования программных систем (ПС).
Компьютерные науки вообще и программная инженерия в частности
очень популярные и стремительно развивающиеся области знаний. Обоснование простое: человеческое общество XXI века информационное общество. Об этом говорят цифры: в ведущих странах занятость населения в информационной сфере составляет 60 %, а в сфере материального производства
40 %. Именно поэтому специальности направления «Компьютерные науки
и информационные технологии» гарантируют приобретение наиболее престижных, дефицитных и высокооплачиваемых профессий. Так считают во
всех развитых странах мира. Ведь не зря утверждают: «Кто владеет информацией тот владеет миром!»
Поэтому понятно то пристальное внимание, которое уделяет компьютерному образованию мировое сообщество, понятно стремление унифицировать и упорядочить знания, необходимые специалисту этого направления.
Одним из результатов такой работы являются международный стандарт по
компьютерному образованию Computing Curricula 2001 — Computer Science
и международный стандарт по программной инженерии IEEE/ACM Software
Engineering Body of Knowledge SWEBOK 2001.
2
Технология разработки программного обеспечения (ТРПО) — система
инженерных принципов для создания экономичного ПО, которое надежно и
эффективно работает в реальных компьютерах.
Различают методы, средства и процедуры ТРПО. Методы обеспечивают решение следующих задач:
планирование и оценка проекта;
анализ системных и программных требований;
проектирование алгоритмов, структур данных и программных структур;
кодирование;
тестирование;
сопровождение.
Инструментальные средства ТРПО обеспечивают автоматизированную или автоматическую поддержку методов. Инструментальные средства
могут объединяться в системы автоматизированного конструирования ПО.
Такие системы принято называть CASE-системами. Аббревиатура CASE
расшифровывается как Computer Aided Software Engineering (программная
инженерия с компьютерной поддержкой).
3
1 Краткие теоретические аспекты технологии разработки
программного обеспечения
1.1 Сущность и актуальность предмета
Технология программирования – это система методов, способов и
приемов разработки и отладки программ.
В соответствии с обычным значением слова «технология» под технологией программирования (programming technology) будем понимать совокупность производственных процессов, приводящую к созданию требуемого
программного средства (ПС), а также описание этой совокупности процессов.
Другими словами, технологию программирования мы будем понимать здесь
в широком смысле как технологию разработки программных средств, включая в нее все процессы, начиная с момента зарождения идеи этого средства, и,
в частности, связанные с созданием необходимой программной документации.
Современная индустриальная технология проектирования программ
включает в себя комплекс мероприятий, руководящих документов и автоматизированных средств, предназначенных для системного анализа, разработки,
отладки, документирования, управления работой специалистов.
Для уменьшения стоимости изготовления ПС и повышения производительности труда программистов используются методы, регламентирующие
высокую профессиональную культуру написания программ независимо от
языка, от системы, ЭВМ и решаемой задачи. Такие методы получили общее
название – технологии программирования.
Хорошая технология дает возможность получить высокий экономический эффект при ее использовании, существенный рост производительности
труда программистов, повышает качество программного продукта.
1.2
Модели жизненного цикла программных средств
Комплексы программ создаются, эксплуатируются и развиваются во
времени. Жизненный цикл ПС включает в себя все этапы развития от возникновения потребности в программе определенного целевого назначения до
полного прекращения использования этого ПС, вследствие его морального
старения или потери необходимости решения задачи.
В настоящее время можно выделить 5 основных подходов к организации процесса создания и использования ПС.
Водопадный подход. При таком подходе разработка ПС состоит из
цепочки этапов. На каждом этапе создаются документы, используемые на
последующем этапе. В исходном документе фиксируются требования к ПС.
В конце этой цепочки создаются программы, включаемые в ПС.
Исследовательское программирование. Этот подход предполагает
быструю (насколько это возможно) реализацию рабочих версий программ
4
ПС, выполняющих лишь в первом приближении требуемые функции. После
экспериментального применения реализованных программ производится их
модификация с целью сделать их более полезными для пользователей. Этот
процесс повторяется до тех пор, пока ПС не будет достаточно приемлемо для
пользователей. Такой подход применялся на ранних этапах развития программирования, когда технологии программирования не придавали большого
значения (использовалась интуитивная технология). В настоящее время этот
подход применяется для разработки таких ПС, для которых пользователи не
могут точно сформулировать требования (например, для разработки систем
искусственного интеллекта).
Прототипирование. Этот подход моделирует начальную фазу исследовательского программирования вплоть до создания рабочих версий программ, предназначенных для проведения экспериментов с целью установить
требования к ПС. В дальнейшем должна последовать разработка ПС по установленным требованиям в рамках какого-либо другого подхода (например,
водопадного).
Формальные преобразования. Этот подход включает разработку формальных спецификаций ПС и превращение их в программы путем корректных преобразований. На этом подходе базируется компьютерная технология
(CASE-технология) разработки ПС.
Сборочное программирование. Этот подход предполагает, что ПС
конструируется, главным образом, из компонент, которые уже существуют.
Должно быть некоторое хранилище (библиотека) таких компонент, каждая из
которых может многократно использоваться в разных ПС. Такие компоненты
называются повторно используемыми (reusable). Процесс разработки ПС при
данном подходе состоит скорее из сборки программ из компонент, чем из их
программирования.
Рассмотрим более подробно водопадный подход. Именно этот подход
рассматривается в качестве индустриального подхода разработки программного обеспечения. Исследовательское программирование исходит из взгляда
на программирование как на искусство. Оно применяется тогда, когда водопадный подход не применим из-за того, что не удается точно сформулировать требования к ПС. Прототипирование рассматривается как вспомогательный подход, используемый в рамках других подходов, в основном, для
прояснения требований к ПС.
В рамках водопадного подхода различают следующие стадии жизненного цикла ПС (см. рисунок 1.1): разработку ПС, производство программных
изделий (ПИ) и эксплуатацию ПС.
5
Стадия производства
программных изделий
Стадия разработки ПС
Стадия эксплуатации
ПС
Фаза применения ПС
Этап внешнего
описания ПС
Этап конструирования ПС
Фаза сопровождения ПС
Этап аттестации
ПС
Этап кодирования
ПС
Рисунок 1.1 - Стадии и фазы жизненного цикла ПС
Стадия разработки (development) ПС состоит из этапа его внешнего
описания, этапа конструирования ПС, этапа кодирования (программирование
в узком смысле) ПС и этапа аттестации ПС. Всем этим этапам сопутствуют
процессы документирования и управления ПС. Этапы конструирования и кодирования часто перекрываются, иногда довольно сильно. Это означает, что
кодирование некоторых частей программного средства может быть начато до
завершения этапа конструирования.
Этап внешнего описания ПС включает процессы, приводящие к созданию некоторого документа, который мы будем называть внешним описанием
(requirements document) ПС. Этот документ является описанием поведения
ПС с точки зрения внешнего по отношению к нему наблюдателя с фиксацией
требований относительно его качества. Внешнее описание ПС начинается с
анализа и определения требований к ПС со стороны пользователей (заказчика), а также включает процессы спецификации этих требований.
Конструирование (design) ПС охватывает процессы: разработку архитектуры ПС, разработку структур программ ПС и их детальную спецификацию.
На этом этапе определяется потребность в ПС, его назначение и основные функциональные характеристики, оцениваются затраты и возможная
эффективность применения такого комплекса программ.
Кодирование (coding) ПС включает процессы создания текстов программ на языках программирования, их отладку с тестированием ПС.
На этапе аттестации (acceptance) ПС производится оценка качества
ПС. Если эта оценка оказывается приемлемой для практического использования ПС, то разработка ПС считается законченной. Это обычно оформляет-
6
ся в виде некоторого документа, фиксирующего решение комиссии, проводящей аттестацию ПС.
Программное изделие (ПИ) экземпляр или копия разработанного ПС.
Изготовление ПИ это процесс генерации и/или воспроизведения (снятия
копии) программ и программных документов ПС с целью их поставки пользователю для применения по назначению.
Производство ПИ это совокупность работ по обеспечению изготовления требуемого количества ПИ в установленные сроки. Стадия производства ПИ в жизненном цикле ПС является, по существу, вырожденной (не существенной), так как представляет рутинную работу, которая может быть
выполнена автоматически и без ошибок. Этим она принципиально отличается от стадии производства различной техники. В связи с этим в литературе
эту стадию, как правило, не включают в жизненный цикл ПС.
Стадия эксплуатации ПС охватывает процессы хранения, внедрения
ПС, а также транспортировки и применения ПИ по своему назначению. Она
состоит из двух параллельно проходящих фаз: фазы применения ПС и фазы
сопровождения ПС.
Применение (operation) ПС это использование ПС для решения
практических задач на компьютере путем выполнения ее программ.
Сопровождение (maintenance) ПС это процесс сбора информации
качестве ПС в эксплуатации, устранения обнаруженных в нем ошибок, его
доработки и модификации, а также извещения пользователей о внесенных в
него изменениях.
Каскадная модель широко использовалась в 70-80 годах.
Его основной характеристикой является разбиение всей разработки на
этапы, причем переход с одного этапа на следующий происходит только после того, как будет полностью завершена работа на текущем (рисунок 1.2).
Каждый этап завершается выпуском полного комплекта документации, достаточной для того, чтобы разработка могла быть продолжена другой командой разработчиков.
Положительные стороны применения каскадного подхода заключаются в следующем:
на каждом этапе формируется законченный набор проектной документации, отвечающий критериям полноты и согласованности;
выполняемые в логичной последовательности этапы работ позволяют
планировать сроки завершения всех работ и соответствующие затраты.
Каскадный подход хорошо зарекомендовал себя при построении ПС,
для которых в самом начале разработки можно достаточно точно и полно
сформулировать все требования, с тем чтобы предоставить разработчикам
свободу реализовать их как можно лучше с технической точки зрения. В эту
категорию попадают сложные расчетные системы, системы реального времени и другие подобные задачи. Однако, в процессе использования этого подхода обнаружился ряд его недостатков, вызванных прежде всего тем, что ре7
альный процесс создания ПО никогда полностью не укладывался в такую
жесткую схему. В процессе создания ПО постоянно возникала потребность в
возврате к предыдущим этапам и уточнении или пересмотре ранее принятых
решений. В результате реальный процесс создания ПО принимал следующий
вид (рисунок 1.3):
Рисунок. 1.2 - Каскадная схема разработки ПО
Рисунок 1.3 - Реальный процесс разработки ПО по каскадной схеме
Основным недостатком каскадного подхода является существенное
запаздывание с получением результатов. Согласование результатов с пользователями производится только в точках, планируемых после завершения каждого этапа работ, требования к ПС «заморожены» в виде технического задания на все время ее создания. Таким образом, пользователи могут внести
свои замечания только после того, как работа над системой будет полностью
завершена. В случае неточного изложения требований или их изменения в
течение длительного периода создания ПО, пользователи получают систему,
не удовлетворяющую их потребностям. Модели (как функциональные, так и
информационные) автоматизируемого объекта могут устареть одновременно
с их утверждением.
Спиральная модель жизненного цикла нашла свое широкое применение в 86-90 годах.
Для преодоления проблем, которые возникали при каскадном подходе
была предложена спиральная модель жизненого цикла(ЖЦ) (рисунок 1.4),
8
делающая упор на начальные этапы ЖЦ: анализ и проектирование. На этих
этапах реализуемость технических решений проверяется путем создания
прототипов. Каждый виток спирали соответствует созданию фрагмента или
версии ПО, на нем уточняются цели и характеристики проекта, определяется
его качество и планируются работы следующего витка спирали. Таким образом, углубляются и последовательно конкретизируются детали проекта, и в
результате выбирается обоснованный вариант, который доводится до реализации.
Разработка итерациями отражает объективно существующий спиральный цикл создания системы. Неполное завершение работ на каждом этапе позволяет переходить на следующий этап, не дожидаясь полного завершения работы на текущем. При итеративном способе разработки недостающую
работу можно будет выполнить на следующей итерации. Главная же задача как можно быстрее показать пользователям системы работоспособный продукт, тем самым, активизируя процесс уточнения и дополнения требований.
Основная проблема спирального цикла - определение момента перехода на следующий этап. Для ее решения необходимо ввести временные ограничения на каждый из этапов жизненного цикла. Переход осуществляется
в соответствии с планом, даже если не вся запланированная работа закончена.
План составляется на основе статистических данных, полученных в предыдущих проектах, и личного опыта разработчиков.
Основным нормативным документом, регламентирующим ЖЦ ПО,
является международный стандарт ISO/IEC 12207 (ISO - International Organization of Standardization - Международная организация по стандартизации,
IEC - International Electrotechnical Commission - Международная комиссия по
электротехнике). Он определяет структуру ЖЦ, содержащую процессы, действия и задачи, которые должны быть выполнены во время создания ПО.
Рисунок 1.4 - Спиральная модель ЖЦ
9
Структура ЖЦ ПО по стандарту ISO/IEC 12207 базируется на трех
группах процессов:
основные процессы ЖЦ ПО (приобретение, поставка, разработка, эксплуатация, сопровождение);
вспомогательные процессы, обеспечивающие выполнение основных
процессов (документирование, управление конфигурацией, обеспечение качества, верификация, аттестация, оценка, аудит, решение проблем);
организационные процессы (управление проектами, создание инфраструктуры проекта, определение, оценка и улучшение самого ЖЦ, обучение).
1.3 Качество программного обеспечения (ПО)
Каждое ПС должно выполнять определенные функции, т.е. делать то,
что задумано. Хорошее ПС должно обладать еще целым рядом свойств, позволяющим успешно его использовать в течение длительного периода, т.е.
обладать определенным качеством. Качество (quality) ПС это совокупность
его черт и характеристик, которые влияют на его способность удовлетворять
заданные потребности пользователей. Это не означает, что разные ПС должны обладать одной и той же совокупностью таких свойств в их наивысшей
степени. Этому препятствует тот факт, что повышение качества ПС по одному из таких свойств часто может быть достигнуто лишь ценой изменения
стоимости, сроков завершения разработки и снижения качества этого ПС по
другим его свойствам. Качество ПС является удовлетворительным, когда
оно обладает указанными свойствами в такой степени, чтобы гарантировать
успешное его использование.
Совокупность свойств ПС, которая образует удовлетворительное для
пользователя качество ПС, зависит от условий и характера эксплуатации этого ПС, т.е. от позиции, с которой должно рассматриваться качество этого ПС.
Поэтому при описании качества ПС, прежде всего, должны быть фиксированы критерии отбора требуемых свойств ПС. В настоящее время критериями
качества ПС (criteria of software quality) принято считать:
функциональность;
надежность;
легкость применения;
эффективность;
сопровождаемость;
мобильность.
Функциональность это способность ПС выполнять набор функций,
удовлетворяющих заданным или подразумеваемым потребностям пользователей. Набор указанных функций определяется во внешнем описании ПС.
Надежность (reliability) ПС это его способность безотказно выполнять определенные функции при заданных условиях в течение заданного периода времени с достаточно большой вероятностью. При этом под отказом в
10
ПС понимают проявление в нем ошибки. Таким образом, надежное ПС не
исключает наличия в нем ошибок важно лишь, чтобы эти ошибки при
практическом применении этого ПС в заданных условиях проявлялись достаточно редко. Убедиться, что ПС обладает таким свойством можно при его
испытании путем тестирования, а также при практическом применении. Таким образом, фактически мы можем разрабатывать лишь надежные, а не правильные ПС.
При оценке степени надежности ПС следует также учитывать последствия каждого отказа. Некоторые ошибки в ПС могут вызывать лишь некоторые неудобства при его применении, тогда как другие ошибки могут иметь
катастрофические последствия, например, угрожать человеческой жизни.
Поэтому для оценки надежности ПС иногда используют дополнительные показатели, учитывающие стоимость (вред) для пользователя каждого отказа.
Легкость применения это характеристики ПС, которые позволяют
минимизировать усилия пользователя по подготовке исходных данных, применению ПС и оценке полученных результатов, а также вызывать положительные эмоции определенного или подразумеваемого пользователя.
Эффективность это отношение уровня услуг, предоставляемых ПС
пользователю при заданных условиях, к объему используемых ресурсов.
Сопровождаемость это характеристики ПС, которые позволяют
минимизировать усилия по внесению изменений для устранения в нем ошибок и по его модификации в соответствии с изменяющимися потребностями
пользователей.
Мобильность это способность ПС быть перенесенным из одной среды (окружения) в другую, в частности, с одной ЭВМ на другую.
Функциональность и надежность являются обязательными критериями качества ПС, причем обеспечение надежности будет красной нитью проходить по всем этапам и процессам разработки ПС. Остальные критерии используются в зависимости от потребностей пользователей в соответствии с
требованиями к ПС. Для конкретизации качества ПС по каждому из критериев используется стандартизованный набор достаточно простых свойств ПС,
однозначно интерпретируемых разработчиками. Такие свойства мы будем
называть примитивами качества ПС. Некоторые из примитивов могут использоваться по нескольким критериям. Ниже приводится зависимость критериев качества от примитивов качества ПС.
Функциональность: завершенность.
Надежность: завершенность, точность, автономность, устойчивость,
защищенность.
Легкость применения: П-документированность, информативность
(только применительно к документации по применению), коммуникабельность, устойчивость, защищенность.
Эффективность: временнáя эффективность, эффективность по ресурсам (по памяти), эффективность по устройствам.
11
Сопровождаемость. С данным критерием связано много различных
примитивов качества. Однако их можно распределить по двум группам, выделив два подкритерия качества: изучаемость и модифицируемость.
Изучаемость это характеристики ПС, которые позволяют минимизировать усилия по изучению и пониманию программ и документации ПС.
Модифицируемость это характеристики ПС, которые позволяют автоматически настраивать на условия применения ПС или упрощают внесение в него вручную необходимых изменений и доработок.
Изучаемость: С-документированность, информативность (здесь применительно к документации по сопровождению), понятность, структурированность, удобочитаемость.
Модифицируемость: расширяемость, модифицируемость (в узком
смысле, как примитив качества), структурированность, модульность.
Мобильность: независимость от устройств, автономность, структурированность, модульность.
Ниже даются определения используемых примитивов качества ПС.
Завершенность (completeness) свойство, характеризующее степень
обладания ПС всеми необходимыми частями и чертами, требующимися для
выполнения своих явных и неявных функций.
Точность (accuracy) мера, характеризующая приемлемость величины погрешности в выдаваемых программами ПС результатах с точки зрения
предполагаемого их использования.
Автономность (self-containedness) свойство, характеризующее способность ПС выполнять предписанные функции без помощи или поддержки
других компонент программного обеспечения.
Устойчивость (robustness) свойство, характеризующее способность
ПС продолжать корректное функционирование, несмотря на неправильные
(ошибочные) входные данные.
Защищенность (defensiveness) свойство, характеризующее способность ПС противостоять преднамеренным или нечаянным деструктивным
(разрушающим) действиям пользователя.
П-документированность (u. documentation) свойство, характеризующее наличие, полноту, понятность, доступность и наглядность учебной,
инструктивной и справочной документации, необходимой для применения
ПС.
Информативность (accountability) свойство, характеризующее наличие в составе ПС информации, необходимой и достаточной для понимания
назначения ПС, принятых предположений, существующих ограничений,
входных данных и результатов работы отдельных компонент, а также текущего состояния программ в процессе их функционирования.
Коммуникабельность (communicativeness) свойство, характеризующее степень, в которой ПС облегчает задание или описание входных данных,
и способность выдавать полезные сведения в достаточно простой форме и с
простым для понимания содержанием.
12
Временнáя эффективность (time efficiency) мера, характеризующая
способность ПС выполнять возложенные на него функции в течение определенного отрезка времени.
Эффективность по ресурсам (resource efficiency) мера, характеризующая способность ПС выполнять возложенные на него функции при определенных ограничениях на используемые ресурсы (используемую память).
Эффективность по устройствам (device efficiency) мера, характеризующая экономичность использования устройств машины для решения поставленной задачи.
С-документировапнность (documentation) свойство, характеризующее с точки зрения наличия документации, отражающей требования к ПС и
результаты различных этапов разработки данной ПС, включающие возможности, ограничения и другие черты ПС, а также их обоснование.
Понятность (understandability) свойство, характеризующее степень,
в которой ПС позволяет изучающему его лицу понять его назначение, сделанные допущения и ограничения, входные данные и результаты работы его
программ, тексты этих программ и состояние их реализации.
Структурированность (structuredness) свойство, характеризующее
программы ПС с точки зрения организации взаимосвязанных их частей в
единое целое определенным образом (например, в соответствии с принципами структурного программирования).
Удобочитаемость (readability) свойство, характеризующее легкость
восприятия текста программ ПС (отступы, фрагментация, форматированность).
Расширяемость (augmentability) свойство, характеризующее способность ПС к использованию большего объема памяти для хранения данных
или расширению функциональных возможностей отдельных компонент.
Модифицируемость (modifiability) мера, характеризующая ПС с
точки зрения простоты внесения необходимых изменений и доработок на
всех этапах и стадиях жизненного цикла ПС.
Модульность (modularity) свойство, характеризующее ПС с точки
зрения организации его программ из таких дискретных компонент, что изменение одной из них оказывает минимальное воздействие на другие компоненты.
Независимость от устройств (device independence) свойство, характеризующее способность ПС работать на разнообразном аппаратном
обеспечении (различных типах, марках, моделях ЭВМ).
1.4 Стиль программирования
Стиль программирования связан с удобочитаемостью программы.
Правила хорошего стиля программирования – это результат соглашения между опытными программистами.
13
Правило стандартизации стиля заключается в следующем: если существует более одного способа сделать что-либо и выбор произвольный, остановитесь на одном способе, и всегда его придерживайтесь. Программное
средство представленное в хорошем стиле имеет комментарии (пояснительные, вводные иногда оглавления), значимые идентификаторы, хорошо воспринимаемый текст ПС.
Пользовательский интерфейс также должен быть разработан в хорошем стиле, придерживаясь следующих рекомендаций:
пользовательский интерфейс должен базироваться на терминах и
понятиях, знакомых пользователю;
пользовательский интерфейс должен быть единообразным;
пользовательский интерфейс должен позволять пользователю исправлять собственные ошибки;
пользовательский интерфейс должен позволять получение пользователем справочной информации: как по его запросу, так и генерируемой ПС.
1.5 Модульное программирование
Приступая к разработке каждой программы ПС, следует иметь в виду,
что она, как правило, является большой системой, поэтому мы должны принять меры для ее упрощения. Для этого такую программу разрабатывают по
частям, которые называются программными модулями. А сам такой метод
разработки программ называют модульным программированием. Программный модуль это любой фрагмент описания процесса, оформляемый как самостоятельный программный продукт, пригодный для использования в описаниях процесса. Это означает, что каждый программный модуль программируется, компилируется и отлаживается отдельно от других модулей программы, и тем самым, физически разделен с другими модулями программы.
Более того, каждый разработанный программный модуль может включаться
в состав разных программ, если выполнены условия его использования, декларированные в документации по этому модулю. Таким образом, программный модуль может рассматриваться и как средство борьбы со сложностью
программ, и как средство борьбы с дублированием в программировании (т.е.
как средство накопления и многократного использования программистских
знаний).
Программы разбиваются на модули для того, чтобы:
упростить их разработку и реализацию;
облегчить чтение программ;
упростить их настройку и модификацию;
облегчить работу с данными, имеющими сложную структуру;
избежать чрезмерной детализации алгоритмов;
обеспечить более выгодное размещение программ в памяти ЭВМ.
14
Не всякий программный модуль способствует упрощению программы.
Выделить хороший с этой точки зрения модуль является серьезной творческой задачей. Для оценки приемлемости выделенного модуля используются
некоторые критерии. Так, Хольт предложил следующие два общих критерия:
хороший модуль снаружи проще, чем внутри;
хороший модуль проще использовать, чем построить.
Майерс предлагает для оценки приемлемости программного модуля
использовать более конструктивные его характеристики:
размер модуля;
прочность модуля;
сцепление с другими модулями;
рутинность модуля (независимость от предыстории обращений к
нему).
Размер модуля измеряется числом содержащихся в нем операторов
или строк. Модуль не должен быть слишком маленьким или слишком большим. Маленькие модули приводят к громоздкой модульной структуре программы и могут не окупать накладных расходов, связанных с их оформлением. Большие модули неудобны для изучения и изменений, они могут существенно увеличить суммарное время повторных трансляций программы при
отладке программы. Обычно рекомендуются программные модули размером
от нескольких десятков до нескольких сотен операторов.
Прочность(связность) модуля это мера его внутренних связей. Чем
выше прочность модуля, тем больше связей он может спрятать от внешней
по отношению к нему части программы и, следовательно, тем больший вклад
в упрощение программы он может внести.
Сцепление модуля это мера его зависимости по данным от других
модулей. Характеризуется способом передачи данных. Чем слабее сцепление
модуля с другими модулями, тем сильнее его независимость от других модулей.
Рутинность модуля это его независимость от предыстории обращений к нему. Модуль будем называть рутинным, если результат (эффект) обращения к нему зависит только от значений его параметров (и не зависит от
предыстории обращений к нему). Модуль будем называть зависящим от
предыстории, если результат (эффект) обращения к нему зависит от внутреннего состояния этого модуля, изменяемого в результате предыдущих обращений к нему. Майерс не рекомендует использовать зависящие от предыстории (непредсказуемые) модули, так как они провоцируют появление в
программах хитрых (неуловимых) ошибок. Однако такая рекомендация является неконструктивной, так как во многих случаях именно зависящий от предыстории модуль является лучшей реализаций информационно прочного модуля. Поэтому более приемлема следующая (более осторожная) рекомендация:
всегда следует использовать рутинный модуль, если это не приводит к плохим (не рекомендуемым) сцеплениям модулей;
15
зависящие от предыстории модули следует использовать только в
случае, когда это необходимо для обеспечения параметрического сцепления;
в спецификации зависящего от предыстории модуля должна быть
четко сформулирована эта зависимость таким образом, чтобы было возможно прогнозировать поведение (эффект выполнения) данного модуля при разных последующих обращениях к нему.
В связи с последней рекомендацией может быть полезным определение внешнего представления (ориентированного на информирование человека) состояний зависящего от предыстории модуля. В этом случае эффект выполнения каждой функции (операции), реализуемой этим модулем, следует
описывать в терминах этого внешнего представления, что существенно упростит прогнозирование поведения данного модуля.
1.6 Методы проектирования программных средств
Наиболее распространенными и применимыми являются: метод восходящей разработки и метод нисходящей разработки ПС.
Метод восходящей разработки заключается в следующем. Сначала
строится модульная структура программы в виде дерева. Затем поочередно
программируются модули программы, начиная с модулей самого нижнего
уровня (листья дерева модульной структуры программы), в таком порядке,
чтобы для каждого программируемого модуля были уже запрограммированы
все модули, к которым он может обращаться. После того, как все модули
программы запрограммированы, производится их поочередное тестирование
и отладка в принципе в таком же (восходящем) порядке, в каком велось их
программирование. Такой порядок разработки программы на первый взгляд
кажется вполне естественным: каждый модуль при программировании выражается через уже запрограммированные непосредственно подчиненные модули, а при тестировании использует уже отлаженные модули. Однако, современная технология не рекомендует такой порядок разработки программы.
Во-первых, для программирования какого-либо модуля совсем не требуется
наличия текстов используемых им модулей для этого достаточно, чтобы
каждый используемый модуль был лишь специфицирован (в объеме, позволяющем построить правильное обращение к нему), а для тестирования его
возможно (и даже, как мы покажем ниже, полезно) используемые модули заменять их имитаторами (заглушками, драйверами). Во-вторых, каждая программа в какой-то степени подчиняется некоторым внутренним для нее, но
глобальным для ее модулей соображениям (принципам реализации, предположениям, структурам данных и т.п.), что определяет ее концептуальную целостность и формируется в процессе ее разработки. При восходящей разработке эта глобальная информация для модулей нижних уровней еще не ясна
в полном объеме, поэтому очень часто приходится их перепрограммировать,
когда при программировании других модулей производится существенное
уточнение этой глобальной информации (например, изменяется глобальная
структура данных). В-третьих, при восходящем тестировании для каждого
16
модуля (кроме головного) приходится создавать ведущую программу (модуль), которая должна подготовить для тестируемого модуля необходимое
состояние информационной среды и произвести требуемое обращение к нему.
Это приводит к большому объему «отладочного» программирования и в то
же время не дает никакой гарантии, что тестирование модулей производилось именно в тех условиях, в которых они будут выполняться в рабочей
программе.
Метод нисходящей разработки заключается в следующем. Как и в
предыдущем методе сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с
модуля самого верхнего уровня (головного), переходя к программированию
какого-либо другого модуля только в том случае, если уже запрограммирован модуль, который к нему обращается. После того, как все модули программы запрограммированы, производится их поочередное тестирование и
отладка в таком же (нисходящем) порядке. При этом первым тестируется головной модуль программы, который представляет всю тестируемую программу и поэтому тестируется при «естественном» состоянии информационной среды, при котором начинает выполняться эта программа. При этом те
модули, к которым может обращаться головной, заменяются их имитаторами
(так называемыми заглушками). Каждый имитатор модуля представляется
весьма простым программным фрагментом, который, в основном, сигнализирует о самом факте обращения к имитируемому модулю, производит необходимую для правильной работы программы обработку значений его входных
параметров (иногда с их распечаткой) и выдает, если это необходимо, заранее запасенный подходящий результат. После завершения тестирования и
отладки головного и любого последующего модуля производится переход к
тестированию одного из модулей, которые в данный момент представлены
имитаторами, если таковые имеются. Для этого имитатор выбранного для
тестирования модуля заменяется самим этим модулем и, кроме того, добавляются имитаторы тех модулей, к которым может обращаться выбранный
для тестирования модуль. При этом каждый такой модуль будет тестироваться при «естественных» состояниях информационной среды, возникающих к
моменту обращения к этому модулю при выполнении тестируемой программы. Таким образом, большой объем «отладочного» программирования при
восходящем тестировании заменяется программированием достаточно простых имитаторов используемых в программе модулей. Кроме того, имитаторы удобно использовать для того, чтобы подыгрывать процессу подбора тестов путем задания нужных результатов, выдаваемых имитаторами. При таком порядке разработки программы вся необходимая глобальная информация
формируется своевременно, т.е. ликвидируется весьма неприятный источник
просчетов при программировании модулей. Некоторым недостатком нисходящей разработки, приводящим к определенным затруднениям при ее применении, является необходимость абстрагироваться от базовых возможностей используемого языка программирования, выдумывая абстрактные операции, которые позже нужно будет реализовать с помощью выделенных в
17
программе модулей. Однако способность к таким абстракциям представляется необходимым условием разработки больших программных средств, поэтому ее нужно развивать.
Особенностью рассмотренных методов восходящей и нисходящей
разработок (которые мы будем называть классическими) является требование,
чтобы модульная структура программы была разработана до начала программирования (кодирования) модулей. Это требование находится в полном
соответствии с водопадным подходом к разработке ПС, так как разработка
модульной структуры программы и ее кодирование производятся на разных
этапах разработки ПС: первая завершает этап конструирования ПС, а второе
открывает этап кодирования. Однако эти методы вызывают ряд возражений:
представляется сомнительным, чтобы до программирования модулей можно
было разработать структуру программы достаточно точно и содержательно.
На самом деле это делать не обязательно, если несколько модернизировать
водопадный подход. Ниже предлагаются конструктивный и архитектурный
подходы к разработке программ, в которых модульная структура формируется в процессе программирования (кодирования) модулей.
Конструктивный подход к разработке программы представляет собой
модификацию нисходящей разработки, при которой модульная древовидная
структура программы формируется в процессе программирования модулей.
Разработка программы при конструктивном подходе начинается с программирования головного модуля, исходя из спецификации программы в целом.
При этом спецификация программы принимается в качестве спецификации
ее головного модуля, который полностью берет на себя ответственность за
выполнение функций программы. В процессе программирования головного
модуля, в случае, если эта программа достаточно большая, выделяются подзадачи (внутренние функции), в терминах которых программируется головной модуль. Это означает, что для каждой выделяемой подзадачи (функции)
создается спецификация реализующего ее фрагмента программы, который в
дальнейшем может быть представлен некоторым поддеревом модулей. Важно заметить, что здесь также ответственность за выполнение выделенной
функции несет головной (может быть, и единственный) модуль этого поддерева, так что спецификация выделенной функции является одновременно и
спецификацией головного модуля этого поддерева. В головном модуле программы для обращения к выделенной функции строится обращение к головному модулю указанного поддерева в соответствии с созданной его спецификацией. Таким образом, на первом шаге разработки программы (при программировании ее головного модуля) формируется верхняя начальная часть
дерева, например, такая, которая показана на рисунке 1.5.
18
Спецификация программы
(головного модуля)
Текст головного модуля
Спецификация
1-ой подзадачи
Спецификация
3-ей подзадачи
Спецификация
2-ой подзадачи
Рисунок 1.5 - Первый шаг формирования модульной структуры программы при конструктивном подходе
Аналогичные действия производятся при программировании любого
другого модуля, который выбирается из текущего состояния дерева программы из числа специфицированных, но пока еще не запрограммированных
модулей. В результате этого производится очередное деформирование дерева
программы, например, такое, которое показано на рисунке 1.6.
Архитектурный подход к разработке программы представляет собой
модификацию восходящей разработки, при которой модульная структура
программы формируется в процессе программирования модуля. Но при этом
ставится существенно другая цель разработки: повышение уровня используемого языка программирования, а не разработка конкретной программы.
Это означает, что для заданной предметной области выделяются типичные
функции, каждая из которых может использоваться при решении разных задач в этой области, и специфицируются, а затем и программируются отдельные программные модули, выполняющие эти функции. Так как процесс выделения таких функций связан с накоплением и обобщением опыта решения
задач в заданной предметной области, то обычно сначала выделяются и реализуются отдельными модулями более простые функции, а затем постепенно
появляются модули, использующие ранее выделенные функции. Такой набор модулей создается в расчете на то, что при разработке той или иной программы заданной предметной области в рамках конструктивного подхода
могут оказаться приемлемыми некоторые из этих модулей. Это позволяет
существенно сократить трудозатраты на разработку конкретной программы
путем подключения к ней заранее заготовленных и проверенных на практике
модульных структур нижнего уровня. Так как такие структуры могут многократно использоваться в разных конкретных программах, то архитектурный
19
подход может рассматриваться как путь борьбы с дублированием в программировании. В связи с этим программные модули, создаваемые в рамках архитектурного подхода, обычно параметризуются для того, чтобы усилить
применимость таких модулей путем настройки их на параметры.
Спецификация программы
(головного модуля)
Текст головного модуля
Спецификация
1-ой подзадачи
Спецификация
3-ей подзадачи
Текст
головного модуля
1-ой подзадачи
Текст
головного модуля
3-ей подзадачи
Спецификация
2-ой подзадачи
Текст
головного модуля
2-ой подзадачи
Спецификация
2.1-ой подзадачи
Спецификация
2.2-ой подзадачи
Рисунок 1.6 - Второй шаг формирования модульной структуры программы при конструктивном подходе.
В классическом методе нисходящей разработки рекомендуется сначала все модули разрабатываемой программы запрограммировать, а уж затем
начинать нисходящее их тестирование, что опять-таки находится в полном
соответствии с водопадным подходом. Однако такой порядок разработки не
представляется достаточно обоснованным: тестирование и отладка модулей
может привести к изменению спецификации подчиненных модулей и даже к
изменению самой модульной структуры программы, так что в этом случае
20
программирование некоторых модулей может оказаться бесполезно проделанной работой. Нам представляется более рациональным другой порядок
разработки программы, известный в литературе как метод нисходящей реализации, что представляет некоторую модификацию водопадного подхода.
В этом методе каждый запрограммированный модуль начинают сразу
же тестировать до перехода к программированию другого модуля.
Все эти методы имеют еще различные разновидности в зависимости
от того, в какой последовательности обходятся узлы (модули) древовидной
структуры программы в процессе ее разработки. Это можно делать, например, по слоям (разрабатывая все модули одного уровня, прежде чем переходить к следующему уровню). При нисходящей разработке дерево можно обходить также в лексикографическом порядке (сверху вниз, слева направо).
Возможны и другие варианты обхода дерева. Так, при конструктивной реализации для обхода дерева программы целесообразно следовать идеям
Фуксмана, которые он использовал в предложенном им методе вертикального слоения.
Сущность такого обхода заключается в следующем. В рамках конструктивного подхода сначала реализуются только те модули, которые необходимы для самого простейшего варианта программы, которая может нормально выполняться только для весьма ограниченного множества наборов
входных данных, но для таких данных эта задача будет решаться до конца.
Вместо других модулей, на которые в такой программе имеются ссылки, в
эту программу вставляются лишь их имитаторы, обеспечивающие, в основном, сигнализацию о выходе за пределы этого частного случая. Затем к этой
программе добавляются реализации некоторых других модулей (в частности,
вместо некоторых из имеющихся имитаторов), обеспечивающих нормальное
выполнение для некоторых других наборов входных данных. И этот процесс
продолжается поэтапно до полной реализации требуемой программы.
Таким образом, обход дерева программы производится с целью кратчайшим путем реализовать тот или иной вариант (сначала самый простейший)
нормально действующей программы. В связи с этим такая разновидность
конструктивной реализации получила название метода целенаправленной
конструктивной реализации. Достоинством этого метода является то, что
уже на достаточно ранней стадии создается работающий вариант разрабатываемой программы. Психологически это играет роль допинга, резко повышающего эффективность разработчика. Поэтому этот метод является весьма
привлекательным.
На рисунке 1.7 представлена общая классификация рассмотренных
методов разработки структуры программы.
21
Методы разработки структуры программ
Восходящие
Нисходящие
Классический
подход
Классический
подход
Классическая
нисходящая
разработка
Классическая
восходящая
разработка
(не рекомендуется)
Классическая
нисходящая
реализация
Классическая
восходящая
реализация
(не рекомендуется)
Конструктивный
подход
Архитектурный
подход
Конструктивная
разработка
Архитектурная
разработка
Конструктивная
реализация
Архитектурная
реализация
Целенаправленная
конструктивная
реализация
Рисунок 1.7 - Классификация методов разработки структуры программ
22
1.7 Отладка и тестирование ПС
Отладка ПС это деятельность, направленная на обнаружение и исправление ошибок в ПС с использованием процессов выполнения его программ. Тестирование ПС это процесс выполнения его программ на некотором наборе данных, для которого заранее известен результат применения или
известны правила поведения этих программ. Указанный набор данных называется тестовым или просто тестом. Таким образом, отладку можно представить в виде многократного повторения трех процессов: тестирования, в
результате которого может быть констатировано наличие в ПС ошибки, поиска места ошибки в программах и документации ПС и редактирования программ и документации с целью устранения обнаруженной ошибки. Другими
словами:
Отладка = Тестирование + Поиск ошибок + Редактирование
В зарубежной литературе отладку часто понимают только как процесс
поиска и исправления ошибок (без тестирования), факт наличия которых устанавливается при тестировании. Иногда тестирование и отладку считают
синонимами. В нашей стране в понятие отладки обычно включают и тестирование, поэтому мы будем следовать сложившейся традиции.
Тестирование – процесс многократного повторения программы с целью обнаружения ошибок. Тестирование – составная часть отладки.
Отладка имеет место тогда, когда программа со всей очевидностью
работает неправильно. Поэтому отладка начинается всегда в предвидении
отказа программы. Если же оказывается, что программа работает верно, то
она тестируется. Часто случается так, что после прогона тестов программа
вновь подвергается отладке. Таким образом, тестирование устанавливает
факт наличия ошибки, а отладка выявляет ее причину.
Основная цель выделения отладки и тестирования как отдельных этапов создания программы заключается в том, чтобы обратить внимание обязательности обеих стадий и на необходимость специального планирования
временных затрат по каждой из них в отдельности.
Нельзя гарантировать, что тестированием можно установить наличие
каждой имеющейся в ПС ошибки. Поэтому возникает две задачи. Первая задача: подготовить такой набор тестов и применить к ним ПС, чтобы обнаружить в нем по возможности большее число ошибок. Однако чем дольше продолжается процесс тестирования (и отладки в целом), тем большей становится стоимость ПС. Отсюда вторая задача: определить момент окончания отладки ПС (или отдельной его компоненты). Признаком возможности окончания отладки является полнота охвата пропущенными через ПС тестами (т.е.
тестами, к которым применено ПС) множества различных ситуаций, возникающих при выполнении программ ПС, и относительно редкое проявление
ошибок в ПС на последнем отрезке процесса тестирования. Последнее определяется в соответствии с требуемой степенью надежности ПС, указанной в
спецификации его качества.
Заповеди, предложенные Майерсом, по тестированию ПС.
23
Заповедь 1. Считайте тестирование ключевой задачей разработки ПС,
поручайте его самым квалифицированным и одаренным программистам;
нежелательно тестировать свою собственную программу.
Заповедь 2. Хорош тот тест, для которого высока вероятность обнаружить ошибку, а не тот, который демонстрирует правильную работу программы.
Заповедь 3. Готовьте тесты как для правильных, так и для неправильных данных.
Заповедь 4. Документируйте пропуск тестов через компьютер; детально изучайте результаты каждого теста; избегайте тестов, пропуск которых
нельзя повторить.
Заповедь 5. Каждый модуль подключайте к программе только один
раз; никогда не изменяйте программу, чтобы облегчить ее тестирование.
Заповедь 6. Пропускайте заново все тесты, связанные с проверкой работы какой-либо программы ПС или ее взаимодействия с другими программами, если в нее были внесены изменения (например, в результате устранения ошибки).
Существуют следующие методы тестирования ПС:
1) Статическое тестирование – ручная проверка программы за столом.
2) Детерминированное тестирование – при различных комбинациях
исходных данных.
3) Стохастическое – исходные данные выбираются произвольно, на
выходе определяется качественное совпадение результатов или примерная
оценка.
Имеется два подхода к тестированию:
1) Структурное тестирование – метод «белого ящика», тестируется
логика программы, внутренняя структура программы.
2) Функциональное тестирование – метод «черного ящика»- тестируется спецификация, т.е. вход/выход без учета знаний о ее структуре.
В нашей стране различаются два основных вида отладки (включая
тестирование): автономную и комплексную отладку ПС.
Автономная отладка ПС означает последовательное раздельное тестирование различных частей программ, входящих в ПС, с поиском и исправлением в них фиксируемых при тестировании ошибок. Она фактически
включает отладку каждого программного модуля и отладку сопряжения модулей.
Комплексная отладка означает тестирование ПС в целом с поиском и
исправлением фиксируемых при тестировании ошибок во всех документах
(включая тексты программ ПС), относящихся к ПС в целом. К таким документам относятся определение требований к ПС, спецификация качества ПС,
функциональная спецификация ПС, описание архитектуры ПС и тексты программ ПС.
24
1.8 Надежность ПС
Надежность ПО – это свойство системы выполнять заданные функции, сохраняя во времени значения установленных эксплутационных показателей в заданных пределах, соответствующих заданным режимам и условиям
исполнения. Потеря надежности связывается с появлением отказов в работе.
Другими словами надежность ПО – это вероятность того, что программа какой-то период времени будет работать без сбоев с учетом степени их влияния
на выходные результаты.
Под показателем надежности принято понимать величину или совокупность величин, характеризующих качественно или количественно степень
приспособленности систем к выполнению поставленной задачи. Имеются три
вида показателей надежности сложных систем: качественные, порядковые и
количественные.
Качественные показатели надежности не могут быть выражены в
виде числа и не содержат информации, позволяющей обосновать предпочтение одного из нескольких конкурирующих вариантов системы при их сравнении. Качественные показатели указывают на какие-либо свойства системы.
Качественные показатели дают возможность отличать системы друг от друга.
Порядковые показатели надежности содержат информацию, позволяющую обосновать предпочтение одного из вариантов системы при их
сравнении без количественной оценки степени предпочтения. Порядковые
показатели дают возможность расположить в ряд по степени возрастания надежности исследуемые варианты системы, но не позволяют оценить, на какую величину отличается достигнутый уровень надежности рассматриваемых вариантов.
Количественные показатели надежности выражают надежность в
виде числа. Они определяются путем непосредственных статистических наблюдений на основе обработки результатов применения или испытания систем. А также путем аналитических расчетов или моделирования процесса
функционирования систем.
В первых работах по теории надежности ПО заимствованы основные
положения теории аппаратной надежности. В ряде исследований вопроса надежности ПО показатель надежности рассматривался как функция времени
наработки. ПО не изменяется существенно по мере наработки, а изменяется в
результате устранения ошибок.
1.9 Документация ПС
Документальное обеспечение ПО важно не только для последующей
эксплуатации разработанных систем ПО, но и для процесса проектирования.
Документация должна создаваться по ходу проектирования, часть ее разрабатывается и используется непосредственно в процессе проектирования персоналом групп разработки, на различных этапах создания проекта.
25
При разработке ПС создается и используется большой объем разнообразной документации. Она необходима как средство передачи информации между разработчиками ПС, как средство управления разработкой ПС и
как средство передачи пользователям информации, необходимой для применения и сопровождения ПС. На создание этой документации приходится
большая доля стоимости ПС.
Эту документацию можно разбить на две группы:
документы управления разработкой ПС;
документы, входящие в состав ПС.
Документы управления разработкой ПС (software process documentation) управляют и протоколируют процессы разработки и сопровождения ПС,
обеспечивая связи внутри коллектива разработчиков ПС и между коллективом разработчиков и менеджерами ПС (software managers) лицами, управляющими разработкой ПС. Эти документы могут быть следующих типов:
планы, оценки, расписания. Эти документы создаются менеджерами
для прогнозирования и управления процессами разработки и сопровождения
ПС;
отчеты об использовании ресурсов в процессе разработки. Создаются менеджерами;
стандарты. Эти документы предписывают разработчикам, каким
принципам, правилам, соглашениям они должны следовать в процессе разработки ПС. Эти стандарты могут быть как международными или национальными, так и специально созданными для организации, в которой ведется разработка ПС;
рабочие документы. Это основные технические документы, обеспечивающие связь между разработчиками. Они содержат фиксацию идей и
проблем, возникающих в процессе разработки, описание используемых стратегий и подходов, а также рабочие (временные) версии документов, которые
должны войти в ПС;
заметки и переписка. Эти документы фиксируют различные детали
взаимодействия между менеджерами и разработчиками.
Документы, входящие в состав ПС (software product documentation),
описывают программы ПС как с точки зрения их применения пользователями, так и с точки зрения их разработчиков и сопроводителей (в соответствии
с назначением ПС). Здесь следует отметить, что эти документы будут использоваться не только на стадии эксплуатации ПС (в ее фазах применения
и сопровождения), но и на стадии разработки для управления процессом
разработки (вместе с рабочими документами) во всяком случае, они должны быть проверены (протестированы) на соответствие программам ПС. Эти
документы образуют два комплекта с разным назначением:
пользовательская документация ПС (П-документация);
документация по сопровождению ПС (С-документация).
Пользовательская документация ПС (user documentation) объясняет
пользователям, как они должны действовать, чтобы применить разрабаты26
ваемое ПС. Она необходима, если ПС предполагает какое-либо взаимодействие с пользователями. К такой документации относятся документы, которыми должен руководствоваться пользователь при инсталляции ПС (при установке ПС с соответствующей настройкой на среду применения ПС), при
применении ПС для решения своих задач и при управлении ПС (например,
когда разрабатываемое ПС будет взаимодействовать с другими системами).
Эти документы частично затрагивают вопросы сопровождения ПС, но не касаются вопросов, связанных с модификацией программ.
В связи с этим следует различать две категории пользователей ПС:
ординарных пользователей ПС и администраторов ПС.
Ординарный пользователь ПС (end-user) использует ПС для решения
своих задач (в своей предметной области). Это может быть инженер, проектирующий техническое устройство, или кассир, продающий железнодорожные билеты с помощью ПС. Он может и не знать многих деталей работы
компьютера или принципов программирования.
Администратор ПС (system administrator) управляет использованием
ПС ординарными пользователями и осуществляет сопровождение ПС, не
связанное с модификацией программ. Например, он может регулировать
права доступа к ПС между ординарными пользователями, поддерживать
связь с поставщиками ПС или выполнять определенные действия, чтобы
поддерживать ПС в рабочем состоянии, если оно включено как часть в другую систему.
Состав пользовательской документации зависит от аудиторий пользователей, на которые ориентировано разрабатываемое ПС, и от режима использования документов. Под аудиторией здесь понимается контингент
пользователей ПС, у которого есть необходимость в определенной пользовательской документации ПС. Удачный пользовательский документ существенно зависит от точного определения аудитории, для которой он предназначен. Пользовательская документация должна содержать информацию, необходимую для каждой аудитории. Под режимом использования документа понимается способ, определяющий, каким образом используется этот документ.
Обычно пользователю достаточно больших программных систем требуются
либо документы для изучения ПС (использование в виде инструкции), либо
для уточнения некоторой информации (использование в виде справочника).
В соответствии с работами можно считать типичным следующий состав пользовательской документации для достаточно больших ПС:
общее функциональное описание ПС дает краткую характеристику
функциональных возможностей ПС. Предназначено для пользователей, которые должны решить, насколько необходимо им данное ПС;
руководство по инсталляции ПС предназначено для администраторов ПС. Оно должно детально предписывать, как устанавливать системы в
конкретной среде, файлы, представляющие ПС, и требования к минимальной
конфигурации аппаратуры;
27
инструкция по применению ПС предназначена для ординарных
пользователей. Содержит необходимую информацию по применению ПС, организованную в форме удобной для ее изучения;
справочник по применению ПС предназначен для ординарных пользователей. Содержит необходимую информацию по применению ПС, организованную в форме удобной для избирательного поиска отдельных деталей;
руководство по управлению ПС предназначено для администраторов ПС. Оно должно описывать сообщения, генерируемые, когда ПС взаимодействует с другими системами, и как должен реагировать администратор на
эти сообщения. Кроме того, если ПС использует системную аппаратуру, этот
документ может объяснять, как сопровождать эту аппаратуру.
Разработка пользовательской документации начинается сразу после
создания внешнего описания. Качество этой документации может существенно определять успех ПС. Она должна быть достаточно проста и удобна
для пользователя (в противном случае, это ПС вообще не стоило создавать).
Поэтому, хотя черновые варианты (наброски) пользовательских документов
создаются основными разработчиками ПС, к созданию их окончательных
вариантов часто привлекаются профессиональные технические писатели.
Документация по сопровождению ПС (system documentation) описывает ПС с точки зрения ее разработки. Эта документация необходима, если
ПС предполагает изучение того, как оно устроено (сконструировано), и модернизацию его программ. Сопровождение это продолжающаяся разработка. Поэтому в случае необходимости модернизации ПС к этой работе
привлекается специальная команда разработчиков-сопроводителей. Этой
команде придется иметь дело с такой же документацией, которая определяла
деятельность команды первоначальных (основных) разработчиков ПС, с
той лишь разницей, что эта документация для команды разработчиковсопроводителей будет, как правило, чужой (она создавалась другой командой). Чтобы понять строение и процесс разработки модернизируемого ПС,
команда разработчиков-сопроводителей должна изучить эту документацию,
а затем внести в нее необходимые изменения, повторяя в значительной степени технологические процессы, с помощью которых создавалось первоначальное ПС.
Документацию по сопровождению ПС можно разбить на две группы:
документация, определяющая строение программ и структур данных ПС и технологию их разработки;
документация, помогающая вносить изменения в ПС.
Документация первой группы содержит итоговые документы каждого технологического этапа разработки ПС. Она включает следующие документы:
внешнее описание ПС (Requirements document);
описание архитектуры ПС, включая внешнюю спецификацию каждой ее программы (подсистемы);
28
для каждой программы ПС описание ее модульной структуры,
включая внешнюю спецификацию каждого включенного в нее модуля;
для каждого модуля его спецификация и описание его строения;
тексты модулей на выбранном языке программирования;
документы установления достоверности ПС, описывающие, как
устанавливалась достоверность каждой программы ПС и как информация об
установлении достоверности связывалась с требованиями к ПС.
Документы установления достоверности ПС включают, прежде всего,
документацию по тестированию (схема тестирования и описание комплекта
тестов).
Документация второй группы содержит руководство по сопровождению ПС, которое описывает особенности реализации ПС (в частности, трудности, которые пришлось преодолевать) и как учтены возможности развития
ПС в его строении (конструкции). В нем также фиксируются, какие части
ПС являются аппаратно- и программно-зависимыми.
Общая проблема сопровождения ПС обеспечить, чтобы все его
представления шли в ногу (оставались согласованными), когда ПС изменяется. Чтобы этому помочь, связи и зависимости между документами и их частями должны быть отражены в руководстве по сопровождению, и зафиксированы в базе данных управления конфигурацией.
29