от головной боли и стараясь лишний раз не двигаться телом, чтобы не усугублять мучительный беспорядок в желудке. Он сидел на работе, и пытался набирать PL/SQL-код, но в глазах двоилось, и поэтому вместо SELECT…AS каждый раз упорно печаталось SELECT…ASS.
— Только одно название, что органические, а все одно — та же химия. Общество потребления, чтоб им пусто было. Whole Foods, Trader Joe's, Planet Organics Fresh Market my ass… Все, все — с одной и той же грядки! На чем надо было выращивать арбуз, чтобы им можно было так отравиться! Хорошо еще, хоть арбуз был маленький…
Он уронил голову на клавиатуру и попал на клавишу DEL. Так как рукой он при этом держал CTRL-ALT, компьютер перезагрузился. Программист А. не обратил на это внимания.
— …а бутылка большая, — продолжал размышлять он. — Если бы водкой не запивал, вообще бы окочурился. Вот ведь бл$@#&во!
Программист А. оторвал уставший взгляд от монитора, потер кулаком покрасневшие глаза и встал. На кухне он обмотал бутылку пива, которую держал в руках, салфеткой, вышел на крыльцо и сел на верхнюю ступеньку. Мыслей в голове уже не было, вернее, они были, но словно неподвижно валялись в углу, как скомканные бумажные листы с бесполезным кодом. Алгоритм не выстраивался.
Солнце садилось прямо за дом напротив, заливая улицу розовым светом. Сосед справа возился с граблями во дворе. Он приветливо помахал А. рукой, А. кивнул в ответ.
— Сейчас приедет машина из Domino, — подумал почему-то А., и машина действительно появилась и остановилась у дома слева. Сосед слева всегда заказывал пиццу в это время в воскресенье. В общем, все было как обычно. Все было одно и то же изо дня в день. Все повторялось и повторялось, как код, вошедший в бесконечный цикл. В этом было что-то необычное, какая-то идея, которую усталый мозг не хотел схватывать. Программист А. сидел на крыльце и смотрел, как диск солнца скрывается за черным краем крыши.
— Вот уж действительно, — подумал он. — Восходит солнце, и заходит солнце…
— …и спешит к месту своему, где оно восходит… — послышался тихий голос непонятно откуда.
Программист А. оглянулся. Поблизости никого не было.
— Надо меньше работать, — проворчал А. и отхлебнул пива из бутылки.
Все повторялось и повторялось, изо дня в день. Различия присутствовали, но были несущественны, существенным было повторение. Это выглядело примерно как вызывать одну и ту же функцию с разными параметрами — значения локальных переменных внутри функции могут изменяться в зависимости от значений параметров, но код функции — код, который исполняется — он всегда один и тот же. Но кто вызывает эту функцию?
Темнело. Мягкий ветерок прокатился по траве.
— Идет ветер к югу, и переходит к северу, кружится, кружится на ходу своем… — подумал опять программист А., и на мгновение ему показалось, что ветер подхватил скомканные листы мыслей в его голове и сложил из них в воздухе некое подобие идеи.
— … и возвращается ветер на круги своя… — с готовностью откликнулся тот же самый голос.
— Возвращается, говоришь?.. — программиста А. внезапно осенило и алгоритм решения задачи, над которым он ломал голову все выходные, вдруг выстроился в его голове до последнего квадрата блок- схемы.
— …что было, то и будет; и что делалось, то и будет делаться… — монотонно продолжал внутренний голос, но А. его уже не слушал.
Он все понял. Функция вызывала саму себя! Поэтому все и повторялось. Поэтому и не было ничего нового под солнцем. Он бросился в дом, к компьютеру, и, сделав огромный глоток пива, принялся с пулеметной скоростью стучать по клавишам.
— Ну конечно! — приговаривал он. — Рекурсия! Суета сует! Блоковая структура с лексическим именованием — и рекурсия, рекурсия! Вот ведь бл$@#&во!
— Вот здесь я аккуратно проверяю входной параметр на соответствие типу данных, и выдаю сообщение об ошибке, если необходимо, — с энтузиазмом рассказывал молодой индийский программист, указывая на соответствующие строки кода на экране монитора.
Программист А., расположившийся рядом в кресле, кивнул.
— Далее, и это очень интересно, обратите внимание, я использую алгоритм быстрой сортировки по имени, чтобы избежать упорядочивания во время запроса к базе данных! Неплохая идея, а?
Программист А. кивнул. Ободренный начинающий программист возбужденно продолжал:
— Затем я использую хэш-таблицу для учета регистров, что позволяет мне быстро и эффективно считывать информацию.
Программист А. кивнул.
— Здесь я не уверен, однако, что ключ оптимален, — говорил индийский программист. — Так как разные узлы могут иметь одинаковый тип данных, добавление его к ключу может снизить количество обращений к базе. Что бы Вы посоветовали?
Программист А. кивнул. Молодой индийский программист некоторое время помолчал и тихо вышел из комнаты. Программист А. кивнул еще раз. Ему снился остров Кауаи и он сам, скользящий на серфинговой доске по теплой зеленой волне.
Программист А. сидел в Starbucks с компьютером и большим стаканом caffe latte. Звучала тихая музыка, уютно светился изнутри большой серый камин, непринужденно болтали за стойкой официанты в черных-зеленых фартуках, скрашивая друг для друга безлюдный вечерний час. Программист А. ничего этого не замечал. Ссутулившись над столом, он не первый час безуспешно пытался найти нужный алгоритм, и ему уже начинало казаться, что это невозможно.
Отчаявшись, А. поднял голову от экрана и огляделся. Словно впервые, он с удивлением заметил странные картины на стене, причудливые лампы под потолком, диски Эллы Фитцджералд и The Police у кассового аппарата. Внезапно его осенило.
— Подождите! — воскликнул он. — Но ведь это же все совершенно неправильно! Это делается совсем не так!
Он вскочил, быстро собрал вещи и выбежал на улицу. Перейдя через дорогу, он вошел в О'Клири и сел за стойку. Здесь громко играла музыка, по телевизору показывали бейсбол, Red Sox выигрывали у канадцев. А. кивнул соседу за стойкой, сосед весело показал ему шаку. Бармен деловито поставил перед ним кружку Сибирской Короны и сгреб пятерку и доллар.
— Вот теперь все как надо, — удовлетворенно сказал А. и, снова ссутулившись над экраном, продолжил свой безнадежный труд.
Программист А. сидел в темной комнате у камина, пил виски “Канадский туман” и смотрел в огонь. Неожиданно огонь скукожился и погас.
— Интересно, — подумал программист А. — Куда делся огонь? Только что он был здесь, в этой комнате, и теперь его нет… Ничто не девается в никуда. Значит, огонь ушел…
Вывод показался вполне логичным, и А. отметил это большим глотком виски.
— Однако, если огонь ушел, — продолжал рассуждать он. — То куда он ушел? В каком направлении?