будет ли еще снег? Неужели, опять зимнюю резину ставить…
Его взгляд упал на настенный календарь, показывающий 10 июня.
— Да… — подумал программист А. — Что ни говори, длинная в этом году зима. Даже для Новой Англии длинная.
В комнате пахло мандаринами, горячей картошкой и свежими огурцами. Блюдо с салатом оливье, большая хрустальная плошка селедки под шубой, тарелка с аккуратно разложенными шпротами, салат из помидоров и огурцов с луком, салат из риса, крабового мяса, золотистых кукурузных зерен и ломтиков ананаса — все это было расставлено на столе вокруг огромного блюда с дымящейся вареной картошкой и жареными куриными ножками. Тарелки с тонко нарезанными ломтиками буженины и докторской колбасы из русского магазина расположились по краям стола. Бутылка Столичной и три бутылки сладкого Советского шампанского придавали картине законченность золотого сечения.
Программист А. зажег гирлянды и потушил свет. Комната погрузилась в мигающий разноцветный сумрак. Сев за стол, он откупорил шампанское, наполнил бокал и взглянул в светящийся голубым светом экран телевизора. Играла поставленная им кассета с “Иронией судьбы”. Ну что ж, будем… — подумал программист А. и пригубил шампанское. До Нового Года оставалось 114 дней.
— Странно, — подумал мозг. — Этот последний блок данных явно имеет противоречивую информацию в заголовке. Так, посмотрим… Насколько я помню формат заголовка, первые два байта — это внутренний идентификационный номер сообщения. Ну, тут проблем нет, если он, конечно, уникален. Потом — 512 байт — имя блока данных, по два байта на символ, из-за китайцев приходится использовать юникод, чтоб его… Так, что там дальше? Пошли указатели на разные области памяти. Ага, вот оно! Указатель на область событий прошлого. Вот тут-то, похоже, и проблема. Если этот указатель ненулевой, а в данном случае он ненулевой, то дата в соответствующем поле в конце заголовка должна отвечать определенному событию в прошлом. Так… Смотрим на дату… Так и есть! Дата-то сегодняшняя! Как будто это происходит прямо сейчас… Противоречие получается. И как же мне прикажете идентифицировать это событие?
Мозг задумался и еще раз просмотрел весь заголовок. Противоречие не исчезало — согласно указателю, это уже было раньше, а согласно дате, это происходило прямо сейчас. Он покопался в своих инструкциях, надеясь найти какое-нибудь упоминание о том, значение какого поля заголовка должно пользоваться приоритетом в случае конфликта — указатель или дата, но на этот счет инструкций не было.
— А, собственно, чего я мучаюсь, и без того работы полно! — подумал мозг. — Прошлое, будущее — какая, к черту, разница! Указатель ненулевой, ну пусть и идет… по указателю.
И мозг уверенно направил данные в область событий прошлого.
— Deja vu, — подумал программист А.
Часть 2
Программист А. открыл окно Notepad, напечатал слово BEGIN и спросил начинающего индийского программиста:
— Что это?
— Это оператор BEGIN, означающий начало программы, — ответил начинающий программист.
— Хорошо, — сказал программист А. и стер слово BEGIN. — А что это теперь?
— Теперь там ничего нет, — ответил начинающий программист.
— Неверно, — сказал А. — Начало программы по-прежнему там. BEGIN — всего лишь слово на одном из языков программирования, оно и близко не может передать истинного значения “начала программы”. То, что ты хочешь написать, уже существует. Ты не должен писать ни строчки кода, пока не осознаешь эту истину. Понял?
— Понял, — ответил начинающий программист.
— Ничего он не понял, — ворчал программист А. вечером, пытаясь разобраться в 2000 строк кода, которые успел в первый же день работы наваять начинающий индийский программист.
Программиста А. спросили: What's the difference between love and sex?
— Love takes two, — ответил программист А.
Программист А. проснулся как-то осенью и огляделся. Он сидел на рабочем месте перед своим монитором с открытым на нем пустым окном редактора. Часы показывали 11:11 am, индийские программисты вокруг с энтузиазмом печатали новый код, QA захлебывался в нескончаемом потоке багов, менеджеры с озабоченными лицами расходились с очередного митинга. Deadline приближался, но проект был выполнен лишь наполовину.
В следующий раз программист А. проснулся в декабре. Он по-прежнему сидел на рабочем месте перед пустым окном редактора, часы по-прежнему показывали 11:11 am, индийские программисты все так же печатали новый код, QA захлебывался в нескончаемом потоке багов, а менеджеры с озабоченными лицами расходились с очередного митинга. Deadline приближался, но проект был выполнен лишь на четверть.
В следующий раз программист А. проснулся в марте. Часы показывали 11:11 pm, deadline был через неделю, и А. уже несколько дней сидел в офисе, практически не вылезая, пытаясь хоть как-то связать вместе куски кода.
— Что за хренотень! — ругался про себя А, в сотый раз добавляя явную инициализацию для переменной, которую начинающий индийский программист использовал в условном операторе. — Сон какой-то у меня стал прерывистый! К врачу, что ли, сходить…
Однажды утром программист А. наткнулся на работе у кофеварки на двух индийских коллег, которые о чем-то горячо спорили.
— О, вот ты рассуди нас, — сказал один из них. — Мы поспорили, когда лучше продавать акции, а когда лучше покупать.
— А? — сказал программист А.
— Я считаю, что акции нужно покупать, когда они падают, и продавать, когда растут. Когда акции падают, их можно купить дешевле, поэтому их нужно покупать. Когда акции растут, невозможно предсказать, когда рост остановится, поэтому их нужно продавать, пока они не упали.
— Я считаю, что акции нужно покупать, когда они растут, и продавать, когда они падают, — сказал второй индийский программист. — Когда акции растут, цена их увеличивается, поэтому их нужно покупать. Когда акции падают, невозможно предсказать, когда падение остановится, поэтому их нужно сразу же продавать. Кто из нас прав?
Программист А. подумал, но рассудить их не смог.
— Ну и какой же ты после этого программист! — пристыдили его индийские коллеги, и отвернувшись, продолжали свой спор.
Выпив как-то пива, программист А. пошел прогуляться ночью в парк. Свернув на одну из боковых дорожек, он неожиданно увидел человека, сидящего на скамейке у озера, в кругу лунного света. Человек был одет в длинное темное пальто, а на голове у него было что-то вроде военной фуражки. Приглядевшись получше, программист А. разглядел, что это женщина, и даже узнал ее по виденным в интернете фотографиям. Это была адмирал Грейс Хоппер, автор языка КОБОЛ и первого в мире компилятора. Кроме этого Грейс Хоппер нашла первый в истории компьютерный баг, оказавшийся молью, застрявшей в соленоидах гигантского калькулятора. Сейчас от нее исходило странное свечение, и она смотрела на программиста А., широко улыбаясь.
— Присаживайся, — сказала Грейс Хоппер. — Я тебя жду.