Основы программирования. Урок 1. Логика и алгоритмы

Основы программирования. Урок 1. Логика и алгоритмы

Что общего между программистом и художником, кроме творческого беспорядка на столе? Они оба создают интересные вещи, используя креативность и выходя за рамки привычного мышления. Главное отличие в том, что программист следует законам логики и разрабатывает точные алгоритмы создания произведения. Об этом мы сегодня и поговорим.

Где логика?

Логика – это наука о правильном мышлении. Или в нашем случае – о правильной постановке команд, которые приведут к нужному результату.

Последовательность таких команд в виде инструкций, описывающих порядок действий, называется Алгоритмом. Набор инструкций, которые идут друг за другом по определённому алгоритму, называется Программой.

Наименьшая автономная часть программы – это инструкция (команда или набор команд). По-другому инструкции называют «оператор» или «statements». Один оператор выполняет конкретный программный код. Это главная часть любой программы.

Пишите максимально подробные и логичные инструкции для компьютера, чтобы он понял команду именно так, как вам требуется. Если этого не сделать – нужного результата не выйдет.

По сути, инструкции и алгоритмы – это то, чему подчиняются все процессы в реальном мире. Чтобы наглядно показать, как всё это работает, приведем пример из жизни.

Разбираем «на пальцах»

Вот Алексей. Он обычный парень, который любит играть в футбол. Нам необходимо прописать программу, симулирующую игру Лёши. Для этого мы прописываем конкретную инструкцию, которая состоит из таких команд:

  • Надеть спортивную одежду.
  • Выйти на улицу.
  • Поставить мяч на землю.
  • Ударить по мячу.

Основы программирования. Урок 1. Логика и алгоритмы

Запускаем игру и понимаем, что что-то идёт не так. Причина в том, что Алексей вышел играть в туфлях, а не в спортивной обуви, так как мы не учли в инструкции этот нюанс.

Основы программирования. Урок 1. Логика и алгоритмы

Возвращаемся назад и дополняем:

  • Надеть спортивную одежду.
  • Надеть спортивную обувь.
  • Выйти на улицу.
  • Поставить мяч на землю.
  • Ударить по мячу.

Основы программирования. Урок 1. Логика и алгоритмы

Теперь игра идёт так, как мы задумали.

Этот вариант примитивный. В настоящей программе инструкций будет гораздо больше. Каждое действие Алексея придётся прописывать подробно. Например, выход из дома:

  • Подойти к лифту.
  • Нажать на кнопку.
  • Зайти в лифт.
  • Нажать кнопку первого этажа.
  • Выйти из лифта и т. д.

Чем подробнее прописаны стейтменты, тем более качественно работает программа.

Представьте количество команд, инструкций и сложность алгоритма в искусственном интеллекте или роботе. Сколько подробных инструкций предусматривает и прописывает программист, чтобы искусственный интеллект самостоятельно принимал решения, а робот ходил, разговаривал, отвечал и реагировал на действия.

Программа – живой организм, который постоянно развивается и изменяется. Актуализировать её придётся бесконечно: дописывать инструкции, расширять функционал, упрощать. При этом программа всё ещё не будет идеальной. Всегда есть что добавить или изменить.

В случае с Алексеем, дополнительно понадобилось бы прописать и то, что он идёт на выбранную спортивную площадку или стадион, зовёт с собой друзей и т. д.

Учитывайте тот факт, что ваша программа обязательно будет изменяться и дополняться. Тот, кто после вас займётся её поддержкой и развитием, должен понять вашу логику. Не слишком стремитесь к упрощению и минималистичности.

Виды алгоритмов

Последовательность команд и инструкций может быть разной. Но в основе лежат три вида алгоритмов:

Линейный

Каждое действие выполняется последовательно друг за другом в строгом порядке. Когда выполнено одно, начинается другое. И так до последнего.

Циклический

По достижении определенного действия алгоритм возвращается на любое из предыдущих сколько угодно раз. Это делается с помощью циклов, которые мы обсудим на следующих уроках. В примере с футболистом цикличным алгоритм считался бы в том случае, если бы Алексей бесконечно бил по мячу.

Ветвление

В одной из команд (или нескольких) прописывается разветвление. Доходя до него, необходимо выбрать на какую из ветвей пойти дальше. Представьте, что идёте по дороге и встречаете развилку. Вам необходимо выбрать путь налево или направо. Это и есть алгоритм ветвления.

Основы программирования. Урок 1. Логика и алгоритмы

В чистом виде эти алгоритмы встречаются лишь в простейших программах. Чаще всего они комбинируются между собой. Именно комбинируемый алгоритм – самый распространённый вид алгоритма.

Каждая программа состоит из сложного набора инструкций, где есть и циклы, и ветвления, и прямые линии. Со стороны это похоже на большое дерево с множеством веток, которые растут в разные стороны.

Все алгоритмы выполняют конкретные логические задачи: сортировка, поиск, сравнение и т. д. В каждой из задач эффективными будут разные алгоритмические последовательности. Для сортировки одни, для поиска другие.

Для разработки подходящего алгоритма и потребуется креативность. Вы сами выбираете путь и способы достижения результата, вдохновляясь природными процессами, опираясь на собственные ощущения, и описываете их в программе. Вспомните об этом, когда кто-нибудь снова скажет, что программирование – это только математика 🙂

Домашнее задание

Напишите линейный, циклический или разветвленный алгоритм. Это должен быть порядок действий, список команд, конкретная инструкция. Программа должна упростить вашу жизнь, делать то, что сами вы делать не хотите.

Введение 1. Трагедия Боинга 737 МАХ 2. Безошибочность алгоритмов3. Язык ДРАКОН 4. Визуальное структурное программирование 5. Аксиоматический метод 6. ДРАКОН-конструктор 7. Алгоритмическая логика 8. Доказательство правильности 9. Семейство ДРАКОН-языков 10. Автоматное программирование 11. Учебное пособие по языку ДРАКОН для вузов 12. Недостатки языка ДРАКОН 13. В чем сила языка ДРАКОН 14. На руках разработчиков алгоритмов кровь сотен людей 15. Литература

Аннотация. О чем пойдет речь?

Речь пойдет об визуальном алгоритмическом языке ДРАКОН, который опирается на мантру безошибочности. ДРАКОН — это попытка покончить с пагубными привычками мэйнстрима, когда заказчик и исполнитель с трудом понимают друг друга, когда тестирование и отладка занимают много времени, когда продукты сдаются заказчику со скрытыми дефектами и порождают болезненные доработки. Такое положение следует решительно изменить.

Конечно, это не просто и серебряной пули нет. А может, все-таки есть, хоть и не серебряная? ДРАКОН-методология покоится на двух китах: когнитивной эргономике (наглядность) и неклассической теории алгоритмов (надежность). Это не просто наглядность и надежность. Это стремление достичь амбициозную цель: сверхвысокую наглядность и безошибочность, которая раньше считалась невозможной.

