4. СТРАТЕГИЯ РАЗРАБОТКИ ДОКУМЕНТА ⌠ТРЕБОВАНИЯ К ПО■
В этом разделе рассматривается накопленный в различных проектах опыт разработки требований к ПО и предлагается практическая стратегия написания документа ⌠Требования к ПО■.
4.1. Обзор накопленного опыта разработки требований4.1.1. Опыт разработки требований в корпорации АВС Computer
Как вытекает из опыта фирмы АВС Computers [ 3 ], в процессе разработки ПО появляются следующие документы, перечисленные ниже в хронологическом порядке:
- ⌠Соглашение о требованиях■
- ⌠Внешняя спецификация■
- ⌠Внутренняя спецификация■
Документ ⌠Соглашение о требованиях■ должен содержать первое письменное соглашение между заказчиком и разработчиком о том, что будет сделано и что не будет делаться при разработке и выпуске программного обеспечения. В отличие от него спецификация предполагает наличие более точных и исчерпывающих формулировок и определений. При этом первые два документа содержат информацию о том, что представляет собой изделие; а третий должен объяснять, как изделие устроено и как достигаются установленные для него цели и требования. Все документы имеют схожую структуру для облегчения контроля над проектом, а также для обеспечения прослеживаемости всех технических решений от требований до их реализации. По мере продвижения проекта разделы документа либо просто копируются в соответствующие разделы следующего создаваемого документа либо расширяются описаниями технических решений текущего этапа.
Ниже приведена общая структура документа ⌠Внешняя спецификация■, с развернутыми комментариями в тех пунктах, которые касаются технической стороны дела (документ также включает экономические, управленческие и другие аспекты, которые не рассматриваются здесь):1. ОПИСАНИЕ ПРОГРАММНОГО ИЗДЕЛИЯ
1.1. Наименование и шифры изделия (полное наименование изделия, сокращенные наименования изделия, шифры изделия и проекта)
1.2. Краткое описание изделия (включая сведения об авторском праве, иерархию документов, с указанием документов вышестоящих уровней)
1.3. Результирующие компоненты изделия (оформляется в виде таблицы или другой формы и включает в себя, перечень спецификаций, другой документации и компонентов программного обеспечения. В качестве последних выступают листинги программ, объектные модули, отладочный материал, средства разработки)
2. ЦЕЛИ
Этот раздел содержит причины выпуска изделия с указанием различного типа заявок, планов и т.п. и носит полностью управленческий характер.
3. СТРАТЕГИЯ
3.1. Соглашения относительно представления материала
3.1.1. Обозначения (определяются все обозначения, используемые в требованиях. Например, если применяются индексы, то дается пример их использования и определяется принцип индексации)
3.1.2. Терминология (особенно специфическая для данного изделия)
3.1.3. Синтаксис (приводятся, если необходимо, синтаксические правила для дальнейшего описания требований)
3.2. Генерируемое программное обеспечение (классифицируется как вспомогательное и порождаемое описываемым изделием)
3.3. Системное программное обеспечение (все остальное ПО, включая ОС, утилиты, пакеты прикладных программ, которое классифицируется как основное, поскольку оно ⌠генерирует■ ПО предыдущего пункта)
Замечание. Причина такой расстановки пунктов состоит в том, что при правильном проектировании сверху вниз генерируемое программное обеспечение является основной целью проектирования и должно быть описано раньше, чем его генератор. Другими словами, структура генерируемых программ должна опрелделять структуру генератора, а не наоборот. Если все изделие является основным, то в п.3.2. делается пометка ⌠не используется■ и опускаются все его подпункты. Структура подпунктов п.п. 3.2 и 3.3 полностью дублируется и далее для простоты используется нумерация только п.п. 3.3.
3.3.n. Общие характеристики функции ⌠n■.
Если технически затруднительно и неестественно рассматривать изделие как один большой функциональный модуль, то следует привести его функциональную декомпозицию, показав связи между функциями (функциональными модулями) и присвоив каждой функции некоторое уникальное имя ⌠n■. Затем для каждой функции отводится подраздел раздела 3.3 (т.е. 3.3.1, 3.3.2 и т.д.), в заглавии которого используется слово ⌠функция■ с последующим именем функционального модуля. Отметим, что такая функциональная декомпозиция не указывает, как именно изделие будет фактически разбито на программные модули (это составляет содержание документа ⌠Внутренняя спецификация■). Для удобства работы, конечно, полезно иметь некоторое соответствие функционального и фактического разбиения, но это не является требованием и не должно уводить с правильного пути проектирования изделия.
3.3.n.1. Внешние ограничения
3.3.n.1.1. Стандарты (список используемых промышленных стандартов и собственных стандартов предприятия)
3.3.n.1.2. Ограничения на совместимость.
Необходимо рассматривать несколько аспектов совместимости: исходный язык, машинный язык, форматы данных и сообщений, форматы отчетов, форматы листингов и т.п. Специально должна оговариваться совместимость со следующими программными изделиями:
- изделиями-предшественниками (т.е. такими, которые пользователь может заменить новым изделием; если число функций при такой замене уменьшается, то следует привести обоснование этому)
- изделиями-компаньонами (т.е. относящимися к той же группе средств и являющимися альтернативой)
- подобными изделиями (т.е. выполняющих похожие функции в других программных изделиях)
- конкурирующими изделиями (других организаций )
3.3.n.1.3. Программные ограничения.
Описываются программное окружение разрабатываемого ПО, включая указание средств для его загрузки и запуска. Также отмечаются все действующие программные ограничения, например использование вычислений с удвоенной точностью для некоторых функций.3.3.n.1.4. Аппаратные ограничения.
Приводится перечень устройств, необходимых для работы ПО (с указанием минимальной, оптимальной и максимальной конфигурации). Указываются все действующие ограничения на оборудование, например, физические характеристики терминала или требование запрещения использования звукового сигнального устройства.3.3.n.2. Внешние характеристики
Замечание. Если разрабатываемое ПО является расширением уже существующего, то описываются главным образом его дополнительные характеристики. В любом случае наибольшее внимание должно уделяться самым важным для конечного пользователя вопросам. Эти разделы являются основой документа и содержат полное и окончательное описание всех свойств программного изделия.
3.3.n.2.1. Результаты.
Описываются все выходные данные ПО с точки зрения их функционального содержания и назначения (например, файлы, сообщения, программно устанавливаемые сигналы и прерывания). При этом должны быть рассмотрены все возможные в системе носители и средства отображения информации. Указываются тип, структура, формат, объем, расположение и диапазон изменения. Для всех выходных данных, читаемых людьми (сообщения и отчеты) должны быть приведены образцы.3.3.n.2.2. Процессы обработки.
Описываются операции, выполняемые ПО в целом или функциональными модулями, рассматриваемыми как ⌠черный ящик■. если обсуждение идет на уровне модулей или этапов разработки, указываются также модули или этапы, требуемые для получения определенной выходной информации. Точно определяются все возможные ошибки, потенциальные условия их возникновения и способы рестарта и восстановления. Подраздел должен описывать инициацию, преобразование данных, все варианты завершения работы (нормального и аварийного).3.3.n.2.3. Входы.
Описание подобно п. 3.3.2.13.3.n.3. Эргономические характеристики.
Замечание. Этот раздел описывает свойства, обеспечивающие надежность, комфорт и продуктивность работы пользователей и операторов, а также вопросы безопасности, секретности, восстанавливаемости после сбоев, мобильности ПО. Остановимся более подробно на двух подразделах: ⌠Надежность■ и ⌠Рабочие характеристики■.В разделе ⌠Надежность■ (это свойство программы понимается здесь как способность к восстановлению нормальной работы при ошибках и сбоях в работе оборудования) рассматриваются следующие вопросы:
- защита данных пользователя
- степень защиты программ от ошибок, возникающих в других частях системы (например, работающих одновременно с данной программой в другой области памяти).
Следует рассмотреть, как могут повлиять на работу предлагаемых программных средств такие ошибки, учитывая следующие моменты:
- распределение ресурсов памяти (указать, если предусмотрено обеспечение изоляции отводимых областей памяти)
- связь программ через общие аппаратные ресурсы
Раздел ⌠Рабочие характеристики■ описывает основные параметры или принципы, по которым должна оцениваться эффективность работы программы, по возможности в количественном виде с указанием возможных допусков. Все параметры должны быть измеряемыми, к их числу могут относиться быстродействие, пропускная способность, скорость передачи данных, расход машинных ресурсов, время реакции (или задержки) и т.д.
3.3.n.4. Внутренние характеристики (этот раздел полностью расширяется в документе ⌠Внутренняя Спецификация■, однако частично может быть заполнен с целью полного описания соответствующих внешних свойств).
3.4. Внутренние ограничения (здесь речь идет о тех свойствах, которые пользователю логично ожидать, но которые по тем или иным причинам будут исключены из программного изделия или потенциально оставлены на усмотрение разработчика. Например, неполная заимозаменяемость носителей, отсутствие поддержки каких-либо возможностей оборудования, и т.п.).
4. ИСПОЛЬЗУЕМЫЕ МАТЕРИАЛЫ (в т.ч. справочные)
4.1.2. Опыт разработки требований ПО для самолета А-7
- ПЕРЕДАЧА ЗАКАЗЧИКУ И ВВОД В ДЕЙСТВИЕ.
Полетная программа самолета А-7 ВМС США [ 6 ] должна была входить в состав системы навигации и управления оружием самолета, получая входные данные от датчиков, переключателей, расположенных в кабине, а также от пилота, который вводит их с помощью специальной клавиатуры. Программа управляет несколькими устройствами отображения информации в кабине и производит установку положения нескольких датчиков. Всего к ЭВМ подключены 22 устройства, в числе которых. например, инерционный измеритель скорости и пилотажно-проекционный индикатор. Программа вычисляет навигационную информацию (текущее положение самолета, скорость, курс) и управляет применением оружия.
Разработчики полетной программы самолета А-7 приводят следующие цели документа ⌠Требования к ПО■:
- задавать только внешнее поведение и не навязывать никакой конкретной реализации. Пользователь должен определять свои требования только на основе своих знаний о предметной области (в данном случае - навигации) и не выражать их в терминах возможной реализации. Последнее будет сильно ограничивать разработчика, не позволяя ему использовать наиболее эффективные алгоритмы и структуры данных.
- задавать ограничения на реализацию, особенно в части интерфейса с аппаратурой. Если что-то здесь упущено, то корректная сама по себе программа как правило не сможет корректно работать в составе реальной системы.
- быть легко изменяемыми. Если документация не обновляется в течение жизненного цикла системы, то теряется контроль за развитием системы и становится трудно координировать корректность вносимых в программу изменений.
- служить справочным материалом. Документ ⌠Требования к ПО■ должен быстро давать ответы на конкретные вопросы, а не давать пространные пояснения по предметной области и т.п. Важны точность и краткость, необходимо предусмотреть глоссарий, детальное оглавление и указатели.
- прогнозировать жизненный цикл системы. Разумно уже на этой стадии пытаться превидеть какого рода изменения в требованиях могут произойти (весь опыт подсказывает, что независимо от желания разработчиков документации всегда приходится вносить в нее изменения в силу множества вполне объективных факторов).
- описывать допустимую реакцию на нежелательные события (такие как сбои аппаратуры, ошибки пользователя, и.т.д.), не оставляя их разработку целиком на усмотрение программиста. Пользователю (более знакомому с системой в целой и ее предметной областью) обычно лучше известно, что надо делать в тех или иных сбойных ситуациях.
Суть подхода разработчиков полетной программы самолета А-7 к документированию требований можно выразить в виде трех принципов:
- Ставить вопросы прежде, чем пытаться на них отвечать. Если этого не делать, то имеющиеся прежний опыт, программы, документация будут мешать беспристрастному рассмотрению требований; при этом помимо воли задаются лишь те вопросы, на которые легко отвечать. Полезно сначала составить оглавление, включая, например, следующие вопросы:
- Введение
- Характеристики ЭВМ (общее описание ЭВМ с учетом особенностей, если она уже есть, иначе - основные требования к ЭВМ)
- Интерфейсы с аппаратурой (краткое описание информации, получаемой и передаваемой ЭВМ)
- Функции программы (что должна делать программа в разных ситуациях, какой должна быть ее реакция на различные события)
- Временные ограничения (как быстро и как часто должна выполняться каждая из функций. Этот пункт отделен от предыдущего, т.к. ответы на вопросы ⌠что?■ и ⌠когда?■ изменяются независимо.)
- Требования к точности (каковы допустимые отклонения выходных параметров от точных значений)
- Реакция на нежелательные события (такие как выход из строя датчиков, получение некорректных данных от пилота и т.п.)
- Подмножества (т.е. какие части и функции надо сделать легко удаляемыми из программы)
- Фундаментальные предположения (характеристики программы, которые не изменяются ни при каких модификациях)
- Изменения (типы внесенных или ожидаемых изменений; этот список является взаимодополняющим с предыдущим)
- Глоссарий
- Источники (ссылочная документация и список сотрудников с указанием того, кто на какие вопросы может ответить)
- Разделять аспекты. Например, при описании интерфейсов с аппаратурой не делается никаких предположений о назначении программы, а поведение программы описывается без ссылок на особенности аппаратуры. Тогда изменения, вносимые в какой-либо раздел документа, не влияют на другие разделы.
- Как можно больше формализации вместо словесных описаний. Если словесное описание можно заменить таблицей, формулой, графической диаграммой или схемой, то это нужно сделать. Конечно, здесь важно (как и в любом другом деле) не перегибать палку и не вводить вместо указанных простейших формальных способов представления информации сложные формальные языки, которые хорошо понимают теоретики, но не большинство программистов.
При организации описания интерфейсов с аппаратурой было введено понятие элемента данных как любого входного или выходного параметра, значение которого изменяется независимо от других параметров. Так, на входе программы присутствует барометрическая высота, положения переключателей режима датчиков, сигналы готовности датчиков и т.д. На выходе - координаты маркера положения самолета на индикаторе пилота, команда управления антенной радиолокатора, сигнал управления индикатором ⌠Сбой ЭВМ■ и т.п. Всего бортовая ЭВМ самолета А-7 получала 70 входных элементов данных, и передавала 95 выходных элементов данных. При описании этих данных применялись символические имена элементов данных и их значений (как отдельных, так и групп), специально подготовленные шаблоны и формуляры табличного типа.
При описании входных данных следует воздерживаться от указаний того, как и когда эти данные используются программой, чтобы избежать каких бы то ни было предположений о функции программы. Входные данные лучше всего описывать как перечень ресурсов, которые можно использовать при решении задачи, не упоминая об эффекте их изменения, который реализуется программой. Выходные элементы данных описываются в терминах воздействия на внешние устройства, избегая любых ассоциаций, не связанных со свойствами аппаратуры (т.е. реализуемых программно).
При организации описания функций программы необходимо связывать функции с выходными элементами данных: каждая функция определяет значения одного или более выходных элементов данных, и значения любого выходного элемента данных задаются в точности одной функцией. Такой метод описания функций работает для большинства выходных элементов, использование которых носит ограниченный характер. В случае устройств общего назначения, таких как дисплей, можно построить описание так, как если бы для каждого вида информации была отдельная панель на этом дисплее, управляемая отдельной функцией. Необходимо добавить к этим описаниям набор правил, определяющих, какая из функций управляет реально дисплеем в каждый конкретный момент. Такой подход (создание ⌠виртуальных дисплеев■) позволяет разделять решения о том, какие вырабатываются значения и о том, когда они отображаются.
Далее, функции программы можно подразделить на запрашиваемые и периодические. Каждое исполнение запрашиваемой функции происходит в ответ на некоторое событие. Например, сигнал ⌠Сбой ЭВМ■ включается запрашиваемой функцией при обнаружении ошибки в работе аппаратуры. Периодическая функция (например, функция обновления координат на дисплее пилота) выполняется многократно, и ее не нужно каждый раз запрашивать. Вместо этого, ее можно запускать и останавливать специальными событиями. такое разделение полезно, потому что для периодических и запрашиваемых функций требуется разная информация о режиме исполнения и временных характеристиках. При описании запрашиваемой функции нужно указать события, вызывающие ее выполнение, а вопрос, который следует задавать в отношении временных характеристик, таков: ⌠Какова максимально допустимая задержка между запросом и действием по запросу?■ Описывая периодическую функцию, необходимо задать события, запускающие и останавливающие ее периодическое исполнение и условия, влияющие на ее работу после того, как она запущена. Уместный вопрос о временных характеристиках: ⌠Какова минимальная и максимальная частота повторения этой функции?■
Опыт рассматриваемой разработки показал, что естественный на первый взгляд подход, при котором выходные значения описываются как математические функции от входных значений, оказался практически не пригоден. Дело в том, что приходится определять некоторые вычисляемые промежуточные значения, которые в свою очередь образуются из других промежуточных значений. В конечном итоге при таком подходе будет фактически описана реализация, что недопустимо для документа требований к ПО. Поэтому предлагается описывать требования, задавая выходные значения в виде функций от условий работы самолета и от событий, происходящих при этом. Напомним, что события возникают в некоторые моменты времени, а условия действуют в течение некоторого промежутка времени. Условия можно записать в виде логических предикатов, используя входные элементы данных, или уже некоторые макроопределения, происходящие от этих данных. Тогда событие привязано к моменту изменения некоторого условия (т.е. ставшего истинным, будучи до этого ложным или наоборот) и связано с некоторым изменением внешнего мира, о котором программа узнает посредством анализа входных данных.Хотя каждая функция зависит лишь от небольшого подмножества всего множества возможных условий, для упрощения описания функций следует объединять отдельные условия в группы. Для этой цели служит понятие режимов, определяемых как классы состояний системы. Поскольку при переходе из режима в режим функции изменяются гораздо сильнее, чем в пределах одного режима, соответствующее ⌠порежимное■ описание функций оказывается проще для понимания, чем общее описание. Для точности и полноты описания применялись таблицы условий (описывающие выходные значения периодических функций в зависимости от режимов и условий внутри режима) и таблицы событий (описывающие моменты запроса на запрашиваемые функции и моменты запуска/остановки периодических функций; а также действия, производимые по событиям).
Чтобы охарактеризовать требуемую реакцию системы на нежелательные события, полезно составить общий список возможных нежелательных ситуаций, например, такой:
1. Отказы ресурсов
- временные (например, сбой датчика входной информации)
- постоянные (например, выход из строя области памяти)
2. Ошибки во входных данных
- обнаруживаемые путем изучения только входных данных
- обнаруживаемые при сравнении с внутренними данными
- обнаруживаемые пользователем, понявшим, что он допустил ошибку (и хочет ее исправить)
- обнаруживаемые пользователем по некорректным выходным данным
3. Ошибки во внутренних данных
- обнаруживаемые по внутренним несоответствиям
- обнаруживаемые при сравнении с входными данными
- обнаруживаемые пользователем по некорректным выходным данным
По мнению авторов рассматриваемой разработки, полученный ими опыт показывает, что достаточно сложную систему можно полно, непротиворечиво и практически полезно описать в терминах внешних воздействий на нее и ее видимого извне поведения.
4.2. Требования стандартов
4.2.1. Стандарт DO-178B в части разработки требований к ПОРазработка требований к ПО, согласно стандарту DO-178B, охватывается более общим процессом разработки ПО, состоящим из следующих этапов:
- Этап разработки требований к ПО.
- Этап проектирования ПО.
- Этап кодирования ПО.
- Этап интеграции ПО в систему.
В соответствии со стандартом DO-178B в процессе разработки ПО вырабатывается по крайней мере один (а в ряде случаев и больше) уровень требований к ПО. Требования высокого уровня получаются непосредственно из анализа требований к системе и анализа архитектуры самой системы и должны включать в себя:
- функциональные требования
- требования на производительность
- интерфейсные требования
- требования безопасности
Эти требования далее обычно развиваются на этапе проектирования ПО, формируя последующие уровни требований более низкого уровня. Однако, если исходный код генерируется непосредственно из требований высокого уровня, то налицо всего один уровень требований, что дает возможность рассматривать их и как требования низкого уровня. В этом случае к ним применимы соответствующие принципы и правила их формирования.
На этапе проектирования ПО (если он есть) определяются как архитектура ПО, так и требования низкого уровня. Разработка архитектуры ПО заключается в принятии ряда последовательных и взаимосвязанных решений о структуре ПО, имея в виду как собственно программные модули так и структуру используемых данных. Разработка требований низкого уровня к ПО тогда сводится по сути к формированию требований уже к отдельным программным модулям и их интерфейсу с другими модулями. В такие требования могут включаться также требования на динамическое взаимодействие модулей между собой в рамках некоторой операционной системы или работы иной организующей программы (если она есть). Из требований низкого уровня без какой-либо дополнительной информации может быть непосредственно реализован исходный код программы.
Каждая из составляющих фазы разработки ПО может порождать производные требования - требования, прямо не прослеживаемые к требованиям высокого уровня. В качестве примера можно привести необходимость программ обработки прерываний для многих систем реального времени. Введение системы прерываний обычно напрямую не связано ни с одной из функций, требуемых потребителем, однако их реализация на выбранном компьютере без такого механизма может быть затруднена или не осуществима совсем. Производные требования могут включаться в состав требований как высокого, так и низкого уровня.
Исходными данными для этапа разработки требований к ПО согласно стандарту DO-178B являются следующие документы:
- требования к системе, включая описание аппаратного интерфейса и аппаратной архитектуры системы. Эти документы поступают из жизненного цикла системы;
- план создания ПО и стандарты на требования к ПО. Эти документы поступают из фазы планирования создания ПО.
После того, как эти данные удовлетворяют некоторому заранее определенному критерию (например, применяется экспертная оценка, которая показывает ⌠завершенность■ или ⌠достаточность■ документов), они используются для разработки требований высокого уровня к ПО, которые оформляются в документ ⌠Требования к ПО■.
Этап разработки требований к ПО считается завершенным, когда его цели и цели всех связанных с ним этапов (в том числе и системных) достигнуты. Стандарт перечисляет основные задачи, которые необходимо решить на этом пути:
- интерфейсные и функциональные требования к системе, планируемые к реализации на базе ПО, должны быть проанализированы на предмет противоречий, несоответствий и неопределенностей;
- неадекватные или некорректные исходные данные должны быть по принципу обратной связи направлены на выработавшие их подэтапы для разъяснения или исправления. Без сомнения, такие данные нельзя без исправления использовать для формирования требований;
- должны быть особо выделены требования по безопасности, соответствующие системным требованиям по предотвращению выхода системы из строя;
- требования высокого уровня должны соответствовать стандартам на требования к ПО, быть непротиворечивыми и допускающими проверку. Под последним понимается возможность генерации тестов и тестовых процедур для каждого требования и их действительной реализации. Эта деятельность выполняется позднее на фазе тестирования и верификации ПО;
- требования высокого уровня должны формулироваться с использованием количественных величин с допусками везде, где это возможно;
- требования высокого уровня не должны описывать детали разработки или тестирования. Исключением являются требования к ПО, возникающие вследствие установленных в процессе дизайна системы аппаратных ограничений. В каком-то смысле аппаратные ограничения играют роль некоторого ⌠материального интерфейса■ программ с внешним миром, присутствующего наряду с общеизвестным информационным интерфейсом;
- каждое системное требование, планируемое к реализации на базе ПО, должно быть преобразовано в одно или более требований к ПО высокого уровня;
- каждое требование высокого уровня, за исключением производных требований, должно быть прослеживаемо к одному или нескольким системным требованиям;
- производные требования высокого уровня должны быть направлены этапу оценки безопасности системы. Можно считать последний по форме некоторым подобием процесса верификации ПО, однако пристальное внимание именно к системным вопросам делает его содержание значительно шире.
4.2.2. Основное содержание документа ⌠Требования к ПО■
Документ ⌠Требования к ПО■ определяет требования высокого уровня, включая и производные требования, если это необходимо. Эти данные должны включать (но не ограничиваться этим):
- описание приведения системных требований к программным, с особым акцентом на требования безопасности и потенциальные условия возникновения сбойных ситуаций;
- функциональные и операционные требования для каждого режима работы;
- критерии функционирования, например, точность;
- временные требования и ограничения;
- ограничения по размеру памяти;
- программные и аппаратные интерфейсы, например, протоколы обмена, форматы данных, частота входных и выходных сигналов;
- требования на обнаружение сбоев и мониторинг за безопасностью функционирования;
- требования к расчленению ПО на отдельные компоненты и на их взаимодействие друг с другом (например, при реализации в виде распределенной системы).
Несмотря на то, что стандарт DO-178B достаточно определенно описывает необходимое содержание документа ⌠Требования к ПО■, можно привести ряд практических рекомендаций, разъясняющих необходимые требования к документу в терминах, более привычных для программистов. Так, более сбалансированный, более удобный в использовании и при этом полностью соответствующий стандарту список требований к ПО может выглядеть так:
4.3. Обсуждение общих проблем документирования разработки ПО
- описание аппаратно-программных интерфейсов (включая протоколы, форматы, частоту смены данных);
- перечень всех функций, выполняемых ПО, с указанием их критичности;
- функциональные блок-диаграммы, DCFD или эквивалентное представление для графической иллюстрации функциональных операций и взаимоотношений между функциями;
- функциональные и операционные требования для каждого режима работы;
- требования к функционированию (например, точностные требования);
- временные требования и ограничения (например, время задержки ответа);
- ограничения по размеру памяти;
- другие характеристики используемой процессорной системы (например, число независимых линий прерываний процессора), которые выступают как ограничения, накладываемые на ПО;
- требования на встроенную тестовую систему (имеется в виду тестирование аппаратной части);
- требования на мониторинг безопасности работы;
- границы ухудшения характеристик или невыполнения некоторых функций при сбойных ситуациях;
- требования к тестированию. Этот пункт не детализирует а лишь показывает основное направление планируемой тестовой деятельности, своего рода ⌠тестовую концепцию■. Ее фиксация на таком раннем этапе может избежать многих трудностей, ⌠неожиданно■ возникающих при попытке протестировать проект, во всех отношениях кажущийся вполне успешным и завершенным;
- требования на членение ПО (если применяется).
4.3.1. Необходимость ведения проектной документации
Вполне возможно, что небольшую систему удастся спроектировать ⌠за один присест■, описать проект в одном документе и самим же построить спроектированную систему. Но для больших и сложных систем так не выходит. Помимо того, что в проект вовлекается множество людей, необходимо еще и написать множество документов, удовлетворяющих самым разным запросам. Среди всей значительно отличающейся по содержанию, стилю и терминологии документации документы, относящиеся к разработке системы формируют иерархию или пирамиду, которая при взгляде сверху вниз описывает дизайн в более и более мелких деталях. При этом многие документы высокого уровня пишутся с мысленным учетом специфических деталей дизайна на основе уже проведенных исследований и рабочих материалов предыдущих проектов.
Документы в пирамиде могут быть рассмотрены в двух смыслах, что обычно отражается и в их названии: как спецификация того что было разработано и как требования для дальнейшей разработки. Просто ⌠Спецификация■ подчеркивает, как много дизайна уже проделано, а ⌠Спецификация требований■ отражает, как много еще предстоит сделать. Если возникает проблема и дизайн должен измениться, необходимо сохранить в архиве оригинальный вариант дизайна и смысл каждого изменения. В этом контексте дизайн может выглядеть как иерархия решений, а спецификация просто описывает их.
На самых ранних стадиях проекта первая цель документов - позволить руководству проектом оценить необходимые ресурсы. Ведение проектной документации имеет далее несколько различных целей:
- описать разработку для пользы самих авторов (разработчиков)
- собщить пользователю, находящемуся как бы на один уровень выше, что разработчики поняли его требования или по крайней мере описали то, что он собирался получить
- связать разработчиков с другими командами разработчиков
4.3.2. Информационное содержание проектной документации
При первом взгляде может показаться, что целая иерархия документов генерируется декомпозицией одного единственного документа - Спецификации Требований (примерно так же, как проводится функциональная декомпозиция в методе структурного анализа). Между тем, обычная спецификация требований для проекта занимает порядка 100 страниц, в то время как нижний уровень проектной документации - несколько тысяч, т.е. явно содержит больше информации. Поэтому можно сделать вполне очевидный вывод, что в процессе разработки добавляется новая информация. Т.о., разработка состоит не столько в произведении функциональной декомпозиции, сколько в производстве решений, добавлении информации, создании порядка из беспорядка. И тогда одна из главных функций спецификации состоит в отражении этой информационной деятельности.
Требования для нового продукта или системы редко приходят в жизнь как точные, хорошо продуманные идеи. Поначалу имеется только несколько человеческих ⌠нужд■, которые осознаются и выражаются в терминах существующих известных вещей. Дизайн, в самом широком смысле, это работа по изучению этих ⌠нужд■ и производству продукта для их удовлетворения.
На первый взгляд необходимо только, чтобы нуждающееся лицо (пользователь) записало то, что оно хочет, в Спецификацию Требований. Например, пользователь выражает нужду в ⌠управляющем центре■, который должен ⌠управлять движением и.т.п.■. Затем некто (инженер, проектировщик), получив эту спецификацию, может построить требуемое.Однако на самом деле такое краткое описание не может быть просто декомпозировано в целях дизайна, т.к. в нем просто недостаточно информации. Попытка конкретизировать это описание подразумевает принятие решений. Так, уже было принято точное решение иметь управляющий ⌠центр■, а не сеть, например. Мы можем предположить и дальнейшие решения, такие как: ⌠необходимо управлять всеми движущимися средствами в пределах города■ и ⌠необходимо выполнять при этом следующие функции:...■.
Описание проблемы пользователем не должно предполагать какие-либо решения (возможно такие решения могут оказаться недоступными для современной технологии). Упрощенно можно полагать, что после написания Спецификации Требований мы видим мир с описанием нового продукта и меньшим числом проблем. Мы не можем сказать в деталях, что находится внутри квадрата ⌠центр управления■: это относится к области проектных решений. Мы можем только определить это в терминах нового поведения окружающего мира и взаимодействия нашего нового продукта с окружающим миром. Хотя мы и приняли несколько решений, мы еще не спроектировали наш ⌠квадрат■. Выполняемые им (вследствие наших решений!) функции существуют лишь как высокоуровневые, человеческие идеи. И эти идеи невозможно просто проанализировать с целью получения низкоуровневых деталей. Анализ является важной компонентой Спецификации Требований. Но это только одна компонента, и необходимо не путать ее со следующей фазой: проектными решениями. Мы можем анализировать только вещи, которые существуют, т.е. мир ⌠до■ новой системы. Мы не можем анализировать вещи которые являются только идеями в сознании потребителя или разработчика. Однако мы нуждаемся в большей информации, и она может придти только от пользователя. Если он хочет, чтобы дизайн был успешным, он должен конкретизировать свои нужды, но не как детали дизайна внутри ⌠квадрата■, но в терминах цели, для которой этот ⌠квадрат■ задуман в будущем пользовательском мире. Так, система будет должна ⌠хранить деньги■, ⌠уменьшать время доставки■ и.т.д.
4.4. Общий процесс анализа текстовой проектной документации и формулировки требований
< Спецификация Требований не является полным описанием продукта; это перечисление целей и намерений, имеющее предполагаемую систему на низшем уровне описания и неограниченное чем либо сверху. Напротив, работа проектировщика не анализ требований, а синтез дизайна. Проектировщики должны делать решения. И хотя эти решения происходят как отклик на требования пользователя, они не содержатся в последних. Проектировщики будут синтезировать проект, т.е. сделают множество решений, которые станут своеобразным мостом между целями пользователя и конечными деталями управляющего центра.
Итак, смысл декомпозиции требований в проект заключается в том, что проектные решения образуют структуру; а сам метод структурной декомпозиции помогает нам при этом организовать и документировать наши проектные решения.
Если мы сгруппируем решения в соответствующие документы, то немедленно увидим, почему документы верхнего уровня тоньше, чем нижнего: они содержат немного решений. Также становится понятным, почему Спецификация Требований сама может быть достаточно объемной: она содержит не столько решения, сколько обзор окружающего систему внешнего мира.
Если можно проследить каждое предложение в требованиях в множество решений и каждое решение в множество предложений в требованиях, то в системе проектной документации имеется информационный баланс. Сложное требование, скажем, будет иметь соответственно большее число решений в проектной спецификации.
Хотя теоретически это верно, на практике нет дизайна полностью оригинального. Производитель будет всегда пытаться продать продукт, который уже был разработан. В действительности требование не пытается охватить все детали дизайна, а вместо этого ссылается на другие документы. Например, если мы покупаем машину, продавец получает наши требования в терминах размера вашей семьи, величины вашего дохода, вашего социального положения и.т.д. Все это транслируется в простую формулу типа ⌠Модель А, 4 двери, 1600 куб.см■. И это является Спецификацией Требований■, которую получают на заводе.
Ясно, что такая информация не претендует на перечень всех деталей, необходимых для постройки машины. Вместо этого просто называется один из продуктов, выпускаемых заводом, что может быть закодировано всего шестью цифрами. Реальная Спецификация Требований, по которой строится машина, является более длинным документом (или их множеством). Это скрытый документ, с его проведенными исследованиями и отчетами, который и используется для постройки машины. Все требуемые изменения в процессе постройки могут быть просто перечислены в ⌠Спецификации Требований Пользователя■. Тогда более общий принцип информационного баланса заключается в том, что Спецификация Требований должна содержать всю новую или нестандартную для проектируемой системы информацию.Предположим, что имеются несколько текстовых документов, разработанных в рамках некоторого проекта и содержащих по своему статусу и смыслу различные проектные требования и ограничения. Эти документы необходимо проанализировать и попытаться структуризовать имеющуюся в них информацию, стремясь при этом:
4.4.1. Идентификация требований и ограничений
- однозначно идентифицировать каждое требование/ограничение;
- удалить повторяющиеся требования/ограничения;
- прояснить неоднозначности в требованиях/ограничениях;
- классифицировать все требования/ограничения;
- определить ответственность в выполнении каждого требования или ограничения.
Для идентификации требований и ограничений необходимо выполнить следующие шаги:
4.4.2. Рационализация повторяющихся требований и ограничений
- проанализировать каждое предложение в документе и решить, какие предложения содержат информацию о требованиях или ограничениях. На такую информацию обычно указывают слова типа ⌠должен■, ⌠необходимо■, ⌠будет■ и т.п., которые выражают основные устремления заказчика. Вместе с тем такие предложения должны отвечать на вопрос ⌠ЧТО система должна будет делать■, оставляя вопросы со словом ⌠КАК■ на этап проектирования;
- решить, какие предложения содержат больше чем одно требование или ограничение и разбить такие предложения на более простые, которые содержат уже по одному требованию или ограничению;
- пронумеровать (в принятой по документации системе отстчета, обеспечивающей уникальность и ясность) все выделенные требования и ограничения. Идентификационный номер может быть простым порядковым числом, но этот стиль не рекомендуется применять. Гораздо лучше использовать структурную схему нумерации, опирающуюся на структуру разделов документа в целом. Напрмер, 5.3.4-3, где 5.3.4 - номер раздела документа, 3 - порядковый номер требования внутри этого раздела.
Достаточно часто одно и то же требование или ограничение встречается более чем однажды внутри одного документа или в разных документах. Между тем необходимо, чтобы каждое требование было однозначно идентифицировано и поэтому все повторения должны быть ликвидированы. Для зтого необходимо выполнить следующие шаги:
4.4.3. Устранение неоднозначности
- найти все повторения одного и того же требования/ограничения. Например, в тексте может быть две следующих фразы: ⌠5.3.4-3. Главной целью проектируемого самолета являются боевые действия в воздухе■ и ⌠6.1.2-2. Разработка самолета проводится главным образом для боевых действий в воздухе■.
- выбрать одно из повторяющихся требований или ограничений с наиболее удачной текстовой формулировкой; если таковой нет, то переформулировать так, чтобы наилучшим образом выразить смысл требования или ограничения.
- сохранить идентификатор одного из старых или пронумеровать новое требование в принятой системе идентификации требований.
- определить все остальные требования (с худшими формулировками, но уже ⌠попавшие■ в систему их идентификации) как ⌠заменяемые■ на требование с лучшей формулировкой. Таким образом, общее число требований не изменяется (или даже увеличивается), но все повторяющиеся помечены и впоследствии могут быть удалены. Не рекомендуется сразу удалять повторяющиеся требования до окончания работы над ними, чтобы обеспечить лучшую прослеживаемость результатов.
Очень часто требования или ограничения, выражаемые обычным языком, допускают различную интерпретацию. Поэтому для всех таких случаев необходимо их дополнить замечаниями, комментариями, разъяснениями, точно проясняющими вносимый автором смысл. Например:
⌠3.6.7-1. Самолет должен иметь достаточную надежность.
Замечание. Достаточная надежность означает, что MTBF больше чем 10000 часов.■
4.4.4. Классификация требований/ограниченийИмея в виду необходимость в оформлении требований в конечном итоге как документа (содержащего обычно систему подразделов), надо стремиться классифицировать требования в соответствии с их типом (т.е. сферой их действия, объектом/субъектом и.т.п.)
4.4.5. Определение ответственных за выполнение
- определить перечень ⌠классов■, соответствующую предметной области проекта. Например такой перечень может охватывать требования по безопасности, требования по надежности, операционные требования, функциональные требования, аппаратные ограничения, программные ограничения.
- определить, к какому из классов относится то или иное требование. Например, ⌠5.6.4-2. <аппаратура, надежность> Каждый узел системы должен иметь MTBF больше чем 10000 часов.■
В обозримом будущем вряд ли удастся создать ⌠автоматическую систему удовлетворения требований■, разрабатывающую заказанную систему без участия человека по предложенной заказчиком некоторой спецификации. Поэтому дальнейшие пункты являются неотъемлемой частью методологии создания требований для любого достаточно сложного проекта, реализуемого более чем одним человеком.
4.4.6. Примеры
- определить общий круг и группы разработчиков, которые будут реализовывать требования. Например, группа ⌠Навигационные Системы■, группа ⌠Система управления полетом■, группа ⌠Гидравлические системы■ и.т.п.;
- назначить ответственного для выполнения каждого требования или ограничения. Это не обязательно должно быть персонифицированное лицо, иногда вполне достаточно указать конкретную группу разработчиков;
- внести в требование идентификатор документа, являющийся исходным для каждого требования. Например, ⌠3.3.4-3. <НС, СИСТ > Самолет должен быть способен лететь по заданному маршруту.■, где НС - группа ⌠Навигационные Системы■, СИСТ - документ ⌠Системные требования■.
Ниже приведен ряд примеров неудачной формулировки требований, их возможная критика и предложен улучшенный вариант. Конечно, для полноты проверки необходим контекст, так что примеры не могут показать неудачность представленных фраз в любом контексте. Целью является показать возможную направленность вопросов, которые необходимо задавать себе при проверке требований.
1. ⌠Проверка диапазона величины X включается при нажатии клавиши ⌠ВК■ на клавиатуре■.
Неясно, при любом ли нажатии указанной клавиши производится эта операция. Кроме того, неясно, выполняется ли эта операция ⌠автоматически■ аппаратными средствами клавиатуры или ее приходится поддерживать программно. Лучше формулировать более конкретно таким образом: ⌠Проверка диапазона величины X должна выполняться программой обработки прерывания от клавиатуры после окончания набора величины X на клавиатуре и нажатия клавиши ⌠ВК■■.2. ⌠Сигнал А устанавливается в нулевое значение■.
Неясно, имеется в виду физический или логический нуль, который может отличаться от физического. Также явно не определено, чья это функция. Лучший вариант выглядит так: ⌠Сигнал А должен устанавливаться программой обработки прерываний в нулевое логическое значение. Примечание. Уровни логических значений соответствуют их физическим величинам, а именно:...■.3. ⌠Выходные данные будут заполнять состоять из одного полного блока записей■.
Неясно, сколько записей могут входить в полный блок записей.4. ⌠Программа мониторинга должна обнаруживать и обрабатывать ошибочные ситуации: переполнение, деление на нуль, достижение конца файла и т.д.■.
4.5. Анализ характеристик качества содержания документа
Любое перечисление в рамках требований, конечно, не должно включать слова типа ⌠и т.д.■. Кроме этого слово ⌠обрабатывать■ без разъяснений его смысла также недопустимо.По современным представлениям считается, что хорошая спецификация требований должна быть полной, формальной, без повторений и однозначной. Кроме того все требования должны быть тестируемы. Попробуем проанализировать возможность тестирования указанных требований для спецификации.
4.5.1. ПолнотаРассмотрим сперва документ ⌠Спецификацию Требований■, который объясняет то, что хочет пользователь в терминах его собственных целей и намерений. В процессе разработки (в т. ч. в самом ее конце) возникают вопросы и проблемы, на которые может ответить лишь сам пользователь. Например, если пользователь ⌠управляющего центра■ пожелает транспортировать различные грузы, это может означать не только шифровку телефонных линий, но и перемещение всего центра в более надежное здание и перепроектировку всех программ. Этот пример показывает, что полнота на верхнем уровне, хотя и облегчает задачу проектировщика, но все же невозможна (примерно так же, как невозможно описать историю появления всех объектов во вселенной).
Далее, проектные спецификации в принципе могут быть полны, если мы описываем управляющий центр, телефоны, компьютеры, программы до самой последней детали. Однако, на практике мы даже не пытаемся это делать. Спецификации содержат детали, но описывают только их новые, нестандартные особенности, отсылая за остальным к уже существующим описаниям. Остальная часть системы специфицируется по тому же принципу, как и ранее автомобиль: ⌠Компьютер модели А, 1 Мбайт, 4 диска■. Однако, как только мы определяем конечное число информации, мы вынуждены считать при этом, что весь бесконечный остаток ⌠не имеет значения■. Список вещей, которые должны были бы специфицироваться, бесконечен. То, что мы выбираем для описания, определяется скорее не ⌠полнотой■, а принципом ⌠наибольшей отдачи■, который предполагает малоценным описывать детали после некоторого предела. Где этот предел находится, зависит от многих факторов, и определяется для каждого проекта независимо и во многом субъективно.
Итак, любая детальная спецификация не является буквально полной, что и не является ее самоцелью. Достаточно того, что они описывают все вещи, которые нам необходимо знать, чтобы выполнить дизайн. Показателем качества спецификации является не полнота сама по себе, а является ли она ценной для проектирования системы или нет.
4.5.2. Формальные языки и смыслВыше было показано, что не стоит пытаться наполнять спецификацию всеми деталями, оставляя последние во вспомогательных документах, отражающих накопленный производителем опыт. Вместо описания всех особенностей ⌠стиля■, ⌠мощности■ и ⌠размера■ автомобиля, мы говорим ⌠Модель А, 4 двери, 1600 л.с.■. Это язык формальной спецификации, который превосходит традиционный язык в смысле формального синтаксиса и семантики. Каждый элемент определяется во вспомогательных документах, которые доступны как пользователю, так и производителю.
4.5.3. Избыточность и неоднозначность
В наши дни возможно даже выполнить компьютерный анализ таких языков. Изготовитель автомобиля в состоянии при этом проанализировать спецификацию пользователя на предмет согласованности (и полноты) и вроде бы ничто не мешает направить результат прямо в автоматическую производственную линию. На самом деле своим формальным описанием мы только доопределяем небольшие изменения в уже готовых конструкциях, формальные элементы просто указывают на другие документы, где содержатся реальные спецификационные детали. Только эти документы и придают смысл нашим формальным элементам. Синтаксис языка контролируется проектными инженерами, которые ограничивают его в множестве автомобилей, которые уже разработаны и проверены.
Если мы хотим получить систему с новыми, непроверенными свойствами, мы не можем так поступать. Мы не можем просто определить ⌠управляющий центр■ т.к. эти слова не определены во вспомогательных документах. Только пользователь знает их смысл, пока система еще не спроектирована. В процессе дизайна, мы можем произвести множество формальных описаний на базе уже известных элементов, таких как компьютеры и телефоны. Но новые особенности, которые делают эту систему отличащейся от других, не могут быть описаны этим путем. Какие бы элементы мы не использовали, слова могут быть только или уже определенными, или понимаемыми со ссылками на спецификацию требований. И это возвращает нас к пониманию посредством мира пользователя. Смысл наших слов остается в конечном счете в рамках обычного языка и человеческих идей.
Предположим далее, что мы запрашиваем ⌠Модель А, 4 двери, преобразованый для инвалидов■. Первые два параметра являются формальными ссылками на базовые элементы, однако третий неформален и должен быть разъяснен пользователем. Но мы не можем просто просто отделить первые две части спецификации, запуская ⌠Модель А, 4 двери■ в производственную линию и проектируя сами остальное. Присутствие новой особенности ставит весь наш дизайн под сомнение. Мы не можем далее просто конвертировать формальные параметры в строку цифр для компьютерной обработки, нам следует изучить их определения. И они также остаются в конечном счете в рамках обычного языка и неограниченной сложности реальных объектов.
Конечно элемент ⌠4 двери■ может быть вполне понятен, но только в том смысле, какой дает нам мысленная картинка автомобиля. Слова содержат зародыши идей, ⌠смысловых зацепок■ (semantic hooks) которые сцеплены в множество неформальных изображений в человеческом сознании. И если слова выбираются тщательно, они могут иметь большое значение. Они позволяют нам думать в высокоуровневых идеях, предусматривая ⌠рычаги■ для манипулирования реальными, нижележащими определениями. Но мы не должны смущаться неформальной картиной при определении реального объекта. Конечный автомобиль, после преобразования, может иметь 3 или 5 дверей - но он будет все еще помечен как ⌠4-дверный■ на производственной линии. Разрешая такие ⌠смысловые зацепки■ формальных слов, мы стараемся обсуждать неформально в интересах эффктивного взаимодействия.
Использование этих ⌠зацепок■ - уже известная техника в программировании, где идентификаторы носят ⌠осмысленные■ имена. В этом случае имена эквивалентны комментариям в программе, и мы можем продемонстрировать это редактированием всех имен в случайные текстовые строки перед компиляцией. Такой текст программы станет бессмысленной для человека, однако это не повлияет на ее выполнение. Это демонстрирует разницу между формальной записью на языке программирования и намеченным реальным эффектом от компьютерной системы отражаемого в именах переменных.
Конечно, как только проект будет закончен, все слова станут формально определенными уже простым указанием на законченную систему. Но в это время все проблемы уже решены и большая нужда в строгости и взаимодействии отпадет. Не является большим достижением формальное описание уже спроектированной системы. Сказанное не означает, что мы не можем использовать обозначения математики как помощь в описании взаимоотношений. Но мы должны помнить, что в рамках разработки технической документации ⌠формальность является в лучшем случае аналогией и в худшем - косметикой■.Мы пришли к заключению, что смысл любой спецификации содержится в конечном счете в словах обычного языка. Но что эти слова означают? Сами по себе слова не имеют смысла. Смысл вносится при совместном извлечении группой слов подходящего отклика в человеческом сознании. Чтобы дойти до широкой аудитории или достичь более точного смысла мы нуждаемся в большем числе слов без ограничения. Многие очень простые идеи требуют целых книг для из разъяснения. просто потому, что они противоречат нашему накопленному опыту.
4.5.4. Общие рекомендации
Это представляет избыточность и неоднозначность в новом свете. В буквальном (тривиальном) смысле, избыточность означает наличие вещей, которые не являются необходимыми, а неоднозначность означает более чем один возможный смысл. Мы можем исключить и то и другое из документации для большей краткости и формальности. Но если мы сделаем это просто путем выбрасывания разъяснений, то мы выбросим и смысл тоже, ⌠выплеснем с водой и ребенка■. В итоге мы получим голые математические уравнения без неоднозначностей и без смысла.
На самом деле мы хотели бы удалить неоднозначность, но только не за счет общего смысла. Если мы хотим быть понятными, мы должны сами и разъяснить, т.е. сказать одну вещь разными способами. Мы не просто пишем столько, сколько необходимо для разъяснения, но мы пишем столько, сколько необходимо для понимания. Спецификация, которая разъясняет что-либо двумя способами, подобна дублированной компьютерной системе, что защищает от целого класса ошибок. Итак, мы должны писать так много, как наиболее ценно для понимания.По современным представлениям идеальная спецификация должна быть полна, формальна, без повторов и однозначна. Однако выше показано, что эти термины сами не столь формальны и точны. Мы не можем интерпретировать их в буквальном, математическом смысле. Более конструктивно думать о них как об показателях хорошего стиля:
- ⌠полнота■ означает, что включена вся необходимая информация, идеи и разъяснения;
- ⌠формальность■ означает формальный ⌠прозаический■ стиль без специальных оборотов и жаргона;
- ⌠неповторяемость■ означает, что повторы не надоедают читателю;
- ⌠однозначность■ - означает, что все адекватно разъяснено.
Где это возможно, мы должны применять формальные методы, в математическом смысле этого слова. Если мы можем охватить смысл некоторого механизма формальной аналогией, т.е. математической моделью, то мы сократим его длинное описание - при условии, что мы ⌠обнажим стержень■ достаточными пояснительными словами. Это включает в себя аккуратное определение терминов, формализованные диаграммы и обозначения, усердное внимание к деталям - все то, что определяет хороший стиль документа.
4.6. Переход от анализа системных требований к разработке требований к ПО
При этом мы должны избегать принудительной краткости, которая дает иллюзию совершенства, и которая достигается порой просто выкидыванием всех кусков, не укладывающихся в эту идеализированую цель. Мы должны помнить также, что документы содержат много больше информации, чем они показывают на своих страницах. Если разъяснения для оценки смысла каждого предложения неадекватны или пропущены, проектировщик начнет ⌠читать между строк■, додумывая несказанное с возможными ошибками. Поскольку документация расчитана на людей, мы должны сделать ее максимально понятной именно человеку. Необходимо помнить, что одна неформальная фраза или картинка в подходящем контексте может дать больше ясности, чем страница убористого текста.Выше мы рассмотривали стратегию построения функциональной модели системных требований. Необходимо отметить, что хотя система и состоит из аппаратной и программной части, модель требований к ПО не является просто механически отделимой составной частью указанной общей системной модели. Для разделимости системных требований на аппаратные и программные необходимо сначала определить архитектуру системы с тем, чтобы привязать каждое системное требование к элементу этой архитектуры и решить, аппаратными или программными или сразу обоими средствами каждый такой элемент будет пользоваться для удовлетворения требований.
Шаги формирования архитектурной модели системы представлены ниже:
- Сгенерировать модель системных требований, отражающую функциональные и управляющие требования
- Расширить эту модель путем добавления ⌠входных■ и ⌠выходных■ интерфейсных процессов, (включая и интерфейс с человеком-оператором) а также других нефункциональных требований, таких как встроенное тестирование, дублирование функций для обеспечения большей надежности, введение функций для поддержки сопровождения системы и т.п.
- Привязать элементы полученной расширенной модели к ⌠физическим■ элементам в соответствии с выбранной технологией, что и произведет архитектурную модель системы
Образно говоря, сначала из системных требований вычленяются функциональные и управляющие требования, которые формируют стройный ⌠скелет■ модели обработки данных/управления, затем этот скелет ⌠обрастает■ в связи с наличием нефункциональных (в т.ч. технологических) требований, не теряя стройности, придаваемой все время указанным ⌠скелетом■, и превращаясь в конце концов в архитектурную ⌠физическую■ модель системы.
Если модель системных требований можно считать технологически независимой, то архитектурная модель является уже технологически зависимой и находится не в области требований, а в области проектирования системы. Тем не менее мы вынуждены сделать этот шаг до разработки требований на ПО. Объяснение этому однако вполне естественно в рамках иерархического подхода к любым системам:
- мы смотрим на систему именно как на систему, а не простое собрание аппаратных и программных компонент, выполняющих каждую свою функцию. ⌠Целое функционально больше, чем сумма его частей■;
- на системном уровне мы видим как система интегрируется воедино. Речь идет о программно-аппаратном интерфейсе, задаваемом системными требованиями;
- мы работаем с каждым системным требованием независимо от решения о его дальнейшей реализации в аппаратной и программной части. Такое решение накладывает некоторые ограничения на проведение декомпозиции требований. Главная цель на этом этапе - это установить иерархию системы, построить ее архитектурную модель.
Итак, в результате получается верхний уровень архитектуры системы в терминах (физических) модулей и информационых каналов взаимодействия модулей между собой путем обмена потоками данных. Мы имеем на этом этапе модель реализации системы, показывающую два аспекта:
- распределение системных требований по архитектурным модулям. Это дается спецификацией модуля, в котором указываются выполняемые им системные требования;
- определение физических каналов обмена информации, связывающих модули между собой;
- обмен информацией по каналам осуществляется путем информационных векторов данных.
Рассмотрим основные особенности архитектурной модели в сравнении ее с функционально-управляющей моделью:
- абстрактные процессы привязываются к конкретным архитектурным модулям (т.е.модулям, которые планируется ⌠физически■ осуществить),. В графическом плане происходит перекомпоновка процессов: одни объединяются в единый модуль, другие - расщепляются каждый на несколько модулей;
- перекомпоновка процессов очевидно влечет за собой и перекомпоновку данных, в которой потоки данных/управления привязываются к физическим каналам, которые планируется использовать для переноса этих потоков. Смысловое определение самих потоков данных не изменяется заменой их на вектора в расширенной модели, а просто снабжается дополнительной информацией, приписывающей им физические источник и приемник, которая записывается в словарь данных. Отметим, что вектор данных отличается от потока своей однонаправленностью и тем, что может содержать произвольную комбинацию (даже функционально разнородных) элементов потоков данных и управления;
- терминаторы на архитектурной контекстной диаграмме отражают физические сущности с точки зрения проектировщика (например, выделенные внешней границей объекта), которые в принципе могут отличаться от терминаторов - источников и приемников информации на функциональной контекстной диаграмме. Однако на базе имеющегося опыта можно считать, что множество терминаторов практически не меняется при переходе к архитектурной модели, что отражает техническую ⌠однофункциональность■ современных датчиков информации и возможных выходных устройств системы.
Введение в модель интерфейсных требований может интерпретироваться, например, как отщепление от терминатора соответствующей интерфейсной функции, которая получает от терминатора те же данные, но только в другом формате, более привязанном к физической реализации.
4.7. Процесс разработки требований к ПО
В общем случае, процесс создания архитектурной модели требует учета и функциональных и управляющих требований для архитектурных модулей, производства проектных решений в части перераспределения требований, оценки полученных результатов, и как правило, носит итерационный характер.
После построения архитектурной модели необходимо решить, как конкретные модули будут реализовывать предписанные им требования: только аппаратно, только программно (мы не заботимся в этом случае о базовом вычислителе, обычно это стандартный готовый компьютер), или аппаратно/программно. Следует отметить, что последний случай на самом деле на более нижних уровнях декомпозиции сводится к первым двум, так что достаточно разделять только аппаратные и только программные требования. После этого системного проектного решения о разделении архитектурных модулей на аппаратные и программные и начинается, собственно, фаза разработки требований к ПО (базирующемся на этих программных архитектурных модулях). Рекомендуется ⌠не забегать вперед■ и не начинать разработку программных (и аппаратных) требований, пока полностью, т.е. до самого нижнего уровня, не закончен анализ системных требований. Аналогичную рекомендацию можно дать при разработке программной (и аппаратной) архитектуры.
В практике разработки не очень больших встроенных централизованных систем обработки данных как правило только один архитектурный модуль, связанный с наличием встроенного компьютера отвечает за программные требования. Напротив, в децентрализованных системах (начиная уже от персонального компьютера с ⌠интеллектульными■, т.е. на базе микропроцессора, контроллерами внешних устройств и до систем управления космическими аппаратами) может быть несколько или даже много таких модулей. Требования к ПО разрабатываются отдельно на каждый такой архитектурный модуль.Процесс разработки требований к ПО практически повторяет процесс разработки системных требований. Перечислим некоторые его отличительные особенности:
- разделение функционально-управляющей модели системных требований на программную и аппаратную часть делается путем как бы ⌠обращения■ проведенной привязки процессов по модулям и потоков данных/управления по физическим каналам и информационным векторам. При этом получается функционально-управляющая модель требований к ПО, прямо прослеживаемая к системным требованиям.
- требования к ПО расширяются производными (по отношению к системным) требованиями и ограничениями, связанными с интерфейсом с аппаратной частью системы. Наиболее обычный путь для этого - рассмотрение аппаратных частей, принадлежащих системе, но не являющимися внешним ее интерфейсом (например, независимая от питания память, таймер/часы) как дополнительных терминаторов, поставляющих или принимающих информацию от программ и проведение декомпозиции, аналогичной описанной выше.
- построение архитектурной диаграммы ПО значительно сложнее, чем для системы в целом. Это связано и с многочисленностью программных компонент, являющейся следствием принципа полного разделения функций/данных, и с различным характером связи между программными модулями. Самыми важными видами программной архитектуры являются физическая (т.е. компоновка мелких модулей в более крупные структуры) иерархия, иерархия вызовов и сеть данных, которые модули обмениваются между собой.
Пока не существует общепринятого удобного способа графически изобразить все типы структур программной архитектуры на одной диаграмме. Можно порекомендовать на высших уровнях программной архитектуры пользоваться аналогичными CDFD диаграммами обмена векторами данных между модулями посредством физических каналов, на средних уровнях переходить к схемам Константайна [ 10 ], а архитектуру отдельных программных модулей описывать псевдокодом или, если она является логически сложной - на языке обычных блок-схем.
Информационная модель (в виде различных диаграмм, миниспецификаций и словаря данных) несмотря на всю ее важность для успеха разработки, может служить лишь приложением или неосновной частью документа. Основной частью документа, как вытекает из его названия, являются сами требования. Поэтому после завершения анализа требований к ПО необходимо составить документ ⌠Требования к ПО■, удовлетворяющий, например, стандарту DO-178B.