Серия «На пути к FAANG»

49

На пути к FAANG 15

Сперва - маленький повод для гордости.

На пути к FAANG 15 Учеба, IT, Программирование, Faang

Я вошел в топ 100к пользователей LeetCode. "Фигня!", скажете вы. Может и фигня, но для меня это охренеть какое достижение - еще недавно я был за пределами топ 300к!

А еще у меня было очень много моков.

За прошедшее время я провел порядка 5 разных моковых интервью - и что характерно, ВСЕ они были с людьми из Нидерландов. Воздух у них какой-то особый, что ли. Я прям как изгой какой-то со своим Кипром. Что характерно - ни один мок не завалил, но справедливости ради, мне и вопросы попадались довольно легкие - пара на стек, один на sliding window, парочка на heap. Я в свою очередь с выбором вопросов заморачивался, поэтому у меня были и бинарный поиск (в rotated массиве, чтобы жизнь сказкой не казалась), и топологическая сортировка, и хитрая задачка на reorder связанного списка. В общем, мои вопросы пока еще никто с разбегу не решал, что, наверное, хорошо. Во всяком случае, я подсвечиваю моим будущим конкурентам за вакансии слабые места.

В общем, хорошо, что алгоритмы идут плавно - это поддерживает мою самооценку, потому что системный дизайн идет очень трудно. В курсе довольно сложный английский в плане построения предложений, плюс сам материал непростой, плюс сейчас идут прям фундаментальные основы, которые надо знать и понимать. Врагу не пожелаю читать про ребалансировку шардов БД на английском. Приходится перечитывать материал по несколько раз, плюс повторять на следующий день, чтобы закрепить. Самое интересное - я прекрасно понимаю, что вряд ли мне придется на интервью залезать в такие глубины - если только мне сильно не повезет, и интервьюер не захочет узнать, как хорошо я понимаю, как работает WAL и чем он отличается от логической репликации. Но я хочу понимать, вот в чем штука. Хочу не просто выучить, как задизайнить Netflix, а быть способным понять, почему все именно так, а не по-другому.

В общем, я чувствую себя так, будто из кодера превращающусь в программиста. Это, в принципе, круто само по себе, без всякого FAANG.

Показать полностью
11

На пути к FAANG 14

Итак, за прошедшее время я:

  1. Стал прямым свидетелем покушения на убийство (со стрельбой из пистолета в окно припаркованного авто). Из-за этого пропустил мок (был на нервах + давал показания полиции). Ууу, сука.

  2. Почти закончил топик Facebook на LeetCode.

  3. Впервые в жизни вывел собственное (и довольно крутое) решение dp-задачи, которого нет в editorial.

  4. Продвинулся по системному дизайну.

И поскольку первый пункт - это скучная, никому не интересная херня, давайте остановимся на последних трех!

Топик Facebook на LeetCode оказался довольно интересным. Некоторые задачки реально заставили попотеть, например, мне очень понравились вот эти две:

https://leetcode.com/problems/regular-expression-matching

https://leetcode.com/problems/longest-valid-parentheses

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

https://leetcode.com/problems/remove-invalid-parentheses/des...

И это еще не все! Наверняка вы ведь видели классическую DP-задачку?

https://leetcode.com/problems/decode-ways

Я уже решал ее когда-то, но как это часто бывает, тотально забыл, как, поэтому когда я открыл ее снова - засел на пару часов, перебирая и откидывая в уме разные варианты решения. И в процессе я обнаружил любопытную вещь - если строка состоит только из "1" и "2", число вариантов росло ровно как числа Фиббоначи! После этого понадобилось буквально 15 минут, чтобы вывести формулу для чисел 3-9 и 0, после чего я написал вот это:

На пути к FAANG 14 IT, Faang, Учеба

И это сработало! Более того - этого решения нет в editorial, а значит, я, пусть и случайно, сделал что-то новое и нестандартное! Не могу даже описать, как это круто. Ни о чем таком я даже и думать не мог, когда начинал год назад.

Ну и наконец системный дизайн. Тут получилось забавно - я разобрал еще три главы из книги, про которую писал в прошлой части. Один из комментаторов посоветовал мне забить ровно после 100-й страницы и переключиться на что-то конкретное, поэтому сегодня, после главы про проектирование веб-краулера (150-я страница - до меня медленно доходит), я решил из интереса чекнуть, не учу ли я что-то, что потом придется проходить еще раз в том самом всеми обожаемом курсе на Educative. И - сюрприз - все это там есть. В общем, завтра начинаю этот курс. Книгу буду просто использовать как шпаргалку.

