После рассказа о том, как я получил работу в Amazon, в этом посте на reddit мне задали множество вопросов о том, как мне помог LeetCode в подготовке к собеседованиям.

В статье я отвечу на эти вопросы.

Сколько времени это заняло?

Я начал готовиться за 2-3 месяца до собеседований в BigTech. В то время я тратил по 2-3 часа в день на подготовку.

Разбивка работы на leetcode по месяцам (2022 год)
Разбивка работы на leetcode по месяцам (2022 год)

Вот разбивка работы на leetcode по годам.

2020 год
2020 год
2021 год
2021 год

Что я понял

  • В рамках года я начал заниматься на 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)


  1. maxxxxxxy
    28.07.2023 13:06
    +4

    Много где уже читал, что ~500 задач литкод золотая середина. Имхо главное чтобы easy составляли примерно 10-20%


    1. Hixon10
      28.07.2023 13:06
      +3

      500 задач — это не золотая середина, это P90, если не больше. С 100-150 задачами можно легко проходить собеседования (не все, не всегда, но это и не требуется, так как во время поиска работы будет множество этапов и множество собеседований).


    1. Ensay
      28.07.2023 13:06
      +1

      А остальные 80% как распределяются?


  1. NightShad0w
    28.07.2023 13:06
    +26

    Ждём через 2 года статью от автора на тему, как 500 задач по программированию не помогли получить повышение и интересные задачи, потому что не ходил на корпоративные мероприятия и приносил плохие вести старшему разработчику или менеджеру, и, как следствие, на ежегодной оценке производительности получил среднюю оценку и при очередном падении акций был уволен как ненужный ресурс.


    1. bak
      28.07.2023 13:06

      Почему сразу в негативном русле? Может наоборот, "я сходил на 300 корпоративов за 2 года и получил повышение", "уровень 1 - пойти на корпоратив и общаться с 5ю случайными людьми, уровень 3 - пить с боссом твоего босса".


  1. stackjava
    28.07.2023 13:06
    +18

    Опять пропаганда алгоритмиков (((

    Фетиш какой то


    1. Tuxman
      28.07.2023 13:06
      +4

      Нужны ли в реальной работе программисты все эти алгоритмы? Ответ банальный - BigTech платит хорошо, поэтому могу себе позволить гонять кандидатов. Если соискатель не готов/не хочет сделать усилия над собой и выучить эти алгоритмы, то и как-то особо на работе не будет стараться делать усилия. Видимо такая логика.


      1. moonster
        28.07.2023 13:06
        +1

        Нужно же как то фильтровать кандидатов. ) К сожалению, никто не умеет нанимать малоизвестных, но толковых разработчиков прицельно. Если никто не знает, как правильно фильтровать, то какая разница как? Тем более, что это про программирование, а не про мячики от гольфа в автобусе и круглые люки. Прогресс.


        1. yewuv
          28.07.2023 13:06
          +7

          Два менеджера по персоналу, опытный и стажёр, сидят в офисе и обсуждают дела.
          Молодой достает огромную пачку резюме, штук 300.

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

          • А как же претенденты?! Опытный невозмутимо:

          • А зачем нам неудачники?


          1. vova9110
            28.07.2023 13:06

            Баян, но блин, как же хорош!


      1. unicrus
        28.07.2023 13:06
        +1

        Логика ещё в том, чтобы держать таланты подальше от конкурентов. Даже если у тебя они не так заняты.


        1. Leetc0deMonkey
          28.07.2023 13:06
          +3

          С литкодрочерским подходом таланты как раз наоборот остаются у конкурентов.


      1. mikronavt
        28.07.2023 13:06
        +2

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

        Поэтому видимо предполагается ,что на работе кандидат будет заниматься не чем-то интересным/полезным, а "будет стараться делать усилия" ради чего-то бессмысленного, только потому что так сказал менеджер. И тогда действительно такой отбор подходит.


        1. Wan-Derer
          28.07.2023 13:06

          На собеседовании проще и быстрее проверить решение задачи чем знание какую-то новой технологии или подхода. Это даже можно автоматизировать. Здесь уже писали про обязательные этапы на хакерранк.

          Датели стараются оптимизировать свою работу в ситуации "вас тут много, а я один".


      1. bogolt
        28.07.2023 13:06
        +3

        Может все и не нужны, но когда на каждом месте работы я вижу как люди регулярно допускают N+1 в базу, или создают три вложенных цикла что уводит время работы функции в полный ад. И кстати все эти люди успешно прошли собесы и рассказали о сложности функций и всем таком.


    1. assad77
      28.07.2023 13:06
      +1

      В самих алгоритмах проблем нет, если ты сам пришел сам рвешься на конкретную вакансию, то подготовиться к ней можно вполне. Но если тебя и так все устраивает, тебя уговаривают придти, а не понравиться не подешь, то странно ожидать, что кандидат будет долго готовится. Скорее он не пройдет собес.

      Кроме того, такой метод все выше будет задирать планку, а в этом случае выгоду от этого получат те кто регулярно меняет работу, и hr департамент. Лояльные же сотрудники, готовые работать 5+ лет на одном месте будут проигнорированы.

      По старому месту работы говорили, что человек в среднем уходит после 2х лет.

      Это тот момент, когда kpi hr, приносит вред компании.

      Но софт компаннии обладая большой нормой прибыли справляются с этим.


  1. Helltraitor
    28.07.2023 13:06
    -3

    Автор оригинала: Minh Nguyen

    Здесь можно уже заканчивать чтение. Есть ли вообще аналогичные истории о найме сотрудников из бывшего СССР иностранными или местными компаниями?

    P.S. Пишу именно в таком ключе, потому что аудитория хабра, преимущественно, жители или выходцы стран СССР


    1. Hixon10
      28.07.2023 13:06
      +10

      Полно таких историй. Достаточно открыть linkedin и поискать людей из России в фирмах из биг теха.


    1. ViacheslavNk
      28.07.2023 13:06
      +5

      Да так же достаточно таких историй, чем люди из бывшего СССР отличаются в этом плане?


    1. faiwer
      28.07.2023 13:06
      +4

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


      1. ViacheslavNk
        28.07.2023 13:06

        Нюансы географии это обычно вопросы визы, легального статуса, пакета релокации и т.д.

        По большем счету эти вопросы для граждан России и Белоруссии стали актуальными с начала известных событий многие страны закрыли консульства, а какие-то и просто перестали выдавать рабочие/студенческие визы, до этого визовые вопросы были скорее даже на последнем месте при трудоустройстве в иностранные компании.


  1. zergon321
    28.07.2023 13:06
    +1

    Довольно много. Обычно вроде всё говорят про 150 задач. В том числе и те, кто реально устроился в FAANG


    1. faiwer
      28.07.2023 13:06
      +2

      Задачи задачам рознь. 150 hard задач с хорошим покрытием разных тем это куда круче чем 600 medium задач с уклоном, скажем, только в графы.


  1. bosco
    28.07.2023 13:06

    Интересен и уровень позиции, странно что об это не написано. Middle?


  1. LedIndicator
    28.07.2023 13:06
    +6

    Выполнив свою задачу получения должности в BigTech, я нацелен стать хорошим разработчиком ПО

    Всегда казалось, что сначала надо стать хорошим разработчиком ПО, а потом получить хорошую должность, но нет.
    Задрочил литкод, прошёл собес, теперь будет, собственно, учиться программировать.
    "Что делать будем? Завидовать будем!"


    1. nameless323
      28.07.2023 13:06

      Что-то мне подсказывает что автор собеседовался и получил офер на джуниорскую позицию, этим же можно объяснить что ему хватило только литкода для офера.


  1. Leetc0deMonkey
    28.07.2023 13:06
    +3

    Лучше бы лотерею устроили. Один хрен все эти литкодсобесы пальцем в небо. Зато реальный равноправный шанс проявить себя в FAANG появится у каждого.


  1. nameless323
    28.07.2023 13:06
    -3

    Я вот не знаю что этими алгоритмами всех так пугают. Из личного опыта в FAANG на алгоритмах обычно дают задачи что обычных знаний и банальной логики полученных за годы программирования хватает с лихвой без всяких предварительных проходов по литкоду. Хотя конечно может мне просто везло так, но по отзывам коллег и друзей так было примерно у всех (хотя может на бэкэндеров или в общем на вэб позиции и сложнее в плане алгоритмов или если в резюме ничего нет например, но на всякий C++ с опытом 10+ лет вот так).


    1. 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 в десятки раз.


      1. nameless323
        28.07.2023 13:06

        Так я в общем то про то же, литкод это кому нравится литкод. В общем и целом у нормального разработчика с опытом не должны задачки которые реально даются вызвать никаких проблем и без литкода (я например вообще задачи алгоритмические не спрашиваю у кандидатов). Тем более от мидл левела больший упор идет в тех (скорее всего с джунов у которых про опыт не спросишь мучают такими задачками, стоит ли свой путь начинать с ФААНГА вопрос вообще открытый).


        1. Mirn
          28.07.2023 13:06

          я обычный разраб, разрабатываю с 90ых годов в начале с бейсика и паскаля/делфи потом железо си и теперь уже Rust. и вот еслиб не пара отказов по причине "у вас плохой рейтинг на литкоде", в жизнь не стал бы прокачивать эти имеющие мало общего с реальным кодингом задачи в моей firmware специальности. Точнее как прокачиваю - чтоб время не терять я их ломаю, сделал брутфорсом за 5 минут и далее. Воспользовался тем что тест кейсы ленивые и слабые - отлично, минута кодинга, однострочный итератор и забыл про эту чушь, идём к следующей.


          1. nameless323
            28.07.2023 13:06

            Честно не встречал конторы, которых интересует именно рейтинг на литкоде (это конечно бред), даже в ФААНГ такого нет - решил на собесе, молодец, всем все равно даже есть акк на литкоде или нет. Может какие местные особенности или просто не повезло с фирмами (учитывая что вы упомянули йены - Япония?)?


  1. alemiks
    28.07.2023 13:06
    +1

    как найти разраба, который умеет решать реальные проблемы клиента, а не задачки с литкода?


    1. nameless323
      28.07.2023 13:06

      А почему у вас эти два множества не пересекаются? Одно другому в общем то не мешает.


      1. Mirn
        28.07.2023 13:06
        +2

        и как часто бизнесу надо чтоб разраб-одиночка разрабатывал только алгоритм с нуля за пол часа, порой без доступа к гуглу и без возможности обговорить и немного изменить ТЗ?


        1. nameless323
          28.07.2023 13:06

          А почему вы думаете что собеседование в ФААНГ это только литкод задачки (по крайней мере на мидл+ уровень)? Там может быть по 6 раундов собеседований в день по несколько дней и задачки занимают может быть 10% от всего времени, остальное это те же самые обсуждения теха, резюме, подходов и так далее, просто вот ФААНГ может еще себе позволить в дополнение к этим темам поспрашивать немного задачек (которые в общем то особых сложностей у людей с опытом программирования вызвать и так не должны). То есть выбирают пересечение - может решать и решал реальные проблемы и более менее знает что такое структуры данных и простой алгоритм может написать.


          1. Mirn
            28.07.2023 13:06
            +1

            зачем тогда превращать литкод в ещё одно высшее образование т.к. по факту "справка что не дурак"? они задают моду и этим нагло пользуются тем что другие подхватывают и нанимают меньшее кол-во людей из-за избыточной фильтрацией. В итоге не раз слышал соображения например "если надо готовиться по 6 раундов по несколько дней то зачем идти на 5 миллионов йен в год с 100 часами обязательной сверхурочки в месяц если проще сразу в фаанго-гугл пробовать"


            1. nameless323
              28.07.2023 13:06
              +1

              Ну тут все просто, они хотят и могут и считают что знание алгоритмов и структур данных для кандидата маст хэв - их дело, вы можете к ним не идти если вас такие правила не устраивают (всё же фаанг не для всех, не том смысле что кто-то "не достоин", а в том что там определенная культура разработки которая понравится далеко не всем, многим более приятна атмосфера небольших фирм где есть сильное влияние программиста на проект). Если мелкие фирмы копируют и не могут из-за этого нанять человека - тоже их проблема, может и не стоит идти туда, где процессы настолько бездумно копируются. Я чаще вне ФААНГА алгоритмику встречал давольно редко.


        1. xsevenbeta
          28.07.2023 13:06
          +1

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

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

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


  1. panzerfaust
    28.07.2023 13:06

    Minh Nguyen

    Я с прошлого ноября прособесил 12 вьетнамцев на джаву. Взяли всего одну девушку толковую. У остальных интервьюеров выхлоп такой же или вообще по нулям. Это прям очень специфичная публика. У нас в СНГ как-то по дефолту считается, что инженер должен шарить и понимать, что под капотом. А этим ребятам вообще все параллельно. Могут что-то там нашлёпать - и так сойдет. Типичный диалог с сеньором-помидором с 8 годами опыта:

    Я: Зачем вообще нужен HashSet? В каком кейсе его применить можно?

    Сеньор: ... бла бла, понятия не имею...

    Я: Хорошо, а почему у него вообще приставка Hash?

    Сеньор: Потому что у объектов есть методы hashCode и equals.

    (Пояснение. HashSet так называется, т.к. имеет в основе функционал хэш-таблиц, которые в свою очередь используют хэш-функции. То, что у классов можно определить эти самые хэш-функции вообще никак не объясняет название хэшсета и его свойств)

    Короче, спрашиваешь какие-то реал-лайф кейсы - не знают. Переходишь на более приземленные вещи - не знают. Когда уже спрашиваешь "что такое Х" - начинают отвечать по учебнику. А вот "зачем нужен Х" - такой вопрос уже не тянут.

    А еще мастерский скилл в области "для меня большая честь быть на этом интервью" и прочий корп-булшит. Так что удачи Амазону.