В первом случае получается линейный порядок, или «программа без ветвления», во втором — частичный порядок, или, если угодно, недетерминированный алгоритм.
Поэтому в данном случае ребята правильно объяснили последовательность действий, а когда потребовалось снова вернуться к блоку «мальчик ставит кубик», я жестом фокусника извлёк длинную стрелку, и получилась изображённая на рис. 54 блок-схема.
Рис. 54.
3.
Сейчас, задним числом, всё изложенное кажется мне не очень удачным. Есть два дефекта в самой реализации: первый — плохо выражена проверка условия; второй — куда-то исчезла операция измерения той башенки, что на столе (её надо было предпослать первому блоку). Ещё более важен другой недостаток — неестественность конструкции. Ребята прекрасно поняли, что я делаю, но совершенно не поняли, зачем и почему именно так. Я уже говорил, что реально в жизни они поступали иначе: ставили сразу несколько кубиков, после чего хватало одного-двух измерений.Тем не менее осталась общая идея — придумывать задачи на построение алгоритмов, и остались также некоторые принципы, сохранившиеся в окончательном проекте.
Кроме того, чисто эстетически оказалось очень приятным раскладывать белые карточки на чёрном лакированном фоне журнального столика.
Однако долгое время я не мог придумать ни одной новой задачи. Идеи приходили в голову разные — от того, как подниматься на нужный этаж на лифте, до того, чтобы вытаскивать из мешка шарики разных цветов и раскладывать по двум урнам. Но всё это были процессы либо плохо алгоритмизуемые, либо неинтересные и неестественные. А идея алгоритмического языка казалась мне совсем недостижимым идеалом: если я не могу придумать одну задачу, то что уж говорить о классе задач! К тому же меня несколько угнетала мысль о том, что даже если я придумаю несколько задач, то для каждой из них придётся делать новые рисунки.
4.
После многочисленных обсуждений со Стёпой современного программирования вообще и программируемых игрушек со встроенными микропроцессорами в частности я сумел, наконец, сформулировать для себя самого (а потом и для Стёпы) главную трудность, главное препятствие на пути создания языка программирования для детей.Ясно, что этот язык должен быть узким по возможностям, а, значит, и узко специализированным. Все известные мне языки специализируются либо на работе с числами (ФОРТРАН, АЛГОЛ), либо на обработке данных (КОБОЛ), либо на обработке текстов и списков (ЛИСП, СНОБОЛ); кроме того, есть универсальные языки, обладающие всеми тремя возможностями (ПЛ, АЛГОЛ-68)[17]
.Однако все эти три области применения программирования совершенно непонятны и неинтересны детям (ближе всего к их интересам стоят числа, но чтобы ощутить смысл задач, подлежащих алгоритмизации, им надо подрасти как минимум лет на пять). Значит, проблема в том, чтобы придумать доступную детям область применения языка. А сам язык — дело второе.
Через два дня после телефонного разговора, в котором я сформулировал Стёпе постановку задачи, он придумал гениально простое решение: в качестве области применения языка он предложил движение объектов по лабиринту, изображённому на клетчатой бумаге.
Он же предложил вначале в качестве наиболее простого лабиринта взять прямоугольную комнату.
После этого мы с ним независимо друг от друга придумали совершенно одинаковый язык — даже обозначения все, кроме одного, совпали; такое совпадение служит доказательством естественности языка.