Были годные статьи об аргументированной пользе алгоритмов (например, habr.com/ru/company/geekfactor/blog/597035), тут хочется поделиться личным опытом.

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

Что дано: фронтэнд с элементами nodejs разработки. Знаю javascript, взял java из-за общего префикса и Брюса Эккеля. Язык годный, легко читать, осознал что надо оч много писать после 175 задачек на ресурсе под именем leetcode. Попробовал язык мобилок, язык прекрасный, но не для мобилок. Swift прекрасен и будет еще прекраснее в будущем. До наступления прекрасного будущего решил юзать питон: легко и мало писать, но трудно читать — да и пофиг, так как каждый день новая задачка.

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

Недостижимая цель (она же мотивация) — заработать баллов на майку leetcode (5000, по-моему). За решение задачки дня дают 10 монеток. Идея как в казино, покрываем сектор. В месяц на наш сектор делает 50 монет (и будет больше). Профит. Верхняя граница сектора на данный момент — это трехсотая задача.

Что пропущено? 1) платные задачи — зарядку проводим дома без похода в зал; 2) задачки на которые можно решить только на bash — кажется, на питон уже пора все переписать; 3) четыре красные задачки.

Задачки на leetcode бывает трех видов: зеленая, желтая и красная. Отличие красной от желто/зеленых в кол-ве логических шагов и тестов c большими данными (и тут bigdata :) (или, другими словами, красные алгоритмы должны работать оч быстро). Бывали красные задачки что-то вроде проекта — вроде и не сложно, но пишешь и пишешь, прям оч много кода. Если сравнить: желтая задачка на день, красная может легко затянуть на два (в редких случаях на неделю).

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

Много задач на бинарный поиск, обход деревьев и списков. Задачки на строки, массивы, двойные массивы. Палиндромы (куда без них), скобки, калькуляторы (они же парсеры). Было с десяток задач на SQL (по-моему все можно решить с помощью window function). Были задачи с историей (прям кайф) которые обычно красные и кажутся на первый взгляд очень проходными. Много связанных задач.

В какой-то момент задачку оч хочется закрыть (выполнить), а вот тесты не проходят. То есть тесты на качество проходят (порядка 200 штук), а на кол-во (с большими входными данными) — нет. Алгоритм переиспользуeт компоненты связанных задачек, на бумаге выглядит чудесно, а тесты все никак. Погрешность теста в 0.3 % — пропущен какой-то локальный минимум (тут я честно позавидовал ребятам из ml). Возникает этическая проблема: харкодить или не харкодить тесты? С одной стороны, оч хочется закрыть задачку и пойти спать (что весьма неплохая идея). C другой, и думается мне, это весьма правильное решение — не харкодить, оставить задачку в нерешенных и вернуться к ней потом.

Немного статистики: решив первые 255 задачек, по версии leetcode вы будете лучше, чем 90% пользователей на желтых и красных задачках и на 84% по зеленым задачкам. Кол-во монеток приблизительно 950, рейтинг (или ранк) 146250 (есть куда плыть). Как-то так. Удачи в кодинге :)

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


  1. sswwssww
    01.04.2022 12:31
    +3

    "при этом коллега крутил на всем подряд биг О нотэйшн, скорее всего софт скилы у него развиты лучше" - причём тут софт скилы?

    "решил юзать питон: легко и мало писать, но трудно читать" - если уж Python трудно читать, то интересно узнать что за язык, по вашему мнению, легко читать.


    1. amarao
      01.04.2022 15:06

      Я тоже не сразу понял тезис. Он сводится к тому, что если есть два программиста с одинаковой зарплатой, но один умеет программировать, а второй "так себе", то второму зарплату обеспечили не навыки, а софт-скиллы (чесать языком). Пируэт сложный и вполне достойный задачки с литкода.


      1. sswwssww
        01.04.2022 15:21

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


        1. amarao
          01.04.2022 15:59
          +1

          Обычная венгерская обратная запись.


    1. xyli0o Автор
      01.04.2022 16:12

      Swift мне кажется вполне читаемый, typescript неплох


  1. Zibx
    01.04.2022 14:45

    О, помогите! Я попробовал порешать там задач, но баллов за них никаких не дали. Во всяком случае в профиле в Community Stats всё по нулям. Скажите что я делаю не так? Задачи решал из вкладки Problems.

    На codewars дошел до kyu 1, а тут не понимаю как работает статистика.


    1. xyli0o Автор
      01.04.2022 16:08

      Задачка дня на сегодня -- 344. Reverse String. Если решите, у вас +10 монеток :)


    1. nice17
      01.04.2022 20:24

      Со страницы https://leetcode.com/problemset/all/ в профиле доступен пункт Points, монеты там


    1. xyli0o Автор
      01.04.2022 22:05

      Статистика на страничке https://leetcode.com/<username>


  1. amarao
    01.04.2022 15:09
    +1

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

    // Под изучением языка я имею в виду не "hello, for while", а типовые паттерны. Заглянуть в соседнее решение после своего успешного - бесцено, потому что контекст высокий и удивление очень целенаправленное и глубокое.


  1. ya_ne_znau
    02.04.2022 18:17
    +1

    Пожалуйста, не пишите слишком много сокращений в статье ("оч", "след", ...). Это сильно режет глаза


    1. xyli0o Автор
      03.04.2022 13:37

      Оки)