Чтобы докопаться до истины и показать возможность разумного пути к безошибочному будущему, стоит начать с анализа крупнейшей по числу жертв алгоритмической трагедии в истории человечества.

Основы программирования. Урок 1. Логика и алгоритмы

Телестудия Роскосмоса. Кадр из фильма «Жирограф и ДРАКОН Пилюгина».

Основы программирования. Урок 1. Логика и алгоритмы

Сколько стоят ошибки в алгоритмах

Умеют ли люди писать алгоритмы? В корпорации Боинг трудятся умные люди высочайшей квалификации. Они, несомненно, умеют писать алгоритмы. Но с ошибками. Сколько стоят ошибки? Немало. Фирма Boeing согласилась выплатить 2,5 миллиарда долларов, чтобы избавиться от суда об утаивании проблем с самолетом Боинг 737 MАХ от авиационного регулятора FAA.

И всего-навсего 500 миллионов долларов (из этих денег) достанутся семьям погибших в авиакатастрофах компаний Ethiopian Airlines и Lion Air.

Цель — безошибочность

Ошибки в алгоритмах и программах — острая проблема. Исправление промахов и ошибок приводит к дополнительным затратам труда и времени, перерасходу средств и порою к дополнительным издержкам, как у Боинга. Отчасти это объясняется тем, что понятие алгоритма, его свойства и нотации разрабатывались без учета проблемы человеческих ошибок.

Эффективная и удобная нотация для записи алгоритмов до сих пор не создана. Нотации, конечно, есть, но они с неумолимой неизбежностью воспроизводят ошибки.

Новая нотация

Актуальная задача — предложить новую нотацию и показать, что она содействует безошибочности. Этого мало. В новую нотацию нужно встроить незаметный для пользователей математический аппарат, предотвращающий ошибки.

Чтобы подчеркнуть важность понятия «безошибочный алгоритм», полезно проанализировать инцидент с самолетом Боинг 737 МАХ, алгоритмы которого оказались ошибочными и привели к катастрофе.

Макроалгоритмы

Макроалгоритмы — это алгоритмы в широком смысле. Макроалгоритмы делятся на компьютерные алгоритмы (которые выполняются компьютерами) и жизнеритмы, выполняемые людьми.

Макроалгоритм большой человеко-машинной системы содержит взаимоувязанные и согласованные между собой алгоритмы и жизнеритмы. Примером большой человеко-машинной системы служит фирма Боинг, огромная фирма, на которой трудятся 150 000 человек. Это люди высочайшей квалификации, обладающие огромными знаниями. Что же их подвело?

Основы программирования. Урок 1. Логика и алгоритмы

Что случилось с лайнером Боинг 737 MAX

Сайт корпорации Боинг

Через считанные минуты после взлета, когда надо было срочно набирать высоту, произошло невероятное — автоматическая система управления внезапно направила нос самолета к земле. Экипаж изо всех сил пытался выровнять лайнер и избежать катастрофы. Но все было тщетно. Автоматика была непреклонна и по крутой траектории вела воздушное судно вниз — навстречу неминуемой гибели.

Трагедия повторилось дважды: 29 октября 2018 года в Индонезии и спустя полгода, 10 марта в Эфиопии. Погибли 346 человек: все пассажиры и оба экипажа. Выживших не было.

В тисках конкуренции

Знаменитая американская корпорация Боинг была озабочена конкуренцией с мощной европейской фирмой Эйрбас. Соперничество двух авиагигантов всегда было напряженным. Самолеты Боинг 737 и европейский А320 стали рабочими лошадками мира пассажирских перевозок.

Они тысячами летали на маршрутах короткой и средней дальности по всей планете. Их продажи были для обоих концернов надежным источником дохода. Рынок был поделен примерно поровну. Но обновленный лайнер А320 грозил нарушить равновесие и вывести Эйрбас далеко вперед.

Новые А320 обещали быть существенно дешевле в эксплуатации. В последние годы расходы на топливо составляли почти 25% операционных расходов авиакомпаний. Эйрбас обещал, что новые самолеты будут на 15% экономичнее прежних.

Новые двигатели на лайнере Боинг 737 MAX

Заказы на новый самолет, названный A320neo, посыпались на европейский концерн. Спрос на лайнер 737 между тем заметно снизился. Боинг не мог оставить это без ответа. Современные двигатели гораздо тише и экономичнее своих предшественников, но по технологическим причинам они гораздо больше в диаметре.

Боинг собирался установить на самолетах 737 МАХ наиболее экономичные двигатели LEAP производства фирмы CFM. Но Эйрбас его опередил.

Как только было объявлено, что Эйрбас будет использовать более бережливые двигатели на новом самолете А320, у Боинга не осталось выхода. Поступить иначе означало совершить коммерческое самоубийство.

И работа закипела! Однако под низко расположенное крыло лайнера 737 новый двигатель не влезал. Его пришлось выдвинуть на пилоне вперед и вверх. Это решило одну проблему, но создало другую.

Новое распределение веса и аэродинамика крыла с двигателем придали самолету необычные характеристики управляемости. У лайнера 737 МАХ обнаружилась тенденция сильно задирать нос, особенно если угол атаки (угол между осью фюзеляжа и землей) слишком велик.

Слишком большой угол атаки

Это очень неприятно. Излишне большой угол атаки может привести к сваливанию — то есть к тому, что набегающий поток воздуха перестанет создавать подъемную силу, которая поддерживает самолет в воздухе. И он начнет стремительно терять высоту. Летчики тщательно избегают подобных ситуаций.

Опытные пилоты-испытатели обнаружили, что новый самолет 737 МАХ управляется совсем не так, как предыдущие поколения 737-й модели. Значит, прежние навыки пилотирования здесь не годятся.

Что делать? Создавать учебный тренажер-симулятор нового лайнера и переучивать сотни пилотов? Но ведь это лишнее время и огромные расходы.

Зачем понадобилась система MCAS

Творческая мысль на выдумки хитра. Находчивые инженеры Боинга придумали палочку-выручалочку под названием «Улучшение характеристик системы маневрирования» — Maneuvering Characteristics Augmentation System (MCAS). Она должна была убрать головную боль и сделать лайнер 737 МАХ похожим в управлении на предыдущие самолеты.

Заодно программа MCAS устраняла недочеты в аэродинамике. Она автоматически предотвращала свойственные лайнеру 737 МАХ попытки самостоятельно задрать нос, когда угол атаки чрезмерно велик. Тем самым устраняется опасность сваливания, вызванная задранным носом.

Гладко было на бумаге, да забыли про овраги

При этом разработчики подчеркивают, что система MCAS не является системой предотвращения сваливания, а нужна для того, чтобы «улучшить горизонтальную стабильность самолета, чтобы он походил в управлении на остальные лайнеры 737-й модели».

Хотя между предыдущим поколением и лайнером 737 МАХ есть значительные отличия, но — благодаря замечательной системе MCAS — пилоты, летавшие на старых Боингах, могли чувствовать себя уверенно. От них требовалось совсем немного: пройти короткий онлайн-курс обучения на флешке — и можно спокойно сесть за штурвал нового самолета.

