Компания Geekfactor cовместно с Getmentor.dev проводит программу подготовки к трудоустройству в зарубежные стартапы (бесплатно помогаем подготовиться к интервью и показываем резюме классным компаниям) — почитать о ней подробней и зарегистрироваться можно тут.

Много кто знает, что такое Leetcode. Это своего рода решебник — задачи, которые дают на технических собеседованиях в крупных компаниях (в том числе и из FAANG) и их решения.

Такие задания, заточенные на знание структур данных и алгоритмов, все чаще встречаются и на собеседованиях в небольших компаниях. Многим кандидатам это не нравится — они утверждают, что навыки «литкодинга» ничего не говорят о том, как человек справится с реальной работой. Согласен. Если вы не можете слёту решать задачи c LeetCode, это не значит, что вы плохой разработчик. Возможно, вам в реальной работе вообще никогда не понадобится, скажем, инвертировать бинарное дерево. Однако глупо отрицать, что на LeetCode можно изучить массу подходов и инструментов, которые окажутся полезными. В этой статье я расскажу о том, что вынес для себя из работы с платформой.

1. Важно хорошо понимать структуры данных и алгоритмы

LeedCode — это не курс по структурам данных и алгоритмам. Если вы эти темы сами не изучали, то я безусловно рекомендую пройти соответствующий базовый курс. Без основ вы не сможете эффективно использовать платформу. Ну и помимо этого, после курсов вы начнёте разбираться в том, как работают разные структуры и алгоритмы и какие из них лучше подходят для решения тех или иных задач.

Глупо отрицать: каждый программист должен отлично разбираться в структурах данных. Недавно читал историю, как небольшая модификация алгоритма позволила на 70 % сократить время загрузки GTA V. Да и на собственном опыте я знаю, как эффективная реализация приложения позволяет ему работать беспроблемно даже в условиях большой нагрузки.

2. Всегда найдется кто-то, кто знает больше вас

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

Я понял, что мне всегда есть, чему учиться у других, и это понимание играет большую роль в моей реальной работе. У меня невероятно опытные старшие коллеги, которые действительно помогают мне совершенствоваться. Именно благодаря презумпции “есть кто-то умнее меня” я развиваюсь дальше.

3. Пограничный случай может всё испортить

Пока я не начал работать, ошибки в моем коде не представляли никакой реальной угрозы. Случайная ошибка могла никогда не увидеть свет, и никто бы её не заметил. Другое дело — сейчас, когда мой код идет в продакшн. Результат моей работы используют тысячи людей, и любая ошибка — пусть даже она проявляется в незначительном пограничном случае — наверняка проявится и создаст проблемы нашим клиентам, и/или приведет к материальному ущербу.

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

4. Упорная работа ценнее, чем талант...

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

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

Нелегко возвращаться в состояние джуна. Но надо
Нелегко возвращаться в состояние джуна. Но надо

Ещё одно свидетельство того, насколько важна практика, я получил, когда перешёл с задач по Python на задачи по Java. Хотя я использую Java ежедневно в работе, в контексте задач LeetCode она вовсе не кажется мне интуитивно понятной. Большинство задач на ней я не могу решить, пока не прогуглю детали реализации — как в старые добрые времена, когда я только начинал программировать. Но сейчас это меня не расстраивает и не демотивирует. Я знаю, что при условии достаточной практики буду разбираться в Java так же хорошо, как и в Python.

5. Планирование — неотъемлемая часть разработки ПО

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

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

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

Заключение

Лично мне повезло: мне нравится LeetCode и я ничего не имею против дополнительной практики, даже когда не ищу работу. Однако я знаю многих, кто считает, что на нём нельзя научиться ничему, что пригодилось бы в реальной жизни. Надеюсь, своей статьей я смог хотя бы кого-нибудь убедить, что это не так. А если вам всё-таки приходится использовать платформу для подготовки к собеседованию, постарайтесь извлечь из неё что-нибудь полезное. На худой конец, на рынке много вакансий, где никто с задачами LeetCode вас мучить не будет.

Читайте также:

