Обложка статьи «С нуля — в Google: история успеха»

С нуля — в Google: история успеха

Перевод статьи «Google | L4 | Warsaw | Sep 2019 [Offer]»

Рассказывает scooby_doo

Может это будет и не самая короткая статья, но я хочу пройтись по всем пунктам от самого начала. Во-первых, моя мотивация. Я хотел работать в Google. Не в Amazon, не в Uber, не в Facebook, не в Microsoft. Только в Google. И дело не только в масштабе компании и большом количестве пользователей, но и в том, что каждый их продукт оказал невероятное влияние на мою жизнь.

У меня было несколько друзей в Google. Они сказали мне, что нужно хорошо разбираться в структурах данных и алгоритмах и много практиковаться. А затем получить рекомендацию для прохождения собеседования. Если кратко, то именно это я и сделал. А теперь перейдём к подробностям.

Я приступил к LeetCode в январе. На тот момент я не знал ни одного языка программирования и мне было немного боязно начинать заниматься этим в 26 лет, когда большинство одарённых начинают в 12. Тем не менее, с самого начала я был сильно увлечён статисткой и математикой.

С чего начать?

Итак, с чего я начал? Проходил множество онлайн курсов по: HTML (январь), CSS (январь-февраль), JS (февраль), React (июнь), AI/ML (апрель-май); в процессе написания проектов изучил C++ на YouTube-канале The Cherno (с января по настоящее время). Где-то в середине февраля я начал решать простые задачи на LeetCode, и это был полный провал. У меня уходило множество часов на решение простейших задач, я отправлял тонны неправильных решений. Однако я поставил перед собой определённые цели. Я планировал потратить половину марта на массивы, вторую — на строки, половину апреля — на связные списки, затем деревья и так далее. Я придерживался плана и продолжал безостановочно решать задачи и, к моему удивлению, к середине марта я уже вполне мог справляться с 3–4 задачами в день, в основном со средним уровнем сложности, а в редких случаях — даже с высоким. И вот мой первый совет: не ждите знака свыше, начинайте работать.

Я обогнал свой план по изучению каждой структуры данных за 15 дней и концу марта уже успел немного заняться связными списками, деревьями и графами. Мой второй совет: имейте план, но не стесняйтесь его перегонять. К апрелю я хорошо освоился на LeetCode (по крайней мере, мне так казалось) и решил к тому моменту порядка 80 задач.

На этом этапе я принял третье и, возможно, самое умное решение в моём процессе подготовки, которое подводит меня к следующему совету: втяните в это своих друзей! Я собрал группу из 4–5 друзей, создал группу в WhatsApp и завёл таблицу в Google Таблицах, где мы могли отслеживать прогресс друг друга в решении задач. Мы придумали алгоритм подсчёта очков (чем сложнее задача, тем больше очков) и начали соревноваться друг с другом. Это кардинально поменяло дело. Я помню, как провёл несколько ночей, решая 15 задач, лишь бы перегнать моих друзей! Дела шли хорошо, и в середине мая я сделал нечто, что подняло меня на совершенно другой уровень: прошёл курс Уильяма Фисета по структурам данным на Udemy. Он не сильно рекламируется, но он офигенный, бесплатный и составлен человеком из Google. Мой четвёртый совет: пройдите этот курс!

Практика

Я решил, что теперь мне осталось только заняться практикой, что я и сделал. Согласно моему плану, я должен был подать заявление в Google в июле (через полгода после моего решения сделать это), и я определился с количеством задач, которые хочу решить к тому времени (300 штук). Однако, к началу июня я решил уже 240 и решил взять перерыв, чтобы изучить React, сделать пару небольших проектов, чтобы получить опыт создания приложений, пусть даже и простых. До января я никогда не писал ни единой полезной строки кода, поэтому это было нужно, чтобы дополнить моё резюме.

Затем наступил июль, и я сделал шаг вперёд. Я подал заявление и купил… барабанная дробь… премиум на LeetCode! Я не знаю, было ли это очень эффективно, но я не хотел ничего упустить и в итоге ОЧЕНЬ насладился некоторыми премиум-задачами, потому и вам советую. Более того, в июле я создал новый аккаунт, чтобы решить все важные для Google задачи (спасибо премиуму) и даже множество задач Facebook. С некоторыми из них я уже справился до этого, но всё равно решал их снова, потому что в марте я был совсем зелёным и мне хотелось закрепить свои знания и качество кода. Курс Уильяма Фисета действительно поднял меня на новый уровень.