Так было задумано и допущено к полетам. Но, как говорится, гладко было на бумаге.

Основы программирования. Урок 1. Логика и алгоритмы

— Отличный мозг! Но в чем  дело? Почему люди не умеют писать безошибочные алгоритмы?

Что получилось на самом деле

В кабине раздавались новые сигналы тревоги. Командир безуспешно пытался восстановить контроль над самолетом. Надо срочно набирать высоту! Но как? Когда капитан Яред Гетачу пытался поднять нос Боинга, электронные системы опускали его обратно.

Просто тянуть штурвал на себя оказалось недостаточно. Он щелкнул переключателем на штурвале — это должно было восстановить аэродинамический баланс самолета и направить его вверх. Увы, спустя несколько секунд переключатель автоматически вернулся в исходное положение.

Штурвал затрясся — механическое предупреждение о том, что ситуация становится угрожающей: самолет опасно близок к сваливанию. Звуковая сигнализация продолжала трезвонить о потере высоты.

Пилоты отключили часть электронных систем и стали управлять самолетом вручную. Но контролировать самолет становилось все труднее. К этому моменту он набрал скорость. Аэродинамические силы, удерживающие его в воздухе, стали настолько велики, что противиться им с помощью ручного управления стало невозможно.

Пилоты снова включили электронику, и капитан вновь попытался поднять нос Боинга с помощью переключателя на штурвале. На какое-то время это помогло: самолет вновь начал набирать высоту.

Но затем набор высоты прекратился — снова вмешались компьютеры, которые упрямо гнули свое. Новое предупреждение извещало о том, что самолет движется со слишком большой скоростью — он начал пикировать к земле. В отчаянии капитан Гетачу обратился к помощнику, и они вдвоем налегли на штурвалы в надежде выровнять самолет силой собственных мускулов.

Но и эта последняя попытка не удалась. Самолет продолжал набирать скорость, пикируя все круче, пока не врезался в землю на скорости более 800 километров в час. Всего через шесть минут после взлета.

На те же грабли

Пятью месяцами ранее такой же Боинг 737 MAX индонезийской компании Lion Air вылетел обычным рейсом из Джакарты. Полет в город на западе Индонезии должен был занять около часа. Но спустя несколько минут после взлета пилоты оказались в похожей ситуации.

Самолет, казалось, жил своей жизнью, норовя снизиться, несмотря на усилия пилотов заставить его набрать высоту. Они не понимали, что происходит. Каждый раз, когда они поднимали нос самолета вверх, спустя несколько секунд автоматика упорно толкала его вниз.

Проблемы с управлением летающего дьявола

Это произошло более 20 раз подряд. На земле диспетчеры забеспокоились, глядя на экраны радаров — Боинг явно терял высоту. Один из пилотов сообщил, что у них возникли проблемы с управлением.

Пытаясь разобраться, экипаж растерялся еще больше — приборы командира и второго пилота показывали разную высоту полета. Пилоты не знали точно, на какой высоте они летят и с какой скоростью.

В конце концов, они полностью потеряли контроль над самолетом. Он вошел в крутое пике и на большой скорости врезался в воды Яванского моря.

Серьезный просчет руководства фирмы Боинг и FAA в области безопасности полетов

Потеря двух новых самолетов, трагическая гибель свыше 300 человек, запрет на продолжение полетов и отказ ряда авиакомпаний от закупок новых самолетов 737 МАХ явились тяжелым ударом для Боинга.

Почему вопиющие ошибки в области безопасности самолетов и подготовки пилотов остались незамеченными? Было начато расследование в конгрессе США, ФБР и других инстанциях.

«Они находились в летающих гробах»

На слушаниях в конгрессе расчеты фирмы Боинг и ее руководителя Денниса Мюленбурга подверглись яростной критике.

Сенатор Ричард Блюменталь заявил: «У этих пилотов не было шансов. У этих кем-то любимых людей не было шансов. Они находились в летающих гробах».

Здесь я должен прервать рассказ и вернуться к теме. Нас интересует проблема алгоритмов. Какую роль сыграли алгоритмы в трагедии лайнера 737 МAX? Причина авиационного инцидента связана с низким качеством и неполнотой алгоритмов и жизнеритмов.

Алгоритмы на скамье подсудимых. На руках разработчиков алгоритмов кровь сотен людей

Применительно к лайнеру 737 МАХ слово «жизнеритм» можно трактовать как бизнес-процесс. Имеются в виду бизнес-процессы в широком смысле слова, описывающие функционирование не только коммерческих фирм, но и государственных учреждений (FAA), а также взаимодействие между ними.

При традиционном подходе алгоритмическая часть бизнес-процесса зачастую описывается не строго и эргономически не удовлетворительно. В случае с лайнером 737 МАХ анализ алгоритмов и жизнеритмов не позволил выявить погрешности проектирования и своевременно устранить их. Не позволил предотвратить беду и спасти людей.

Алгоритмы и жизнеритмы

Алгоритмы и жизнеритмы — абстрактные понятия. Однако они должны быть четко описаны и представлены в строгой удобочитаемой форме. Они должны быть пригодны для быстрого чтения и понимания. Если это не так, появляются разночтения и взаимное непонимание — предвестники беды.

Иными словами, все алгоритмические подробности и оттенки алгоритмов и жизнеритмов должны быть тщательно проработаны и аккуратно изложены. Потому что от точности и эргономичности описаний и моделей может зависеть жизнь людей.

Кризис самолета 737 МАХ или кризис понятия «алгоритм»

Алгоритмы находятся внутри компьютеров и выполняются автоматически. Жизнеритмы описывают поведение людей в разнообразных бизнес-процессах. Нужно иметь и то, и другое. Необходимо тщательно сопрягать алгоритмы и жизнеритмы. При создании и эксплуатации самолета 737 МАХ понятие «жизнеритмы» охватывает следующую группу процессов:

— внутренние бизнес-процессы фирмы Боинг, описывающие взаимодействие работников различных отделов и подразделений фирмы друг с другом;

— бизнес-процессы, регламентирующие взаимодействие сотрудников фирмы Боинг и Федеральной авиационной администрации FAA;

— бизнес-процессы, описывающие взаимодействие сотрудников Боинга с авиакомпаниями и другими контрагентами;

— бизнес-процессы, регламентирующие обучение и сертификацию пилотов самолета 737 МАХ, в том числе, в критических и нештатных ситуациях полета.

Жесткое требование

Анализ алгоритмов и жизнеритмов должен показывать реальное состояние дел и демонстрировать упущения, ошибки и слабые места.

Это очень жесткое требование. Двойная авария лайнера 737 МАХ показала, что данное требование не выполняется. Алгоритмы и жизнеритмы не позволили заблаговременно выявить и устранить недостатки, допущенные при разработке и эксплуатации самолета 737 МАХ.Почему? Может быть, понятие алгоритма нуждается в уточнении?

