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