В конце, как обычно - пожелание всем, кто идет или собирается пойти по моим стопам, не сдаваться. Неважно, как все это закончится и смогу ли я пройти с первой/второй/n-ной попытки в big tech, главное - что даже у самоучки есть шанс этого добиться. Так что занимайтесь, и не позволяйте всякой фигне типа стрельбы на улицах выбить вас из колеи больше чем на пару дней)

Показать полностью 1
27

На пути к FAANG 12

Итак, прорыв.

На пути к FAANG 12 Программирование, Учеба, Faang, IT

Если что, тут два Medium алгоритма, решенных сегодня, не влезли

За последние 4 дня - 9 алгоритмов уровня Hard, 22 алгоритма Medium и 7 Easy. Практически все - без заглядываний в рефы.

Что случилось и откуда такой прогресс на пустом месте? Дело в том, что я прошел свой первый мок. И героически его завалил, во всяком случае, алгоритмическую часть.

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

Я слишком торопился, и начинал писать решение прям сразу, даже не обдумав (и не проговорив) его предварительно. Типа, по ходу дела придет.

Тупо? Да, тупо. Но теперь я это исправил (я стараюсь прям вслух проговорить решение от и до, прежде чем приступать к написанию кода) и моя продуктивность улетела куда-то в стратосферу. Откровенно говоря, за последние 4 дня я только один раз потратил на алгоритм больше часа. Вот он, очень рекомендую попробовать.

https://leetcode.com/problems/word-ladder-ii/description/

Первый word ladder, кстати, решить было довольно легко (строим граф, делаем BFS по графу, профит). Но вторая часть - это конечно что-то. Если мне дадут это, вряд ли я напишу готовое решение за полчаса.

Книжка по системному дизайну идет довольно легко, сейчас изучаю распределенные хранилища key-value. Из интересного до этого была только тема со стратегиями rate limiting. Конспект по книге уже на 20+ страниц чистых терминов и определений. Книга очень крута, автор не растекается мыслью по дереву и расписывает коротко и ясно, highly recommended (Alex Xu, System Design), just in case.

Короче, не сдавайтесь.

Показать полностью
8

На пути в FAANG 11

Давненько я не писал, наверное, мои 65 подписчиков меня уже потеряли... шучу, кому я сдался) Но тем не менее, считаю своим долгом выложить очередной отчет.

Курс на Educative закончен. Правда, напоследок он дал мне прикурить, подсунув пару-тройку алгоритмов уровня Hard по Disjoint Set (он же Union-Find). Один я решил сам, один разобрал и над одним (обозначенным как Medium по какой-то неведомой мне причине) просто посмеялся и закрыл. Как любят шутить на LeetCode - "если вам дали это на интервью, знайте - они не хотят вас нанимать". Вот вам ссылка, попробуйте свои силы.

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

На пути в FAANG 11 Faang, Учеба, Программирование, IT, Гифка

В общем, так получилось и со мной после того, как я открыл гайд по подготовке к интервью одной хабровчанки (жители Хабаровска, это не про вас написано), и узнал, что, по ее мнению, я знаю где-то 20% от требуемого уровня. Там и дискретная математика, и теория вероятности, и master theorem, и основы криптографии, и битовые манипуляции - и это все только база. В общем, я было перенес сроки еще на пару лет вперед, но один умный человек, который уже давно в этом самом FAANG, меня успокоил и посоветовал сосредочиться на основах. Чем я и решил заняться.

Так что сейчас я просто начал прорешивать по 4 задачки из топика Amazon в день. Когда закончу с ним - начну Meta. Это две компании, в которые у меня потенциально есть рефералы.

Плюс начал книжку Alex Xu по системному дизайну. Для опытных людей, наверное, она довольно примитивная, но для меня, как способ "вкатиться в тему" - прям must have, как оказалось. Минимум воды, максимум информации, люблю такое.

Ну и да, я начинаю моки по алго части. It's time. Страшновато, конечно. Так что пожелайте мне удачи.

Показать полностью
11

Разбираем задачку с LeetCode на Dynamic Programming