Основы программирования. Урок 1. Логика и алгоритмы

Анализ понятия «алгоритм»

Уже говорилось, что понятие алгоритма, его свойства и нотации создавалось без оглядки на проблему ошибок. Между тем ошибки, упущения и слабые места во многих случаях являются постоянным спутником сложных алгоритмов и сложных программных комплексов. Однако увидеть, обнаружить и заблаговременно исправить подобные недостатки трудно, что ведет к лишним издержкам. Ошибочные алгоритмы никому не нужны. Алгоритм с ошибкой — это не алгоритм.

Актуальной задачей является уточнение понятия «алгоритм» исходя из требования безошибочности. Это требование относится не только к одиночным алгоритмам, но и к алгоритмическим системам, содержащим сотни и тысячи взаимодействующих алгоритмов.

Входит ли нотация в понятие алгоритма

Алгоритм — сложное понятие, в котором можно выделить:— определение алгоритма (интуитивное и формальное); — свойства алгоритма; — нотации, т. е. способы записи алгоритма.

До сих пор свойства и нотации алгоритма рассматривались и изучались в отрыве от потребностей практики, которая заинтересована в сокращении числа ошибок. Это имело негативные последствия.

Недооценка проблемы безопасности открыла путь к использованию нежелательных методов разработки алгоритмов — небезопасных методов, порождающих ошибки. Такое положение следует признать неприемлемым.

Комплексная программа уменьшения числа ошибок

Наряду с устоявшимся понятием «алгоритм» целесообразно ввести понятие «безошибочный алгоритм». Речь идет не просто о термине, а о нацеленной в будущее комплексной программе значительного сокращения ошибок в алгоритмах за счет использования новых (когнитивно-эргономических и формальных) методов. Программа называется «подавление ошибок» и здесь не описана.

«Нет-нет-нет, мы хотим сегодня! Нет-нет-нет, мы хотим сейчас!». Я понимаю, но статья имеет пределы.

Свойства и нотация безошибочных алгоритмов

Свойства и нотация безошибочных алгоритмов должны:— оцениваться с учетом требования безошибочности, которое следует считать приоритетным; — тщательно выбирать и рекомендовать такой способ записи алгоритма, который предотвращает ошибки; — запрещать способы записи, содействующие появлению ошибок (или присваивать им низкую оценку).

Создание безошибочных алгоритмов следует начинать с разработки эргономичной нотации, которая способна предотвращать ошибки.

Повторю все ту же мантру безошибочности. В новую нотацию нужно встроить незаметный для пользователей математический аппарат, предотвращающий ошибки.

Понятность и понимаемость безошибочного алгоритма

Следует различать два свойства алгоритма: понятность и понимаемость. Свойство «понятность» говорит о том, что алгоритм должен быть понятен компьютеру, т. е. состоять из инструкций, входящих в его систему команд. Это разумное и очевидное свойство алгоритма.

К сожалению, при этом зачастую выпадает из поля зрения не менее важное свойство «понимаемость алгоритма» для человека. Имеется в виду человек, который читает или изучает алгоритм с целью выявления ошибок, упущений, слабых мест и иных недостатков.

Такая проверка может проводиться в любое время в процессе жизненного цикла алгоритма. Проверку могут проводить разные люди: автор алгоритма, его руководитель, заказчик, специалисты по сопровождению (эксплуатации) алгоритма и др.

Понимаемость (understandability) алгоритма для человека (в отличие от понятности для компьютера) означает удобочитаемость, то есть ясность, доходчивость, пригодность алгоритма для быстрого и легкого понимания и выявления ошибок.

Зачем нужна понимаемость

Понимаемость есть совокупность свойств алгоритма, характеризующая затраты усилий пользователя на понимание логической концепции этого алгоритма (ГОСТ 28806-90).Чтобы облегчить выявление ошибок при зрительной проверке за столом, указанные затраты должны быть минимальными.

Отсюда следует, что понимаемость есть свойство алгоритма минимизировать интеллектуальные усилия, необходимые для его понимания при зрительном восприятии алгоритма человеком. Понимаемость необходима при создании безошибочных алгоритмов.

Если бы алгоритмы и жизнеритмы (бизнес-процессы) фирмы Боинг и FAA обладали надлежащим качеством и свойством «понимаемость», то ошибки, упущения и слабые места в самолете 737 МАХ были бы своевременно выявлены и устранены, катастрофа не произошла бы, а пассажиры и экипажи остались бы живы.

Основы программирования. Урок 1. Логика и алгоритмы

Задачи становятся все сложнее. Их все труднее понять. Понимание — это труд. Производительность этого труда недопустимо мала.Необходимы новые: когитивнно-эргономические и формальные методы, чтобы облегчить понимание.

Дискуссия о понимании алгоритмов

Низкая понимаемость алгоритмов и программ — важный недостаток современного программирования. Джозеф Фокс, руководитель отделения федеральных систем IBM, у которого в подчинении было 4400 человек, объясняет, в чем дело:

«Некий превосходный программист спроектировал и написал программу определения орбитальных характеристик искусственного спутника Земли. Он первым закончил программирование, все работало правильно, память попусту не тратилась. Программа была написана на языке Фортран и занимала около четырех страниц плотного фортрановского текста. Он знал свою программу вдоль и поперек.

«Через три месяца его попросили добавить к программе несколько новых функций. Он достал документацию (описание программы) и принялся ее изучать. Три или четыре дня он пытался понять, что же происходит в его программе. А ведь он ее сам написал! Сколько бы сил он потратил, если бы это была чужая программа!».

Разве можно с этим мириться?

Эта удивительная история подтверждает простую истину: алгоритм вещь сложная и понять его непросто. Оказывается, даже сам автор программы спустя три месяца не сумел расшифровать свой собственный алгоритм.

Чтобы прочитать всего четыре страницы и докопаться до истины, превосходному программисту пришлось изрядно помучиться. И потратить три или четыре дня.

Отсюда следует неутешительный вывод. Глядя на исходный текст программы, понять сложный алгоритм очень трудно. А быстро понять — невозможно. Разве это хорошо? Разве можно с этим мириться?

Чему учит история авиации

История авиации — это история замечательных достижений и одновременно история катастроф и человеческих трагедий.Анализируя неудачу лайнера 737 МАХ, можно указать два варианта развития событий:— традиционный подход к исследованию причин катастроф и аварий и исправлению недостатков; — принципиально новый подход к безошибочности, опирающийся на Комплексную программу уменьшения числа ошибок.

Первый вариант ведет к успеху методом проб и ошибок, где проба — это очередная катастрофа, причем платить приходится жизнями людей.

Второй вариант нацелен на поиск более рационального решения. При этом важную роль играет новая нотация, специально предназначенная для создания безошибочных алгоритмов. Не забудьте про мантру безошибочности.

Нотация безошибочного алгоритма

