После рассказа о том, как я получил работу в Amazon, в этом посте на reddit мне задали множество вопросов о том, как мне помог LeetCode в подготовке к собеседованиям.
В статье я отвечу на эти вопросы.
Сколько времени это заняло?
Я начал готовиться за 2-3 месяца до собеседований в BigTech. В то время я тратил по 2-3 часа в день на подготовку.
Вот разбивка работы на leetcode по годам.
Что я понял
В рамках года я начал заниматься на leetcode более стабильно (от 30 минут до часа ежедневно), а не импульсивно по месяцу-два, как это было раньше.
Сколько заниматься LeetCode? Соотношение заданий easy/medium/hard
Вот так выглядит моя разбивка сейчас; когда я завершил свои последние собеседования в апреле, у меня было пройдено около 450 вопросов.
Выводы
Ты не получишь никакой пользы от выполнения тех заданий, с которыми уже освоился. Если ты легко решаешь easy, то увеличь количество выполняемых medium. Относить к практике осознанно, трать время с максимальной пользой.
Что бы я сделал иначе
Наверно, идеальное соотношение — это 1: 3: 1. Большинство вопросов, задаваемых на собеседованиях, относятся к категории medium, поэтому если вы можете решать их уверенно, то достаточно хорошо готовы к собеседованию.
Решать задачи по темам, брать случайные или Blind 75
В контексте моих собеседований в Amazon/Atlassian/Canva/Google в этом году
Я решал ежедневные задачи LeetCode, а также выполнял верхние задачи из списка собеседований Amazon, которые доступны в premium-подписке LeetCode.
Этот список оказался очень полезным для подготовки к собеседованиям в Amazon, потому что выполненные мной задачи оказались очень похожими по сложности и стилю. Если вы стремитесь попасть в конкретную компанию, то рекомендую пройти список этой компании.
(Вероятно, для этого не понадобится premium-подписка, потому что можно найти бесплатные списки задач компаний по тэгам, например, amazon list free)
Полученные уроки
Когда я только начал пользоваться Leetcode, то отвечал на случайные вопросы. Это противоречит принципу продуманной практики. Самый эффективный подход заключался бы в том, чтобы решить примерно 20-40 easy, затем освоить список blind 75. После этого вы будете достаточно готовы к тому, чтобы приступать к собеседованиям, и я искренне считаю, что ещё примерно сто заданий, которые были постоянно сложными и повышали мои навыки, сделают вас столь же эффективным, как мои примерно 450 задач.
Вывод заключается в том, что количество задач не так важно, как их качество, и что уровень, при котором вы спокойно будете решать стандартные задачи на собеседованиях, составляет примерно 200 задач.
Какие ресурсы я использую для подготовки/структуры данных и алгоритмы?
Этот вопрос задавали очень часто.
75% моих знаний по структурам данных и алгоритмам (Data Structure and Algorithms, DSA) взято из университетского курса DSA благодаря тому, что я намеренно зубрил этот курс. Остальные знания я набрался гуглением непонятных мне аспектов при решении задач LeetCode; также я пользовался разделом ответов и обсуждений в задачах LeetCode.
А если я плохо учился на этом курсе в университете/колледже или учусь сам?
Тогда Интернет — ваш друг. Всё, что вы знаете, есть онлайн и доступно бесплатно, например, есть популярный курс по изучению DSA с нуля.
Идеальный процесс выглядел бы так: изучить новую структуру данных -> выполнить несколько задач LeetCode с тэгами этой структуры данных -> повторить.
И как ни очевидно это звучит, просто гуглите то, что вы не знаете или хотите знать.
Если говорить о темах, то какие из них показались вам наиболее важными?
Так получилось, что я решил достаточно задач, чтобы покрыть все типы вопросов, которые мне могли задавать.
Если вы уверенно сможете решать leetcode blind 75, то вашего уровня покрытия тоже будет достаточно.
Но чтобы ответить на этот вопрос, я воспользуюсь этим списком; вот моя разбивка большинства тем по важности:
УРОВЕНЬ 1 (ОБЯЗАТЕЛЬНО)
Массивы, строки, связанные списки, деревья, сортировка и поиск
УРОВЕНЬ 2 (спрашивают не так часто, как УРОВЕНЬ 1, но переходите к нему только тогда, когда решите достаточно много задач УРОВНЯ 1).
Динамическое программирование
УРОВЕНЬ 3 (частично важный, включает в себя сочетания тем уровня 1, но я не считаю их столь же важными, как УРОВЕНЬ 1)
Задачи по проектированию и математике
Действительно ли обязательно решать 450 задач, чтобы попасть в Amazon?
Конечно, нет. Это полностью ситуативно и зависит от ваших условий/возможностей/способа обучения.
Оглядываясь назад, если бы я знал, как практиковаться эффективно, то смог бы справиться за 150-200 задач LeetCode.
Отвечая на вопрос «когда я смогу приступать к собеседованиям», скажу: как только вы будете уверенно себя чувствовать с задачами уровня medium (для меня это было около 150-200 задач), вы должны начать проходить собеседования.
Выводы
Практикуйтесь осмысленно, выполняйте задачи, которые сложны для вас, но не настолько, что вам очень сложно выполнить задачу. Сосредоточьтесь на актуальных темах, с которыми у вас есть трудности, если готовитесь к устройству в конкретную компанию, то полезно будет использовать список задач LeetCode для конкретной компании.
Не откладывайте собеседования надолго. Как только вы решите 100-200 задач, нужно приступать к собеседованиям. Даже если вы не преуспеете, то получите опыт и обратную связь для дальнейшего развития.
Что я буду делать дальше
Выполнив свою задачу получения должности в BigTech, я нацелен стать хорошим разработчиком ПО/развивать свою карьеру и создавать онлайн-контент, связанный с технологиями.
Комментарии (40)
NightShad0w
28.07.2023 13:06+26Ждём через 2 года статью от автора на тему, как 500 задач по программированию не помогли получить повышение и интересные задачи, потому что не ходил на корпоративные мероприятия и приносил плохие вести старшему разработчику или менеджеру, и, как следствие, на ежегодной оценке производительности получил среднюю оценку и при очередном падении акций был уволен как ненужный ресурс.
bak
28.07.2023 13:06Почему сразу в негативном русле? Может наоборот, "я сходил на 300 корпоративов за 2 года и получил повышение", "уровень 1 - пойти на корпоратив и общаться с 5ю случайными людьми, уровень 3 - пить с боссом твоего босса".
stackjava
28.07.2023 13:06+18Опять пропаганда алгоритмиков (((
Фетиш какой то
Tuxman
28.07.2023 13:06+4Нужны ли в реальной работе программисты все эти алгоритмы? Ответ банальный - BigTech платит хорошо, поэтому могу себе позволить гонять кандидатов. Если соискатель не готов/не хочет сделать усилия над собой и выучить эти алгоритмы, то и как-то особо на работе не будет стараться делать усилия. Видимо такая логика.
moonster
28.07.2023 13:06+1Нужно же как то фильтровать кандидатов. ) К сожалению, никто не умеет нанимать малоизвестных, но толковых разработчиков прицельно. Если никто не знает, как правильно фильтровать, то какая разница как? Тем более, что это про программирование, а не про мячики от гольфа в автобусе и круглые люки. Прогресс.
yewuv
28.07.2023 13:06+7Два менеджера по персоналу, опытный и стажёр, сидят в офисе и обсуждают дела.
Молодой достает огромную пачку резюме, штук 300.Мы должны просмотреть их все, чтобы подобрать кандидатов на эту вакансию. Опытный хладнокровно берет у него пачку, делит ее пополам, одну часть - на стол, вторую - в шреддер. У молодого глаза по пятаку.
А как же претенденты?! Опытный невозмутимо:
А зачем нам неудачники?
unicrus
28.07.2023 13:06+1Логика ещё в том, чтобы держать таланты подальше от конкурентов. Даже если у тебя они не так заняты.
Leetc0deMonkey
28.07.2023 13:06+3С литкодрочерским подходом таланты как раз наоборот остаются у конкурентов.
mikronavt
28.07.2023 13:06+2За работу платят деньги и в хорошем случае она еще и интересная. Решение задачек конечно тоже может быть интересным, но тратить приходится свободное время на то что не пригодится потом в реальной работе. Уж лучше выучить какую-то новую технологию или подход, который реально улучшит профессиональные навыки, чем забатывать бесполезные задачи.
Поэтому видимо предполагается ,что на работе кандидат будет заниматься не чем-то интересным/полезным, а "будет стараться делать усилия" ради чего-то бессмысленного, только потому что так сказал менеджер. И тогда действительно такой отбор подходит.
Wan-Derer
28.07.2023 13:06На собеседовании проще и быстрее проверить решение задачи чем знание какую-то новой технологии или подхода. Это даже можно автоматизировать. Здесь уже писали про обязательные этапы на хакерранк.
Датели стараются оптимизировать свою работу в ситуации "вас тут много, а я один".
bogolt
28.07.2023 13:06+3Может все и не нужны, но когда на каждом месте работы я вижу как люди регулярно допускают N+1 в базу, или создают три вложенных цикла что уводит время работы функции в полный ад. И кстати все эти люди успешно прошли собесы и рассказали о сложности функций и всем таком.
assad77
28.07.2023 13:06+1В самих алгоритмах проблем нет, если ты сам пришел сам рвешься на конкретную вакансию, то подготовиться к ней можно вполне. Но если тебя и так все устраивает, тебя уговаривают придти, а не понравиться не подешь, то странно ожидать, что кандидат будет долго готовится. Скорее он не пройдет собес.
Кроме того, такой метод все выше будет задирать планку, а в этом случае выгоду от этого получат те кто регулярно меняет работу, и hr департамент. Лояльные же сотрудники, готовые работать 5+ лет на одном месте будут проигнорированы.
По старому месту работы говорили, что человек в среднем уходит после 2х лет.
Это тот момент, когда kpi hr, приносит вред компании.
Но софт компаннии обладая большой нормой прибыли справляются с этим.
Helltraitor
28.07.2023 13:06-3Автор оригинала: Minh Nguyen
Здесь можно уже заканчивать чтение. Есть ли вообще аналогичные истории о найме сотрудников из бывшего СССР иностранными или местными компаниями?
P.S. Пишу именно в таком ключе, потому что аудитория хабра, преимущественно, жители или выходцы стран СССР
Hixon10
28.07.2023 13:06+10Полно таких историй. Достаточно открыть linkedin и поискать людей из России в фирмах из биг теха.
ViacheslavNk
28.07.2023 13:06+5Да так же достаточно таких историй, чем люди из бывшего СССР отличаются в этом плане?
faiwer
28.07.2023 13:06+4Сотрудников из бывшего СССР иностранные компании нанимают используя те же подходы. Задают те же вопросы. Они решают те же задачи. Никто не адаптирует процесс найма по географическому признаку. Нюансы географии это обычно вопросы визы, легального статуса, пакета релокации и т.д.
ViacheslavNk
28.07.2023 13:06Нюансы географии это обычно вопросы визы, легального статуса, пакета релокации и т.д.
По большем счету эти вопросы для граждан России и Белоруссии стали актуальными с начала известных событий многие страны закрыли консульства, а какие-то и просто перестали выдавать рабочие/студенческие визы, до этого визовые вопросы были скорее даже на последнем месте при трудоустройстве в иностранные компании.
LedIndicator
28.07.2023 13:06+6Выполнив свою задачу получения должности в BigTech, я нацелен стать хорошим разработчиком ПО
Всегда казалось, что сначала надо стать хорошим разработчиком ПО, а потом получить хорошую должность, но нет.
Задрочил литкод, прошёл собес, теперь будет, собственно, учиться программировать.
"Что делать будем? Завидовать будем!"nameless323
28.07.2023 13:06Что-то мне подсказывает что автор собеседовался и получил офер на джуниорскую позицию, этим же можно объяснить что ему хватило только литкода для офера.
Leetc0deMonkey
28.07.2023 13:06+3Лучше бы лотерею устроили. Один хрен все эти литкодсобесы пальцем в небо. Зато реальный равноправный шанс проявить себя в FAANG появится у каждого.
nameless323
28.07.2023 13:06-3Я вот не знаю что этими алгоритмами всех так пугают. Из личного опыта в FAANG на алгоритмах обычно дают задачи что обычных знаний и банальной логики полученных за годы программирования хватает с лихвой без всяких предварительных проходов по литкоду. Хотя конечно может мне просто везло так, но по отзывам коллег и друзей так было примерно у всех (хотя может на бэкэндеров или в общем на вэб позиции и сложнее в плане алгоритмов или если в резюме ничего нет например, но на всякий C++ с опытом 10+ лет вот так).
Mirn
28.07.2023 13:06+2на литкоде немало задач плохого качества:
иногда просто невыносимо отвратительного, часто даже суть задачи сформулировать чётко не могут, порой доходит утрируя до "давайте сыграем немного в другую игру 21 (очко), пример1: пустое множество, пример2: два туза - выиграл(чо?)." сиди догадывайся, ах да забыл, в единственном хинте: use DP (спасибо помогли).
и таких задач тяп-ляп-итаксойдёт от фаанга особенно от гугла много
одна из последних
https://leetcode.com/problems/strange-printer/
вторая проблема - DP-дедовщина "раз мы страдали, а значит все должны именно этим страдать и знать и уметь". Часто задачи намеренно изменены до уровня практической неприменимости лишь бы ДПшечка их так глубоко любимая завелась, иначе up-down подход не сработает. (пример: один или даже нуль элементов это тоже комбинация или строка, но на вопрос почему пустых множеств подразумевается всегда одна штука а не бесконечность никто так и не ответил)ну и банальное засилье однотипных задач "DP(func) mod 10e9+7 = leetcode". где func высосанная из пальца бесполезная на практике комбинаторика, но мигом улетающая в бесконечность, поэтому результат по модулю как костыль. (задача ради задачи, как гробы-вопросы с анаграммами в ЧГК)
четвёртая проблема - неадекватная оценка сложности и отсутствие потолка сложности. Есть харды в категории изи, а есть попросту задания настолько сложные что надо запретить давать их на собесы, например решение уравнения записанного текстом с множеством неизвестных (аналог вольфрам альфы), эти задания не на час тех собеса и даже не на день. Это скорее проект!
А есть харды которые решаются на языке низкого уровня типа раста однострочным итератором брутфорсом перебором всего ко всему с запасом по CPU в десятки раз.nameless323
28.07.2023 13:06Так я в общем то про то же, литкод это кому нравится литкод. В общем и целом у нормального разработчика с опытом не должны задачки которые реально даются вызвать никаких проблем и без литкода (я например вообще задачи алгоритмические не спрашиваю у кандидатов). Тем более от мидл левела больший упор идет в тех (скорее всего с джунов у которых про опыт не спросишь мучают такими задачками, стоит ли свой путь начинать с ФААНГА вопрос вообще открытый).
Mirn
28.07.2023 13:06я обычный разраб, разрабатываю с 90ых годов в начале с бейсика и паскаля/делфи потом железо си и теперь уже Rust. и вот еслиб не пара отказов по причине "у вас плохой рейтинг на литкоде", в жизнь не стал бы прокачивать эти имеющие мало общего с реальным кодингом задачи в моей firmware специальности. Точнее как прокачиваю - чтоб время не терять я их ломаю, сделал брутфорсом за 5 минут и далее. Воспользовался тем что тест кейсы ленивые и слабые - отлично, минута кодинга, однострочный итератор и забыл про эту чушь, идём к следующей.
nameless323
28.07.2023 13:06Честно не встречал конторы, которых интересует именно рейтинг на литкоде (это конечно бред), даже в ФААНГ такого нет - решил на собесе, молодец, всем все равно даже есть акк на литкоде или нет. Может какие местные особенности или просто не повезло с фирмами (учитывая что вы упомянули йены - Япония?)?
alemiks
28.07.2023 13:06+1как найти разраба, который умеет решать реальные проблемы клиента, а не задачки с литкода?
nameless323
28.07.2023 13:06А почему у вас эти два множества не пересекаются? Одно другому в общем то не мешает.
Mirn
28.07.2023 13:06+2и как часто бизнесу надо чтоб разраб-одиночка разрабатывал только алгоритм с нуля за пол часа, порой без доступа к гуглу и без возможности обговорить и немного изменить ТЗ?
nameless323
28.07.2023 13:06А почему вы думаете что собеседование в ФААНГ это только литкод задачки (по крайней мере на мидл+ уровень)? Там может быть по 6 раундов собеседований в день по несколько дней и задачки занимают может быть 10% от всего времени, остальное это те же самые обсуждения теха, резюме, подходов и так далее, просто вот ФААНГ может еще себе позволить в дополнение к этим темам поспрашивать немного задачек (которые в общем то особых сложностей у людей с опытом программирования вызвать и так не должны). То есть выбирают пересечение - может решать и решал реальные проблемы и более менее знает что такое структуры данных и простой алгоритм может написать.
Mirn
28.07.2023 13:06+1зачем тогда превращать литкод в ещё одно высшее образование т.к. по факту "справка что не дурак"? они задают моду и этим нагло пользуются тем что другие подхватывают и нанимают меньшее кол-во людей из-за избыточной фильтрацией. В итоге не раз слышал соображения например "если надо готовиться по 6 раундов по несколько дней то зачем идти на 5 миллионов йен в год с 100 часами обязательной сверхурочки в месяц если проще сразу в фаанго-гугл пробовать"
nameless323
28.07.2023 13:06+1Ну тут все просто, они хотят и могут и считают что знание алгоритмов и структур данных для кандидата маст хэв - их дело, вы можете к ним не идти если вас такие правила не устраивают (всё же фаанг не для всех, не том смысле что кто-то "не достоин", а в том что там определенная культура разработки которая понравится далеко не всем, многим более приятна атмосфера небольших фирм где есть сильное влияние программиста на проект). Если мелкие фирмы копируют и не могут из-за этого нанять человека - тоже их проблема, может и не стоит идти туда, где процессы настолько бездумно копируются. Я чаще вне ФААНГА алгоритмику встречал давольно редко.
xsevenbeta
28.07.2023 13:06+1Leetcode это форма обучения, которая хороша прежде всего тем, что выдаёт маленькие задачки - их проще решить, получить свою порцию дофамина и идти к следующей. Знание хоть и фрагментарное, но это знание и практика. Ничто не мешает использовать параллельно другие формы обучения. Концепция количественного отображения прогресса так же хорошо работает для людей, которые выросли на компьютерных играх.
Если посадить трёх людей учить языки и один будет делать по учебнику, второй использовать такие сервисы, а третей сразу писать что-то большое и сложное, то у второго будет больше шансов на успех чему-то научиться.
Если говорить только про успех в собеседованиях, то на второй фазе по хорошему должны спросить о реально сделанных проектах и о фреймворках, но первая фаза будет так или иначе про алгоритмы и тут опять же сильно выручит тренажер.
panzerfaust
28.07.2023 13:06Я с прошлого ноября прособесил 12 вьетнамцев на джаву. Взяли всего одну девушку толковую. У остальных интервьюеров выхлоп такой же или вообще по нулям. Это прям очень специфичная публика. У нас в СНГ как-то по дефолту считается, что инженер должен шарить и понимать, что под капотом. А этим ребятам вообще все параллельно. Могут что-то там нашлёпать - и так сойдет. Типичный диалог с сеньором-помидором с 8 годами опыта:
Я: Зачем вообще нужен HashSet? В каком кейсе его применить можно?
Сеньор: ... бла бла, понятия не имею...
Я: Хорошо, а почему у него вообще приставка Hash?
Сеньор: Потому что у объектов есть методы hashCode и equals.
(Пояснение. HashSet так называется, т.к. имеет в основе функционал хэш-таблиц, которые в свою очередь используют хэш-функции. То, что у классов можно определить эти самые хэш-функции вообще никак не объясняет название хэшсета и его свойств)
Короче, спрашиваешь какие-то реал-лайф кейсы - не знают. Переходишь на более приземленные вещи - не знают. Когда уже спрашиваешь "что такое Х" - начинают отвечать по учебнику. А вот "зачем нужен Х" - такой вопрос уже не тянут.
А еще мастерский скилл в области "для меня большая честь быть на этом интервью" и прочий корп-булшит. Так что удачи Амазону.
maxxxxxxy
Много где уже читал, что ~500 задач литкод золотая середина. Имхо главное чтобы easy составляли примерно 10-20%
Hixon10
500 задач — это не золотая середина, это P90, если не больше. С 100-150 задачами можно легко проходить собеседования (не все, не всегда, но это и не требуется, так как во время поиска работы будет множество этапов и множество собеседований).
Ensay
А остальные 80% как распределяются?