Вчера у меня случилась великая радость - я наконец-то без подсказок написал решение medium DP задачи, используя bottom-up подход (то есть циклом вместо рекурсии). Рекурсивные (up-down) подходы более интуитивны, зато циклы дают лучшую производительность и меньшее потребление памяти. В общем, давайте попробуем разобрать daily-challenge c LeetCode за вчерашний день.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Дана строка, нужно найти и вернуть самый длинный палиндром из нее (если несколько одной длины, вернуть любой).

Начинаем с интуитивного решения. Рекурсивно переберем все возможные варианты.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Не самый красивый код, но со своей ролью справляется.

Предсказуемо работает - и вылетает по Time Limit. Еще бы, у нас Time Complexity O(n^3). Кошмар.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

А ведь это далеко не самая большая строка...

Но ведь это задачка на DP. Даже если бы этого не было в тегах - все равно можно понять, что места для оптимизации тут есть, ведь мы по факту обрабатываем некоторые подстроки по многу раз. Скажем, если мы возьмем слово длиной в 5 символом, то, построив стек вызовов в виде обычного бинарного дерева, можно убедиться, что подстрока [2,3] будет проверена трижды. Не круто.

Давайте-ка добавим мемоизацию.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

О, мы сразу прошли все тесты (снизили TC до O(n^2)). Но результаты не радуют.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Особенно ужасает потребление памяти. Даже для Java это перебор.

Плохо. В основном плохо из-за мемоизации строк (приходится тратить время и место на их обрезку и хранение), плюс недешевая проверка на палиндром в O(n). Давайте-ка перепишем на bottom-up.

Мы помним, что у задачек на палиндром есть три общих случая в зависимости от длины строки n:

  • Если n = 1, строка всегда палиндром (в каком направлении букву не читай, выйдет одно и то же).

  • Если n = 2, то строка палиндром, если первая буква равна последней.

  • Если n > 2, то строка считается палиндромом, если первая буква равна последней, и строка между ними - палиндром.

Собственно, мы просто заполняем dp таблицу прямо по этому принципу.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Гораздо симпатичнее, но в разы менее интуитивно

Смотрите, какая красота

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Да, это все еще в нижней планке решений (благодаря тому, что существует довольно замысловатый алгоритм, решающий эту проблему за линейное время), но в три раза сократили Runtime, и в два - потребление памяти. Это все еще O(n^2), но скажем так, с куда более приемлимыми константами.

Собственно, это был, наверное, один из наиболее базовых алгоритмов на тему динамического программирования, и шансы, что что-то подобное спросят на собеседовании в FAANG, довольно высоки. Просто посмотрите на топик Companies.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Так что имеет смысл уметь решать dp алгоритмы и сверху вниз, и снизу вверу. Чисто на всякий)

Показать полностью 8
12

Снова на пути к FAANG

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

В общем, месяца так три назад я словил перегорание (походу, сидеть по 8 часов на LeetCode все же было плохой идеей) и какое-то время просто не хотел видеть ничего на эту тему. Я работал. Читал книги. Старался не сдохнуть от кипрской жары (+47, сука). Делал все, что угодно, лишь бы не возвращаться к алгоритмам. Так продолжалось около пары месяцев, пока я не осознал, что:

  1. До окончания контракта на Кипре чуть больше года, и я точно не хочу тут оставаться.

  2. Я действительно хочу перебраться в Штаты через пару лет.

  3. Я больше не хочу работать в стартапах за 4 килоевро, а радикально больше платят только в FAANG.

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

В общем, в августе я вернулся и начал все заново. Не надо делать facepalm - я просто решил освежить свои знания по всем пройденным темам, чтобы гладко вкатиться назад. Начал решать daily challenge на Leetcode + повторять свою программу на Educative. Как оказалось. это было неплохой идеей, потому что мои прошлые знания никуда не делись, а с новыми силами я даже смог гораздо более детально разобрать некоторые паттеры и закрепить их в своей памяти. В общем, сейчас в пройденном материале я уверен гораздо сильнее, чем раньше.

И позавчера я наконец-то закончил с повторением и начал новую тему. Топологическая сортировка оказалась довольно легкой, если понимать графы (спасибо книжке "Грокаем алгоритмы"). Хотя на Alien Dictionary я угрохал почти четыре часа, но в основном из-за того, что криво прочитал условие и вместо порядка слов взял за основу для построения графа порядок букв в словах. Короче, сам себе злой Пиннокио. Из первых уст я знаю, что эту задачку спрашивают в Амазон, так что нейронная связь точно лишней не будет)