Нотация алгоритма — это система обозначений, позволяющая записать, прочитать и понять алгоритм.Кому интересно, можно полистать мою книгу «Учись писать, читать и понимать алгоритмы. Алгоритмы для правильного мышления».

При обычном подходе к выбору нотации требование об отсутствии ошибок не ставится и не рассматривается. Такой подход уязвим для критики, ибо позволяет использовать для записи алгоритмов любую подходящую нотацию, например:— естественный язык (включая словесно-формульную запись);— псевдокод;— язык программирования;— блок-схему согласно ГОСТ 19.701-90 (ISO 5807-85);— схему деятельности (activity diagram) языка UML;— диаграмму Несси-Шнейдермана и т. д.

Все нотации не годятся

Все нотации из этого списка имеют существенные недостатки. Они не обладают свойством эргономичности и не могут использоваться для безошибочных алгоритмов.

Новый способ записи должен быть эргономичным и значительно более эффективным. Новая нотация способна обеспечить почти полное отсутствие ошибок. При этом используется батарея новых методов подавления ошибок, которая здесь не описана.

Основы программирования. Урок 1. Логика и алгоритмы

— Что делает этот чудак?— Изобретает новую нотацию.

Когнитивно-эргономический подход

Цель — облегчить и ускорить понимание алгоритмов и выявление ошибок.Для этого необходимо устранить или ослабить когнитивные затруднения, то-есть трудности понимания алгоритмов.

Когнитивно-эргономический подход — это рабочий метод, дающий полезные плоды — улучшение понимаемости алгоритмов и программ, предотвращение многих ошибок, повышение производительности сложного интеллектуального труда.Не надо путать.  Когнитивно-эргономический подход и синтаксический сахар — разные вещи.

Основы программирования. Урок 1. Логика и алгоритмы

Можно ли создать алгоритмический язык, способный предотвращать ошибки

Показано, что заданным требованиям удовлетворяет визуальный алгоритмический язык ДРАКОН.На Хабре: Визуальное программирование на языке ДРАКОН. В Википедии: ДРАКОН. In Wikipedia: DRAKON.Книга: Алгоритмы и жизнеритмы на языке ДРАКОН. Разработка алгоритмов. Безошибочные алгоритмы.

Как и все прочие языки, ДРАКОН опирается на математику и логику. Однако сверх того, он самым тщательным образом учитывает когнитивные вопросы. Благодаря систематическому использованию когнитивно-эргономических методов ДРАКОН приобрел уникальные эргономические характеристики.

В будущем он сможет претендовать на звание чемпиона по критерию «понимаемость алгоритмов и программ» (в классе императивных языков).

Язык ДРАКОН. Алгоритмическая макроконструкция «силуэт»

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 1. Алгоритм «Проверка летающей тарелки»

Язык ДРАКОН. Алгоритмическая макроконструкция «примитив»

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 2. Плохой дракон-алгоритм. а) Нарушено правило «Чем правее, тем хуже».б) Нарушенр правило: «Главный маршрут должен идти по шампуру».

Главный маршрут (жирная линия) все время петляет и делает зигзаги. Его трудно проследить взглядом.

Главный маршрут — это царская дорога (happy path). Это наиболее благоприятный маршрут алгоритма.

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 3. Хороший дракон-алгоритм. Он получен в результате улучшения схемы на рис. 2 с помощью операции «рокировка». а) Выполняется правило «Чем правее, тем хуже». б) Главный маршрут прямой как стрела. Он идет по шампуру.

Эдсгер Дейкстра, Бертран Мейер, Игорь Вельбицкий

Потенциально опасные текстовые средства потока управления можно заменить на безопасные визуальные средства управления.

Начнем с истории. В 1968 году Эдсгер Дейкстра в журнале «Communications of the ACM» указал, что оператор goto, используемый во многих языках программирования высокого уровня, является основным источником ошибок и потому должен быть запрещен.

Затем Бертран Мейер выявил еще два опасных элемента — операторы break и continue, который также следует запретить как замаскированные goto. По словам Мейера, это те же старые «goto в овечьей шкуре». Еще дальше идет Игорь Вельбицкий, который считает, что из программирования следует исключить:

Язык ДРАКОН продолжает и развивает традицию, начатую Дейкстрой и продолженную Вельбицким и Мейером. Традицию, направленную на выявление и изгнание потенциально опасных операторов управления, которые могут послужить причиной ошибок.

В чем идея

Идея проста и сводится к двум положениям:— надо выявить потенциально опасные служебные слова, логические скобки и знаки пунктуации, используемые в операторах управления, и запретить их;— вместо них следует использовать безопасную графику.

Основы программирования. Урок 1. Логика и алгоритмы

Визуальное (двумерное) структурное программирование

Все они подлежат замене на математически строгую графику управления. Графика реализует ту же самую функцию, что и забракованные элементы.

Замена текстовых операторов на их точные графические эквиваленты означает, что язык ДРАКОН использует двумерное (2d) структурное программирование. Последнее можно рассматривать как дальнейшее развитие одномерного (1d) структурного программирования, которое создали Эдсгер Дейкстра, Тони Хоар, Оле-Йохан Дал и др.

«Чем вам ключевые слова, логические скобки и знаки пунктуации помешали?»

Правило Эшфорда гласит: «Бесполезно стремиться направить внимание на важнейшие характеристики, если они окружены лишними, не относящимися к ним визуальными раздражителями, мешающими восприятию главного».

Опасный катализатор ошибок

Отрицательную роль перечисленных текстовых операторов управления можно охарактеризовать как «опасный катализатор ошибок», ибо они:— отвлекают внимание программиста, затрудняют понимание смысла программы, делают работу программиста трудной;— засоряют визуальную картину программы, создают визуальные помехи, фактически являясь ненужными, паразитными элементами, без которых можно обойтись;— с неумолимой неизбежностью провоцируют появление ошибок.

Впрочем, указанные текстовые операторы никуда не исчезают и продолжают тянуть свою лямку как рабочие лошадки. Просто человек их не видит и не пишет. И не смотрит на них, как мы не смотрим на исполняемый код после компиляции.

Человек рисует графические операторы управления (дракон-схемы похожи на блок-схемы) и работает с ними.

Какова цель

Цель заключается в том, чтобы улучшить способность языков проектирования и программирования предупреждать появление ошибок.

Нужно существенно увеличить надежность программно-математического обеспечения. Ниже показано, что операторы, провоцирующие ошибки, можно обезопасить.

Сравнение текста и графики для оператора while

Основы программирования. Урок 1. Логика и алгоритмы

Слева имеются паразитные элементы (while и две скобки). Справа их нет

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 4. Оператор while можно удалить и заменить на управляющую графику языка ДРАКОН

В си-программе на рис. 4 имеются избыточные элементы, которые можно изъять с целью улучшения исходного кода программы. Вот они:— while;— две круглые скобки;— две фигурные скобки.

Си-оператор на рис. 4 слева содержит загромождающие паразитные элементы, отсутствующие в дракон-операторе справа. Следствием является неоправданное усложнение си-оператора, которое засоряет программу и отвлекает внимание программиста.

