Определение требований -- начальный этап разработки любой программной системы. Определение
функциональных требований для
программы-функции есть описание исходной задачи, которое может быть формализовано в виде предусловия и постусловия.
Нефункциональные требования для программы-функции в большинстве случаев вырождаются: возможны требования к надежности, эффективности, переносимости; другие виды требований встречаются редко.
Предметом второй главы является определение требований
для реактивных систем на конкретном примере.
Глава 2. Пример. Освещение в отсеках подлодки
Требуется реализовать освещение в отсеках подводной лодки.
Исходное требование:
освещение должно быть достаточным для проведения экипажем разных видов работ.
Другое требование --
энергосбережение.
Чтобы обеспечить реализацию этих противоречивых требований, предлагается использовать два вида освещения:
минимальное для большинства видов работ и
яркое для отдельных операций.
Функциональные требования управления освещением (релиз 1). Имеется
кнопка для включения и выключения
лампочки.
Нажатие кнопки включает лампочку. Она горит
слабым светом.
Двойное нажатие кнопки зажигает лампочку
ярким светом.
Повторное нажатие кнопки
выключает лампочку.
Если кто-то считает, что здесь все очень просто, он серьезно заблуждается. Рассмотрим различные варианты реализации управления освещением.
Яркий свет можно обеспечить включением второй спирали в лампочке, а слабый свет -- при одной включенной спирали. Сложная конструкция. Производство таких лампочек надо еще организовать. А другие решения?
Не надо лампочки с двойной спиралью. Проще использовать вторую лампочку.
Не надо второй лампочки. Кто не видит пусть фонариком подсветит.
Не надо фонарика и лампочки тоже. Все наши матросы отлично видят в темноте.
Кнопка. Слишком примитивно. А что взамен?
Лучше тумблер или простой выключатель.
Выключатель? Еще хуже. Используйте панель. Касание -- лампочка зажгись!, двойное касание -- зажгись ярким светом.
Панель? Это нам известно. Двойное касание на смартфоне. А в ответ тишина.
Есть лучшее решение. Сказал ласковое слово -- лампочка зажглась, сказал второе -- зажглась ярко.
Объявится
Системщик и скажет: "
Все вы тут безнадежные теоретики. Жизни не знаете". Разумеется, реализация в железе (материале) -- не наша задача. Это предмет
системной инженерии.
Надо проверить, что определенные выше
функциональные требования (релиз 1) являются правильными. Программа верифицируется по отношению к своей спецификации, а требования сверять не с чем. Требований проверяются на предмет соответствия потребностям пользователей, а также некоторым общим нормам и правилам. Этот процесс называется
валидацией требований. Чем отличается валидация от верификации, разъясняется в
обзорной статье Виктора Кулямина.
Проверим
функциональные требования на соответствие общим правилам, изложенным в стандарте
IEEE-830-1998. Хорошие требования должны быть: корректными,
однозначными, полными,
непротиворечивыми и т.д. Оказывается, наша формулировка требований (релиз 1)
не удовлетворяет данным правилам.
Интуитивно понятно, чем отличается
двойное нажатие кнопки от
повторного нажатия. Однако в нашем описании такое различие не представлено, что порождает
неоднозначность толкования требований.
Определим
двойное нажатие кнопки как
пару соседних близких по времени одиночных нажатий. Однако данное уточнение не устраняет
неоднозначность из-за
нечеткости определения близости соседних нажатий.
Необходимо задать
точное значение времени, в пределах которого два нажатия следует считаются близкими. Определим интервал времени в
две секунды, в пределах которого нажатия будут считаться близкими.
Валидацию соответствия требований потребностям пользователей, в том числе правильности выбора интервала в две секунды оставим
системщику и
заказчику.
Требования управления освещением (релиз 2). Имеется кнопка для включения и выключения лампочки.
Нажатие кнопки включает лампочку. Она горит
слабым светом.
Повторное нажатие на кнопку выключает лампочку. При
двойном нажатии (быстрым нажатием на кнопку дважды) лампочка включается и загорается
ярко. Нажатие считается
двойным, если второе нажатие запаздывает по отношению к первому не более чем на две секунды.
Содержательное описание требований на естественном языке (русском) часто допускает неоднозначную трактовку, что может стать причиной ошибок. Например, из описания требований (релиз 2) непонятно, будет ли пара быстрых нажатий кнопки означать переход к яркому освещению в ситуации, когда лампочка уже включена.
Формализация требований в виде
конечного автомата устраняет возможную неоднозначность содержательного описания требований. Вершина автомата есть
управляющее состояние. В каждый момент времени
процесс, определяемый требованиями, находится в одном их управляющих состояний. Срабатывание очередного
шага автомата в текущем управляющем состоянии переводит процесс в следующее управляющее состояние. Описание автомата состоит из описания всех его шагов.
Управляющие состояния:
темно – лампочка выключена
тускло – лампочка включена и горит слабым светом
ярко – лампочка включена и горит ярким светом
Шаг автомата составляется из отдельных
действий. Среди всех действий необходимо выделять те, которые исходят из
внешнего окружения процесса, определяемого требованиями. В требованиях определена реакция на каждое действие из внешнего окружения.
Окружение:
нажатие -- сигнал, возникающий при нажатии кнопки
Используется
оператор приема сигнала "нажатие". Оператор ждет нажатия кнопки, после чего передает управление следующему действию.
Описание требований представим в виде следующей Дракон-схемы.
Вложение:
rel41.png [ 17.21 КБ | Просмотров: 22581 ]
Формализация требований (релиз 3) не полна. В ней полностью формализовано управление. Однако одно действие определено содержательно. Это проверка "прошло менее двух секунд". Для формализации этого действия необходимо завести переменную, в которой замеряется время после первого нажатия кнопки. Значение этой переменной определяет
состояние процесса, представляемого требованиями.
Состояние:
таймер t -- время в миллисекундах от первого нажатия кнопки
Здесь обнаруживается, что начальное значение переменной t должно быть задано, и это действие ошибочно пропущено в требованиях (релиз 3).
Окончательная версия требований представлена Дракон-схемой:
Вложение:
lamp1.png [ 18.95 КБ | Просмотров: 22581 ]
Полная формализация требований (релиз 4) является программой. Подобное типично для реактивных систем: во многих случаях программу можно легко синтезировать из формальных требований автоматически.
Кроме естественного языка существует много формальных языков, текстовых и графических, используемых для описания требований. Требования (релиз 3) определяют промежуточный уровень, в котором полностью формализовано управление, а реализация действий и состояние процесса определены содержательно. Язык Дракон -- один из немногих, допускающих промежуточный уровень формализации. В большинстве числе случаев Дракон применяется именно в стиле релиза 3. Например:
фрагмент программы из сообщения "ИС Дракон на Луне".
Расстояние между третьим и четвертым релизом кажется совсем небольшим. Привычно представление, что построить релиз 4 по релизу 3 способен тупой кодер. Конечно способен, но без гарантии качества. В действительности, вторая часть формализации, определяющая структуры данных состояния процесса, сложнее формализации управления в первой части.