Как я изучал структуры данных и алгоритмы для собеседования в FAANG

Автор оригинала: Esco Obong
  • Перевод
Продолжая тему устройства в FAANG, которую уже мы поднимали в нашем блоге, и специально к старту нового потока нашего курса по алгоритмам сегодня делюсь описанием пути Эско Обонга, старшего инженера-программиста Uber.

Эта история началась в 2015 году, когда стартап, к которому я присоединился как «сотрудник-основатель», закрылся через шесть месяцев после первого раунда инвестиций, и я искал новую работу. Первое моё собеседование было с  Codecademy, где на этапе телефонного разговора меня заверили: «Не волнуйтесь, мы не задаём сумасшедших вопросов об алгоритмах или что-то в этом роде». И я им поверил…




Во время собеседования было два раунда вопросов об алгоритмах, которые в ретроспективе были чрезвычайно простыми. Я помню, как один из собеседников спросил, как пройти из точки A в точку И по сетке. Я понятия не имел, как это сделать, поэтому наделал какой-то ерунды. Написал на доске бесконечный цикл while:

while (true) {…

В цикле точка меняла направление на каждой итерации в зависимости от того, столкнулась ли она со стеной, цикл прерывался, если не находилась конечная точка. Внутри себя мой собеседник, похоже, думал: «WTFFF», но сохранял хладнокровие и продолжал обсуждать мои идеи.

Фиаско в Codecademy открыло мне глаза на пробелы в моих знаниях. Два с половиной месяца спустя я прошёл телефонный скрининг в Google, Uber, Shutterstock и Rent the Runway. Были собеседования на месте в Shutterstock, Rent the Runway и Uber – и я прошёл их все. Google перенёс моё собеседование на две недели вперёд в последнюю минуту. К тому времени у меня уже было три предложения, и я был в восторге от Uber, поэтому я нажал на спуск – присоединился к Uber.

Я прошёл с нуля до профессионального уровня всего за несколько месяцев, но не делал ничего особенного, только последовательно учился. Вот почему я твёрдо верю, что любой инженер может справиться с этими вопросами об алгоритмах и структурах данных и попасть в F.A.A.N.G. или на аналогичные должности с высокой зарплатой. Сначала казалось, что мне не хватает квалификации, потому что для собеседования приходилось усердно учиться. В 2019 году, после того как я управлял собственной консалтинговой фирмой и стартапом в течение почти двух лет, я решил вернуться к постоянной работе и оказался в том же положении, что и в 2015 году.

На этот раз у меня было больше друзей в Uber и других ведущих компаниях, таких как Google и Facebook, которые помогли мне понять суть дела. Так же усердно пришлось учиться им всем. Даже тем, кто не бросил колледж, как и я.

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

Я отказался от представления о мифическом инженере, который может по щелчку пальцев пройти техническое собеседование, и начал понимать реальность ситуации: технические собеседования похожи на SAT [прим. перев. — «Scholastic Aptitude Test» и «Scholastic Assessment Test», дословно «Академический оценочный тест») — стандартизованный тест для приема в высшие учебные заведения в США] в школе. Не важно, что вы потратили четыре года, чтобы изучить всё, чему учатся в старшей школе. Если вы хотите сдать экзамен, вам всё равно нужно подготовиться. Как и в случае с SAT, все ваши прошлые работы и оценки не влияют на результат. Ваш успех полностью зависит от того, насколько хорошо вы сдали тест.

Как только я понял истину, что учиться нужно всем, то обрёл достаточно мотивации, чтобы трудиться усердно. Я понял, что труд обучения – это именно то, чем заняты мои конкуренты. Это послужило толчком, чтобы сформировать процесс обучения, который помог мне пройти все технические тесты и собеседования в 2019 году. Я бросил колледж и прошёл технические тесты Stripe, Coinbase и Triplebyte. Прошёл скрины и собеседования на местах в Google, Amazon, Uber (снова), Reddit, Squarespace и Braze. Я не ждал, что пройду всё идеально, но считаю, мне помогло то, что я сосредоточился на основных принципах.

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

Переход не был плавным. Когда я только начал готовиться к собеседованию, мне потребовалось более 2 часов, чтобы почти решить задачу, которую теперь можно было бы назвать «leetcode easy», а в то время это казалось невозможным! Я искренне верил, что просто недостаточно умён от природы и мне придётся учиться ещё усерднее, чтобы достичь уровня, на котором смогу решить задачу с той же скоростью, что и инженер Google. Я понял одно: мне нужно практиковаться.

