178
Структурное программирование. Другой важный круг идей для разработки, сокращающих число
ошибок в программе, исходит то Дейкстры (Dijkstra) и построен на теоретической структуре Бёма
(Boehm) и Джакопини (Jacopini).
В своей основе подход заключается в разработке программ, управляющие структуры которых со-
стоят только из циклов, определяемых такими операторами, как DO WHILE и группами условно вы-
полняемых операторов, ограниченных скобками с использованием операторов условия
IF…THEN…ELSE. Бём и Джакопини показывают теоретическую достаточность таких структур.
Дейкстра доказывает, что альтернативное неограниченное применение ветвление с помощью GO TO
образует структуры, располагающие к появлению логических ошибок.
В основе, несомненно, лежат здравые мысли. При обсуждении сделано много критических заме-
чаний — в частности, большое удобство представляют дополнительные управляющие структуры, та-
кие как n-вариантный переход (так называемый оператор CASE) для различения среди нескольких
случаев и аварийный выход (GO TO ABNORMAL END). Кроме того, некоторые догматически избе-
гают всех GO TO , что представляется чрезмерным.
Важной и существенной для создания программ, не содержащих ошибок, является необходимость
рассматривать управляющие структуры системы как управляющие структуры, а не как отдельные
операторы перехода. Такой образ мысли является большим шагом вперед.
…………………………………………….
«Пошаговая обработка: наращивать программу, а не строить сразу. Я до сих пор помню ис-
пытанный в 1958 году удар, когда впервые услышал, как мой друг говорил о строительстве (building)
программ в противоположность написанию (writing). В мгновение он расширил все мое представле-
ние о процессе программирования.
Применение метафоры было сильным и точным. Сегодня мы понимаем, что сходство существует
между созданием программы и другими строительными процессами, и свободно используем другие
элементы метафоры, такие как спецификации (specifications), сборка компонентов (assembly of com-
ponents), леса (scaffolding).
Метафора строительства пережила свое время. Пора снова вносить изменения. Если, как я считаю,
создаваемые сегодня концептуальные структуры слишком сложны, чтобы их можно было точно спе-
цифицировать заранее, и слишком сложны, чтобы строить без ошибок, тогда нужен радикально иной
подход.
Обратимся к природе и рассмотрим сложность живых созданий, а не безжизненных творений че-
ловека. Там мы обнаруживаем конструкции, сложность которых вселяет в нас ужас. Один только
мозг настолько сложен, что невозможно составить его схему. Его мощь невозможно повторить, он
богат своеобразием, способен к самосохранению и самообновлению. Секрет в том, что мозг растет, а
не строится.
Так же должны создаваться наши программные системы. Несколько лет назад Харлан Миллз
предложил наращивать программные системы путем пошаговой разработки. Это значит, что снача-
ла систему надо заставить выполняться, даже если при этом она не делает ничего полезного, кроме
вызова некоторого числа фиктивных подпрограмм. Затем она понемногу обрастает мясом, причем
подпрограммы, в свою очередь, разрабатываются сначала как вызовы пустых фиктивных подпро-
грамм, находящихся на уровень ниже(выделено Д.А).
Настаивая на применении этой технологии разработчиками проектов на моих лабораторных заня-
тиях по программной инженерии, я стал свидетелем поразительных результатов. За последнее деся-
тилетие ничто другое не оказало столь сильного влияния на мою собственную работу и ее эффектив-
ность. Этот подход предполагает нисходящее проектирование, поскольку это — нисходящее наращи-
вание программы. Он позволяет легко отслеживать работу в обратном направлении. Он предоставля-
ет возможность раннего создания макетов. Каждая новая функция или возможность работы с более
сложными данными или условиями органически вырастают на того, что уже имеется.