В дракон-программе избыточные (паразитные) знаки не нужны. Вместо них используются линии формального чертежа. Эргономичный чертеж гораздо лучше, чем текст, показывает маршруты алгоритма, а также петлю обратной связи и тело цикла.

Катализатор ошибок. Анализ операторов switch, case, break

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 5. Оператор switch, case, break можно удалить и заменить на управляющую графику ДРАКОНа

На рис. 5 слева показана си-программа с операторами switch, case, break, а справа — эквивалентная дракон-программа. В си-программе используется большое количество ненужных ключевых слов и знаков пунктуации:— switch, — case (два раза),— break (два раза),— две фигурные скобки,— две круглые скобки,— три двоеточия, — пять точек с запятой.

Указанные слова и знаки для языка Си являются обязательными элементами исходного текста программы. Обойтись без них невозможно, они должны соответствовать формальным правилам синтаксиса языка Си, которые проверяются при компиляции в ходе лексического и синтаксического анализа.

С точки зрения языка ДРАКОН, дело обстоит принципиально по-другому. То, что важно и необходимо для Си, язык ДРАКОН рассматривает как лексический и синтаксический мусор, как слова-пустышки и знаки-паразиты, как бессмысленные, ненужные и вредные элементы, которые подлежат изъятию и удалению. Потому что они являются катализаторами ошибок.

Расчет

Приведем количественный расчет. В си-программе на рис. 5 использовано 55 символов (characters) без пробелов, а в дракон-программе всего 19, т. е. в 2,9 раза меньше. Благодаря графике дракон-программа легче для восприятия, в ней проще разобраться и заметить ошибку.

Дополнительное удобство для чтения программного кода связано с тем, что размещение символов в пространстве подчиняется строгим правилам эргономичной декомпозиции и правилам отделения фигуры от фона.

Основы программирования. Урок 1. Логика и алгоритмы

Мышление пора менять

ДРАКОН должен удовлетворять требованию безошибочности алгоритмов. Такое требование предъявляется к языку впервые. Оно символизирует принципиально новый подход к разработке алгоритмического языка.

Требование не выполняется, но стимулирует изменение мышления.Впрочем, почему не выполняется? Вот народные отзывы из сети:

Участник vtral:Язык Дракон — это способ визуального описания алгоритмов, исключающий ошибки.

Сергей Иголкин (Orthodox):Дракон, на самом деле — чертовски хорош. Не тем, что красивые диаграммки. Или охрененные разнообразные возможности (хотя хватает).А тем, что главную свою цель обеспечивает — сложные алгоритмы писать и отлаживать без ошибок.

Индивидуальный предприниматель Сергей Ефанов: Переписал на ДРАКОНе довольно запутанную функцию из реального проекта.Функция заработала сразу!Более того, при переносе алгоритма в дракон-схему, я обнаружил, что у меня в ней была ошибка! Эта функция работала уже довольно давно, не в одной сотне изделий. Ошибка не была фатальной, она возникала редко, и компенсировалась переподключением к серверу. Но она была! В тексте на Си ее было незаметно. А при попытке перенести алгоритм на дракон-схему, ошибка стала не просто заметной — алгоритм в этом месте «не вырисовывался»!

Что значит «алгоритм не вырисовывался»?

Это значит, что ДРАКОН срывает с ошибки шапку-невидимку и делает ее видимой. Ошибка как бы выпрыгивает из чертежа, бьет разработчика кулаком в нос и громовым голосом кричит: «Вот она я! Заметь меня!».

Больше того, умная программа ДРАКОН-конструктор (интеллектуальный графический редактор) во многих случаях не дает человеку ошибиться. Физически не позволяет.

Каким образом? В программу заложены правила рисования дракон-алгоритмов (визуальное логическое исчисление), которые она строго соблюдает. Отступление от правил невозможно. Если человек попытается нарушить правила и совершить ошибку, ДРАКОН-конструктор откажется повиноваться и не станет рисовать глупости. Именно это означает фраза Сергея Ефанова «алгоритм не вырисовывался». Это пример того, как работает мантра безошибочности.

Дракон-схемы и блок-схемы

Чем отличаются дракон-схемы от блок-схем? Это все равно, что спросить: «Чем отличается человек от обезьяны». Чтобы не тратить много слов, приведу два отзыва из сети.

Роман Озеров: «Я на ДРАКОНе работаю уже 6 лет. Любое создание программы начинаю с него и при отладке работаю только с ним. Скорость разработки, качество возрастает в разы! ДРАКОН это сила, но многие не догоняют, думают, что это обычная блок-схема».

Участник dvuugl: Если нужно рисовать алгоритм, теперь только и только на Драконе. Считаю, что он должен стать государственным стандартом для блок-схем вместо существующего. Удивительно, что авторы книг продолжают использовать прежние схемы, на которые после Дракона без ужаса смотреть невозможно».

Основы программирования. Урок 1. Логика и алгоритмы

Визуальный аксиоматический метод (визуальная формальная система)

Мантра безошибочности включает специальный математический аппарат — логическое исчисление. Особенность в том, что это визуальное логическое исчисление.

В языке ДРАКОН есть две визуальных аксиомы:— аксиома-силуэт, — аксиома-примитив.

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 6. Аксиома-силуэт и аксиома-примитив служат заготовками для построения силуэта и примитива соответственно. Кружками показаны валентные точки.

Любой дракон-алгоритм силуэт (см. рис. 1) логически выводится из аксиомы-силуэт с помощью правил вывода (визуального логического вывода).

Любой дракон-алгоритм примитив (см. рис. 3) логически выводится из аксиомы-примитив точно так же — с помощью визуального логического вывода.

Что значит «выводится»? Это значит, что графика макроконструкций силуэт и примитив является визуальной теоремой. Доказанной теоремой. Ее не надо доказывать, так как она уже доказана в силу свойств логического исчисления.Данное исчисление называется «исчислением икон».

Причем здесь аксиоматический метод?

Ответ под спойлером:

SpoilerЕршов Ю.Л., Палютин Е.А. Математическая логика. — М.: Наука, 1079. — 320 с. — С.12, 13. Основным итогом деятельности в области оснований математики можно считать становление математической логики как самостоятельной математической дисциплины, а принципиальным достижением математической логики — разработку современного аксиоматического метода, который может быть охарактеризован следующими тремя чертами:Основным объектом изучения в математической логике являются различные исчисления.Наряду с синтаксическим изучением исчислений проводится также семантическое изучение формальных языков математической логики. Основным понятием семантики является понятие истинности для выражений (формул, секвенций и т. п.) формального языка.

Валентные точки языка ДРАКОН

«Основной недостаток блок-схем заключается в том, что они не приучают к аккуратности при разработке алгоритма. Ромб можно поставить в любом месте блок-схемы, а от него повести выходы на какие угодно участки. Так можно быстро превратить программу в запутанный лабиринт, разобраться в котором через некоторое время не сможет даже сам ее автор».