Чего я не понимал, так это того, что такого уровня сложности и разочарования вначале следует ожидать всем начинающим, включая инженеров Google.

Я всё тот же человек. Единственная разница между мной тогда и сейчас – практика, практика, практика. У людей часто возникает вопрос: «Как мне учиться?» Трудно понять, с чего начать, что делать дальше, добиваетесь ли вы прогресса, и ещё труднее оставаться на верном пути. Чтобы решить многие из этих вопросов, когда я учился, я создал доску Trello со всеми темами, которые хотел охватить. Доска помогла мне сосредоточиться на самых важных темах и управлять временем, чтобы прогресс был стабильным.

Я написал пост о доске Trello в LinkedIn, этот пост стал вирусным. Менеджер Trello связался со мной по поводу создания для него официального шаблона Trello, который теперь находится здесь: Interview Study Tracker.

Чтобы учиться, в трекере есть шаблон. Он требует определения списка тем и двух или более ресурсов, которые могут научить чему-то по теме. Затем нужно задать себе 2–3 практических задачи, чтобы укрепить понимание. Задачи могут быть из любого источника, главное – это сам контент. Я нашёл большую часть своего контента с помощью простого поиска в Google, темы были ключевыми словами.



Изучайте одно и то же с разных точек зрения, это поможет лучше понять тему. Например, о двоичных деревьях поиска я бы прочитал статью на geeksforgeeks.org, а также главы о них в Cracking the Coding Interview. Затем я задал бы себе 2–3 практических задачи, или достаточно задач, чтобы почувствовать себя комфортно, прежде чем двигаться дальше.

Мой экземпляр «Cracking The Coding Interview 6th Edition», подписанный Гэйл Лакман Макдауэлл

Список тем для изучения


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

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

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

Базовые структуры данных


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

  • Массив.
  • Множество.
  • Хэш-отображение (HashMap, хэшмэп).
  • Связный список.
  • Стек.
  • Очередь.
  • Дерево.
  • Граф.

Ничего страшного, если этот список кажется вам длинным. Многие из этих структур данных тесно связаны и даже опираются друг на друга, поэтому вы сможете изучить их все быстрее, чем думаете. Хэшмэпы базируются на массивах. Стеки строятся на основе связанных списков или массивов. Очереди основаны на связанных списках. У деревьев есть понятия «узлов» и «ссылок» из связанного списка. Графы находятся в том же поле понятий. Они также имеют много общего с деревьями. Все деревья технически тоже являются графами, так что вы можете применить к ним те же методы, что и к графам.

Продвинутые структуры данных


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

  • Куча (также известная как приоритетная очередь).
  • LRU-кэш.
  • Двоичные деревья (AVL, красно-чёрные).
  • Непересекающиеся множества.
  • Trie (префиксное дерево, нагруженное дерево).
  • Skip List (список с пропусками).

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

Кучи, также известные как очереди приоритетов, – это тип дерева, которое ведёт себя как очередь. Бинарное дерево поиска (BST) – это дерево, которое ускоряет поиск узлов. AVL и красно-чёрные деревья – два популярных специфических типа сбалансированных BST. Кэш LRU – это кэш с эффективным использованием памяти, он создаётся объединением Hashmap [прм. перев. — хэшмэпы — специфический тип хэш-таблицы] со связным списком. Trie – это ещё один тип дерева, который ускоряет поиск по подстроке. Непересекающиеся множества – это особый тип множества, которые разделяют элементы на неперекрывающиеся подмножества, полезные для алгоритма поиска объединения. Skip List – это оптимизированный LinkedList, он сокращает время поиска определённых узлов.

Основные алгоритмы поиска и обхода


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

  • Поиск в ширину.
  • Поиск в глубину.
  • Двоичный поиск.

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


В этой области проводится много исследований, но для целей технического собеседования наиболее продвинутые алгоритмы поиска, с которыми вы, вероятно, столкнётесь:

  • Quickselect [прим. перев. — алгоритм нахождения k наименьших элементов в неотсортированном массиве].
  • Алгоритм Дейкстры.
  • Алгоритм Беллмана – Форда.
  • А-звезда (редко).

Алгоритмы сортировки


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

  • Быстрая сортировка.
  • Сортировка слиянием.
  • Топологическая сортировка.
  • Сортировка подсчётом.

