«ЯЗЫК ДРАКОН КРАТКОЕ ОПИСАНИЕ В краткой форме изложены наиболее важные идеи языка ДРАКОН. В данном материале использованы главы из еще не опубликованной книги. Если Вы желаете прочитать более полное описание, скачайте ...»
Владимир ПАРОНДЖАНОВ
ЯЗЫК ДРАКОН
КРАТКОЕ ОПИСАНИЕ
В краткой форме изложены наиболее важные идеи языка ДРАКОН.
В данном материале использованы главы из еще не опубликованной книги.
Если Вы желаете прочитать более полное описание, скачайте книгу
«В.Д. Паронджанов. Как улучшить работу ума: Алгоритмы без программистов — это очень просто! — М.: Дело, 2001. — 360с».
http://forum.oberoncore.ru/viewtopic.php?p=21078#p21078 Обсуждение языка ДРАКОН смотрите на форуме (там же можно скачать дракон-редактор):
http://forum.oberoncore.ru/viewforum.php?f=62
СОДЕРЖАНИЕ
Глава 1. Изюминки языка ДРАКОН 1 Глава 2. Эргономичные алгоритмы 28 Глава 3. Визуализация цикличных алгоритмов Глава 4. Визуализация логических формул Глава 5. Визуальные операторы реального времени Литература ГлаваИЗЮМИНКИ ЯЗЫКА ДРАКОН
Графический язык является главным средством достижения наглядности Константин ГомоюновВВЕДЕНИЕ
В этой части (главы 1—5) дано популярное (неформальное) описание языка ДРАКОН. Этот язык построен путем значительной доработки и улучшения блок-схем алгоритмов (flowcharts) [1].Для обозначения блок-схем, построенных по правилам языка ДРАКОН, используется термин «дракон-схемы».
ПРЕИМУЩЕСТВА ДРАКОН-СХЕМ
Чем же отличаются дракон-схемы от блок-схем?Блок-схемы [1] не обеспечивают автоматическое преобразование алгоритма в машинный код. Дракон-схемы, напротив, пригодны для формализованной записи, автоматического получения кода и исполнения его на компьютере.
Однако более важным является второе (когнитивное) отличие. Хотя блок-схемы порою действительно улучшают понимаемость программ, однако это происходит не всегда, причем степень улучшения невелика.
Кроме того, есть немало случаев, когда неудачно выполненные блоксхемы запутывают дело и затрудняют понимание. В отличие от них дракон-схемы удовлетворяют критерию сверхвысокой понимаемости.
Благодаря использованию специальных формальных и неформальных когнитивных приемов дракон-схемы дают возможность изобразить решение любой, сколь угодно сложной процедурной проблемы в предельно ясной, наглядной и доходчивой форме.
Это позволяет значительно сократить интеллектуальные усилия персонала, необходимые для разработки и отладки алгоритмов и программ.
ИКОНЫ И МАКРОИКОНЫ
Графоэлементы (графические буквы) языка ДРАКОН называются иконами (рис. 4). Подобно тому, как буквы объединяются в слова, иконы объединяются в составные иконы — макроиконы (рис. 5).Соединяя иконы и макроиконы по определенным правилам, можно строить разнообразные алгоритмы, примеры которых показаны на рис. 6— 9, 13, 15, 17—20, 22, 23, 25.
Шампур-блок — часть дракон-схемы, имеющая один вход сверху и один выход снизу, расположенные на одной вертикали. Примерами шампур-блоков являются иконы И3, И5 — И10, И13 — И16, И18, И20 — И (рис. 4) и макроиконы 2—20 (рис. 5).
ЗАЧЕМ НУЖНА ВЕТКА?
Когда принцесса Анна развелась с маркизом Ришелье, возник спор о разделе имущества. Судья потребовал указать: какие покупки принцесса сделала до замужества, а какие после.А теперь забудем об этой семейной драме и сравним между собой рис.
6 и 7. Легко видеть, что рис. 6 не позволяет ответить на вопрос судьи. Зато рис. 7, наоборот, содержит нужную информацию. Более того, алгоритм на рис. 7 нарочно нарисован так, что покупки, сделанные до и после замужества, четко разделены на два столбика. Такой прием называется делением алгоритма на смысловые части. А сами части называются ветками.
Чтобы лучше вникнуть в суть дела, разберем еще один пример. На рис.
8 представлен алгоритм «Сборы на рыбалку», содержащий довольно большую последовательность действий. Иной раз такая последовательность может оказаться ужасно длинной и утомительной для чтения. Можно ли облегчить восприятие и анализ подобных «длиннющих» алгоритмов?
Можно ли сделать «долговязый» алгоритм обозримым и удобным для быстрого понимания?
Да, можно. Чтобы облегчить работу читателя и сделать алгоритм дружелюбным, разработчик дракон-схемы должен заблаговременно разрезать «длинную кишку» и разбить ее на смысловые части.
Сделать это нетрудно. «Сборы на рыбалку» (рис. 8) — это алгоритмический рассказ, в котором можно выделить три крупных куска, три самостоятельных темы.
• Подъем и завтрак • Укладка вещей • Поездка Каждую тему можно нарисовать в виде ветки. Результат изображен на рис. 9. Назначение икон пояснено в таблице.
Икона Название иконы Пояснение Имя ветки Обозначает начало ветки Обозначает конец любой Вопрос. Где начало и конец у первой ветки на рис. 9?
Ответ. Начало — икона «Подъем и завтрак». Конец — «Укладка вещей».
Между началом и концом размещается тело ветки. Оно содержит команды «Встань пораньше» и «Позавтракай».
Что такое ветка Итак, зачем нужна ветка? Чтобы помочь алгоритмисту, программисту и разработчику технологии формализовать смысловое разбиение алгоритма, программы или техпроцесса на части. И, что очень важно, дать частям удобные смысловые названия.
При этом разделение проблемы на N смысловых частей реализуется путем разбиения алгоритма на N веток.
Следует подчеркнуть, что ветка — составной оператор языка ДРАКОН, который не имеет аналогов в известных языках.
КАК РАБОТАЕТ ВЕТКА?
Ветка имеет один вход и один или несколько выходов. Входом служит икона «имя ветки», содержащая идентификатор ветки. Графический оператор «имя ветки» не выполняет никаких действий. Это всего лишь метка, объявляющая название смысловой части алгоритма. Исполнение драконпрограммы всегда начинается с крайней левой ветки (рис. 7, 9).Выходом из ветки служит икона «адрес», в которой записывается имя следующей по порядку исполнения ветки. Икона «адрес» — это замаскированный оператор перехода (gоtо). Однако он передает управление не куда угодно, а только на начало выбранной ветки.
Вход в ветку возможен только через ее начало. Выход из последней ветки осуществляется через икону «конец».
КАК СЛЕДУЕТ РАСПОЛАГАТЬ ВЕТКИ
В ПОЛЕ ЧЕРТЕЖА?
Ветки упорядочены двояко: логически и пространственно. Логическая последовательность исполнения веток определяется метками, записанными в иконах «адрес».Однако логический порядок — это еще не все. На рис. 10, 11, 12 показаны три разных способа пространственного расположения веток, которые имеют один и тот же логический порядок.
Чтобы устранить пространственную неоднозначность и облегчить понимание смысла дракон-схемы, вводится Правило. Чем правее — тем позже.
Оно означает: ветка, нарисованная правее, работает позже всех веток, находящихся левее нее.
Алгоритм, нарисованный согласно правилу «чем правее — тем позже», считается хорошим, эргономичным (рис. 12). Схемы, где это правило нарушается, объявляются плохими (рис. 10, 11). Их использование запрещено.
В разрешенных (эргономичных) алгоритмах имеет место следующий порядок работы (рис. 7, 9, 12):
• первой работает крайняя левая ветка, последней — крайняя правая;
• остальные ветки передают управление друг другу слева направо (при этом может случиться так, что некоторые ветки будут пропущены);
• иногда образуется так называемый «веточный цикл». Это происходит, когда в иконе «адрес» указано имя собственной или одной из левых веток. На рис. 13 веточный цикл помечен черными треугольниками.
ЧТО ТАКОЕ ШАПКА?
Многие алгоритмы чрезвычайно сложны. Чтобы разобраться в хитросплетениях такого алгоритма, нужно прилагать огромные усилия и тратить слишком много времени.Подобную практику следует признать порочной. Алгоритмы можно и нужно сделать эргономичными, легкими для восприятия. Для этого нужно во время давать читателю маленькие, но умные подсказки, проглотив которые, он мог бы легко сориентироваться в задаче и быстрее понять материал.
Одной из таких подсказок служит «шапка». Название объясняется тем, что шапка находится вверху, «на голове» у алгоритма.
Шапка — верхняя часть дракон-схемы (рис. 9), которая включает заголовок алгоритма и комплект икон «имя ветки».
Назначение шапки — помочь читателю мгновенно (не более чем за несколько секунд или минут) сориентироваться в задаче. Расчленить ее на части, увидеть смысловую структуру.
Причем увидеть не в фигуральном смысле слова, не с помощью воображения, не духовным оком, а своими двумя глазами — на бумаге или экране.
Но как это сделать? Трудность в том, что ни один из существующих языков не предоставляет читателю, изучающему сложный алгоритм или технологию, эффективной помощи, позволяющей моментально (за несколько секунд) уяснить ее структуру, деление на смысловые блоки.
В языке ДРАКОН имеются специальные средства, обеспечивающие решение задачи.
ТРИ ЦАРСКИХ ВОПРОСА
Когда мы сталкиваемся с новой незнакомой задачей, в первую очередь мы желаем получить ответ на три царских (наиболее важных) вопроса:Именно с этих вопросов начинается наше знакомство с любой задачей при рациональном подходе к делу.
Эргономическая хитрость состоит в том, что шапка, угадывая тайное желание читателя, дает ему мощную подсказку — ответ на все царские вопросы.
Вот ответы для рис. 9.
• Как называется задача? (Читаем заголовок алгоритма). Сборы на рыбалку.
• Из скольких частей она состоит? (Считаем иконы «имя ветки»). Из трех.
• Как называется каждая часть? (Читаем текст в иконах «имя ветки»).
1. Подъем и завтрак. 2. Укладка вещей. 3. Поездка.
ТРЕХЭТАПНЫЙ МЕТОД ПОЗНАНИЯ АЛГОРИТМА
Дополнительные эргономические удобства связаны с тем, что шапка занимает «парадное» место в верхней части чертежа. Названия смысловых частей помещены внутри особых рамок уникальной формы, которые легко отыскать взглядом.Благодаря этому шапка моментально приковывает к себе внимание читателя без всяких усилий с его стороны. Это очень важно, так как читателю не приходится рыскать глазами по темным закоулкам алгоритма, пытаясь выудить нужную информацию.
Таким образом, ДРАКОН предоставляет читателю эффективный трехэтапный метод познания незнакомого или забытого алгоритма.
На первом этапе, анализируя шапку, читатель узнает назначение алгоритма и его деление на смысловые части (ветки). На втором — осуществляет углубленный анализ каждой ветки. На третьем производит разбор взаимодействия веток.
КАК РАБОТАЕТ АЛГОРИТМ-СИЛУЭТ?
Выполнить алгоритм — значит пройти путь от начала до конца алгоритма. Применим это правило к рис. 9. Будем считать, что существует воображаемый бегунок, который при работе алгоритма пробегает алгоритмическую дорожку от иконы «заголовок» до иконы «конец».Вернемся к вопросу: как работает алгоритм-силуэт? Выехав из иконы «заголовок», бегунок мчится вниз по крайней левой ветке. Он движется через станции (рис. 9):
Икона «адрес» — последняя станция первой ветки. Куда ехать дальше?
Ответ содержится внутри самой иконы. Эта икона потому и зовется «адрес», что сообщает адрес (название) следующей станции. В данном случае она сообщает — следующая станция называется «Укладка вещей».
Из рис. 9 видно, что данная станция находится в начале второй ветки.
Но как бегунок доберется туда? По какой линии?
Ответ прост. Выехав из иконы «адрес», бегунок сворачивает налево и попадает в точку А (рис. 9). Потом движется вверх к точке Б. Затем едет направо по стрелке и въезжает в верхнюю икону «Укладка вещей».
Дальше все происходит аналогично. Бегунок скользит вниз по второй ветке. Добравшись до иконы «адрес», узнает адрес следующей станции («Поездка»). Затем огибает схему по линии АВ, попадает в начало третьей ветки и спускается по ней до конца. На этом выполнение алгоритма заканчивается.
Сейчас мы поступим, как чеховский злоумышленник — будем разбирать рельсы. Имеются в виду линии, окаймляющие алгоритм на рис. 9. Сотрем линию АБ. Уберем также горизонтальные линии, проходящие через точки А и Б. Результат представлен на рис. 14.
Интересно, как будет работать алгоритм после этих исправлений?
К нашему удивлению, отсутствие «рельсов» никак не сказывается на работе алгоритма. В этом легко убедиться. Выехав из иконы «заголовок», бегунок движется вниз по крайней левой ветке. Опустившись до конца ветки, бегунок попадает в икону «адрес».
Казалось бы, это тупик. Рельсы кончились, и дальше ехать некуда. Но это не совсем так. Ведь в иконе «адрес» записан адрес следующей станции («Укладка вещей»). Зная адрес, бегунок прыгнет туда, куда нужно — в начало второй ветки. И поедет вниз. Добравшись до конца второй ветки, он совершит второй прыжок. И попадет в третью ветку. И так далее.
Таким образом, икона «Адрес А» — это команда «Прыгни в начало ветки А». Или, выражаясь по-научному, «Передай управление в начало ветки А». Проще говоря, данная команда передает приказ: «Брось данную ветку и начни выполнять ветку А». (Выполнять ветку — значит исполнять записанные в ней команды).
Переходя от рис. 9 к рис. 14, мы для «упрощения» стерли несколько линий. Теперь мы убедились, что для работы алгоритма они совершенно не нужны. Потому что маршрут бегунка определяют не они, а указания, записанные в иконе «адрес».
Тем не менее, указанные линии не следует удалять по эргономическим соображениям. Дело в том, что обрамляющие линии зрительно «склеивают» разрозненные куски алгоритма. Они превращают их в приятный для глаза целостный зрительно-смысловой образ. И наоборот, устранение скрепляющих линий приводит к тому, что схема зрительно рассыпается на части, что мешает увидеть целостный образ. И сбивает с толку читателя (рис. 14).
ЕЩЕ РАЗ О РАСПОЛОЖЕНИИ ВЕТОК НА ЧЕРТЕЖЕ
В начале главы мы затронули вопрос: как следует располагать ветки в поле чертежа? Учитывая важность темы, коснемся ее еще раз.Давайте мысленно перетасуем ветки на рис. 14, как колоду карт. И расположим их на чертеже в произвольном порядке. Легко сообразить, что подобное «перепутывание» веток никак не отразится на работе алгоритма.
Потому что очередность работы веток зависит только от команд «адрес».
И совсем не зависит от расположения веток на листе бумаги. Словом, сколько ветки ни тасуй, получим тот же самый алгоритм.
Здесь есть одна тонкость. Перестановка веток не отражается на правильности алгоритма. Однако алгоритм должен быть не только правильным, но и понятным, доходчивым. Хаотичное расположение веток затрудняет понимание, что недопустимо.
Поэтому нужно обязательно упорядочить ветки в пространстве чертежа. Удобнее всего расположить их слева направо в той последовательности, в какой они включаются в работу. Для этого служит уже известное нам правило: «Чем правее, тем позже».
Отсюда вытекает важная эргономическая Рекомендация. Чтобы дракон-схема была наглядной и удобной, ветки следует упорядочить слева направо. Более правая ветка должна работать позже, чем любая ветка, расположенная левее
ЧТО ТАКОЕ ШАМПУР?
Шампур — вертикальная линия, соединяющая икону «заголовок» и икону «конец». Между этими иконами обычно помещается несколько других икон. Все они, словно кусочки мяса, оказываются нанизанными на шампур (рис. 15).Правило шампура. Выход иконы «заголовок» и вход иконы «конец» должны лежать на одной вертикали.
Если это правило выполняется, дракон-схема становится более упорядоченной, эргономичной, легкой для чтения (рис. 15). И наоборот, нарушение данного правила делает схему корявой, изломанной, неудобной для глаза (рис. 16).
ЕСТЬ ЛИ В АЛГОРИТМЕ ЦАРСКАЯ ДОРОГА?
Маршрут — это путь, ведущий от начала до конца алгоритма.На рис. 8 и 9 показан неразветвленный алгоритм. В нем всего один маршрут. В разветвленном алгоритме на рис. 17 таких маршрутов два.
Если тропинок несколько, среди них можно выделить главный и побочные маршруты.
Главный маршрут алгоритма — путь, который ведет к наибольшему успеху. Например, на рис. 17 главный маршрут проходит по левой вертикали, и дела обстоят хорошо. Суп не пролился на скатерть, все довольны.
Другой (правый) маршрут ведет к неудаче (скатерть испачкалась).
Рассмотрим задачу. В запутанном лабиринте, соединяющем начало и конец сложного алгоритма, нужно выделить один-единственный маршрут — «путеводную нить». С ней можно зрительно сравнивать все прочие маршруты, чтобы легко сориентироваться в проблеме и не заблудиться в путанице развилок. Путеводная нить должна быть визуально легко различимой. Бросив беглый взгляд на дракон-схему, мы должны обнаружить четкие ориентиры, позволяющие сразу и безошибочно увидеть царский маршрут и упорядоченные относительно него остальные маршруты. Для этого вводится Правило главного маршрута. Главный маршрут алгоритма должен идти по шампуру.
Это значит, что царский маршрут не может оказаться где-то на задворках дракон-схемы, где его днем с огнем не сыскать. Нет, он всегда должен находиться на самом почетном месте — на крайней левой вертикали.
Соблюдение этого правила делает схему зрительно упорядоченной, предсказуемой и интуитивно ясной.
Если правило главного маршрута по каким-то причинам оказалось нарушенным (рис. 18), ошибку надо исправить. Для этого нужно поменять местами слова «да» и «нет» в развилках, а также присоединенные к ним гирлянды икон. Действуя таким путем, всегда можно добиться, чтобы на царском пути оказался тот выход иконы «Вопрос», который ведет к наибольшему успеху.
ПОБОЧНЫЕ МАРШРУТЫ НЕЛЬЗЯ РИСОВАТЬ КАК ПОПАЛО
Побочный маршрут — любой маршрут разветвленного алгоритма за исключением главного.Правило побочных маршрутов. Побочные маршруты алгоритма нужно рисовать справа от шампура по принципу «Чем правее, Это значит: чем правее нарисован побочный маршрут, тем более неприятную ситуацию он описывает.
Вот пример из жизни: «О, ужас! Я, кажется, потерял деньги!»
Кому случалось делать подобное открытие, знает, что степень огорчения зависит от потерянной суммы. Рассмотрим пять возможных ситуаций, и дадим им оценку.
На рис. 19 показана дракон-схема, описывающая эту грустную историю.
По каждой вертикали идет свой маршрут.
Самая первая, крайняя слева вертикаль — это шампур. По ней идет главный маршрут, имеющий оценку «хорошо», потому что все деньги целы. Чуть правее находится вторая вертикаль (потеряны 100 рублей) с оценкой «плохо». Еще правее идет третья вертикаль (пропали 500 рублей) с оценкой «очень плохо». И так далее. Крайняя справа — пятая вертикаль описывает самую скверную ситуацию, когда потеряна вся получка.
Таким образом, четыре побочных маршрута, идущие по вертикалям 2, 3, 4, 5, расположены не случайно, а со смыслом. Они выстроены слева направо по принципу «Чем правее, тем хуже».
Чтобы алгоритм был понятным, он должен быть стройным, красивым, упорядоченным, то есть эргономичным. Он не должен содержать непредсказуемые и хаотичные хитросплетения линий и икон.
Язык ДРАКОН был разработан, в частности, потому, что традиционные блок-схемы алгоритмов, рекомендованные стандартом [1], с эргономической точки зрения, не выдерживают никакой критики. Они напоминают непроходимые джунгли, в которых легко запутаться и почти ничего нельзя понять. ДРАКОН выгодно отличается тем, что его графический узор подчиняется жестким и тщательно продуманным правилам, которые дисциплинируют мышление, облегчают разработку и отладку алгоритмов.
Чтобы убедиться в этом, взглянем еще разок на рис. 19 и проведем взглядом по всем вертикалям слева направо. Мы обнаружим не хаос, а строгий порядок. Потому что маршруты нарисованы не как попало, а по правилам.
В результате чертеж алгоритма обретает четкую зрительно-смысловую структуру, которая облегчает работу мысли. Читая такой чертеж, человек не станет плутать в потемках. Ведь он заранее знает, что схема алгоритма составлена по мудрому плану: все хорошее — слева, все плохое — справа.
Про такой алгоритм можно сказать: «Все ясно, как на ладони!».
ЕСЛИ ПРАВИЛО «ЧЕМ ПРАВЕЕ, ТЕМ ХУЖЕ» НЕ РАБОТАЕТ?
Из физики известно: если начальная скорость ракеты меньше 7,8 километров в секунду (км/с), она непременно упадет на Землю. Если же разогнать ее чуть сильнее, но не больше 11,2 км/с, она станет спутником Земли. При дальнейшем увеличении скорости ракета станет спутником Солнца. А если скорость превысит 16,4 км/с, ракета навсегда простится с Солнечной системой и умчится в безбрежные просторы космоса.Алгоритм этой задачи показан на рис. 20.
Мы знаем, что каждой вертикальной линии на дракон-схеме соответствует свой маршрут, причем вертикали следует рисовать не хаотично, а упорядоченно. До сих пор мы пользовались правилом «Чем правее, тем хуже». Однако здесь оно не имеет смысла. Поэтому на рис. 20 выбрано другое правило «Чем правее, тем больше скорость ракеты».
Чтобы понять смысл правила, проведем взглядом по схеме слева направо. Мы увидим, что от маршрута к маршруту скорость неуклонно возрастает. Первый слева маршрут самый медленный. На втором маршруте скорость больше. На третьем — еще больше. Наконец, четвертый (самый правый) маршрут описывает ситуацию, когда ракета с огромной скоростью улетает за пределы Солнечной системы.
КАК РИСОВАТЬ ПОБОЧНЫЕ МАРШРУТЫ?
Правило. Смещение вправо от главного маршрута должно быть не произвольным и хаотичным, а продуманным и логичным.Например, при решении математических задач вертикали можно расположить в порядке увеличения или уменьшения математической величины (числа), соответствующей этим вертикалям.
Можно придумать и другие правила, позволяющие сделать схему упорядоченной. Для разных задач могут понадобиться разные правила (рис.
21).
Но у всех правил есть общая черта. Главное, чтобы в схеме был не хаос, а порядок. Здесь действует Правило хорошей хозяйки. Если постараться, порядок всегда можно навести.
ЧТО ЛУЧШЕ: ПРИМИТИВ ИЛИ СИЛУЭТ?
Напомним определения понятий, о которых читатель уже мог догадаться из рис. 7 и 8.Силуэт — дракон-схема, разделенная на ветки.
Примитив — дракон-схема, не имеющая веток.
Сравним их между собой. Какая схема лучше? Какая легче для понимания?
Чтобы уяснить суть дела, возьмем один и тот же алгоритм (Поездка на автобусе). И изобразим его двумя способами: в виде силуэта (рис. 22) и в виде примитива (рис. 23).
Легко сообразить, что силуэт обладает серьезными преимуществами. В самом деле, примитив на рис. 23 не позволяет увидеть деление задачи на смысловые части. Иное дело рис. 22. Тут сразу ясно — алгоритм состоит из четырех частей:
Таким образом, в силуэте смысловые части алгоритма четко выделены и сразу бросаются в глаза. Они зрительно и пространственно разнесены в поле чертежа, делая его более понятным. А в примитиве смысловые части не выделены и перемешаны (все в одной куче), что затрудняет чтение и анализ сложных алгоритмов.
Правило. Примитив рекомендуется применять, если драконсхема очень простая (примитивная) и содержит не более икон. В более сложных случаях выгоднее использовать силуэт.
Нарушение этого правила обычно чревато неприятностями, ибо мешает читателю выявить сущность решаемой проблемы. И, следовательно, затрудняет и замедляет понимание смысла программы.
Например, алгоритм на рис. 23 выглядит громоздким и неоправданно сложным для восприятия. Это вызвано тем, что он содержит 19 икон, однако изображен в виде примитива. Криминал в том, что схема на рис. не позволяет читателю мгновенно (за несколько секунд) распознать зрительно-смысловую структуру алгоритма.
В самом деле, из скольких частей состоит решаемая проблема? Глядя на рис. 23, ответить на этот вопрос довольно трудно. А быстро ответить — невозможно.
Положение в корне меняется, когда мы смотрим на рис. 22, где тот же самый алгоритм изображен в виде силуэта. Тут деление алгоритма на части «само бросается в глаза». Однако это не все. Не менее важно, что запутанность зрительного рисунка полностью исчезла. И схема приобрела новое эстетическое (эргономическое) качество: элегантность, ясность и прозрачность.
Таким образом, в сложных случаях силуэт позволяет существенно уменьшить интеллектуальные усилия, затрачиваемые на понимание алгоритма. В силуэте крупные структурные части программы (ветки) четко выделены, образуя легко узнаваемый, стабильный, предсказуемый и целостный зрительный образ.
А в примитиве структурные части не выделены и перемешаны, что затрудняет чтение и анализ сложных алгоритмов.
Однако для простых случаев (менее 10 икон) примитив, как правило, оказывается более предпочтительным.
В этой главе рекомендации по использованию силуэта и примитива даны в упрощенном виде.
Окончательные рекомендации даны в конце главы 5 в такой же рамке.
ГЛАВНЫЙ МАРШРУТ СИЛУЭТА
Выше мы узнали, как упорядочить маршруты примитива. Теперь настала очередь силуэта.Шампур ветки — это вертикаль, соединяющая икону «имя ветки» с иконой «адрес», а если у ветки несколько выходов — с левым из них.
Каждая ветка силуэта имеет свой шампур. Например, на рис. четыре ветки. Следовательно, этот силуэт имеет четыре шампура ветки.
Для ветки сохраняют силу оба «царских» правила:
• главный маршрут ветки должен идти по шампуру ветки;
• побочные маршруты ветки следует упорядочить слева направо по какому-либо критерию.
Предположим, в качестве критерия выбран принцип «Чем правее, тем хуже». В этом случае для каждой ветки силуэта действует Правило. Чем правее (чем дальше от шампура данной ветки) расположена очередная вертикаль, тем менее успешные действия она выполняет.
Например, на рис. 22 ветка «Посадка в автобус» имеет три вертикали.
Левая вертикаль (главный маршрут) описывает наибольший успех, так как вы будете ехать в автобусе сидя.
Правая вертикаль означает наименьший успех, поскольку вы вышли из автобуса и поездка откладывается.
Средняя вертикаль (расположенная выше иконы «Есть желание ехать стоя?») занимает промежуточное положение. Потому что — в зависимости от ответа — может иметь место либо частичный успех (вы будете ехать, но не сидя, а стоя), либо неудача, поскольку вы выходите из автобуса несолоно хлебавши.
Главный маршрут силуэта — последовательное соединение главных маршрутов поочередно работающих веток.
Таким образом, ДРАКОН позволяет читателю моментально увидеть главный маршрут любого, сколь угодно сложного и разветвленного алгоритма. Кроме того, смещение всех побочных маршрутов относительно «царского» оказывается не случайным, а осмысленным и предсказуемым, то есть легким для восприятия.
ПЕРЕСЕЧЕНИЯ ЛИНИЙ? — БОЖЕ УПАСИ!
Некоторые специалисты, склонные к резким выражениям, называют традиционные блок-схемы алгоритмов [1] «помоечными блок-схемами».Потому что в этих схемах царит беспорядок. Запутанная паутина соединительных линий не помогает, а наоборот, затрудняет работу читателя, который пытается понять суть алгоритма.
ДРАКОН выгодно отличается тем, что его графический узор имеет строгое математическое и когнитивно-эргономическое обоснование и подчиняется жестким и тщательно продуманным правилам. Среди них особое место занимает Правило. Пересечения и обрывы соединительных линий запрещены.
При вычерчивании обычных блок-схем допускаются два типа пересечения линий:
• явное, изображенное крестом линий, • замаскированное, выполняемое с помощью так называемых соединителей.
Как известно, соединитель «используется для обрыва линии и продолжения ее в другом месте... для избежания излишних пересечений» [1].
Следует подчеркнуть, что эффективность соединителей для борьбы с пересечениями близка к нулю. Хотя соединители действительно уменьшают число пересечений, но они не улучшают понимаемость блок-схем. То есть не позволяют решить наиболее важную, приоритетную задачу.
В языке ДРАКОН все перечисленные ухищрения (пересечения, обрывы, соединители) по эргономическим соображениям считаются вредными и категорически запрещены. Потому что они засоряют поле чертежа ненужными деталями, создают визуальные помехи для глаз и отвлекают внимание от главного.
Поскольку запрет пересечений является серьезным топологическим ограничением, возникает вопрос: можно ли произвольный алгоритм изобразить в виде дракон-схемы?
Теорема 1. Любая структурная программа может быть изображена на языке ДРАКОН двумя способами: в виде примитива и в виде силуэта.
Теорема 2. Произвольная (неструктурная) программа в ряде случаев не может быть изображена в виде примитива. Однако с помощью эквивалентных преобразований, допускающих введение дополнительных переменных (идентификаторов ветки), она всегда может быть изображена в виде силуэта.
Чтобы прояснить вопрос, обратимся к примерам. На рис. 24 (слева) приведена запрещенная дракон-схема — примитив, в котором имеется неустранимое (без введения дополнительных переменных) пересечение.
На рис. 24 (справа) изображен силуэт, который, как нетрудно убедиться, эквивалентен упомянутому примитиву и вместе с тем не содержит ни одного пересечения. Таким образом, пример на рис. 24 подтверждает справедливость теоремы 21.
Подведем итоги. Язык ДРАКОН обладает важным достоинством: он позволяет изобразить любой алгоритм, полностью отказавшись от таких эргономически неудачных приемов, как пересечения, обрывы, соединители. Отсутствие «паразитных элементов» создает дополнительные удобства для читателя, делает дракон-схему прозрачной, легкой для понимания.
Доказательство теорем 1 и 2 предоставляем читателю. Указание: необходимо опереться на теорему о структурировании и метод Ашкрофта — Манны [2, 3].
КАК ОПИСАТЬ СИЛУЭТ С ПОМОЩЬЮ
ТЕКСТОВОГО ЯЗЫКА?
Из рис. 25 видно, что для описания веток в текстовый язык пришлось внести ряд изменений. В частности, появились два новых текстовых оператора, отсутствующие в традиционных языках:Оператор текстового языка ВЕТКА объявляет название ветки (записываемое на графическом языке внутри иконы «имя ветки»). Оператор АДРЕС безусловно передает управление на текстовый оператор ВЕТКА, имя которой совпадает с записью в операторе АДРЕС.
Сравнивая два языка: графический и текстовый, можно заметить, что соответствующие алгоритмы (рис. 22 и 25) эквивалентны 1. Однако графический язык (язык дракон-схем), несомненно, более нагляден и доходчив.
Второе преимущество состоит в том, что графика позволяет полностью исключить избыточные (паразитные) элементы, каковыми в текстовом языке оказываются почти все ключевые слова: АЛГОРИТМ, ВЕТКА, АДРЕС,
КОНЕЦ ВЕТКИ, ЕСЛИ, ТО, ИНАЧЕ, КОНЕЦ ЕСЛИ, ЦИКЛ ЖДАТЬ, КОНЕЦ
ЦИКЛА, КОММЕНТАРИЙ, ПЕРЕХОД НА, а также метки.Два алгоритма называются эквивалентными, если они дают одинаковые результаты для одних и тех же исходных данных.
ВИЗУАЛЬНЫЙ И ТЕКСТОВЫЙ
СИНТАКСИС ДРАКОНА
ДРАКОН — графический язык, в котором используются два типа элементов:• графические фигуры (графоэлементы), • текстовые надписи, расположенные внутри или снаружи графических фигур (текстоэлементы).
Следовательно, синтаксис ДРАКОНА распадается на две части.
Графический синтаксис охватывает алфавит графоэлементов, правила их размещения в поле чертежа и правила связи графоэлементов с помощью соединительных линий.
Текстовый синтаксис задает алфавит символов, правила их комбинирования и привязку к графоэлементам. (Привязка необходима потому, что внутри разных графических фигур используются разные типы выражений).
Оператором языка ДРАКОН является графоэлемент или комбинация графоэлементов, взятые вместе с текстовыми надписями.
Одновременное использование графики и текста говорит о том, что ДРАКОН адресуется не только к словесно-логическому мышлению автора и читателя программы, но сверх того активизирует интуитивное, образное, правополушарное мышление, стимулируя его не написанной, а именно нарисованной программой, то есть программой-картинкой.
СЕМЕЙСТВО ДРАКОН-ЯЗЫКОВ
ДРАКОН — не один язык, а целое семейство, которое может включать практически неограниченное число языков.Все языки семейства имеют одинаковый графический синтаксис (что зрительно делает языки почти близнецами). Каждый язык семейства отличается тем, что имеет свой собственный текстовый синтаксис.
ДРАКОН-1 — графический псевдоязык, графический аналог обычного текстового псевдокода.
В этом языке в качестве текстоэлементов используется естественный язык. Почти все примеры в этой книге даны на языке ДРАКОН-1. Именно этот язык предлагается в качестве универсального средства взаимопонимания. ДРАКОН-1 служит для описания структуры деятельности, создания технологий, алгоритмов и проектов программ, используется в методе декомпозиции и пошаговой детализации, а также при формализации профессиональных знаний.
ДРАКОН-2 — графический алгоритмический язык для разработки алгоритмов и программ реального времени.
Упрощенная версия этого языка используется в качестве CASE-технологии «ГРАФИТ-ФЛОКС» в Научно-производственном центре автоматики и приборостроения им. академика Н.А. Пилюгина. Она применяется для разработки программного обеспечения систем управления ракет-носителей и разгонных блоков космических аппаратов.
После доработки инструментальных программ язык может быть использован при разработке систем управления реального времени для атомных электростанций, нефтехимических и металлургических заводов, биотехнологических производств и т. д.
Кроме того, семейство включает гибридные графические языки программирования: ДРАКОН-БЕЙСИК, ДРАКОН-ПАСКАЛЬ, ДРАКОН-СИ++ и т. д.
Чтобы получить гибридный язык, например, ДРАКОН-БЕЙСИК, необходимо взять графический синтаксис ДРАКОНА и присоединить к нему по определенным правилам текстовый и визуальный синтаксис языка БЕЙСИК.
Строгое разграничение графического и текстового синтаксиса позволяет в максимальной степени расширить сферу применения языка, обеспечивая его гибкость и универсальность.
При этом единообразие правил графического синтаксиса семейства ДРАКОН-языков обеспечивает их концептуальное единство.
А разнообразие текстовых правил (то есть возможность выбора любого текстового синтаксиса) определяет гибкость языка и легкую настройку на различные предметные области.
В настоящей книге основное внимание уделяется графическому псевдоязыку ДРАКОН-1 (использующему естественный человеческий язык).
Что касается остальных языков ДРАКОН-семейства, даются лишь краткие пояснения.
ВЫВОДЫ
Приведем сводку эргономических правил, позволяющих улучшить когнитивное качество дракон-схем и сделать алгоритмы, программы и технологии более понятными.Сложные алгоритмы следует рисовать в виде системы вложенных друг в друга силуэтов. При этом примитивы используются крайне редко, только как исключение.
2. В иконе «заголовок» запрещается писать слово «начало». Вместо этого следует указать понятное и точное название алгоритма.
3. Разбейте сложный алгоритм на части, каждую часть изобразите в виде ветки. Дайте частям доходчивые и четкие названия и запишите 4. Вход в ветку возможен только через ее начало.
5. В иконе «адрес» разрешается писать имя одной из веток, другие надписи запрещены.
6. Ветки следует располагать в пространстве согласно правилу «Чем правее, тем позже». Наличие веточного цикла модифицирует это 7. Примитив обязательно имеет шампур. Это значит, что у примитива иконы «заголовок» и «конец» всегда лежат на одной вертикали, которая и называется «шампур».
8. Каждая ветка обязательно имеет шампур. У правой ветки шампур — это вертикаль, соединяющая иконы «имя ветки» и «конец». У остальных веток шампуром служит вертикальная линия, соединяющая иконы «имя ветки» и «адрес». А если адресов несколько — с левым из них.
9. Алгоритм всегда имеет главный маршрут, который должен идти по шампуру.
10. Побочные маршруты должны быть упорядочены слева направо согласно одному из выбранных критериев, например, «Чем правее, тем 11. В иконе «конец» следует писать слово «конец».
12. Соединительные линии могут идти либо горизонтально, либо вертикально. Наклонные линии не допускаются.
13. Пересечения линий запрещены.
14. Обрывы линий запрещены.
15. Использование соединителей запрещено.
ЭРГОНОМИЧНЫЕ АЛГОРИТМЫ
ПРОВЕРКА АЛГОРИТМОВ ЗА СТОЛОМ
При решении сложных задач, таких как предсказание погоды, управление войсками, управление большой электростанцией или нефтехимическим заводом, приходится создавать крупномасштабные алгоритмы, насчитывающие сотни тысяч и даже миллионы команд.Практика показывает: чем крупнее алгоритмы, тем больше в них ошибок. Тем сложнее их найти.
Исправлять ошибки в огромных и сложных алгоритмах — трудное и дорогостоящее занятие, причем цена ошибки тем выше, чем позже она обнаружена.
Наименьший ущерб приносят ошибки, которые удается обнаружить в самом начале работы, до генерации кода и исполнения программы на компьютере — в ходе мозговой (зрительной) проверки программы за столом.
Мы называем проверку мозговой, если основную работу по поиску ошибок выполняет человеческий мозг, а компьютер играет вспомогательную роль. При такой проверке человек тщательно изучает технические задания, алгоритмы и программы, представленные на бумаге или экране, стараясь обнаружить как можно больше ошибок и слабых мест. Однако сегодня такая проверка является не только дорогостоящей, но и крайне неэффективной.
Серьезный недостаток мировой практики Низкая эффективность проверки за столом является важным недостатком существующих методов разработки программного обеспечения. Причина в том, что технические задания, тексты алгоритмов, исходные коды программ и другие документы начального этапа разработки не приспособлены для решения этой задачи. Устранение данного недостатка является актуальной задачей.
КАК ПОВЫСИТЬ ЭФФЕКТИВНОСТЬ ПРОВЕРКИ
Мозговую проверку, как и любую другую деятельность, нужно грамотно проектировать. Критерием ее эффективности служит выявление максимального числа ошибок за минимальное время. Или, что одно и то же, минимизация интеллектуальных усилий мозга, затрачиваемых в среднем на выявление одной ошибки.Нейронная конструкция мозга такова, что он может эффективно проводить проверку за столом отнюдь не при любых условиях. А только в том случае, если проверяемые документы обладают высоким когнитивным качеством.
Чтобы минимизировать удельные интеллектуальные усилия, затрачиваемые на обнаружение ошибок, необходимо, чтобы когнитивно-значимые характеристики документов были хорошо согласованы с конструктивными характеристиками мозга. Это значит, что технические задания, алгоритмы и другие документы должны быть специально приспособлены для быстрой и надежной проверки, для легкого и вместе с тем глубокого понимания.
НУЖНА НОВАЯ ТЕОРИЯ
Введем понятие «критерий сверхвысокого понимания». Считается, что алгоритмический язык удовлетворяет этому критерию, если написанные на нем алгоритмы обладают наивысшим когнитивно-эргономическим качеством.Можно сказать и по-другому. Критерий сверхвысокого понимания требует, чтобы форма записи алгоритмов была максимально удобной. И позволяла человеку читать и анализировать любой алгоритм с максимальной легкостью и глубиной понимания.
Чтобы создать подобную легкость, нужны новые, скажем прямо, непривычные для математиков, но понятные «для народа» правила записи алгоритмов. Более того, нужна новая теория — теория эргономичных алгоритмов.
ЧТО ТАКОЕ ЭРГОНОМИЧНЫЙ АЛГОРИТМ?
В этой книге выражения «дружелюбный алгоритм» и «эргономичный алгоритм» употребляются как синонимы.Однако, здесь есть важные оттенки. Слово «дружелюбный» — всего лишь метафора. А выражение «эргономичный алгоритм» мы склонны рассматривать как новое фундаментальное научное понятие. Разумеется, это утверждение надо тщательно обосновать. Данная книга как раз и является таким обоснованием.
Эргономичный алгоритм — это алгоритм, удовлетворяющий критерию сверхвысокого понимания. То есть алгоритм, специально сконструированный таким образом, чтобы обеспечить выявление ошибок за столом без лишней траты умственных сил.
Преимущество эргономичных алгоритмов в том, что они намного понятнее, яснее, нагляднее и доходчивее, чем обычные. Если алгоритм непонятный, в нем трудно или даже невозможно заметить затаившуюся ошибку. И наоборот, чем понятнее алгоритм, тем легче найти дефект.
Поэтому более понятный, эргономичный алгоритм намного лучше обычного. Лучше в том смысле, что он облегчает выявление ошибок, а это очень важно. Ведь чем больше ошибок удастся обнаружить при проверке за столом, тем больше вероятность, что вновь созданный алгоритм окажется правильным, безошибочным, надежным.
Кроме того, эргономичные алгоритмы удобнее для изучения, их проще объяснить другому человеку.
ЭРГОНОМИЧНЫЙ АЛГОРИТМИЧЕСКИЙ ЯЗЫК
Эргономичный алгоритмический язык — это язык, позволяющий создавать эргономичные алгоритмы.Особенность такого языка состоит в следующем. Эргономичные алгоритмы делают проблему более ясной и прозрачной. Поэтому использование эргономичных алгоритмических языков облегчает и ускоряет творческий процесс создания новых алгоритмов.
Иными словами, эргономичный язык повышает производительность труда при разработке и отладке алгоритмов и программ.
НУЖЕН НОВЫЙ ПОНЯТИЙНЫЙ АППАРАТ
В предыдущей главе мы рассмотрели несколько способов, позволяющих улучшить эргономические характеристики алгоритмов.В этой главе мы продолжим тему. И попытаемся ответить на вопрос:
можно ли повысить эргономичность алгоритмов, используя формальный метод эквивалентных преобразований алгоритмов?
Для этого понадобится особый понятийный аппарат, заметно отличающийся от того, которым обычно пользуются программисты. Дело в том, что традиционные понятия плохо приспособлены для решения проблемы понимания. И совершенно не учитывают специфику зрительных образов.
Да-нетный вопрос — это вопрос, на который можно ответить либо «да», либо «нет». Все другие ответы запрещены.
Вот примеры да-нетных вопросов: утюг сломался? Тетя приехала?
Вася купил хлеб? Преступника арестовали? Эта лужа больше, чем та?
Температура выше нуля? Прошла команда на включение двигателя?
На рис. 4 (позиция И4) изображена икона «вопрос». Она называется так, потому что внутри нее пишут да-нетный вопрос. Другие надписи не допускаются.
Икона «вопрос» имеет один вход сверху и два выхода: вниз и вправо.
Выход влево запрещен и никогда не используется. Возле выходов обязательно пишут слова «да» и «нет».
ЧТО ТАКОЕ РАЗВИЛКА?
На рис. 5 (позиция 2) показана макроикона «развилка».Развилка — часть дракон-схемы, внутри которой маршрут сначала раздваивается, а затем соединяется в точке слияния. Развилка имеет один вход сверху и один выход снизу Она представляет собой шампур-блок, который содержит:
Суть дела ясна из примера на рис. 27.
Левое плечо развилки есть путь от нижнего выхода иконы «вопрос»
(точка А) до точки слияния Д. Оно содержит ответ «да», три иконы и соединительные линии.
Правое плечо развилки начинается у правого выхода иконы «вопрос» и заканчивается в точке слияния. На рис. 27 оно содержит ответ «нет» и линию БВГД.
Таким образом, плечо имеет в своем составе надпись «да» или «нет», соединительные линии, иконы и точку слияния. Одно из двух плеч может быть пустым (не содержать икон).
ПРОСТЫЕ И СЛОЖНЫЕ РАЗВИЛКИ
Развилки бывают простые и сложные.Простая развилка содержит только одну икону-вопрос. Примеры простых развилок показаны на рис. 28.
Развилка называется сложной, если в ее плечах имеется по крайней мере одна простая или сложная развилка.
На рис. 19 показаны три сложные развилки. Например, развилка «Потерял 500 рублей?» сложная, так как ее правое плечо содержит простую развилку «Потерял 1000 рублей?». Развилки «Потерял деньги?» и «Потерял сто рублей?» тоже сложные.
Другие примеры сложных развилок показаны на рис. 29.
МАРШРУТЫ И ФОРМУЛЫ МАРШРУТОВ
На рис. 30 (слева) представлена дракон-схема «Охота на мамонта».Заменим текст внутри икон буквами. Вместо «Охота на мамонта» запишем букву А. Вместо «Поймай мамонта» — букву Б и т. д. В результате получим буквенную (литеральную) дракон-схему на рис. 30 справа.
Буквенные схемы удобно использовать для описания маршрутов.
Маршрут — это графический путь от начала до конца алгоритма, проходящий через иконы и соединительные линии. Маршрут можно описать с помощью формулы, которая представляет собой последовательность букв, обозначающих иконы. Все иконы, включая одинаковые, обозначаются разными буквами.
Линейный (неразветвленный) алгоритм имеет только один маршрут и одну формулу. Например, схема на рис. 30 (справа) описывается формулой Разветвленный алгоритм имеет несколько (два или более) маршрутов, причем у каждого маршрута своя, отличная от других формула (рис. 31, 32).
В формулах разветвленных алгоритмов наряду с буквами, обозначающими иконы, используются слова «да» и «нет» (отделяемые пробелами).
Для графического алгоритма справедливо Правило. Выполнить графический алгоритм — значит пройти путь от начала до конца алгоритма по одному из возможных маршрутов.
Будем считать, что существует воображаемый «бегунок», который при работе алгоритма пробегает алгоритмическую дорожку (маршрут) от иконы «заголовок» до иконы «конец».
ЧТО ТАКОЕ РОКИРОВКА?
Рокировка — преобразование алгоритма, при котором левое и правое плечо развилки меняются местами. При этом слова «да» и «нет» также меняются местами. Простейшие примеры рокировки показаны на рис. 17, 18 и 33, 34.Говорят, что два алгоритма имеют одинаковый набор маршрутов, если для каждого маршрута первого алгоритма можно найти парный маршрут второго алгоритма, причем для каждой пары маршрутов их формулы совпадают.
Если два алгоритма имеют одинаковый набор маршрутов, они эквивалентны.
Обратимся к рис. 34. Легко убедиться, что схемы на рис. 34 (слева) и 34 (справа) имеют одинаковый набор маршрутов:
Следовательно, указанные дракон-схемы эквивалентны.
Формальное преобразование алгоритма А1 в алгоритм А2 называется равносильным, если алгоритмы А1 и А2 эквивалентны. Отсюда вытекает Следствие. Рокировка является равносильным преобразованием алгоритмов. При рокировке смысл алгоритма не меняется.
РОКИРОВКА И ЭРГОНОМИЧНОСТЬ:
ОБСУЖДЕНИЕ ВОПРОСА
Полученный результат чрезвычайно важен. Ведь рокировка позволяет улучшить наглядность и понятность алгоритмов.Попытаемся обосновать этот вывод для рис. 33, рассмотрев последовательно все промежуточные шаги рассуждений.
Шаг 1. Выдвигаем гипотезу: для сравнения двух маршрутов на рис. можно использовать признак «лучше—хуже».
Шаг 2. Проверяем гипотезу с помощью следующих рассуждений. Если брюки впору — это хорошо, если их приходится подворачивать — это плохо. Следовательно, использование в данном алгоритме признака «лучше—хуже» правомерно.
Шаг 3. Определяем главный маршрут, который по соглашению соответствует признаку «хорошо». Убеждаемся, что главный маршрут на рис. 33 (слева) идет через правое плечо развилки, что соответствует хорошей ситуации «брюки впору — их не надо подворачивать».
Шаг 4. Констатируем, что главный маршрут на рис. 33 (слева) не идет по шампуру. Делаем вывод: данный алгоритм является плохим, неэргономичным. Однако его можно исправить с помощью рокировки.
Шаг 5. Выполняем рокировку и получаем более эргономичный алгоритм на рис. 33 справа. На этом процедура заканчивается 1.
РОКИРОВКА МОЖЕТ УЛУЧШИТЬ ЭРГОНОМИЧНОСТЬ
АЛГОРИТМОВ
На рис. 35 показана плохая дракон-схема. Согласно правилу главный маршрут (жирная линия) должен быть прямым, как стрела, и идти точно по шампуру. А он вместо этого превратился в ломаную-переломаную линию, которая делает невообразимые скачки и путает читателя. Чтобы исправить ошибку, нужно три раза сделать рокировку.Первый раз делаем рокировку в развилке «В меню есть ваш любимый салат?». Это позволяет пустить главный маршрут по шампуру на верхнем участке. Однако внизу главный маршрут по-прежнему совершает неоправданные зигзаги.
Затем делаем рокировку в развилке «Борщ очень вкусный?». Тем самым улучшаем среднюю часть схемы.
Нам осталось выпрямить главный маршрут на нижнем участке. Для этого переставляем плечи у развилки «Жаркое как подошва?».
Таким образом, в результате трех рокировок неэргономичная схема на рис. 35 превратилась в хорошую (эргономичную) схему на рис. 36.
Подведем итоги. Выпрямляя главный маршрут, мы делаем алгоритм более наглядным, легким для понимания. Потому что главный маршрут — путеводная нить алгоритма, позволяющая быстрее уяснить суть дела.
А теперь — самое главное. Мы осуществили выпрямление главного маршрута не случайно, не по принципу «Что хочу, то и ворочу!», а на основании строгого математического закона — закона рокировки. Напомним суть закона: рокировка — равносильное преобразование алгоритма.
Наличие такого закона придает нашим эргономическим действиям (позволяющим выпрямить «кривой» главный маршрут) математическую строгость и точность.
Мы убедились, что рокировка алгоритма на рис. 35 позволила получить алгоритм на рис. 36, который имеет более высокие эргономические характеристики. Это означает, что операция «рокировка» в примере на рис. 35 и 36 действительно улучшает эргономичность алгоритма.
Правило «Главный маршрут идет по шампуру» — это необходимое, но отнюдь не достаточное условие эргономичности алгоритма. Другое условие — эргономизация текста, то есть превращение запутанного и невразумительного текста в ясный и понятный.
Вопрос «Ноги короче, чем брюки?» звучит вычурно, противоестественно и сбивает с толку читателя. Вместо него следует написать: «Брюки слишком длинные?». В итоге получим действительно понятный и хороший алгоритм.
ЕЩЕ ОДИН ПРИМЕР
На рис. 37—40 представлены четыре схемы, на которых описана история с чернильницей. На всех схемах изображен один и тот же алгоритм.Однако схемы выглядят по-разному.
Зададим вопрос, какие из них начерчены правильно, а какие нет?
Сначала нужно найти главный маршрут. В развилке «Чернильница упала?» главный маршрут идет через «нет». Потому что, когда вещи падают, это плохо. А когда не падают — хорошо. Значит, две схемы — на рис. 37 и 38 — нарисованы неверно.
В чем ошибка? Согласно правилу, главный маршрут должен идти по шампуру. А он вместо этого петлят по задворкам, как заяц.
Проверим правило побочных маршрутов. На рис. 37—40 их два. Один описывает ситуацию, когда чернильница упала, но уцелела. Во втором случае она разбилась. Первой ситуации выставим оценку «плохо», второй — «очень плохо».
Отсюда делаем вывод, что на рис. 39 маршруты не упорядочены. Значит, схема нарисована неверно. Почему? Потому что самый плохой маршрут (с оценкой «очень плохо») должен быть крайним справа. А он по ошибке затесался в середину.
Таким образом, правильно нарисована только одна, самая последняя, схема (см. рис. 40). В ней нет ни одной ошибки. Главный маршрут идет по шампуру, и все маршруты упорядочены по правилу «Чем правее, тем хуже».
Чтобы превратить плохую схему на рис. 37 в хорошую на рис. 40, достаточно сделать всего две рокировки в обеих развилках.
Таким образом, на основании анализа ряда примеров мы убедились:
равносильное преобразование «рокировка» позволяет улучшить эргономичность алгоритмов.
Однако этот вывод относится только к смысловым алгоритмам (где можно указать главный маршрут).
Он совершенно неприменим к буквенным алгоритмам (где понятие главного маршрута теряет силу). Отсюда вытекает, что применение рокировки к буквенной схеме на рис. 34 бессмысленно, так как в данном случае рокировка не влияет на эргономичность.
ВЕРТИКАЛЬНОЕ ОБЪЕДИНЕНИЕ
Иногда бывает, что в дракон-схеме иконы повторяются. Например, на рис. 41 икона «Отдай мотоцикл в ремонт и впредь будь умнее» встречается три раза. Это плохо. Навязчивые повторения раздражают читателя, которому приходится тратить лишнее время и несколько раз читать одно и то же.К счастью, некоторые повторы можно устранить. Такая возможность появляется, если одинаковые иконы находятся рядом, причем их выходы соединены между собой (рис. 41). В этом случае действует Правило. Повторы запрещены.
Устранение повторов производится с помощью вертикальной линии (рис. 42) и называется вертикальным объединением.
При этой операции несколько икон объединяются в одну. Это делается так:
• сначала входы икон объединяются вертикальной линией, • затем удаляются все одинаковые иконы, кроме крайней левой (рис. 41).
Нетрудно доказать, что операция «вертикальное объединение» есть равносильное преобразование алгоритмов.
Сравнивая алгоритмы на рис. 41 и 42, легко заметить, что схема стала более компактной, ясной и наглядной, поскольку освободилась от бессмысленного повторения икон.
Отсюда проистекает Вывод. Равносильное преобразование «вертикальное объединение» позволяет улучшить эргономичность алгоритмов.
ГОРИЗОНТАЛЬНОЕ ОБЪЕДИНЕНИЕ
Иногда для исключения повторов используется не вертикальная, а горизонтальная линия. Соответствующая операция называется горизонтальным объединением. Она является равносильным преобразованием алгоритмов.Рассмотрим более сложную задачу на рис. 43, где также имеются повторы, подлежащие удалению.
Сначала устраним повторение иконы «Съешь кашу» и получим схему на рис. 44. В данном случае для исключения повторов используется горизонтальное объединение.
Затем применим вертикальное объединение и исключим повторение развилки «Есть можно?».
Окончательный результат показан на рис. 45. Полученная схема более удобна и занимает меньше места, чем исходная схема на рис. 43. Самое главное, она стала проще и намного понятнее.
Разобранный пример позволяет сделать Вывод. Равносильное преобразование «горизонтальное объединение»
улучшает эргономичность алгоритмов.
П р е д о с т е р е ж е н и е: выполняя вертикальное и горизонтальное объединение, нужно следить, чтобы не появились пересечения соединительных линий.
ОПАСНОСТЬ ПЕРЕСЕЧЕНИЙ
На рис. 46 в точке Х линии пересекаются. Это очень плохо! Ведь пересечение — визуальная помеха. Она затрудняет восприятие и анализ алгоритмов. Обилие пересечений мешает читателю думать. Практика показывает: пересечение линий — это источник опасности, который может привести к ошибке.Поэтому в языке ДРАКОН действует правило: пересечения запрещены.
Существуют специальные приемы позволяющие устранить пересечения. Самый простой из них показан на рис. 46 и 47.
ПРОСТОЕ ДОКАЗАТЕЛЬСТВО
Можно доказать, что схемы на рис. 46 и 47 эквивалентны (имеют один и тот же смысл).На рис. 46 имеются три маршрута:
Легко убедиться, что схема на рис. 47 имеет точно такие же маршруты.
Совпадение маршрутов говорит о том, что на обеих схемах представлен один и тот же алгоритм. Значит, схемы 46 и 47 равносильны.
КАКАЯ ОШИБКА ПОДСТЕРЕГАЕТ НАС
ПРИ ОБЪЕДИНЕНИИ?
На рис. 48 (слева) икона Е повторяется три раза. На первый взгляд кажется, что две иконы Е можно убрать с помощью операции «горизонтальное объединение». Действуя подобным образом, получим результат на рис. 48 (в центре).Мы допустили грубую ошибку! Вспомним, что при рисовании драконсхем пересечения запрещены. А у нас получилось, что две линии пересекаются в точке X. Отсюда следует Правило. Разрешается объединять не любые одинаковые иконы, а только соседние.
Обратите внимание: на рис. 48 (слева) из трех одинаковых икон Е только две правые являются соседними. А третья (крайняя левая) отделена от них иконой Ж. Поэтому она не может участвовать в объединении. Правильный ответ показан на рис. 48 справа.
ЧТО ДЕЛАТЬ, ЕСЛИ ЭРГОНОМИЧЕСКИЕ ТРЕБОВАНИЯ
ПРОТИВОРЕЧАТ ДРУГ ДРУГУ?
До сих пор мы рассматривали простейшие случаи, когда различные эргономические требования не вступали в конфликт. Однако конфликты возможны. Вот два эргономических критерия, которые могут противоречить друг другу:Чтобы исключить конфликт, следует соблюдать Принцип приоритета. Правило главного и побочных маршрутов имеет более высокий приоритет, нежели стремление уменьшить число вертикалей.
В качестве иллюстрации сравним эквивалентные схемы на рис. 49 и 50. По критерию «минимизация числа вертикалей» выигрывает схема на рис. 49. У нее на одну вертикаль меньше.
А как насчет порядка в маршрутах? Попробуем разобраться.
На рис. 49 правило маршрутов грубо нарушено, причем сразу в двух местах. Во-первых, главный маршрут (когда человек здоров) не совмещен с шампуром. Во-вторых, маршруты не упорядочены слева направо. Действительно, самое тяжелое заболевание (когда человек вынужден лечь в больницу) находится на средней вертикали. Это неправильно, так как слева и справа от нее находятся более легкие недомогания.
Таким образом, правило «Чем правее, тем хуже» не соблюдается.
Поэтому схема на рис. 49 является плохой, неэргономичной.
Чтобы исправить недостаток, необходимо выполнить:
• вертикальное разъединение в точке С (эта операция обратна вертикальному объединению);
• рокировку развилки «Заболел?», • рокировку развилки «Врач помог?».
В итоге получим безукоризненно четкую схему на рис. 50. Здесь все маршруты упорядочены по принципу «Чем правее — тем хуже».
В самом деле, левая вертикаль означает, что дела идут хорошо, ибо человек здоров. Значит, главный маршрут идет по шампуру. Вторая вертикаль описывает легкое недомогание, которое можно снять таблеткой. Третья вертикаль говорит: самочувствие ухудшилось, нужен врач. Наконец, четвертая (крайняя правая) вертикаль означает, что дела плохи — пришлось лечь в больницу.
Как уже упоминалось, схема на рис. 50 тоже не без греха — в ней на одну вертикаль больше, чем на рис. 49. Тем не менее, мы признаем ее наилучшей, поскольку выполняется более приоритетное правило маршрутов.
Отсюда вытекает, что (благодаря наличию приоритетов) комплекс эргономических требований является взаимоувязанным и непротиворечивым.
ЭРГОНОМИЧНОСТЬ АБСТРАКТНЫХ АЛГОРИТМОВ
Можно ли улучшить эргономичность абстрактных (буквенных) драконсхем с помощью равносильных преобразований? Мы уже знаем, что рокировка в этом случае бесполезна. Однако вертикальное и горизонтальное объединение позволяют заметно повысить эргономичность буквенных схем.Чтобы убедиться в этом, обратимся к рис. 51 и 52. В самом деле, схема на рис. 51 выглядит неоправданно громоздкой. Она содержит семь вертикалей, тринадцать икон и заставляет читателя шесть раз читать идентификатор В, чтобы убедиться, что правые шесть икон одинаковые.
А равносильная ей схема на рис. 52 (полученная методом вертикального объединения) свободна от этого недостатка.
Она наглядна, проста и изящна. Содержит только две вертикали и восемь икон. Занимает втрое меньше места на листе бумаги (на экране). И к тому же имеет всего два прямоугольных излома линий (на рис. 51 — семь изломов).
Таким образом, буквенных схема на рис. 52 более эргономична, чем ее соседка.
Еще более громоздкой выглядит абстрактная схема на рис. 53, в которой насчитывается 14 вертикалей.
А эквивалентная ей схема на рис. 54 (полученная методом вертикального и горизонтального объединения) снова выигрывает. Она позволяет уменьшить число вертикалей в три раза (с 10 до 3). Сокращает число икон более чем в два раза (с 45 до 19). Обеспечивает более экономное топологическое упорядочивание маршрутов. Заметно сокращает суммарную длину соединительных линий.
Проведенный анализ позволяет сделать Вывод. В отличие от рокировки, которая полезна только для смысловых дракон-схем, вертикальное и горизонтальное объединение улучшают эргономичность не только смысловых, но и абстрактных алгоритмов.
ИКОНА-ВСТАВКА КАК ЭРГОНОМИЧЕСКИЙ ПРИЕМ
Мы уже знаем, что язык ДРАКОН запрещает применять пересечения, обрывы и соединители. Отсюда вытекает жесткое ограничение: любая дракон-схема должна целиком размещаться на одном листе бумаги.А если она слишком большая и вылезает за рамки прокрустова ложа?
Тогда можно взять бумагу больших размеров, например формата А1.
А если схема громадная и все равно не помещается? На этот случай предусмотрены специальные приемы, позволяющие уменьшить габариты дракон-схемы и разрубить ее на удобные куски. Эти приемы позволяют разместить дракон-схему на листах желаемого размера. Рассмотрим проблему на «миниатюрном» примере.
Предположим, линейный алгоритм состоит из двенадцати икон, а бумажный лист небольшой, так что на нем можно разместить по вертикали не более восьми икон. Как быть?
На рис. 55 и 56 показаны два варианта решения проблемы. Алгоритм на рис. 55 не годится, так как на участке АБ бегунок (рабочая точка) движется вверх, что запрещено правилами языка ДРАКОН.
Преодолеть затруднение можно двумя способами:
• применить конструкцию «силуэт» (о которой шла речь в главе 1);
• примнить прием «разрежь великана» и разделить алгоритм на части.
Рассмотрим последний способ. Для этого удалим из алгоритма несколько связанных по смыслу икон. А вместо них нарисуем икону-заместитель, которая называется вставкой (рис. 56). Вставка нужна, чтобы напомнить об изъятых иконах. Вставка занимает мало места — намного меньше, чем выброшенные иконы, поэтому алгоритм становится короче.
Разумеется, выброшенные иконы не пропадают — они образуют новый алгоритм — процедуру.
На рис. 57 показано, как взаимодействуют основной алгоритм и процедура.
Икона-вставка — это команда «Передай управление в процедуру».
Икона «конец» процедуры означает: «Верни управление в основной алгоритм». При этом управление возвращается в точку, расположенную после иконы-вставки.
На языке программистов икона-вставка — это оператор «Вызов процедуры».
ЧТО ТАКОЕ ПОДСТАНОВКА?
Операция «подстановка» связана с использованием иконы-вставки.Она выполняется за три шага.
Шаг 1. Из дракон-схемы удаляется фрагмент, имеющий один вход и один Шаг 2. Вместо него подставляется икона-вставка с именем Х.
Шаг 3. К удаленному фрагменту добавляется икона-заголовок с тем же именем Х и икона-конец. В результате получается процедура.
Два алгоритма на рис. 55 и 56 неравносильны, так как их формулы не совпадают. Ведь маршрут на рис. 55 содержит 11 икон, а на рис. 56 — 15 икон (см. также рис. 57).
Вместе с тем нетрудно убедиться, что подстановка — эквивалентное преобразование алгоритмов, так как исходный и преобразованный алгоритмы дают одинаковые результаты для одних и тех же исходных данных.
Попутно заметим, что равносильные алгоритмы всегда эквивалентны (обратное неверно).
УЛУЧШЕНИЕ ЭРГОНОМИЧНОСТИ АЛГОРИТМОВ
С ПОМОЩЬЮ МАТЕМАТИКИ
Когда рисуешь алгоритм, нужно стремиться, чтобы он с самого начала удовлетворял правилам и был эргономичным. А если это не получилось?Если первый блин комом, как на рис. 37? В этом случае необходимо довести алгоритм до ума с помощью изложенных выше приемов.
Мы рассмотрели ряд операций, позволяющих выполнить эквивалентное преобразование алгоритмов (при котором смысл алгоритма не меняется). К их числу относятся: рокировка, вертикальное объединение, горизонтальное объединение и подстановка. Подчеркнем еще раз, что эти операции являются математически строгими. С другой стороны, они позволяют улучшить эргономическое качество алгоритмов. Отсюда следует фундаментальный Вывод. Понимаемость (эргономичность) алгоритмов можно повысить с помощью строгих математических методов.
Для удобства читателя на рис. 58 дана общая сводка эквивалентных преобразований.
КРАСОТА И ИЗЯЩЕСТВО АЛГОРИТМОВ
Алгоритм, представленный в письменном виде, предназначен для зрительного восприятия человеком. Следовательно, алгоритм представляет собой зрительную сцену. Или, если угодно, — зрительный образ, зрительную картину.Красота алгоритма — это красота его зрительного образа, в частности, красота дракон-схемы. Алгоритм можно назвать красивым в том случае, если процесс зрительного восприятия, понимания и постижения алгоритма протекает с максимальной скоростью, наименьшими усилиями и максимальным эстетическим наслаждением.
Чем красивее алгоритм, тем быстрее и легче можно его понять. Отсюда вытекает, что красота и элегантность алгоритмов открывают путь к экономии умственных усилий. Но не только.
Чем красивее зрительные образы частей алгоритма, чем изящнее они соединены в общую (алгоритмическую) картину, тем приятнее на них смотреть. Чем точнее и элегантнее зрительный «пейзаж» обнажает глубинный смысл алгоритма, тем плодотворнее мышление.
Чем больше красоты, тем глубже понимание алгоритмов. Чем скорее течет наша алгоритмическая мысль, тем легче мы постигаем суть дела.
Тем быстрее и качественнее протекает важнейший производственный процесс, играющий немалую роль в мировой экономике, — процесс массовой разработки алгоритмов и программ.
И наоборот, если зрительный образ алгоритма кажется некрасивым, неприятным, отталкивающим и запутанным, процесс понимания и обдумывания неизбежно замедляется, что снижает производительность умственного труда.
ДРАКОН — графический язык, язык зрительных образов. С учетом сказанного можно уточнить: ДРАКОН — язык красивых зрительных образов.
Но красота ДРАКОНА — не самоцель. Она позволяет ощутимо повысить производительность труда при создании алгоритмов.
Мы исходим из того, что зрительные образы алгоритмов следует сознательно проектировать. Для этой цели можно (в разумных пределах) использовать средства художественного конструирования. Уместно напомнить слова видного психолога Бориса Ломова:
«Средства художественного конструирования в конечном счете направлены на то, чтобы вызвать тот или иной эффект у работающего человека… Применяя средства художественного конструирования, мы создаем положительные эмоции, облегчаем операцию приема информации человеком, улучшаем концентрацию и переключение внимания, повышаем скорость и точность действий.
Короче говоря, мы пользуемся этими средствами для управления поведением человека в широком смысле слова, для управления его психическим состоянием» и умственной работоспособностью [1].
ПРАВИЛА, РОЖДАЮЩИЕ АЛГОРИТМИЧЕСКУЮ КРАСОТУ
О каких правилах идет речь? Приведем несколько примеров.Правило лаконичности. Зрительный образ алгоритма должен быть лаконичным. Все ненужные, лишние детали должны быть отсечены.
Поясним. Блок-схема алгоритма должна содержать лишь те элементы, которые необходимы для сообщения читателю существенной информации, точного понимания ее значения и стимулирования правильных решений и разумных действий. Пустые украшения, избыточные, затемняющие детали должны быть удалены.
Характеризуя это правило, Ф. Эшфорд пишет:
«Бесполезно стремиться направить внимание на важнейшие характеристики, если они окружены лишними, не относящимися к ним визуальными раздражителями, мешающими восприятию главного»
ДЬЯВОЛ ТАИТСЯ В ПОДРОБНОСТЯХ
Чтобы найти и изгнать «дьявола», надо засучить рукава и заняться чисткой авгиевых конюшен. Надо заглянуть во все углы, внимательно рассмотреть мельчайшие детали и устранить затаившиеся в них недостатки. Это грязная и неблагодарная работа. Однако обойтись без нее нельзя.Чтобы добиться «великой победы», надо устранить тысячи вредных мелочей. Одна из таких мелочей — ненужные изломы соединительных линий.
Правило устранения изломов. Чтобы алгоритм был удобным для чтения, количество изломов соединительных линий должно быть минимальным.
Из двух схем лучше та, где число изломов меньше. Сравним две схемы на рис. 59 и 60. На рис. 59 показана обычная блок- схема, заимствованная из технической литературы [3]. На рис. 60 изображена эквивалентная ей дракон-схема.
Эти рисунки позволяют выявить различия между уродливой блок-схемой и красивой дракон-схемой. С точки зрения правил, рождающих алгоритмическую красоту, блок-схема на рис. 59 имеет следующие недостатки.
• Неоправданно большое число изломов линий (в блок-схеме 12 изломов, а в дракон-схеме только 4).
• Большое число паразитных элементов: 14 стрелок и 3 кружка, которые в дракон-схеме отсутствуют (поскольку они совершенно не нужны и представляют собой визуальные помехи, затемняющие суть дела).
Мы рассмотрели два эргономических закона — правило лаконичности и правило устранения изломов. Мы убедились, что в дракон-схеме эти правила строго соблюдены, а в блок-схеме грубо нарушены.
КРИТИЧЕСКИЙ АНАЛИЗ
Обратимся снова к рис. 59 и 60. Мы сделали лишь первый шаг к расчистке авгиевых конюшен. На рис. 59 осталось еще немало «грязи», которую необходимо отмыть.Итак, вооружимся микроскопом и продолжим наш критический анализ.
Блок-схема на рис. 59 имеет следующие недочеты.
• Для обозначения развилки используется ромб, который занимает слишком много места и не позволяет поместить внутри необходимое количество удобочитаемого текста, состоящего из строк равной длины. В дракон-схеме верхний и нижний углы ромба «отпилены». Поэтому схема становится компактной и удобной как для записи текста, так и для чтения.
• Функционально однородные иконы Д, Е, Ж, И хаотично разбросаны по всей площади чертежа, занимая три разных горизонтальных уровня (что путает читателя). В дракон-схеме они расположены на одном уровне, что служит для читателя наглядной подсказкой об их функциональной однородности.
• Ромбы имеют выход влево, что разрушает шампур и не позволяет применить правило главного маршрута. В дракон-схеме выход влево не допускается.
• Икона Д и ее вертикаль расположены слева от шампура (в дракон-схеме это запрещено).
• Ниже икон Ж и И находятся три уровня горизонтальных линий, которые имеют паразитный характер. В дракон-схеме три уровня сведены в одну линию, что делает схему еще более наглядной и компактной.
Да, конечно, каждое из этих улучшений является маленьким и не делает погоды. Но когда мелкие улучшения исчисляются тысячами и становятся массовыми, ситуация может измениться. Количество переходит в качество. В этом случае облегчение умственного труда может стать значительным.
«АЛГОРИТМИЧЕСКИЕ МЯТЕЖНИКИ»
В последнее время появились алгоритмические «мятежники», которые затеяли восстание против вчерашних авторитетов. Они называют традиционные блок-схемы «кучей мусора».Образчик подобной кучи мусора представлен на рис. 61 [4]. Этот «мусорный» алгоритм мы подвергли косметической операции в «салоне алгоритмической красоты». И превратили в изящную дракон-схему (рис. 62).
Сравним, что было и что стало.
Схема на рис. 61 имеет множество изъянов.
• Слева от иконы Ж есть пересечение линий (в дракон-схеме пересечения запрещены).
• Возле иконы Е имеется линия под углом 45 (в дракон-схеме наклонные линии не допускаются).
• Иконы Д, Е и Ж имеют более одного выхода (в дракон-схеме это запрещено).
• Иконы В, Д, Е, Ж имеют входы сбоку, что придает схеме неряшливый вид. В дракон-схеме вход разрешается только сверху, что упорядочивает алгоритм и создает в нем четкую ориентацию «сверху вниз»).
• Отсутствует шампур, так как выход иконы «заголовок» и вход иконы «конец» не лежат на одной вертикали. Исчезновение шампура означает, что в схеме отсутствует зрительный остов, художественно-композиционная главная вертикаль. Тем самым уничтожается основа для наглядного выделения главного маршрута.
Таким образом, последняя блок-схема (рис. 61), как и предыдущая (рис. 59), по всем параметрам проигрывает дракон-схеме.
ЗАЧЕМ ЗДЕСЬ СТРЕЛКИ?
РАЗВЕ ОНИ ВНОСЯТ ЯСНОСТЬ?
Предыдущие примеры плохих блок-схем были случайным образом взяты из технической литературы. Следующий пример (рис. 63) скопирован из источника [5], где он характеризуется как «стандартная блок-схема ANSI» (Американский национальный институт стандартов). Блок-схема, выполненная по этому стандарту, также имеет многочисленные дефекты:• Ниже иконы G имеет место разрыв шампура (нарушено правило, согласно которому один из путей, идущих от входа к выходу, должен проходить по главной вертикали).
• Икона G имеет два входа (в дракон-схеме разрешается только один вход).
• Икона G имеет вход сбоку (в дракон-схеме это запрещено).
• У иконы G выход находится слева (в дракон-схеме он должен быть снизу).
• Две петли обратной связи обычного цикла находятся слева от шампура и закручены по часовой стрелке (в дракон-схеме они расположены справа от шампура и закручены против часовой стрелки).
• Используются неудобные ромбы (в дракон-схеме их заменяют эргономичные иконы “вопрос”).
• Ромб L имеет выход слева (в дракон-схеме он должен быть справа).
• Используются 12 стрелок, из которых 10 — паразитные (в дракон-схеме всего 2 стрелки).
• Имеется один избыточный излом линии (в блок-схеме 9 изломов, в дракон-схеме только 8).
Таким образом, американская блок-схема, как и предыдущие примеры, по всем параметрам проигрывает дракон-схеме (рис. 64).
Мы еще раз убедились, что алгоритмическая красота достигается благодаря совокупному действию многих правил, каждое из которых, взятое по отдельности выглядит скромным и будничным.
Нетрудно заметить, что красота дракон-схем во многом достигается за счет стандартизации графических узоров. В «плохих» блок-схемах входы и выходы икон изображаются как угодно. Стандартизация отсутствует, превращая блок-схемы в царство анархии.
В отличие от них язык ДРАКОН задает строгие эргономичные стандарты, направленные на достижение алгоритмической красоты. Это значит, что графические символы, обозначающие одни и те же объекты или явления, должны быть унифицированы. Они должны иметь единое графическое решение.
Это касается не только формы икон и правил присоединения к ним входов и выходов. Этому закону подчиняются и более глобальные правила, регламентирующие графический узор всего алгоритма, как целостного зрительного образа.
ЭПОХА ПОНЯТНЫХ АЛГОРИТМОВ
И ВСЕОБЩАЯ АЛГОРИТМИЧЕСКАЯ ГРАМОТНОСТЬ
До сих пор одним из важнейших недостатков теории алгоритмов была ее недостаточная связь с практикой программирования. Это приводило к тому, что разработка и отладка алгоритмов и программ превратилась в сверхтрудный интеллектуальный процесс. В результате производительность труда алгоритмистов и программистов значительно отстает от потребностей практики. Причина этого недостатка — низкая понимаемость алгоритмов и программ. Причем этот недостаток невозможно устранить чисто математическими методами.Но есть и хорошая новость. Объединение усилий математики и эргономики является плодотворным для решения задачи.
Сказанное позволяет предположить, что объявленная выше стратегическая цель — построение ясных, понятных и доходчивых алгоритмов, пригодных для более глубокого взаимопонимания между соисполнителями работ — вполне достижима.
Если это верно, то мы находимся на пороге новой эпохи — эпохи понятных алгоритмов. Впервые в истории во всем мире сложные алгоритмы станут легкими для понимания! Это значит, что будет реализована заветная мечта многих алгоритмистов, программистов и заказчиков программных комплексов.
Вместо нынешних «уму непостижимых» алгоритмических джунглей повсюду засияют волшебным светом «удивительно наглядные описания алгоритмов и процессов». Перед нашими восхищенными очами откроется новый мир — мир дружелюбных алгоритмов, в котором будет царить необыкновенная легкость и глубина понимания.
Можно надеяться, что дальнейшее развитие теории и практики эргономизации алгоритмов проложит широкий путь ко всеобщей алгоритмической грамотности (в тех пределах, в которых подобная задача в принципе может быть решена).
ВЫВОДЫ
Предполагается, что понятие «эргономичный алгоритм» должно стать фундаментальным понятием теории алгоритмов.Применение достижений эргономики к теории алгоритмов позволяет значительно улучшить понимаемость алгоритмов и программ, усилить творческую продуктивность алгоритмистов и программистов.
Понятие эргономичного алгоритма задается с помощью конечного набора четко определенных правил и признаков, таких, как «главный маршрут должен идти по шампуру» и т. д. Следовательно, это понятие является строгим.
Эргономичность алгоритмов можно улучшить с помощью простых и ясных методов, в частности, с помощью математически строгих равносильных преобразований алгоритмов (рокировки, вертикального и горизонтального объединения и подстановки).
ВИЗУАЛИЗАЦИЯ ЦИКЛИЧНЫХ АЛГОРИТМОВ
ПРОБЛЕМА ЦИКЛИЧНЫХ АЛГОРИТМОВ
В этой главе речь пойдет о графических циклах языка ДРАКОН.Проблема в том, что программисты привыкли к текстовой записи циклов, сжились с ней. Для тех, кто всю жизнь использовал текстовую запись, графическая запись (точнее, графический способ мышления о циклах) может показаться непривычным.
Чтобы исключить трудности, мы будем рассказывать о циклах на самых простых бытовых примерах, не избегая юмористических приемов. Как говорил великий Блез Паскаль, «предмет математики настолько серьезен, что полезно не упускать случая сделать его немного занимательным».
Теперь о самом главном. Существующие циклы, используемые во всем мире, имеют серьезный недостаток. Они накладывают на творческую мысль алгоритмиста неоправданные ограничения. Графика позволяет снять многие из этих ограничений. В результате алгоритмическая мысль становится более естественной и плодотворной.
ОБЫЧНЫЙ ЦИКЛ
В языке ДРАКОН имеется следующий ассортимент циклов:Первые четыре цикла рассматриваются в этой главе, цикл ЖДАТЬ — в главе 5.
Составной графический оператор «обычный цикл» (рис. 5, макроикона 4) содержит иконы «вопрос» и «петля цикла» (рис. 4, иконы И4, И11). Он охватывает циклы трех типов (рис. 65—67):
Визуально отличить их очень легко. У цикла ДО вопрос рисуют внизу, а действие вверху (рис. 65). У цикла ПОКА — все наоборот (рис. 66). Гибридный цикл — это «помесь» цикла ДО и цикла ПОКА (рис. 67).
В цикле ДО действие выполняется до вопроса. Это значит, что бегунок сначала пробегает через одну или несколько икон «Действие», потом — через икону «Вопрос». Например, в цикле на рис. 68 сначала выполняются два действия:
И только после этого задается вопрос: «Все доски покрашены?». При ответе «нет» описанные два действия выполняются снова и снова.
Когда все доски будут покрашены, бегунок выходит из иконы «вопрос»
через «да». И алгоритм заканчивает работу.
В цикле ПОКА иная картина. Действие либо вообще не выполняется, либо выполняется после вопроса. Бегунок сначала движется через икону «вопрос», а затем (если ответ благоприятный) — через икону «действие».
Обратимся к примеру на рис. 69. Однажды Карлсон, который живет на крыше, нашел кошелек и открыл его. А что случилось дальше? Здесь возможны варианты.
Вариант 1. Кошелек оказался пустым. Поэтому Карлсону не удалось купить плюшку.
Вариант 2. В кошельке всего одна денежка, так что Карлсон смог купить только одну плюшку.
Вариант 3. В кошельке целая куча монет. Поэтому Карлсон купил гору плюшек и наелся до отвала.
Рассмотрим дело подробнее. Цикл на рис. 69 начинается с вопроса: «В кошельке есть денежки?».
Если денег нет, из иконы «вопрос» бегунок выходит через «нет», и алгоритм сразу заканчивается. Следовательно, действие «Возьми из кошелька денежку» не выполняется ни разу.
Если же деньги есть, бегунок выходит через «да» и начинает кружить по маршруту АБВГДЕЖА. При этом выполняются действия, образующие тело цикла:
Когда деньги кончатся, бегунок выходит из иконы «вопрос» через «нет». И алгоритм заканчивается.
Чем различаются циклы ПОКА и ДО?
Цикл ПОКА может либо ни разу не выполняться, либо выполняться один раз, либо много раз (два и более). А цикл ДО обязательно выполняется хотя бы один раз.
УСЛОВИЕ ПРОДОЛЖЕНИЯ И ОКОНЧАНИЯ ЦИКЛА
Введем два новых понятия. Вообще говоря, эти понятия существовали всегда (без них цикл просто не может работать), но их описание было либо скомканным, либо вообще оставалось за кадром.Уже говорилось, что в иконе «вопрос» записан да-нетный вопрос, то есть логическая переменная величина, принимающая значение «да» или «нет».
Условие продолжения цикла — условие, определяемое значением данетного вопроса («да» или «нет»), при котором цикл продолжает работать.
Условие окончания цикла — условие, определяемое значением да-нетного вопроса («да» или «нет»), при котором цикл заканчивает работу.
На рис. 69 условие продолжения цикла имеет вид Когда деньги кончатся, логическая переменная изменит свое значение с «да» на «нет». В этот момент условие продолжения цикла исчезнет (станет неистинным). И появится условие окончания цикла:
В обычных языках значения указанных условий жестко регламентируются. Например, в языке Паскаль в цикле ДО (repeat-until) выход из цикла производится только тогда, когда логическое выражение принимает значение true (да). Чтобы выполнить столь жесткое условие, иногда приходится делать противоестественную и вычурную запись.
В языке ДРАКОН подобные надуманные ограничения полностью отсутствуют, что (в сочетании с другими эргономическими приемами) заметно облегчает разработку алгоритмов.
ДОСРОЧНЫЙ ВЫХОД ИЗ ЦИКЛА «ПОКА»
Карлсон, который живет на крыше, может съесть очень много плюшек.Наверное, штук сто. Или даже двести. Но не больше! Иначе он просто лопнет. А теперь предположим, что в кошельке, на его счастье (или беду), оказалось пятьсот монет.
Зададим вопрос: как в этой ситуации будет работать алгоритм на рис.
69?
Бедный Карлсон! Ему не позавидуешь. Алгоритм заставит его съесть пятьсот плюшек. Все до единой! И он наверняка умрет от обжорства. Почему? Потому что из цикла на рис. 68 нельзя выйти раньше времени.
Вспомним — в кошельке пятьсот монет. Значит каждая команда цикла будет исполнена ровно пятьсот раз. И лишь затем на вопрос: «В кошельке есть денежки?» — мы получим ответ «нет» и сможем уйти из цикла.
Отсюда следует вывод. Чтобы спасти Карлсона, нужно организовать досрочный выход из цикла. Для этого в алгоритм нужно ввести дополнительную команду-вопрос: «Карлсон уже наелся?» (рис. 70).
Что это даст? Допустим, в кошельке пятьсот монет, а Карлсон может съесть всего двадцать плюшек. После того как цикл повторится двадцать раз, на вопрос: «Карлсон уже наелся?» — будет получен ответ «да». И мы благополучно выйдем из цикла.
Обратите внимание: цикл на рис. 70 имеет не один, а два выхода:
основной и досрочный. Через первый мы выходим, когда в кошельке кончились деньги. Через второй — когда Карлсон наелся.
ДОСРОЧНЫЙ ВЫХОД ИЗ ЦИКЛА «ДО»
Папино слово — закон! А папа сказал: сегодня нужно покрасить забор.На рис. 68 показан случай, когда все идет по плану и работа успешно доводится до конца.
Однако в жизни вечно случается то одно, то другое. Например, ни с того ни с сего кончилась краска. Этот случай представлен на рис. 71. Алгоритм на рис. 71 имеет два выхода из цикла: основной (забор удалось покрасить) и досрочный (забор остался недокрашенным).
Однако, что значит «кончилась краска»? Одно дело, если краски нет в ведре — тогда ее можно взять в сарае. И совсем другое, если в сарае краски тоже нет. Последний случай показан на рис. 72.
Жизнь полна неожиданностей. Кому охота красить дурацкий забор, если все нормальные люди уже играют в футбол? Этот полезный для футбола и вредный для забора случай отражен на рис. 73. Данный алгоритм интересен тем, что в нем три выхода из цикла: основной и два досрочных.
В первом случае забор будет покрашен как надо. Во втором дело не ладится из-за нехватки краски. В третьем — из-за любви к футболу.
Сказанное можно обобщить и записать Правило. В цикле всего один вход. А выходов может быть много. Один выход — основной, остальные — досрочные.
ЦИКЛ В ЦИКЛЕ
Рассмотрим графическую конструкцию «цикл внутри другого цикла».Пусть это будет цикл ДО внутри цикла ДО.
На рис. 68 есть команда «Покрась одну доску». Взглянем на нее «под микроскопом». Чтобы покрасить доску, надо сделать несколько операций:
макнуть кисть в краску, сделать мазок, потом еще и еще — до тех пор пока вся доска не станет окрашенной. Эти действия можно изобразить в виде цикла (рис. 74).
Полученный цикл поместим на рис. 68 вместо команды «Покрась одну доску». Результат показан на рис. 75. Мы получили алгоритм, в котором есть конструкция «цикл в цикле».
Этот алгоритм работает так. Предположим, забор красит Том Сойер.
Сначала Том выполняет две команды (рис. 75):
Дальше нужно покрасить самую первую доску. Для этого Том исполняет команды, содержащиеся в цикле ДО (2):
Если не окончена, Том продолжает красить до тех пор, пока не будет выполнено условие окончания цикла ДО (2):
Рассмотрим числовой пример. Допустим, чтобы покрасить одну доску, нужно семь раз макнуть кисть в краску и сделать семь мазков. Значит цикл ДО (2) будет выполнен ровно семь раз.
После этого Том выполняет команды цикла ДО (1):
Если нет (не все доски покрашены), Том примется за следующую доску.
Давайте проследим маршрут. Из иконы «Все доски покрашены?» выходим через «нет» направо. По стрелке попадаем на вход цикла ДО (1). Затем Том начинает красить вторую доску. Он семь раз макнет кисть и сделает семь мазков. Разделавшись со второй доской, Том шагнет вправо на ширину доски и возьмется за третью доску. И так далее — пока весь забор не будет покрашен (рис. 75).
В алгоритме на рис. 69 заменим икону «Съешь плюшку» на цикл ДО, состоящий из икон «Откуси кусок плюшки» и «Плюшка съедена?» (рис. 76).
В итоге снова получим цикл в цикле. Цикл ПОКА, построенный с помощью иконы «В кошельке есть денежки?», является внешним. В нем «прячется»
внутренний цикл ДО (рис. 76).
Поясним. При выполнении цикла ДО бегунок кружит по внутренней петле ВИКЛВ. За это время Карлсон откусывает один кусок плюшки, потом другой и так далее. Когда он покончит с первой плюшкой, будет выполнено условие окончания цикла ДО.
После этого маршрут бегунка меняется. Если в кошельке по-прежнему есть деньги, бегунок побежит по внешней петле ЖАБВГДЕЖ.
Предположим, в кошельке 50 монет, а Карлсон съедает плюшку за три приема. Это значит, что каждая команда цикла ПОКА будет выполнена раз, а каждая команда цикла ДО — 150 раз. (Чтобы съесть 50 плюшек, откусив каждую 3 раза, нужно сделать 50 х 3 = 150 «откусываний»).
АБСТРАКТНАЯ КОНСТРУКЦИЯ «ЦИКЛ В ЦИКЛЕ»
На рис. 77 показано построение абстрактной (буквенной) конструкции «цикл в цикле».На рис. 78 изображены четыре варианта конструкции «цикл в цикле».
Этот рисунок очень важен — он задает эргономичные правила графического синтаксиса, используемые при создании конструкции «цикл в цикле».
ОСОБЕННОСТИ ОБЫЧНОГО ЦИКЛА
Анализируя рисунки 65—78, можно сделать следующие замечания.• Оператор «обычный цикл» имеет один вход и один или несколько выходов.
• Цикл с одним выходом представляет собой шампур-блок (вход и выход находятся на одной вертикали).
• Если цикл имеет более одного выхода, основной выход размещается на главной вертикали, дополнительные (досрочные) — правее ее.
• Шампур цикла проходит через икону «вопрос».
• Тело цикла ПОКА находится справа от шампура.
• Петля цикла находится правее главной вертикали и закручена против часовой стрелки.
• Икона «вопрос» задает условие цикла, которое распадается на две части: условие продолжения цикла и условие окончания цикла (рис. 69).
• Условие продолжения цикла соответствует правому выходу иконы «вопрос», условие окончания цикла — нижнему.
• Условие окончания цикла может помечаться как словом «нет», так и словом «да». То же самое относится и к условию продолжения цикла.
СТИХОТВОРЕНИЕ И АЛГОРИТМ
Наша ближайшая цель — познакомиться с понятием «переключающий цикл». Это цикл, внутри которого находится алгоритмическая конструкция «переключатель».План рассказа таков. Сначала мы познакомимся с переключателем.
Чтобы сделать материал приятным для чтения, воспользуемся стихотворением Генриха Гейне, в котором «спрятан» переключатель.
Это стихотворение легко превращается в алгоритм. (Те, кто любит забегать вперед, могут взглянуть на рис. 81).
Мы же начнем по порядку.
ПЕРЕКЛЮЧАТЕЛЬ
Предположим, в алгоритме нужно организовать разветвление на несколько направлений. Задачу можно решить двумя способами: с помощью иконы «вопрос» (рис. 79) и с помощью переключателя (рис. 80).Переключатель — составной графический оператор (рис. 5, макроикона 3), имеющий один вход и один выход, содержащий одну икону «выбор»
и несколько (две и более) икон «вариант» (рис. 4, иконы И5, И6).
Внутри иконы «выбор» делается надпись, обычно в утвердительной форме, которая обозначает вопрос, имеющий строго определенное число ответов (два и более). Ответы записываются в иконах «вариант». Таким образом, число вариантов равно числу ответов.
Говоря формально, в иконе «выбор» записывается переменная, в иконах «вариант» — ее значения.
Пример 1. На рис. 81 в иконе «выбор» записан вопрос: «Какую дочь Дункан выдает замуж?». На этот вопрос есть два ответа, записанные в иконах «вариант»:
Пример 2. На рис. 80 картина иная. На первый, взгляд там нет вопроса.
Однако на самом деле вопрос есть, правда неявный. Чтобы убедиться, слово «светофор» прочитаем так: какой сигнал светофора сейчас горит? Вот три ответа:
Формально это означает: переменная «Светофор» принимает три значения: зеленый, желтый, красный.
КАК РАБОТАЕТ ПЕРЕКЛЮЧАТЕЛЬ?
Ответ всегда начинается со слова «если».• Если Дункан выдает замуж чернобровую дочь — лети во весь опор назад.
• Если Дункан выдает замуж дочь с русою косой — ступай на рынок, купи веревку, вернись шагом и молчи (рис. 81).
• Если светофор зеленый — жми на газ.
• Если светофор желтый — притормози.
• Если светофор красный — стой (рис. 80).
Что такое «вариант»
ПЕРЕКЛЮЧАЮЩИЙ ЦИКЛ
Переключатель позволяет создать особый тип цикла — переключающий цикл (рис. 5, макроикона 5). Для этого нужно оторвать выход правой ветви переключателя, загнуть его вверх и присоединить стрелку в нужное место (рис. 82).На рис. 83 изображен цикл с переключателем, однако это не переключающий цикл, а обычный.