В языке ДРАКОН подобные чудеса невозможны, в частности, благодаря институту валентных точек. Последние служат для предотвращения ошибок.

Рис. 7. На анимации валентные точки показаны желтыми кружками.Иконы и макроиконы можно вводить только в валентные точки и больше никуда.

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 8. Размножение валентных точек при проектировании дракон-алгоритма

Формализация точек размещения икон

Валентные точки можно рассматривать как точки размещения икон, или точки ввода икон.

На каждом шаге построения алгоритма происходит размножение валентных точек. Процесс размножения показан на рис. 8. В аксиоме-силуэт всего 3 валентных точки. После добавления конструкции «Ветка» будет уже 5 точек. А после вставки иконы Действие число точек увеличивается до 6 (рис. 8). Дальнейший процесс построения силуэта приводит к монотонному росту числа валентных точек.

Это значит, что иконы можно вставлять не куда угодно, а только в строго определенные места. Для каждой валентной точки определен список икон, которые разрешается вставить в данную конкретную точку.

Ввод иконы производится так. Сначала происходит разрыв соединительной линии в выбранной пользователем валентной точке. Затем в место разрыва вставляется икона.

Все списки (списки валентных точек и списки разрешенных икон) хранятся в памяти прораммы ДРАКОН-конструктор, который осуществляет визуальный логический вывод. Таким образом, описанная операция строго формализована и защищена от многих ошибок.

Математический чертеж дракон-алгоритма

Математический чертеж алгоритма — это чертеж, для которого определены: — формальное описание алфавита графических фигур (икон и макроикон), причем иконы заданы вместе с отростками, что исключает неоднозначность; — формальное описание синтаксиса, то есть соединительных линий между фигурами; — визуальное логическое исчисление, позволяющее из аксиомы-силуэт и аксиомы-примитив строить формализованный чертеж алгоритма методом логического вывода. Язык ДРАКОН разработан исходя из этих предпосылок.

Основы программирования. Урок 1. Логика и алгоритмы

Интеллектуальный ДРАКОН-конструктор

Попробуйте бесплатный онлайн ДРАКОН-конструктор DrakonHub. Вот инструкция. Вы убедитесь, что процесс рисования происходит удобно, легко и с большой скоростью.

Забудьте о линиях! Не царское это дело — рисовать линии

Во избежание ошибок пользователю запрещено рисовать соединительные линии между иконами на дракон-схеме. Потому что он такого нарисует — мама не горюй!Все соединительные линии автоматически создает интеллектуальная программа ДРАКОН-конструктор.

Почему она интеллектуальная? Потому что использует специальный математический аппарат — визуальное логическое исчисление (исчисление икон).

Как работает ДРАКОН-конструктор

Ответ показан на анимациях (рис. 9 и рис. 10). Слева панель инструментов (toolbar). Рис. 9 демонстрирует скорость работы. Рис. 10 поясняет, как переделать уже сделанное.

Оба рисунка показывают работу с макроконструкцией примитив. Редактирование силуэта происходит точно так же. Переход от примитива к силуэту и обратно производится кнопкой на тулбаре внизу справа.

Рис. 9. ДРАКОН-конструктор позволяет создать сложный алгоритм в наглядном виде и очень быстро

Рис. 10. ДРАКОН-конструктор позволяет переделывать алгоритм (удалять, вставлять и переставлять графические фигуры) очень быстро

При этом вообще не надо думать о соединительных линиях между фигурами.Все проблемы с соедительными линиями ДРАКОН-конструктор решает самостоятельно, автоматически без участия человека. На анимации видно, что пользователь не провел ни одной соединительной линии! Тем не менее все линии образовались, причем образовались правильно, без ошибок.

Правила ДРАКОНа

Язык ДРАКОН содержит большое число правил. К счастью, их не надо учить и запоминать. Почему? Потому что правила знает назубок, хранит в своей памяти и скрупулезно выполняет программа ДРАКОН-конструктор.

Вот пример. В дракон-схемах запрещено пересечение линий, обрывы линий и внутренние соединители. Запрет выполняется автоматически. Конструктор гарантирует отсутствие пересечений на основе строгой математической теории — исчисления икон.

Основы программирования. Урок 1. Логика и алгоритмы

Визуальная алгоритмическая логика языка ДРАКОН. Математическая логика в алгоритмах. Визуальная алгебра логики

Это большая тема и в рамках статьи изложить ее невозможно. Будут даны лишь самые краткие пояснения.

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 11. Стандартный (слева) и нестандартный (справа) алгоритм «ИЛИ»

Классическая (текстовая) и неклассическая (визуальная) алгебра логики

Укажем различие между классическим и неклассическим вариантами алгебры логики (на примере дизъюнкции).

В классическом варианте используется линейная запись логической функции  «ИЛИ», которая не показывает свою инверсию и принципиально не может описать инверсный маршрут алгоритма (рис. 11, в самом низу).

В неклассическом случае применяется графическая запись логической функции «ИЛИ» (рис. 11), которая изображает одновременно как главный, так и инверсный выходы.

Зададим вопрос: какой принцип используется для разграничения успеха и неудачи?

Классический вариант использует «принцип отделения единицы (Истина) от нуля (Ложь)». Если функция равна 1 — это хорошо, если равна 0 — плохо.

Неклассический вариант использует «принцип переключателя маршрутов». Если выбран главный выход, это хорошо, если инверсный — плохо.

Стандартный и нестандартный логический алгоритм «ИЛИ»

Стандартный логический алгориитм «ИЛИ» для N логических переменных — это алгоритм, содержащий N икон Вопрос, которые: — расположены лесенкой; — в каждой иконе Вопрос содержится одна логическая переменная.

Стандартный алгоритм «ИЛИ» для трех логических переменных представлен на рис. 11, слева.

Нестандартный логический алгоритм «ИЛИ» для N логических переменных — это алгоритм, полученный с помощью рокировки стандартного алгоритма «ИЛИ». На рис. 11 (справа) показан нестандартный алгоритм для случая трех переменных.

Стандартная и нестандартная схемы «ИЛИ» равносильны. Они описывают один и тот же алгоритм.

Четыре маршрута стандартного алгоритма ИЛИ. Формулы маршрутов

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 12. На схеме «ИЛИ» показаны четыре формулы маршрутов (в четырех желтых выносках). Каждая формула — это конъюнкт.

Алгоритм ИЛИ на рис. 12 имеет четыре маршрута. Для каждого из них можно построить формулу маршрута в виде конъюнкта.

Первый маршрут идет по шампуру и имеет формулу “А да”. Слово «да» означает, что буква А берется без отрицания, как показано в левой выноске.

Второй маршрут идет правее с формулой “A нет B да”. Преобразовав в конъюнкт, получим ¬A & B

Третий маршрут идет еще правее и имеет формулу “A нет B нет С да”. После преобразования в конъюнкт, получим ¬A & ¬B & C