А теперь сумасшедшая часть. До июля я решил 240 задач, однако с 6 июля до 23 сентября я решил ещё 230 новых задач! Я был абсолютным монстром, я проделал невероятный объём работы, который мне и не снился. Также мне пришлось изучить проектирование систем, так как мой рекрутер сказал, что меня будут спрашивать и по этой теме. Сегодня прошло моё последнее очное собеседование в Варшаве, Польше. Далее я опишу, как проходили все мои собеседования.

Собеседование по телефону

  • Это был простой вопрос про способы реализации связных списков. С ходу я смог назвать два способа. Мне сказали реализовать один. Я быстро справился, поэтому мне сказали реализовать и другой.
  • Затем мне предложили подумать над способом получше. На это у меня ушло 5 минут. К тому моменту мы почти закончили. Интервьюер сказал: «Я не ожидаю, что вы реализуете это решение за 3 минуты, но, может, вы хотите попробовать?».
  • Я сказал «да» и управился в срок.
  • Прошёл!

Очное собеседование

В целом потрясающий опыт: прагматичные сотрудники, потрясающий офис, потрясающие бонусы, дружелюбные люди. Chromebook не заработал, что было тем ещё обломом, так как мне обещали, что мне не придётся писать код на доске, но я всё равно справился.

Этап 1: написание кода

Вам даны логи выполнения нескольких функций со временем запуска и завершения работы. Задача: создать иерархию в виде файловой системы, которая будет сообщать длительность выполнения каждой функции.

Решение: создать структуру в виде N-арного дерева и заполнить её десериализованными логами. Писал на доске.

Дополнительный вопрос 1: как убедиться, что данные в логах логически последовательны? Ответ: во-первых нужно отсортировать временные метки, а ещё использовать какую-то проверку, аналогичную проверке баланса скобок.

Дополнительный вопрос 2: как сделать то же самое для многопоточной программы? Ответ: создать флаг потока на входе и разделить массив на хеш-таблицу массивов, что позволит использовать решение для однопоточной версии.

Этап 2: написание кода

Го (настольная игра). Интервьюер на самом деле принёс игру с собой, что мне понравилось. Есть доска, на ней расположено несколько камней. Вам дают новый камень, который нужно положить на пустую клетку. Необходимо вернуть количество вражеских камней, которые будут захвачены после этого хода. Он объяснил мне правила игры. Я предложил длинное решение через поиск в глубину. После реализации обнаружился один логический баг, но мне дали подсказку, после чего я нашёл его и исправил. Снова писал на доске.

Этап 3: проектирование систем

Я особенно беспокоился по поводу этого этапа, но интервьюер был очень спокойный и дружелюбный. Он, вероятно, знал, что у меня не очень много опыта в проектировании систем, поэтому он нарисовал всю систему за меня, а затем спросил: «Допустим, у нас происходит 50 тысяч рекламных переходов в секунду. С какими проблемами вы столкнётесь и как вы их предотвратите?». Я рассказал о таких базовых вещах, как уменьшение задержки, увеличение пропускной способности и планирование аварийного переключения. По сути, когда вопросы касаются практического применения технологий, они хотят видеть ваше общее понимание подходов в масштабировании. Я думаю, что всё прошло хорошо, но я так себе судья, так что не знаю, посмотрим.

Этап 4: googliness и лидерство

Прим. пер. Google определяет googliness как «mashup of passion and drive that’s hard to define but easy to spot» — «смесь увлечённости и драйва, которую сложно описать, но легко заметить».

Это было похоже на вопросы HR о лидерских качествах. Меня много спрашивали о вещах, связанных с управлением командой. Вопросы показались мне лёгкими, так как я был тимлидом в своём стартапе, хоть я и не писал код.

Этап 5: написание кода

Задача была похожа на эту за исключением нескольких деталей. Я расписал на бумаге решение сложностью в O(n^2). Я продолжал думать над решением получше, но интервьюер сказал, что O(n^2) — правильное решение, и был рад, что я пытался копнуть глубже.

Вот, собственно, и всё.

Чем всё закончилось

  • Я получил отличные отзывы по результатам четырёх интервью и удовлетворительный по пятому (уверен, что это было проектирование систем);
  • В течение недели мне подобрали команду и одобрили мой наём;
  • Я получил L4 SWE оффер. Мечты сбываются.

Не смешно? А здесь смешно: @ithumor