Поблагодарите добровольца и попросите аудиторию поаплодировать ему.
Хитрые алгоритмы
Какое отношение фокус имеет к информатике? Здесь мы имеем так называемый самовоспроизводящийся фокус — именно это в информатике называют алгоритмом. Под алгоритмом подразумевается серия инструкций, которая всегда приводит к конкретному желаемому эффекту, если следовать им в заданном порядке. В данном случае — магический эффект: у вас остается именно предсказанная карта. Компьютерные программы — всего лишь алгоритмы, написанные на языке, который скорее поймет компьютер, чем фокусник. С их помощью программист добивается, чтобы программа выполняла задуманные им действия.
Алгоритм, лежащий в основе «Сна об австралийском маге», показан на рис. 5.
Этот конкретный алгоритм содержит не только шаги, которые надо выполнять последовательно. В нем есть циклы, например «повторите 4 раза». Цикл показывает, что некоторые инструкции надо повторить. Он позволяет не писать одно и то же много раз. Именно такие инструкции программисты используют в компьютерных программах, чтобы компьютер повторил какие-то указания. Есть и второй цикл: «Повторите, пока не останется карт». Этот цикл воспроизводится 4 раза, как указано в первом цикле. Каждый раз вы проходите через всю колоду, оставляя и сбрасывая карты, пока не останется ни одной.
Придумываем фокусы
Чтобы придумать новый трюк, фокусник должен использовать тот же тип мышления, что и ученый-информатик, — а именно вычислительное мышление. Карточный фокус подразумевает вычисления, только они проводятся с помощью колоды карт вместо компьютера. Чтобы изобрести новый фокус, необходимо алгоритмическое мышление. Фокусник должен продумать серию шагов, которые можно повторить и обязательно получить магический эффект. Ему абсолютно необходимо, чтобы фокус получался всегда. Он не хочет глупо выглядеть на сцене, и поэтому нужно продумать все до мельчайших деталей. Необходимо удостовериться, что шаги должны делаться именно в указанной последовательности. Как и в программировании, нужно продумать каждый возможный вариант. Может ли доброволец как-то помешать выполнению фокуса? Если да, нужно знать, что делать в этом случае. Кроме того, следует достаточно точно записать все действия, чтобы в будущем сам фокусник или кто-то другой смог повторить их и успешно показать фокус (хотя маги, в отличие от ученых-информатиков, не склонны раскрывать свои секреты!). Все это — алгоритмическое мышление в действии.
Главное здесь в том, что, как только маг изобрел свой трюк и записал алгоритм (возможно, рунами!), всякий, кто знает этот алгоритм, в состоянии показать фокус. Для этого не придется ничего изобретать. Надо просто четко следовать инструкциям. Ученик чародея может показать фокус, даже если ему абсолютно не понятно, как он работает. Правильно и точно выполните необходимые действия — и получите задуманный волшебный эффект.
Почему это важно для информатики? Именно так мы добиваемся, чтобы работал компьютер. Компьютеры — это куски металла и кремния. Они не понимают, что делают. Просто слепо следуют инструкциям, как ученик колдуна. Программисты делают всю творческую работу, составляя инструкции. Для программирования важен навык писать инструкции очень точно и недвусмысленно, чтобы не допустить несоответствий. Цель каждой инструкции не должна вызывать никаких сомнений: компьютер должен в точности следовать указаниям. Каждый возможный исход событий должен быть описан в инструкции — компьютер не справится с непредвиденным. Однако, следуя этим указаниям, компьютер может творить чудеса (и даже казаться разумным, как мы увидим далее).
Все электронные устройства, которые вы когда-либо видели в действии, слепо следуют алгоритму.
Делим на части
Чтобы придумать фокус, например можно составить его из частей, отдельно поработав над каждым шагом и его представлением. Здесь мы снова наблюдаем вычислительное мышление в действии, а именно — декомпозицию. Фокус «Сон об австралийском маге» состоит из четырех основных шагов. Во-первых, нужно подготовить колоду, поместив карты на известные позиции. Во-вторых, нужно сбросить нижнюю часть колоды, создав у добровольца ощущение, что он сам выбирает, как ее поделить, от чего зависит результат (хотя это не так). Следующий шаг — раскладывать карты так, чтобы в итоге осталась одна. И последний шаг — раскрыть предсказание. Если мы запишем фокус в виде алгоритма на этом уровне детализации, то получим что-то вроде изображенного на рис. 6а.
Обратите внимание, что здесь мы прибегли к абстрагированию, то есть прячем детали. В этом описании мы скрыли, как выполняются шаги. Эти детали можно записать в виде отдельного мини-алгоритма. Например, алгоритм для шага, когда мы сбрасываем каждую вторую карту, как показано на рис. 6b.
На самом деле мы уже занимались такого рода абстрагированием для каждого из шагов в начальной версии алгоритма. Зачем? Чтобы вы увидели общую идею и не увязли в подробностях.
Такого рода декомпозиция значительно упрощает понимание алгоритма. Обращать внимание на детали нужно, только если (или когда) необходимо понять, как их повторить, а не для чего они нужны. Если вы хотите иметь шпаргалку, которая поможет вам запомнить шаги (напишите ее на тыльной стороне кисти), то используйте упрощенную абстрагированную версию. Все детали записывать не нужно, ведь вы не сможете это прочитать. Вероятно, стоит записать одну деталь или один шаг, которые вы все время забываете. Декомпозиция поможет сделать все правильно.
Разложив один фокус на отдельные части, вы можете использовать их элементы в других фокусах. Например, во многих фокусах открывают что-то предсказанное заранее. Можно положить предсказание в конверт и оставить его у всех на виду, как это сделали мы. Однако есть и другие способы. Например, записать видеоролик, в котором ваш друг будет держать предсказанную карту, и показать его. В этом, в частности, и состоит прелесть декомпозиции. Необязательно использовать решение целиком — можно повторно использовать (и обобщить) лишь какие-то его части. Например, когда понадобится что-нибудь «раскрыть», можно использовать описанное решение.
Декомпозиция также позволяет заменить отдельные части алгоритма новыми вариантами — другими способами сделать то же самое. Например, представим, что в «Сне об австралийском маге» мы кладем предсказание в воздушный шар и украшаем им сцену. Это не более чем альтернативный способ сделать шаг 4 — но более эффектный! Детали для алгоритма раскрытия карты в варианте с воздушным шаром следует проработать и включить в инструкции, не меняя алгоритм верхнего уровня.
Конечно же, придется изменить два шага — подготовку и собственно раскрытие. Одно не сделать без другого. Однако другие части фокуса можно и вовсе не менять. Программисты пишут программы именно так, составляя их из множества самодостаточных частей.