Наконец, четвертый маршрут (крайний справа) имеет формулу “A нет B нет С нет” и превращается в конъюнкт: ¬A & ¬B & ¬C. Последний маршрут задает инверсный выход.

Стандартный и нестандартный логический алгоритм «И»

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 13. Стандартный (слева) и нестандартный (справа) алгоритм «И»

Стандартная логическая схема «И» для N логических переменных — это схема, содержащая N икон Вопрос, которые: — расположены на одной вертикали; — в каждой иконе Вопрос содержится одна переменная.

Стандартная схема «И» для трех логических переменных представлена на рис. 13, слева.

Нестандартная логическая схема «И» для N логических переменных — схема, полученная с помощью рокировки стандартной схемы «И». На рис. 13 (справа) дан пример нестандартной схемы для трех переменных.

Стандартная и нестандартная схемы «И» равносильны. Они описывают один и тот же алгоритм.

Принципиальный дефект (ахиллесова пята) текстового программирования

В текстовом программировании (textual programming)), чтобы правильно выразить логическую мысль, во многих случаях приходится использовать логическое отрицание, которое служит катализатором ошибок. Обойтись без этого приема (без логического отрицания) в текстовом программировании невозможно.

Визуальное программирование на языке ДРАКОН лишено этого недостатка. Чтобы избавиться от логического отрицания, надо (всего лишь!) поменять местами «Да» и «Нет» на выходах иконы Вопрос. Такой прием называется произвольным расположением «Да» и «Нет» на выходах иконы Вопрос.

Расстановка «Да» и «Нет» на выходах иконы Вопрос в алгоритме «И»

Глядя на рис. 13 (слева), можно заметить, что нижние выходы у трех икон Вопрос помечены словом «Да». Является ли такой подход обязательным? Можно ли изменить расстановку «Да» и «Нет» и поменять их местами?

Да, можно. Чтобы убедиться в этом, на рис. 14 (слева) показан другой вариант — возле иконы B мы изменили расстановку «Да» и «Нет» на противоположную.

На что повлияло такое изменение?

Во-первых, на нестандартную схему «И», где возле иконы В также изменилась расстановка «Да» и «Нет» (рис. 14, справа). Во-вторых, изменение затронуло формулу главного и инверсного выхода (над буквой B либо появился, либо исчез знак отрицания).

Подведем итоги. Пользователь имеет право расставлять слова «Да» и «Нет» по своему усмотрению. Принцип построения логической схемы «И» (как стандартной, так и не стандартной) при этом остается неизменным. Разумеется, нестандартная схема всегда должна выводиться из стандартной с помощью рокировки.

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 14. Стандартный (слева) и нестандартный (справа) алгоритм «И».Произвольное расположение «Да» и «Нет» на выходах икон Вопрос позволяет удалить неоправданные связки отрицания, которые являются катализаторами ошибок

Логические связки желательно устранить из дракон-алгоритмов

Как известно, логическое отрицание представляет определенную трудность для понимания.

В похожие ловушки часто попадают не только программисты. Трудности испытывают и многие другие люди. Опасность ошибочного понимания провоцируют не только знаки отрицания, но и другие связки.

Сходные предостережения делает не только Йодан. Его поддерживает Гленфорд Майерс: «Распространенным источником ошибок является использование логических операций И и ИЛИ».

Возникает вопрос: можно ли устранить подобные источники ошибок? Существует ли радикальное средство, позволяющее ликвидировать опасные места, спрятанные в логических выражениях и провоцирующие появление ошибок?

К счастью, от этой неприятности можно избавиться. Ниже будет показано, что логическое отрицание (и другие логические связки) можно безболезненно изъять из графических логических выражений.

Рекомендации эргономики

Эргономика позволяет сделать алгоритмы (дракон-схемы) более легкими и удобными для понимания. Глядя на эргономичную дракон-схему, человек может сказать: «Посмотрел — и сразу понял!».

Многие люди испытывают трудности, когда видят внутри икон Вопрос сложные логические формулы, содержащие знаки И, ИЛИ, НЕ. Таким людям можно помочь, исключив эти нежелательные знаки.

Удаление логических связок из алгоритмов

Дракон-алгоритм, содержащий внутри икон Вопрос логические знаки И, ИЛИ, НЕ, всегда можно преобразовать в эквивалентный дракон-алгоритм, не содержащий указанных знаков.

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 15. Удаление логических связок с целью предотвращения ошибок

Конъюнкция без знака конъюнкции

Основы программирования. Урок 1. Логика и алгоритмы

Дизъюнкция без знака дизъюнкции

Основы программирования. Урок 1. Логика и алгоритмы

Визуальная логика. Визуализация сложной логической функции

На рис. 18 вверху показана сложная логическая функция Z. Она содержит семь логических связок, а именно: четыре конъюнкции &, одну дизъюнкцию V и два отрицания (верхняя черта).При визуализации мы должны удалить все семь связок. Результат визуализации формулы Z показан на рис. 18 на главном выходе дракон-алгоритма. Легко видеть, что в дракон-алгоритме логические связки полностью отсутствуют.

Основы программирования. Урок 1. Логика и алгоритмы

Рис. 18. Как нарисовать дракон-алгоритм для сложной логической функции

Мантра безошибочности

В языке ДРАКОН предусмотрено много средств для обеспечения безошибочности. Некоторые из них (но не все) описаны выше.Полную совокупность средств безошибочности языка ДРАКОН для краткости можно назвать мантрой безошибочности.

Основы программирования. Урок 1. Логика и алгоритмы

Частичное доказательство правильности дракон-алгоритмов

Дэвид Грис указывает: «доказательство должно опережать построение программы».

Объединив оба требования, получим, что автоматическое доказательство правильности должно опережать построение алгоритма. Нетрудно убедиться, что метод исчисления икон обеспечивает частичное выполнение этого требования.

Известно, что логический вывод позволяет применить к аксиомам правила вывода и получить строго доказанные теоремы. Визуальный логический вывод, следуя этой схеме, берет за основу две визуальных аксиомы языка ДРАКОН (аксиому-силуэт и аксиому-примитив). Применяя к ним визуальные правила вывода, получим шампур-схему, т. е. графический каркас дракон-алгоритма.

Во внутренних алгоритмах ДРАКОН-конструктора закодировано исчисление икон. Поэтому любая шампур-схема, построенная с его помощью и не содержащая критических точек, является истинной, то есть правильно построенной. Этот результат означает, что: ДРАКОН-конструктор осуществляет частичное автоматическое доказательство правильности шампур-схем.

Мантра экономичности (без дополнительной затраты времени, средств и ресурсов)

Здесь необходима оговорка. Частичное доказательство правильности дракон-алгоритма с помощью «ДРАКОН-конструктора» осуществляется автоматически и достигается совершенно бесплатно, так как дополнительные затраты труда, времени и ресурсов не требуются. Так что полученный результат (почти безошибочное автоматическое проектирование графики дракон-алгоритмов) следует признать значительным достижением.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *