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

Где я?

В прошедшие две недели успешно прошёл секции написания кода в Яндекс, жду финалок. Это уже моя пятая попытка попасть в компанию, причём третья после прохождения курса Яндекс.Практикума по алгоритмам, который я закончил в конце 21-го года, т. е. чуть больше года назад. Задачки в этот раз по моему субъективному ощущению оказались чуть сложнее, чем ожидал и чем попадались в предыдущих попытках. Первая задача была близка к medium, а вторая где-то между medium и hard. Темы: массивы, строки и, конечно же, обожаемые Яндексом хеш-таблицы. Ещё попалась одна задача с матрицей.

Алгоритмы на Практикуме

На курсе практикума я учился хорошо -- прорешал всё за три месяца, со многими сложными заданиями справился самостоятельно, был активен в чатах и давал подсказки другим. И вообще самому курсу в целом даю хорошую оценку. Разработчикам курса удалось довольно многое уместить в столь сжатый срок и, что существенно, не просто кое-как напихать, но и достаточно хорошо разобрать в большинстве случаев. Судя по всему, курс по алгоритмам один из лучших курсов Яндекса, если не самый лучший.

 Чтобы не выглядеть аффилированным, отмечу, что были и недостатки. Во время моего прохождения (стоит также отметить, что с 21-го года курс несколько поменялся), некоторые дополнительные сложные темы были разобраны недостаточно подробно или объяснены непонятно (для меня), не доставало иллюстраций, которыми однако всегда снабжались базовые темы. Пару раз я обращался к альтернативным источникам и там объяснения мне 'заходили' лучше. Пару раз попадались задачки, которые я не мог решить, а когда наставник подсказывал решение, то впадал в ступор: 'А как я до такого даже гипотетически мог додуматься, исходя из предоставленной теории?'

В рекламе курса утверждается, что достаточно тратить час в день. Согласиться с этим можно условно. В большую часть дней -- пожалуй, да, плюс-минус, пока всё идёт гладко. Но когда попадается задачка посложнее, возможно придётся напрячься. Несколько раз приходилось ломать голову по многу часов и делать множество 'подходов' в течение целого дня. Можно, конечно, и пропустить в крайнем случае, но немало сложных задач обязательны для выполнения. Можно попросить подсказку, но наставник не всегда отвечает сразу -- иногда ждал полдня, а то и больше. Иногда додумывался сам, не дождавшись.

Отжимания после хорошей учёбы на хорошем курсе

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

А теперь развёрнутый ответ.

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

Не первым и не в первый раз отмечу, что прохождение алгоритмического собеседования это отдельный и особый навык, который требует тренировки, можно даже сказать, зубрёжки ('приседаний'/'отжиманий' и т. п.) Вы должны практиковаться решать несложные задачки на время и без отладки, без запуска, без использования отладочного вывода на leetcode. Решение должно проходить с первого, с самого с*ка первого раза!

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

После того, как вы написали весь код, читайте и перечитывайте его внимательно строчка за строчкой. Делайте это даже если вы на 100% уверены в том, что всё правильно.

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

Потренируйтесь выполнять сухие тесты. В одних случаях их делать проще, в других сложнее, а в некоторых даже чересчур сложно.

Ну а если вы сделали всё, что написано, проверили/перепроверили, запустили и всё равно получили ошибку, то не материтесь также громко как я. И знайте, что вы не одиноки. Также не торопитесь смотреть отладочный вывод и выяснять в какой строчке произошла ошибка. Вместо этого присмотритесь к входным данным, на которых решение ‘свалилось’. Возможно вы быстро поймёте в чём дело, а если нет, то ещё раз сделайте сухой тест конкретно с этими данными. Бывало, я тратил много сил на пустяковую ошибку и теперь уже не считаю, что это было зря.

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

Также делайте поправку на то, что на собеседовании вы будете испытывать стресс и 'подтупливать'.

Другой курс?

Упомяну бесплатный курс "Подготовка к алгоритмическому собеседованию" от Практикума. У него достаточно высокий порог вхождения и как ‘завершённый’ инструмент для подготовки его навряд ли стоит рассматривать. Но зато, по моему мнению, он отлично подходит в качестве вспомогательного средства. Имеет смысл проходить его после основного курса по алгоритмам. А ещё можно, как вариант, используя его материалы выработать свой собственный бесплатный или частично бесплатный трек. Курс хорошо позволяет увидеть, где у тебя есть пробелы, ну а адресно восполнять можно уже пользуясь другими, возможно разными ресурсами, например, тем же самым Степиком. Бывает так, что одна тема лучше разобрана в одном месте, а другая в другом, о чём я уже писал в начале.

Разобраны особенности прохождения интервью с кодом и здесь данный пост во многом повторяет изложенное там.

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

