[Из песочницы] За пределами массива
Усталость
Смотрю в код и совершенно не понимаю, что он делает. Мысли путаются, вижу знакомый синтаксис и набор конструкций, но информация на экране монитора абсолютно не несет для меня никакой смысловой нагрузки. Читаю код построчно, делаю даже пометки в черновике, пытаясь понять алгоритм, но вскоре все сваливается в бессмысленную кашу. Слишком мало кофе или слишком много? Последнее время у меня к нему выработался иммунитет. Выпиваю его словно воду и кажется, что эффект нулевой, но без него никак. Дедлайн наступает на пятки. Руководство дает о себе знать все чаще. Еще один сорванный дедлайн и, пожалуй, мне предложат искать новую работу. От психологического давления и ограниченных сроков исправлять баги становится только тяжелее. Как же много багов и легаси кода, пытаюсь разложить по полками и размотать этот клубок, но все тщетно.
Я слишком глуп для этой работы. Может сказывается отсутствие математической базы? Или может просто нет таланта. Наверное, у меня другой склад ума. Смотрю по сторонам и вижу беззаботный смех моих коллег, кажется, что им дается все намного легче. Код на кончиках пальцев. У меня все не так. Хотя это пройдет, я точно это знаю. Как только я закрою этот проект, появится легкое чувство эйфории, так бывает всегда. А потом, снова окунувшись в очередное болото программного кода, ты теряешь веру в себя. Это «колесо сансары» и я из него не выйду никогда.
Сегодня уйду с работы вовремя. Когда наступает такой момент психологического истощения, лучшее что можно сделать — это отправиться домой, принять душ и хорошенько выспаться. Главное не открывать лэптоп. Никакого ютуба и сериалов. Это не отдых. Или что еще хуже, можно обнаружить себя на рассвете, лихорадочно прочесывающим «stackoverflow» в поисках обхода очередного бага в библиотеке. После чего ты внезапно вспоминаешь, что на самом деле собирался выспаться.
Рабочий день закончился, пожалуй, прогуляюсь до дома пешком. На улице прохладно, осень дает о себе знать. Тем лучше. Это освежит мне мозги. Сегодня никаких походов в магазин, в холодильнике осталась пачка пельменей, они и пойдут в ход.
Наверное, самое больше проклятье программиста — это то, что он может работать и без компьютера. Мысленно программируя и решая очередную проблему. Порой отвлечься, и переключиться ты просто не в силах. Замороженные пельмени слиплись в единый ком, я смотрю на эту картину и почему-то думаю о «связанных списках». Наблюдаю за тем, как варятся пельмени и на бурлящую воду. Одни пузырьки очень быстро сменяют другие. Подумал о «сортировке пузырьком». Не самый эффективных метод сортировки, подумал про себя. Все. Хватит! У меня уже едет крыша. Нужно срочно перестать думать о работе, иначе я просто сойду с ума. Быстро поужинать и в душ, срочно в душ. Все будет завтра, а сегодня я безмерно устал.
Моя усталость настолько сильная, что не помню, как ложился спать. Мне кажется, я не уснул, я просто провалился в беспамятство. Хоть не забыл поставить будильник. Все же завтра снова на работу. Но это будет завтра. Обычно такой сон идет по одному сценарию: ты просто закрываешь глаза и, кажется, через мгновение открываешь их, но уже утром.
Измененное состояние сознания
В этот раз я проснулся посреди ночи. Первая мысль, которая пришла мне в голову — сколько сейчас времени? По ощущениям это глубокая ночь. Мозг отказывается обрабатывать информацию и норовит снова провалиться в сон. Пытаюсь потянуться за телефоном. Что за бред? Я не могу этого сделать. Мое тело не слушается, кажется, я не могу пошевелиться. Пытаюсь прийти в себя. Такого ведь просто не может быть. Что со мной? Снова делаю значительные усилия. И.…, ничего. Просто не могу привести в действия не единый мускул на теле. При этом чувствую свое дыхание. Да, я определённо дышу. Сердцебиение учащается. Кажется, меня охватывает паника. Точно не знаю, но по ощущениям у меня появляется испарина на лбу, и я становлюсь мокрым. Сердце практически выпрыгивает из груди. Тело полностью обездвижено, но сознание при этом ясное. Я умираю? Что мне делать? Пытаюсь закричать, и понимаю, что сейчас это мне тоже не под силу. Видимо для этого должны быть тоже задействованы какие-то мышцы. Так, так, наверное, нужно успокоиться. Мысленно пытаюсь привести в норму частоту сердечных сокращений. Пытаюсь замедлить дыхание. «Спокойно, спокойно», — мысленно повторяю я себе. Кажется, сердцебиение постепенно приходит в норму. Но что дальше? Я даже не могу никуда позвонить. Через сколько меня найдут? Через неделю? Месяц? Я просто умру с голода. Нет, не от голода, от жажды. Кажется, дыхание постепенно успокаивается, а сердце уже не пытается выпрыгнуть из грудной клетки. Просто лежу и смотрю в темноту, не в состоянии поднять веки. Они бесконечно тяжелые.
Не знаю сколько времени прошло. Может час, может больше. Кажется, я начинаю слышать какие-то звуки. Может прихожу в себя? Этот звук усиливается, нет скорее он приближается. Он напоминает шум прибоя. Интересно, что за окном моей однокомнатной квартиры может происходить, что издает такие звуки, да еще и посреди ночи? Звук становится все ближе. Похоже он движется с невероятной скоростью и скоро настигнет меня. В какой-то момент он становится совсем рядом. Нет, это точно не похоже на шум моря. Рев невероятно громкий, он меня пугает. Сейчас что-то произойдет. Интересно, какая вероятность, что прямо на многоквартирный дом падает самолет? Ничто другое в голову не приходит. Что еще может издавать такой всепоглощающий рёв? Хлопок. Мое тело пробило током. Неприятно ощущение по всему телу. Боли нет, но это настолько неприятно, что, наверное, боль переносилась бы легче. Ток пульсирует по всему телу, его частота увеличивает с каждой секундой. Хлопок. Меня куда-то выкинуло.
Другая реальность
Я стою посреди какой-то комнаты. Это точно не моя квартира. Слишком темно, а у меня всегда проникает свет от уличных фонарей и рекламных вывесок. Это сон? Или я умер? Если это сон, то сознание слишком ясное. Правильней сказать, что оно кристально чистое как никогда. Теперь я полностью чувствую свое тело. На мне моя одежда и кроссовки. Я потер свои ладони друг о друга, чувствую их тепло. Поднимаю глаза и вижу вдали, что-то похожее на светящийся монитор. Это что шутка? Подхожу ближе, да это определенно монитор, на вскидку 29 дюймов по диагонали. Нигде не могу разглядеть фирмы производителя. Никогда не видел такой раньше. Он абсолютно без каких-либо рамок. Только сплошной дисплей. Не вижу ни проводов, не системного блока. Только стол, на котором он стоит и кресло. С виду удобное. Вокруг кромешная темнота. Только в радиусе десяти, восьми метров легкое освещение. Быть может это от экрана монитора, но оно довольно объемное, вряд ли весь свет исходит от него. Посмотрел вокруг, других источников света я не вижу. Оглядываюсь чтобы осмотреться, может быть в этой условной комнате есть что-то еще? Да точно, какой-то небольшой шкаф, он находится справа от стола, на котором стоит монитор. Подхожу ближе и понимаю, что это не шкаф — это прозрачный холодильник. Внутри подсветка желтого цвета. Пытаюсь разглядеть содержимое и вижу, что это холодильник с напитками. В отличии от мониторов эти напитки очень даже узнаваемы. Как же хочется пить, это то, что мне сейчас нужно. Холодильник забит банками с Coca-Cola и Pepsi. Очень медленно и осторожно открываю дверцу холодильника. Протягиваю руку и беру банку с Pepsi. Рука сразу чувствует смену температуры. По ощущениями в холодильнике градуса четыре. Баночки с напитками покрыты конденсатом и капельками воды. Беру одну из банок и чувствую приятный холодок тонкого алюминия. Осязание настолько реально, что сложно передать словами. Открываю банку с характерным шипением и делаю глоток. Тут же чувствую знакомый сладкий вкус. Газировка приятно обжигает горло. Этот вкус очень яркий, наверное, такое же ощущение я испытывал в далеком детстве впервые попробовав этот напиток. Если я на том свете, то пока мне здесь неплохо. Хотя признаться, если у меня, когда и были мысли о его существовании, то представлял я его себе несколько иначе. Надеюсь на компе есть игры, не код же здесь писать вечность.
Закрыл холодильник и обнаружил уже слева от стола еще один шкаф. Да, на этот раз это был действительно шкаф. В три раза больше и немного выше, чем холодильник. И похоже больше здесь ничего нет. Походил с банкой в руке по ограниченному пространству. Да, определенно это все что здесь есть. Подошел к шкафу. Это книжный шкаф, он сверху донизу забит книгами. И это не фэнтези или поэзия. Книги очень узнаваемы: Дональд Кнут «Искусство программирования» — четыре тома, Бьерн Страуструп «Язык программирования C++», Томас Кормен «Алгоритмы. Построение и анализ», Макконнелл «Совершенный код». Похоже здесь вся основная литература по Computer Science. То, до чего всегда не доходили руки. Да кого я обманываю, просто мне было лень. Повернулся и справа мой взор снова приковал экран. Почему-то до этого момента мне не приходило в голову посмотреть на изображение монитора. И стало понятно почему. Там был темный экран. Вернее, там была консоль, где красовалось приглашение ввести login. На столе была еще клавиатура. Мыши не было. Да, в Doom похоже не поиграть. Конечно, об этом я думал не всерьез. На самом деле меня беспокоило другое. Где я? Если это странный сон, в котором я нахожусь словно в реальности, то как мне проснуться? Если меня уже нет в живых, то что совсем этим делать, не сидеть же мне здесь вечность?
Немного потупив в монитор, я сделал еще глоток охладительного напитка и поставил баночку на стол. «login… login…», — проговорил я вслух. Что будет, если введу правильные учетные данные? Что будет дальше? Можно, конечно, встать и пойти прочь от этого места. Но куда? В кромешную тьму? Как-то не хочется. И если меня выбросило именно сюда, значит с моей стороны нужны какие-то действия. Не газировку же попить… Впрочем этой возможностью я уже воспользовался. Ничего не изменилось. С другой стороны, все могло бы оказаться намного хуже.
Ну предположим логином может быть root. Почему нет. Каким он может быть еще в данных обстоятельствах. А вот что делать с паролем? Откуда мне его знать? Никаких загадок или подсказок, ничего нет. На предложение ввести пароль, я нажал просто «Enter».
Access denied.
На моем лице появилась ухмылка, да, это было бы слишком просто. Я решил походить и подумать. Подошел снова к холодильнику и уже не особенно осторожничая взял новую банку напитка. В этот раз это была Coca-Cola. И почему эти напитки здесь такие вкусные? Словно я их пробую впервые. Задумчиво подошел к книжному шкафу. Перебирая в голове варианты. Хотя какие могут быть варианты. Может среди книг есть ответ? Поставил банку на стол. Кстати, где здесь мусорная корзина? Взял первую попавшуюся книгу Кнута. Книга как книга, новенькие страницы. И пахнет она тоже новой, и даже корешок при открытии приятно хрустит. Взял еще несколько с полок, ничего необычного. Сел за стол и наобум ввел еще несколько вариантов пароля.
Access denied.
Access denied.
Access denied.
Видимо я что-то упускаю. Я откинулся на спинку кресла и закрыл глаза. И через мгновение на моем лице появилась улыбка. Почему мне не пришла эта мысль раньше? Если предположить, что это сон, хоть и очень странный, и пугающе реалистичный, значит все, что здесь есть, это плод моего воображения. Почему бы там не быть моему собственному паролю от моего домашнего лэптопа? Это же еще проще чем отсутствие пароля! Быстро ввожу логин: root, пароль: ********* и моя рука замирает над клавишей «Enter». А что, если я просто проснусь? Что если мне был дан какой-то шанс, а я им не воспользовался? Книги… Я ведь даже не попробовал их почитать. Указательный палец мгновенно несколько раз нажал клавишу «Backspace». Я быстро встал и подошел к книжному шкафу. Взял тяжеловесную книгу Кормена «Алгоритмы. Построение и анализ», медленно подошел к столу, где стоят мониторы, сел и открыл первую страницу. Сколько же я пытался прочитать, а главное понять эту книгу. Брался за ее чтение, потом бросал, предпринимал новые попытки ее прочитать, но мне она оказалась не по зубам. Но здесь все иначе. Я проглатывал страницу за страницей с невероятной скоростью и полным погружением. Не знаю как это объяснить, но я не читал текст. Когда мы в детстве учимся читать, то мы сначала учим буквы, затем учимся читать слова, а слова складывать в предложения. Но это был какой-то иной уровень восприятия информации. Мне достаточно было посмотреть на страницу, как все укладывалось по полочкам в моей голове. Это были знания и опыт одновременно. Мне казалось, что со мной разговаривает старый приятель, которого я знаю всю жизнь. Нет, это был даже не приятель, а я сам, из будущего, который разобрался давно в этой теме и решил мне объяснить настолько понятно, как не объяснил бы никто иной. Будто эта книга написана специально для меня, она знает меня. Она мой лучший друг. Не прошло и получаса как книга была прочитана, оставив сладкое послевкусие. Когда ты прочитал лучшую книгу в своей жизни и после ничего другого читать не хочется. Ты думаешь о том, что вряд ли тебе удастся найти что-то лучше, что-то более стоящее. Следующими были классика Дональда Кнута. Усваивать информацию у меня получилось все быстрее. Через некоторое время я поймал себя на мысли, что перелистываю по несколько страниц за раз, ни чуть не теряя нить повествования. На четыре тома у меня ушло всего 20 минут, не больше.
Почему здесь так мало книг? Я не хочу чтобы они заканчивались, я как ненормальный проглатывал одну за другой. Меня переполняли эмоции, эти книги были лучшими и самыми захватывающими произведениями из когда-либо мною прочитанных. Я был одержим, меня ничего в жизни настолько не захватывало. Я просто купался в потоке информации, я упивался ею, она наполняла меня смыслом и жизненной энергией. Спустя четыре часа в шкафу не осталось непрочитанных мною книг.
Испытание внутри системы
Настало время для ввода пароля. И откуда у меня была уверенность, что моя догадка с паролем верна? Но я почему-то в этом не сомневался. Чтобы там ни было, я к этому готов. Немного волнуясь, я наконец ввел логин и пароль, затем без промедления нажал «Enter».
Я был внутри системы. На мониторе появился исходный код какой-то программы. Это был код на языке программирования «C++». Объем кода был небольшим. И в глаза мне сразу бросилась одна из функций, которая на вход принимала двумерный массив. Выше этот массив был определен. И от его названия у меня пробежал холодок по спине, а потом бросило в жар.
Переменная называлась deathArray. Быстро встав из-за стола, я попятился назад. Оглядевшись, мне показалось, что в комнате светлеет. Да, здесь действительно становилось все ярче. Спустя три минуты в комнате стало светло как днем. Посмотрев вперед, я не поверил своим глазам. Перед моим взглядом простиралось огромное красно-зеленное поле. Со странным ярким газоном, который состоял из клеточек, примерно метр на метр. Часть клеток были зеленого цвета, а часть из них были ярко-красными. Вид красной травы выглядел зловеще и пугающе. Клетки располагались в хаотичном порядке. Хотя стоп, нет.
Они выглядели в точности как массив на экране монитора, который был заполнен нулями и единицами. Теперь я понял: зеленым клеткам на поле соответствовали единички, а красным соответствовали нули. Судя по всему, мне предстояло дописать функцию, которая поможет успешно пройти это поле. Но у меня остались вопросы, которые требовали немедленных ответов.
Что будет, если наступить на красную клетку? Нужно ли думать над алгоритмом внутри функции или можно просто пройти поле не наступая на красную клетку? А может на самом деле нельзя наступать на зеленую? И самое главное, что за пугающее название массива deathArray?
Будем действовать по порядку. Для начала разберемся с первым вопросом. Я медленно обошел стол и сделал несколько шагов в сторону поля. Трава на клеточках была сочной и ярко-зеленой, но касаться ее, как и становиться на сами клетки, мне не хотелось. Нужно как-то проверить какие из клеток на поле являются опасными. Я снял кроссовки, взял один и кинул на зеленую клетку. Ничего не произошло. Хорошо. Предположим, зеленая клетка действительно является безопасной. А что с красной? Взяв в руку второй кроссовок, я кинул его на красную клетку и тут же вздрогнул от резкого хлопка. Он просто взорвался, превратившись в пыль. Значит моя теория с цветом оказалось верна. Это конечно было логично, но на себе проверять, хоть и весьма очевидную теорию с цветами совсем не хотелось.
Дальше. Что мешает мне пройти всё поле, просто не наступая на красные клетки? Но что-то мне подсказывало, что пройти его нужно как можно быстрее и нужно писать алгоритм поиска именно кратчайшего пути. Основными аргументами в его пользу были — название массива и размер поля. Размер самого массива был 3000×3000 элементов. То есть, если предположить, что размер ячейки 1 квадратный метр, то минимальное расстояние, которое мне придется преодолеть — это 3 километра, а на деле расстояние, которые необходимо было пройти могло увеличиться в несколько раз. Да и вообще, у меня нет никакого желания задерживаться на этом поле надолго.
Я взял из холодильника новую банку Pepsi и сел писать код. К слову, книжный шкаф уже куда-то пропал. Чтобы со мной было, если бы я просто беспечно ввел логин и пароль? Ведь я не понимал до этого момента как работают алгоритмы поиска путей. Никогда еще так старательно я не писал код. Возможно, задача не самая сложная и программисты в какой-нибудь компании как Blizzard сталкиваются с такими задачами каждый день и щелкают их как орешки. Но, во-первых, я не из игровой индустрии, а, во-вторых, от этого зависела моя жизнь.
На написание алгоритма внутри функции у меня ушло около 30 минут. И еще час я посвятил проверке. Вроде все верно. Хотя слово «вроде» неуместно, когда речь идет о жизни и смерти. Все верно. Настало время запуска. Я смял руками пустую жестяную банку и бросил на красную клетку, она тут же исчезла с характерным звуком, превратившись в пыль. Нужно действовать. Прочитав комментарии в начале программы, которые содержали инструкции по запуску, я запустил ее на исполнение.
За пределами массива
Результат не заставил себя ждать. Запуск программы привел в движение клетки на поле. Их высота друг относительно друга стала меняться. Так стало понятно, что это на самом деле не клетки, а кубы. Одни стали на полметра возвышаться относительно других, тем самым выстраивая траекторию пути, которая была рассчитана моим алгоритмом. Кубы один за другим меняли свою высоту, все это сопровождалось громким гулом, что только придавало им массивности. Через некоторое время они полностью перестроились. Получилась траектория из кубов, которая возвышалась над остальными и по которой мне и предстояло пройти. И я побежал.
Не знаю, что именно меня заставило перейти на бег. Это был какой-то внутренний порыв, но как оказалось мои чувства мне не изменили. Слегка оглянувшись назад, я заметил, что та часть поля, которую я пробежал, куб за кубом падали стремительно вниз. Я никак не мог понять, падали они только после того, как оказывались позади меня, или скорость, с которой они проваливаются, была выше моей, и тогда я просто упаду вниз. И к моему несчастью это был второй вариант. Я бежал так быстро, как только мог, стараясь не потерять равновесие. Несколько раз меня пошатнуло на поворотах, и я чуть не угодил на красный квадрат. Силы заканчивались, а бездна метр за метром подбиралась ко мне. Казалось, сейчас я наступлю на очередной квадрат и упаду вниз вместе с ним. Если я хоть где-то ошибся в расчетах, и моя траектория окажется не самой оптимальной, мне конец. В груди начало невыносимо колоть, дыхание окончательно сбилось. Я продолжал бежать во что бы то ни стало. Так просто я не сдамся. Сколько я пробежал? Мне казалось, что финиш должен быть уже совсем близко, но я его не видел. В глазах начинало темнеть, я закашлял. «Еще чуть-чуть, еще совсем чуть-чуть», — мысленно подбадривал я себя. Казалось, что куб, на который я наступаю, тут же проваливался. Это была разница в секунду, стоило мне хотя бы немного замедлиться, и меня бы ждала неминуемая гибель.
Когда силы практически были на нуле, а огонек надежды почти погас, я увидел конец поля. Траектория полностью выпрямилась, мне нужно было бежать только по прямой. У меня открылось второе дыхание. Я бежал что есть сил. Кубы продолжали падать почти у меня под ногами. Но меня тревожило другое. Граница, к которой я так стремился оканчивалась обрывом. Я наконец добежал до самого финиша и резко остановился. Бездна, от которой я так яростно убегал, теперь была с обоих сторон. На самом финише я успел повернуться на 180 градусов, кубы подо мной провалились, и я ощутил чувство падения спиной вниз.
Я вздрогнул, как сумасшедший, хватая ртом воздух. Сердце трепыхалось. Открыл глаза и не мог поверить. Я дома. Лежу в своей кровати. В голове еще сцена из моего сна, которая никак не хочет меня отпускать. Но все позади.
P.S. На работу я прибыл вовремя. Чтобы закончить свой сложный проект, мне понадобился всего час. В итоге сдали его заказчику на неделю раньше. Заказчик остался очень доволен полученным результатом. Спустя несколько месяцев, я уволился из компании в которой работал, потому что получил офер в Google. Как я потом узнал, я прошел собеседование с наивысшим количеством баллов за всю историю компании. Но это уже совсем другая история…