9.1. Создание правильных программ
153
соответствующий элемент не должен быть указан в функциональной
спецификации.
•
Функциональная спецификация должна быть полной. Другими слова-
ми, она должна содержать описание абсолютно всех функциональных
элементов программы. Все, что не было занесено в
функциональную
спецификацию, не должно быть реализовано.
•
Для большей наглядности функциональную спецификацию можно
представить себе в виде основы для тестирования готовой програм-
мы. Все элементы, указанные в
функциональной спецификации, могут
и должны быть протестированы.
•
План реализации.
У этого документа много названий. План реализа-
ции описывает внутреннее поведение программы. В нем указаны все те
элементы, которые не могут быть протестированы извне. Хороший план
реализации зачастую разбивает программу на несколько модулей и опи-
сывает функциональность каждого из них. Описание модуля, в свою
очередь, можно рассматривать как составление требований к модулю
с последующим созданием
функциональной спецификации и плана ре-
ализации.
Из всех перечисленных документов наиболее важной, несомненно, являет-
ся функциональная спецификация. Именно она служит основой для тестиро-
вания готовой программы. Иногда для разработки программы может вполне
хватить неформальных требований или плана реализации, представляющего
собой лишь несколько заметок на клочке бумаги. Но при отсутствии функ-
циональной спецификации мы даже не сможем описать, чего мы достигли по
окончании разработки программы.
9.1.2
Тестирование и исправление
Вторая
проблема написания правильных программ касается повсеместно
распространенного метода разработки “протестировать и исправить”. Про-
граммисты пишут программу и затем тестируют ее на предмет того, правиль-
но ли она работает. Если она не работает или работает неправильно, програм-
мисты исправляют найденные ошибки и снова тестируют программу. Всем
известно, что такой подход отнюдь не приводит к появлению правильной про-
граммы. Он позволяет лишь получить программу, которая будет работать
(а точнее, возможно, будет работать) в наиболее стандартных ситуациях.
В 1972 году Эдсгер Дейкстра (Edsger Dijkstra) в одной из своих речей
отметил, что тестирование может показать только наличие ошибок, а не их
отсутствие [22]. Подмечено как нельзя точно. В идеале мы хотели бы со-
здавать такие программы, правильность которых могла бы быть доказана.