Важные темы


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

  • Рекурсия.
  • Жадные алгоритмы.
  • Динамическое программирование.
  • Битовые манипуляции (AND, NOT, OR, XOR).

Распространённые шаблоны


Эти шаблоны можно использовать, чтобы разобраться со многими алгоритмами:

  • Поиск с возвратом.
  • Метод двух указателей.
  • Метод скользящего окна.
  • Принцип «разделяй и властвуй».
  • Reservoir Sampling (резервуарная выборка).

Математические задачи


  • Перестановки.
  • Комбинаторика.
  • Факториал.
  • Степень множества (булеан).

Другие общие задачи


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

Практика


Самостоятельная практика


Обучение ничего не значит без практики. Каждый раз, когда вы изучаете новую тему из своего учебного плана, вы должны использовать знания из неё. Это поможет вам лучше запомнить тему, даст понимание глубже. Задайте самому себе несколько практических задач по каждой завершённой теме. На таких сайтах, как leetcode.com, можно найти практические вопросы, воспользовавшись тегами «trees» или «graphs».

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

Во время собеседования вы должны решить задачу за 15–45 минут в зависимости от сложности. Вначале вам, скорее всего, понадобится несколько часов, чтобы решить первую задачу. В первые несколько недель это время должно начать сокращаться. Через месяц или два месяца постоянной практики (а не просто времени) вы должны научиться решать приличное количество задач вовремя. Иногда ваша задача – реализовать единственную структуру данных, например LRU-кэш или Trie. В других случаях нужно выполнить только одну операции над структурой данных, например удаление элемента в двоичном дереве.

Практикуйтесь в реализации всех упомянутых здесь структур данных до тех пор, пока вам не придётся ничего искать, и вам будет очень легко отвечать на перечисленные выше вопросы, когда собеседование будет настоящим. Сосредоточьтесь на понимании того, почему код написан именно так, а не на попытках запомнить код точно. Когда вы пишете код, исходите из понимания того, что должно произойти дальше, а не ориентируйтесь по памяти. Вероятно, вас не попросят реализовать массив или сбалансированные деревья BST, такие как деревья АВЛ/красно-черные, но вы должны знать, как они работают.

Практика с ассистентом (имитация собеседования)


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

Когда вы будете готовы?


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

Очень важно отслеживать прогресс и получать обратную связь, чтобы знать, когда вы действительно готовы выступить на настоящем собеседовании, не полагаясь только на эмоции. Следите за временем выполнения, когда вы задаёте себе практические задачи, и старайтесь не более 40 минут на ответы на большинство вопросов среднего уровня и 1 час на ответы на сложные вопросы на leetcode.com или hackerrank.com.

Большая часть кода на собеседовании оценивается на небольшом наборе крайних случаев, и небольшие ошибки всегда пропускаются или считаются несущественными. Люди не ждут совершенства, но они должны увидеть достаточно «сигналов», чтобы убедиться в том, что вы подходите. Пройдите как минимум три фиктивных собеседования, прежде чем идти на настоящее. Двигайтесь вперёд только в момент, когда сможете стабильно хорошо работать во время тренировки.

Крупные технологические компании нанимают сотрудников постоянно, поэтому они могут очень гибко планировать или переносить дату собеседования. Я перенёс свои собеседования в Google и Uber на 2 и 1 месяц соответственно, потому что не был готов. В прошлом я делал ещё более длительные переносы. Чтобы перенести собеседование, не нужно никаких особых оправданий. Я просто говорил: «Мне нужно больше времени на подготовку». Эти компании тратят много денег на ваше собеседование. 5–6 штатным сотрудникам платят за собеседование в течение 4–5 часов с последующей оценкой результатов. Учитывайте зарплаты рекрутеров, они нашли время, чтобы найти вас и обработать лишь небольшой процент заявок от людей, которые прошли через них, и это как минимум несколько тысяч долларов за собеседование. Компании хотят, чтобы люди приходили подготовленными. Они будут ждать, а не тратить время, деньги (и не только их) на отказ от инженера, который мог бы подойти, если бы они просто подождали ещё месяц или два. Так что отложите мероприятие, если не готовы. Никогда не идите на собеседование, не будучи готовым!

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

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

Ресурсы

Книги



Сайты


  • brilliant.org — структуры данных на Brilliant.
  • algoexpert.io — лидирующая платформа для подготовки к собеседованиям с программированием, алгоритмами и структурами данных.
  • bigocheatsheet.com — пространственная и временная сложности.

Буткэмпы


  • interviewkickstart.com — курсы подготовки к техническим собеседованиям.
  • outco.io — подготовка к собеседованию.

Практика


Самостоятельная работа

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

Работа с ассистентом

  • interviewbit.com — бесплатные и анонимные имитационные собеседования.
  • pramp.com — практика в собеседованиях вживую.


Надеюсь, данная статья была вам полезна. Главная мысль, которую я хотел донести — чтобы устроиться на работу в ведущую технологическую компанию, вам не нужно специальное высшее образование (хотя оно будет полезно), гены счастливчика или длинный послужной список. Единственное, что вам нужно, – это уделять время последовательному обучению и практике и не забывать про промокод HABR, который добавит дополнительно 10% к скидке на баннере.



image



SkillFactory
Школа Computer Science. Скидка 10% по коду HABR

Комментарии 71

  • НЛО прилетело и опубликовало эту надпись здесь
      +4
      А вы изучайте для себя а не для собеседования. Темы для изучения которые описал автор — это база, которую дают на первом курсе профильных учебных заведений.
      • НЛО прилетело и опубликовало эту надпись здесь
          0

          Помню, в универе защищал лабораторную. Какую-то мелочь не знал, препод говорит: "Что нужно делать если не знаешь — верно, читать документацию. Где в RStudio документация?", а потом "И что значит что ты прочитал?".
          Отличный препод был. Жаль что я на учебу забил(

          +8

          Неиспользуемые вещи забываются.


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

            +2
            А мне вот другое интересно — если человек помнит, что красно черное дерево — это двоичное, сбалансированное (даже самобалансирующееся) дерево, применяемое в таки-то случаяз — этого недостаточно? Ведь если мы говорим о понимании — то понимания того, что такое сбалансированное дерево, и почему это хорошо/плохо — должно реально хватать для работы. А уже детали реализации помнить скорее глупо, чем полезно.
              +1
              то понимания того, что такое сбалансированное дерево, и почему это хорошо/плохо — должно реально хватать для работы.

              Должно. Но видимо те кто собеседуют(речь не про всех) хотят чтобы прогер был с установленным ssd у себя в голове, вместо мозга.
                0

                В гугле, наример, не спрашивают реализацию красно-черных дервьвев. Достаточно использовать std::set, допустим, и знать, что оно работает за логарифм, потому что там внутре бинарное самобалансирующееся дерево поиска. Если вы слышали о (или тем более знаете как устроено) красно-черное дерево (как один из примеров таких деревьев), то это лишь повод поставить вам дополнительный жирный плюс в графе "алгоритмы и структуры данных". Но даже просто знания, что там за логарифм как-то работает и вставка и проверка и удаление, вполне достаточно, и никаких минусов в отчете не понесет.

                  0
                  Понятно. Ну я бы сказал, что это логичный вариант, т.е. если бы я решил вдруг спросить про красно-черное дерево, меня бы такой ответ удовлетворил тоже.
              –1
              Вы так говорите, как будто эту университетскую «базу» используют больше 1% современных программистов/кодеров/разработчиков. ПО сути для первой джуниорской вакансии надо прочесть 1 книжку по языку и 1 книжку по алгоритмам (самую тонкую, не надо кнута) + глянуть 10-15 самых распростанненых задач на собес. А дальше ты работаешь и получаешь актуальный для индустрии опыт. А для всякиех там гуглов уже читаешь вот такие статьи и специфические книги. Какое-то кусочки знаний конечно иногда пригождаются на работе, но использовать старое доброе высшее образование как какое-то базовое мерило для специалиста весьма спорно. Вижу кучу примеров как люди без вышки прекрасно себя чувствуют в индустрии разработки ПО.
            +45
            -А вы знаете как сделать поиск внутри графа?
            -Да, конечно, вот — вот так можно, а еще так, но за большее число итера…
            -А красно-черное дерево?!
            -Да, это мое любимое — вот варианты и я еще мо…

            -Хорошо, вы приняты!
            Будете делать формочки для логина пользователя…

            © FAANG
              +1
              Будете делать формочки для логина пользователя…

              ))))) Спасибо, спасибо, что так лаконично выразили цель такого рода собеседований.

                +10
                FAANG:
                -А вы знаете как сделать поиск внутри графа?
                -В книжке посмотрю, если на SO сходу не нагуглю.
                -А красно-черное дерево?!
                -Ну что вы! Название, конечно, слыхал, но в настоящей жизни это даром не нужно!

                -И действительно! Мы вам перезвоним!

                *Продолжает делать формочки для логина пользователя в чешижопской интернет студии*
                  0
                  Есть разница между «не знаю», и «знаю, но с ходу не напишу, надо заглянуть в справочник». Таким образом вас могу попросить написать, к примеру, 5 интегралов от тригонометрических функций по памяти.
                    0
                    Это тоже верно. Но если вам нужно будет принять на работу одного, а на собеседование придет 500 соискателей, то скорее всего, вы возьмете на работу того, кто эти пять интегралов знает, и не будете проверять навыки просматривания в справочниках у всех остальных. Нет, возможно кто-то из них и лучше решает диффуры, но если вы это будете проверять, то за приемлемое время вы никого не найдете. Лучше найти локальный приемлемый максимум за конечное время, чем абсолютный за бесконечное.
                      +4
                      Но если вам нужно будет принять на работу одного, а на собеседование придет 500 соискателей, то скорее всего, вы возьмете на работу того, кто эти пять интегралов знает, и не будете проверять навыки просматривания в справочниках у всех остальных.

                      Проблема только в том, что такой метод сработает, если ваша работа связана с высшей математикой. Но, если работа именно «формочки для логина» делать, то может оказаться, что чемпион-олимпиадник, на память диктующий таблицы интегралов, очень плохо делает формочки.
                      Т.е. я к тому, что вопросы собеса должны находится в практической плоскости, понятной и собеседующему и соискателю.
                        +1
                        Проблема оценки пригодности кандидата стара как мир, никто и не говорит о том, что это оптимальный подход. Просто вероятность того, что человек, знающий алгоритмы, может делать формочки хорошо, выше, чем у человека, который их не знает. К тому же это универсальная проверка на пригодность в области computer science, позволяющая унифицировать процесс для разных вакансий.
                          +5
                          Просто вероятность того, что человек, знающий алгоритмы, может делать формочки хорошо, выше, чем у человека, который их не знает.
                          Совсем не факт. «Делать формочки» — это нудная работа на усидчивость и для человека с высоким интеллектом и глубокими знаниями она скучная и не интересная, поэтому делать он будет ее «через силу» и результат будет соответствующий. Академика тоже можно посадить за кассу в супермаркете, но зачем?
                            0
                            Ну ладно, нудная работа это отстой, согласен. И куда тогда податься людям с высоким интеллектом, да так, чтобы по деньгам как в FAANG? Такие места есть, но их на порядок меньше, чем открытых позиций в фаанге, и попасть туда еще труднее. Тут не такая дихотомия, что ты или страдаешь от ограниченности в Гугле, или купаешься в деньгах, попутно применяя свои глубокие знания в каком нибудь НИИ cutting-edge R&D центре. IRL ты или мучаешься от ограниченности задач в Гугле в Калифорнии, считая дни до вестинга, или мучаешься такими же ограниченными задачами в «Рога и Копыта Индастриз» в Подмосковье, считая дни до зарплаты (это я сильно утрирую, конечно, сути это не меняет).
                            Я не вижу препятствий для человека с глубокими знаниями и высоким интеллектом «делать формочки в Гугле», и извлекать из этого максимум выгоды в деньгах, в качественном расширении социальных связей и деловых и научных возможностей для собственного дела. Имхо, это вполне стоит месяца-двух усилий над собой.
                              +3
                              С позиции соискателя интерес понятен.
                              Мой комментарий был относительно нелогичности HR-отдела.
                              Грубо говоря, если нужны грузчики, так и проверяйте силу и выносливость, а не IQ-тест и наличие кандидатской диссертации…
                                –3
                                Мой комментарий был относительно нелогичности HR-отдела. Грубо говоря, если нужны грузчики, так и проверяйте силу и выносливость, а не IQ-тест и наличие кандидатской диссертации

                                Все у HR логично. Представьте, что вы HR в некотором условном Газпроме и руководство для подержания имиджа требует платить грузчикам в 10 раз больше среднего в этом регионе.

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

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

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

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

                                    Скорее грузчиков заставляют участвовать в соревновании армрестлинга.
                                    Это не очень покажет умение акуратно перенести рояль или разгрузить Камаз кирпичей за смену, но в целом какие-то корреляции с физической силой армрестлинг, вероятно, покажет.
                                      0
                                      Мне кажется, цепочная интерпретация аналогий — неблагодарное занятие. Точки зрения понятны, так что предлагаю остановиться. )
                            +4
                            может оказаться, что чемпион-олимпиадник, на память диктующий таблицы интегралов, очень плохо делает формочки.

                            Кстати, судя по результатам работы FAANG для конечного пользователя — оно в целом так и есть.
                              0
                              Тут главное не спутать маркетинговый и инженерный буллшит. )
                                +1
                                Как интересно получается.

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

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

                                Всё как в этом известном мультфильме:



                                Если это правда, то к системе собеседований появляется ещё больше вопросов. Если нет — то придётся признать равный вклад в буллшит всех участников :)
                                  0
                                  Вопросы к сервисам, конечно, есть у всех. Но лично я в целом не возьмусь учить Гугл бизнесу, а его инженеров программированию.
                      +2
                      Вы не поверите, неделю назад, интервью с Убер, первое задание — построить ориентированный граф, обойти все вершины и отфильтровать некоторые из них по условию.
                      Интервьюверу не понравилось что я использовал adjacency list для построения графа. Сказал, что есть более эффективный способ, но какой не сказал. Интервью на фротенд позицию не пройдено.
                        0
                        построить ориентированный граф, обойти все вершины и отфильтровать некоторые из них по условию.

                        Может матрица смежности?
                          0

                          …которая для sparse-случая выродится в adjacency list, большие не-sparse-графы — сам по себе интересный вопрос, а для маленьких графов это всё неважно.

                            0

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


                            Но это очень частный случай. Может, mobileDeveloper что-то напутал и наоборот предлагал матрицу смежности вместо списка инцидентности?

                              0
                              Граф был разряженный. Матрицу я упомянул, как вариант и объяснил, почему она может быть хуже в данном случае.
                            0
                            Я упомянул такую возможность.
                            +4
                            Вы не поверите, неделю назад, интервью с Убер, первое задание — построить ориентированный граф, обойти все вершины и отфильтровать некоторые из них по условию.
                            … Интервью на фротенд позицию не пройдено.

                            Задача на построение Virtual DOM. Если подходить с позиции не «фронтэнд разработчик — это тот, кто разрабатывает на реакте» а с «фронтэнд разработчик — это тот, кто разрабатывает реакт», то вполне себе нормальная, хорошая задача.
                              +1

                              Вспомнилось. Есть такая либа enzyme. Для тестирования React. И в случае больших DOM она начинала просто беспощадно тормозить (а может и по сей день так). Зависимость была явно нелинейная. Пришлось её всю раздебажить (мои глаза!). Оказалось что ребята делали обход дерева в ширину. Ну ок, в чём проблема? А в том что они частично это реализовали (сделав queue через массив), но потом забили и понавтыкали везде квадратов. В уже почти готовом алгоритме. AirBnB неприятно удивил.

                                +1
                                Я не имею ничего против алго задачек на собеседованиях. Меня беспокоит то, что все эти FAANG компании требуют идеального решения за 30-45 минут отведённого времени. Например, в данном случае я дал вполне годное работающее решение, также я могу объяснить в каких случаях оно будет не очень подходящим и т.п. Т.е. получить идеальное решение можно, только если задротить Литкод день и ночь, но это не делает меня инженером лучше чем я сейчас.

                                С другой стороны, я понимаю, что у этих компаний нескончаемый поток кандидатов, и они могут позволить себе выбирать лучших (по их методикам лучших).
                            0
                            Выучить алгоритмы для собеседования — это дело нужное, конечно, но потребуются ли эти знания потом для реальной работы?
                              0
                              В некоторых ситуациях ответ на вопрос «вам шашечки или ехать» выходит за рамки простого.
                                +5
                                иногда требуются. Чаще всего требуется просто выбрать правильно коллекцию (даже с этим у многих проблемы). У меня на практике был случай, когда человек использовал для хранения множества массив вместо хэштаблицы или дерева, и код, который действительно работает постоянно и делает всю работу программы (которая продавалась за большие деньги), дико тормозил. На код-ревью иногда сталкиваюсь с тем, что люди выбирают коллекции небрежно, и могут реализовать алгоритм с квадратичной сложностью там, где кол-во элементов требует более эффективного алгоритма, зачастую даже стандартного.
                                Так что базовая алгоритмическая грамотность на уровне «отличаю массив от списка и хэштаблицы, а еще знаю про деревья» должна быть.
                                  +4
                                  иногда требуются
                                  А оправдывает ли это «иногда» ретивость, с которой интервьюверы трясут знания алгоритмов?
                                    +3

                                    По крайней мере в FAANG, где на каждую позицию десятки, если не сотни претендентов — да. Могут хоть оценки в школе сравнивать, хоть умение плавать.
                                    Единственный гарантированный способ оценить, как будут работать кандидаты — это испытательный срок. Но это запретительно дорого, даже для них.


                                    Вот и остается спрашивать что-то вполне релевантное и коррелирующее с когнитивными способностями. Заодно как-то проверяется умение писать код.

                                      0
                                      ретивость — скорее нет, тут фактор большого конкурса на место. Но спросить человека по нескольким алгоритмическим темам — нужно. Вот они и проверяют, по задаче на тему. Времени только мало дают, поэтому приходится задачи тупо задрачивать.
                                    +3

                                    Если вы не знаете алгоритмы, то вы даже не поймете, что они вам, оказывается, понадобились. Просто будет какой-нибудь полный перебор или решение какой-то упрощенной, приближенной задачи. При том что, нормальное, алгоритмическое решение и работает на порядки быстрее, и кода там в 4 раза меньше (со всеми комментариями, вроде — это динамическое программирование, тут такие-то параметры).


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

                                    +2
                                    Я помню, как один из собеседников спросил, как пройти из точки A в точку И по сетке. Я понятия не имел, как это сделать

                                    Статья неполная без ответа, как. В голову приходит дерево решений только, или граф с дейкстрой

                                      +4
                                      A*
                                        0
                                        Статья неполная без нормальноо текста задачи, имхо) Потому что в такой постановке вообще непонятно, что надо сделать.
                                          0

                                          Ну так там и дейкстра и а* указаны. Можно и каким-нибудь BFS/DFS пытаться достигнуть

                                          0
                                          А, есть что то, подобное такой программе,

                                          Documentalist
                                          Fast, offline access to developer API documentation on Windows.
                                          Over 190+ API docs.


                                          , но сборником решений разных алгоритмов на разных языках программирования?
                                          (как вариант сборника решений сайта rosettacode.org/wiki/Rosetta_Code )

                                          P.S. И, можно ли, тогда будет при собеседовании пользоваться такой подборкой реализации алгоритмов?
                                          И, что тогда, в такой «гипотетической» ситуации, станут спрашивать собеседующие? :)

                                          Список алгоритмов

                                          И, по вопросу в статье,
                                          Я помню, как один из собеседников спросил, как пройти из точки A в точку И по сетке. Я понятия не имел, как это сделать

                                          Например:

                                          Алгори́тм волново́й трассиро́вки (волновой алгоритм, алгоритм Ли) — алгоритм поиска пути, алгоритм поиска кратчайшего пути на планарном графе. Принадлежит к алгоритмам, основанным на методах поиска в ширину.
                                            +1
                                            А, есть что то, подобное такой программе,

                                            Есть e-maxx, cp-algorithms.

                                            +19
                                            Мой экземпляр «Cracking The Coding Interview 6th Edition», подписанный Гейлом Лаакманном Макдауэллом

                                            Лол. Это девочка.

                                              +3
                                              Ну вот, теперь вы знаете, чем отличается перевод в корпоративном блоге от авторской статьи… если это поправят — это хорошо. А бывает что и нет.
                                                0
                                                Конечно пофиксил, спасибо.
                                                *Посыпает голову пеплом
                                                  0
                                                  Ну это не мне, это чуть выше )
                                                –4

                                                С точки зрения современной американской идеологии, называть незнакомого человека "мальчиком" или "девочкой" на основе фотографии или имени — преступление называемое "assuming gender".


                                                Честно говоря, я не знаю, как у них правильно поступать, и знать не хочу. Видел, что в твиттере вроде бы явно стали писать в профиле, как их надо называть (он, она, оно). Спрашивать наверняка будет считаться харассментом: «Ты, что не видишь, что я женский предпол, недополовой женский?!»

                                                +1
                                                И тут опять «sliding window» смешали зачем-то с TCP/IP :D
                                                  0
                                                  Судя по вики, sliding window используется в TCP/IP, что, конечно, не делает этот протокол происхождением этой техники. Поясните, плиз?
                                                    0
                                                    Автор оригинала имел в виду технику/прием решения задач «sliding window», который неплохо переведен, например, тут. При этом, если посмотреть оригинал статьи, никакого упоминания TCP/IP там нет. Это вариация на тему «слышу звон, но не знаю где он». И, главное, всего несколько дней назад, вот тут, те же «скользящие окна TCP/IP».
                                                    0
                                                    В TCP используется.
                                                    +1
                                                    ИМХО это уже перебор — учиться проходить интервью. Даже в Гугл или ФБ. Есть уже и книги о том, как проходить собеседования, и куча сервисов для подготовки к ним. Кроме того, что у человека хорошая память, действительно такие собеседования ничего показать не могут. Более того, не уверен, что работающие уже в FAANG инженеры смогут пройти такие интервью. Если нужно использовать алгоритмы обхода деревьев в проекте, не проблема открыть этот конкретный алгоритм и изучить. Как тут уже указывалось, главное знать где искать и иметь желание это делать.
                                                    Для себя, да, учиться нужно в обязательном порядке. Но не по списку из алгоритмов, а по мере необходимости.
                                                      0
                                                      так они уж лет 15 есть, книги эти, и сайты лет 10. Я бы сказал, это уже давно мейнстрим. За бугром так вообще сейчас тупо везде задачами собеседуют. На моей текущей работе тоже на собеседовании приходилось реализовать кой-чего.
                                                      Мне тоже не нравится необходимость постоянно в решении задач практиковаться, если что. Но вот правила игры такие. Вы сами пишете, что учиться нужно для себя в обязательном порядке, но почему не по списку алгоритмов? это ж тоже в конечном итоге для себя
                                                        +1
                                                        Более того, не уверен, что работающие уже в FAANG инженеры смогут пройти такие интервью.

                                                        Тут есть практика тестировать новые задачи на своих коллегах. Мои коллеги — легко прошли бы мое интервью.


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

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

                                                        +6
                                                        В последние годы всегда ходил на собеседования без подготовки, рассуждая, что продаю мой богатый опыт в разработке больших нагруженных систем. Но всегда покупали экспертное знание плюсов и алгоритмы. Поэтому 2 собеседования в Яндексе и одно в Блумберг я не прошёл, но и проходил я их just for fun, без цели всенепременно туда попасть. А работаю много лет над интересными проектами в компаниях, куда попадаю через рекомендации знакомых.

                                                        Т.е. моё поведение сейчас: «я типа такой крутой, не хотите, как хотите, нас и тут неплохо кормят». Но, если бы была цель попасть в FAANG и т.п., пришлось бы играть по их правилам. Я бы засел за книги, вспомнил бы алгоритмы, практиковался бы в решении олимпиадных задач и т.п. Пригодится или нет неважно, если цель — попасть в компанию.
                                                          –1
                                                          подписанный Гейлом Лаакманном Макдауэллом

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

                                                            0

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

                                                              0

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

                                                                +3
                                                                Если человек действительно горит программированием, то всегда что-то будет делать для себя.

                                                                Я бы не стал показывать. Да у меня есть свои проекты. Но они сделаны по принципу "времени мало, успеть бы сделать фичу Х". Показывать это как эталон своих возможностей? Ну нафиг. Начнут ещё вопросы задавать — а вот тут почему глобалку объявили? Да потому что времени было в обрез, а мне за это никто не платит. А вот тут почему костылём подпёрли? Да потому что време… Не очень понимаю зачем оценивать по таким критериям. Посмотрит человек как git-история ведётся — скажет а чего всё в master пушили? Да потому что я один над проектом работал. А чего коммиты с тупыми описаниями? Да потому что я один ра… Ну и так далее.

                                                                  0

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


                                                                  1. наличие таких поделок/проектов
                                                                  2. насколько человек продвинулся от стандартных примеров — тут вобщем даже код можно не смотреть — можно прям приложение глянуть

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

                                                                0

                                                                Если им этого достаточно, то мне надо еще немного подтянуть английский и из Праги переехать в США. Ну и повспоминать, может код набрать какой. Что то прям не верится, что чуваку этого хватило в фаанг.

                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                    0

                                                                    Про поведенческое не знаю, а дизайн мне самое простое.

                                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                Самое читаемое