В общем, сдаваться я не собираюсь - курс на Educative почти перевалил за 50%, и я его закончу. После этого (наконец-то!) системный дизайн.

Показать полностью
0

На пути в FAANG 9

Итак, за спиной еще неделя.

Тема графов оказалась не такой уж и простой, как я думал - сбивает с толку то, что каким-то образом это, блин, не отдельная структура данных! Обычно графы даются как набор граней (то есть тупо двухмерный массив), и нужно проделать несколько телодвижений, чтобы превратить это в мапу и начать уже BFS/DFS. Зато алгоритмы Прайма/Крускала оказались очень и очень легкими.

Вообще, именно топик с графами подсвечивает мне одну интересную проблему - говорят, что образцовое решение Medium алгоритма за редкими исключениями должно умещаться в 30 строчек. Каким образом в эти 30 строчек впихнуть, например, самописный класс UnionFind - хрен его знает. Тут либо оговаривать, что "это не считается", либо предлагать интервьюеру использовать воображение.

Еще забавно, что пока я грызу графы на LeetCode, добрые люди в Educative взяли и расширили несколько уже пройденных топиков моего курса. Топик по DP, например, разросся в два раза. Придется возвращаться и дорешивать, но я в целом не против. Вообще DP мне прям нравится, как и в принципе все рекурсивное (подход bottom-up заходит меньше, хотя не могу отрицать его изящность в некоторых случаях). Смешно вспоминать, что когда-то сама концепция рекурсии плотно выносила мне мозг. Даже жаль, что в работе ее практически не приходится использовать.

Сегодня пришла в голову идея подговить себе шпаргалки типа "Название алгоритма -> Алгоритм -> Применение". Ну то есть например:

BFS -> закидываем стартовый элемент в стек, далее в цикле -> вытаскиваем элемент из стека -> закидываем в стек соседей, удовлятворяющих условиям -> повторяем, пока не находим то, что нужно.

То же самое неплохо было бы сделать по паттернам типа бэктрекинга, которые скорее концепция, чем непосредственно алгоритм.

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

Показать полностью
10

На пути к FAANG 8

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

Я "начал" графы. Почему в кавычках? Да потому что я уже проходил их два года назад, это было первое, что давали на курсе Седжвика. Но за весь курс Седжвик ни разу не назвал это, собственно, графами, или хотя бы disjoint set (или я просто забыл за давностью событий). В общем, я долго настраивал себя на то, что будет сложно и муторно, а в итоге оказалось, что это довольно просто. Пришлось только запомнить, как написать UnionFind с weight union и path compression, два метода и конструктор. Piece of cake.

Еще я порядком подохренел с того, как хорошо прокачал связанные списки. Тренировки ради начал этот раздел в топике Амазона на LeetCode и закончил три средних и одну сложную проблемы за полтора часа.

Вообще наконец-то появилось ощущение опыта, что ли. Своего рода интуиция, которая говорит - ок, похоже, тут можно использовать heap, здесь - dynamic programming, а вот это - просто долбанутая задача, которую проще скипнуть. Кстати, да - долбанутых задач на LeetCode хватает. Например, в том же топике Амазона была проблемка - превратить число в его текстовую репрезентацию, на английском, само собой. Для этого нужно накидать минимум три мапы и покрыть 100500 всяких corner case'ов. Могу ли я это сделать? Да. Хочу ли я тратить на это пару часов? Точно нет! Как мудро заметил кто-то в комментариях к задаче - если вам дали такое, значит, вас не хотят нанимать.

По сути, графы - последний крупный топик, который оставался непокрытым (мне еще предстоит научиться обходить их и ознакомиться с парой-тройкой типовых алгоритмов по этой стуктуре данных). Дальше только заканчивать курс по паттернам coding interview (там не так много осталось) и повторять уже пройденное. Я хочу, чтобы через пару-тройку месяцев я мог комфортно решать хотя бы 70% medium алгоритмов на LeetCode с минимальным количеством прогонов. Сейчас это достижимо. Еще несколько месяцев назад это было невозможно. И в этом чисто моя заслуга.

Кстати, походу, перед курсом на system design мне придется пройти курс по распределенным системам. Жду не дождусь, если честно. Хоть что-то новое)

На этом все, увидимся через неделю.

Показать полностью
Отличная работа, все прочитано!