Кот на бумажке

В заключение хочу поговорить о "собеседовании на бумажке". Изначально я написал этот пост в группе ТГ и не собирался публиковать где-то ещё. Однако он вызвал довольно живую и в основном положительную реакцию. Очередной раз нашлись и те, кто несколько пренебрежительно отозвался об 'интервью на бумажке'. Что, мол, никто толком так и не объяснил какой в таком интервью сакральный смысл. В ответ от кого-то последовало опять же известное возражение, что подобные интервью проводят в Google и Meta.

Неразумно вмешиваться в священные войны, но я не воздержусь от того, чтобы вставить свои 5 копеек.

Программирование шариковой ручкой тренирует навык написания чистого кода с первого раза. Если кода 5-10 строчек, то ошибки выявить может быть легко. А если много тысяч строк? Какова может быть цена ошибки в коде? Каковы могут быть трудозатраты на её выявление? Понятно, что есть всякие продвинутые технологии и методологии тестирования, но и ошибка может быть замысловатой.

Добавлю к этому, что сам я проходил такие же алгоритмические интервью с "яндекс-блокнотом" ещё и в Диасофт и в небольшую фирму UBIC. Т. е. не только айти-гиганты теперь уже это практикуют.

Комментарии (16)


  1. Elena-314
    25.01.2023 14:02
    +1

    а на какую позицию в яндекс претендовал (если не секрет)?


  1. alex_sunny Автор
    25.01.2023 14:16
    -2

    Изначально не объявлял и до сих пор не обсуждали. Сказали только, что явно не стажёр и не юниор.


    1. Elena-314
      25.01.2023 16:41

      давно программируете?)


      1. alex_sunny Автор
        26.01.2023 14:51
        +1

        давно, суммарно более 10 лет опыта разной интенсивности


        1. Elena-314
          26.01.2023 22:47

          удачи Вам на следующем раунде собеседований в Яндекс


    1. velipre_xella
      26.01.2023 15:35

      Мидл хтмл-разработчик, угадал?


  1. WraithOW
    25.01.2023 14:31
    +2

    Программирование шариковой ручкой тренирует навык написания чистого кода с первого раза.

    Во-первых, неясно зачем. Ну вот в чем сакральный смысл того, чтобы сэкономить 5 секунд, которые у меня в редакторе займёт переименовать переменную или вынести/заинлайнить функцию.

    Во-вторых, нет, не тренирует. Столетия делания всяких штук руками наглядно демонстрируют, что творчество - итеративный процесс. Писатели исписывают стопки черновиков, художники перерисовывают картины в 50 слоёв (и это после многих итераций эскизов), скульпторы делают макеты из гипса, которые уже потом переносят на мрамор.

    В-третих, чистота первой итерации с качеством итогового продукта вообще кореллирует поскольку-постольку. Подмена тезиса.


    1. sets
      25.01.2023 14:57
      -2

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


    1. astypalaia
      27.01.2023 14:03

      Программирование ручкой на листочке - это что-то сродни игре в шахматы вслепую. Говорят, очень развивает память и мозг в целом. Но если подумать, процентов 90 кода именно так и пишутся. Только даже без ручки и листочка - в голове по дороге на работу, с работы, дома лежа на диване. Так что навык-то полезный, не будем им разбрасываться. Программист, который садится за клавиатуру и при этом не очень представляет, что он собирается писать - вызывает недоверие. А если представляет - то где он это взял? Только в голове, больше никак.


      1. lair
        27.01.2023 15:22

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

        А вы утверждаете, что в этот момент "в голове" пишется именно код, со всеми синтаксическими деталями?

        Потому что я, например, в голове строю абстрактные конструкции, а деталями они обрастают только при столкновении с остальным кодом.


  1. lair
    25.01.2023 16:51

    Программирование шариковой ручкой тренирует навык написания чистого кода с первого раза.

    Нет, не тренирует. Кто сказал, что написанный шариковой ручкой код - чистый?

    Ну и да, обычно задачи написать чистый код с первого раза просто не стоит (см TDD, например).


    1. Elena-314
      25.01.2023 22:54

      мне кажется, это индивидуально; мне тоже помогает шариковая ручка, но конечно, ее недостаточно для написания идеального кода)


      1. lair
        25.01.2023 22:55

        В каком смысле "помогает"?


        1. Elena-314
          25.01.2023 22:59

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


          1. lair
            25.01.2023 23:01

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


  1. AChevozerov
    27.01.2023 14:03
    +1

    А если много тысяч строк?

    Вы с первого раза много тысяч строк чистого кода пишете ручкой?
    А когда используете IDE вы тоже сразу пишете полотно на много тысяч строк кода, а не делите на модули и проверяете работу каждого модуля в отдельности?