Компания Geekfactor cовместно с Getmentor.dev проводит программу подготовки к трудоустройству в зарубежные стартапы (бесплатно помогаем подготовиться к интервью и показываем резюме классным компаниям) — почитать о ней подробней и зарегистрироваться можно тут.

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


  1. Groosha
    12.01.2022 17:34
    +4

    Чем лично мне понравился литкод: он мягко заставляет тебя писать тесты ещё и локально, соответственно, продумывать крайние случаи.
    Нередко было так, что какое-нибудь решение задачи с обходом дерева занимает 10 строк, а тесты, где есть генерация таких деревьев — раз в 5-10 больше.


  1. panzerfaust
    12.01.2022 17:38
    +13

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


  1. csl
    12.01.2022 18:04
    +7

    https://habr.com/ru/post/569522/comments/#comment_23297884 Haskell в leetcode. Во время того коммента на Хабре на https://leetcode.com/discuss/feedback/136097/please-provide-haskell-language-support

    было 50 голосов


  1. mamchyts
    12.01.2022 20:59
    +4

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

    Всегда удивлялся таким людям, которые за пару курсов (или видосов на ютюбе) говорят что освоили ("поднялись на новый уровень") структуры данных и алгоритмам.

    2 или 3 года назад я приобрел бумажный вариант Алгоритмы. Построение и анализ (да, та самая бело-голубая книга). Дважды я ее пытался прочесть. Специально сейчас открыл и нашел закладку - 69 страница. 69 из 1281, карл!

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


    1. tarekd
      12.01.2022 22:13
      +2

      Может человек мехмат МГУ закончил и проходил всю теорию алгоритмов и структур данных, и ему просто нужно освежить знания.


      1. LevPos
        13.01.2022 07:03
        +2

        У автора (Federico Manucci) в LinkedIn написано:

        Università di Bologna

        Bachelor's degree, Chemical Engineering


    1. un1t
      13.01.2022 11:55
      +1

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


    1. saboteur_kiev
      13.01.2022 14:38
      +1

      А чтение алгоритмов редко бывает полезно. Все вылетает.

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


    1. tym32167
      13.01.2022 17:53
      +1

      Так вы начали изучение с Кормена, ещё бы не встрять при этом, там же сплошная теория. Если интерес чисто практический, я бы порекомендовал эту книгу https://algs4.cs.princeton.edu/home/


      1. vrytov
        13.01.2022 18:00
        +1

        Или e-maxx.


        1. tym32167
          13.01.2022 19:36
          +2

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


      1. questor
        15.01.2022 10:09

        И после этой книги можно тут же курс на курсере пройти от автора. Мне чем понравился курс Седжвика - наличием автоматической оценки присланного кода по количеству пройденных юнит-тестов


        1. tym32167
          15.01.2022 13:24

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


  1. sergio_nsk
    12.01.2022 22:13
    +1

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

    #include <bits/stdc++.h> // https://stackoverflow.com/questions/25311011/
    using namespace std;     // https://stackoverflow.com/questions/1452721/
    #define ll long long
    #define loop(v, n) for (ll v = 0; v < n; v++)
    
    ll solve(ll a, ll b) {
      loop (i, a)
        loop (j, b)
          cout << i << ", " << j << '\n';
    }
    
    int main() {
      solve(1, 2);
    }


    1. Politura
      12.01.2022 23:40

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


      1. sergio_nsk
        13.01.2022 04:38
        +1

        На Stackoverflow приходят с такими решениями со ссылками на задачи LeetCode и GeeksForGeeks и просят помощи в поиске ошибок.


        1. Politura
          13.01.2022 06:27
          +5

          Про GeeksForGeeks ничего не знаю, а у литкода для каждой задачки своя ветка обсуждения, где можно спросить совета, если что-то не получается, или просто посмотреть другие решения. И если на самом деле кто-то от литкода с таким кодом пришел на стековерфлоу, то комментарии в коде прямо указывают на то, что это ctrl-c/ctr-v stackowerflow кодер, который обломался об литкод, не догадался там зайти в обсуждения и вернулся в привычную среду.

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


          1. sergio_nsk
            13.01.2022 07:03
            +1

            Этот код я набил сам, показал частые изъяны вопросов на SO от литкодовцев по моей памяти и добавил комментарии, чтобы у здешних читателей вопросов не было.

            1. Растягивание пространства std на глобальное пространство имёнён.

            2. Включение всех заголовочных файлов одним файлом гнутого компилятора.

            3. Переименование макросами нативных типов бессмысленными сокращениями.

            4. То же самое сокращение выраженний макросами.

            5. Отсутствие return. И т.д.

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


            1. Politura
              13.01.2022 09:39
              +1

              Ну литкод этож ни разу не обучение языку, там тренируешься делать быстрые алгоритмы, обычно в задачке надо реализовать одну единственную функцию, которая всегда что-то вернет. Иногда надо реализовать структуру, но очень редко. Соответственно 1 там по-умолчанию и наверное 2 тоже (уже включенные инклуды просто не виды), 5 не может быть в принципе, ибо всегда надо что-то вернуть (а хотя мейна-то там тоже нет, он полностью скрыт, как и тесты), а 3 и 4 ни разу не встречал, даже когда решал какие-то задачки на с++ и сравнивал с другими решениями, или просто видел в обсуждениях код с++.


    1. aleex
      13.01.2022 08:52

      Я периодически порешиваю литкод для тонуса и не очень понимаю, откуда это. Правда и в stackoverflow с вопросами не лезу :)

      Замечу, что std по умолчанию в нем включен, а в cout еще ни разу не приходилось писать, поэтому это какие-то неправильные пчелы были...

      По теме - да, действительно учит чему-то новому. Ну, в моем конкретном случае :)


      1. un1t
        13.01.2022 12:05

        del


      1. vrytov
        13.01.2022 17:08
        +3

        Это код не с Leetcode, а с контестов по олимпиадному программированию и площадок, на которых они проводятся (вроде Codeforces). Там действительно это общепринятая практика, например Пётр Митричев использует нечто подобное в своих решениях, и назвать его быдлокодером у меня лично язык не повернётся. Нередко набор макросов-сокращений и прочий бойлерплейт занимает >50% от решения. Это лишь специфика контестов - время ограничено, задач много, и париться с вводом всяких long long unsigned не очень приятно.

        Понятно, что в продакшене потом так не пишут.


        1. aleex
          14.01.2022 20:20

          Необычный для меня код, но я в спортивное программирование ни разу не пытался. Подскажите, все те сокращения, что по второй ссылке - это домашние заготовки или это прямо с нуля пишется на каждом соревновании?


          1. wataru
            14.01.2022 21:28
            +1

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


    1. andreyverbin
      13.01.2022 14:09
      -2

      А в Африке все голые и друг друга едят.


    1. wataru
      13.01.2022 17:55
      +2

      Это больше от олимпиад — там надо код писать максимально быстро. Это правда бывает, но лечится буквально за пару недель при наличии код ревью в компании (что у всех уважающих себя контор уже давно есть).


  1. Stas911
    13.01.2022 00:38

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


    1. NN1
      13.01.2022 11:20

      Тут зависит от компании. Скажем если вам FAANG то извольте натренироваться решать сложные задачки.

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

      Ещё любят некоторые системный дизайн спрашивать.

      А вообще здесь на хабре об этом много статей написано.


    1. tym32167
      13.01.2022 18:06

      у меня на литкоде где то 200 решенных, 50% - легкие, 40% - медиум, 10% - харды. Но я помимо литкода ещё много решал задач, готовился активно месяцев 6-8, задач примерно сотню в месяц решал разной сложности на разных платформах.


  1. un1t
    13.01.2022 12:06

    Не убедил. Если автор до литкода не умел писать тесты, то возможно надо было освоить TDD, а не литкод. Он научился валидировать данные. Отлично. А для этого точно нужен литкод?

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


    1. andreyverbin
      13.01.2022 14:16
      +2

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


      1. un1t
        13.01.2022 14:24

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

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


        1. andreyverbin
          13.01.2022 22:26

          Лучше и то и другое. Ничто так не учит вниманию к деталям и анализу граничных условий как литкод


  1. bouncycastle
    14.01.2022 00:20

    Есть два типа разрабов: те, кто считают что leetcode и алгоритмы - must have, и их противники.


  1. vya
    14.01.2022 02:21
    +1

    На практике выходит так, что пишешь как быстрее, с оглядкой на то, что может это и будет расширяться. А потом пишешь workaround для чужого кода, который писали также. И если есть свободное оплачиваемое время - допиливаешь/рефакторишь/причёсываешь. Куда интереснее в этом плане тестовые задания, когда есть время подумать над архитектурой и реализовать близкий к идеалу вариант.