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

Что есть в этой статье


  • Программа подготовки
  • Список ресурсов и статей
  • Советы прохождения собеседования

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

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

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

После прочтения этой книги я смог определить список основных тем для подготовки.

Мой список выглядел примерно так:

  • Big O
  • Пазлы
  • Архитектура приложений
  • Алгоритмы и структуры данных

Big-O


Собственно о Big-O рассказывать особо нечего, нужно просто знать и понимать отличие вычислительной сложности разных алгоритмов, понимать как определять рантайм и расход памяти алгоритмов, знать базовые шаги к оптимизации алгоритмов и т. д.
О Big-O написано бесчисленное количество статей и книг, практически в любом входном курсе об алгоритмах есть лекции посвященные данной тематике. На хабре тоже есть цикл статей посвященный данной тематике habr.com/post/196560

Пазлы


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

То как я видел пазлы в плане подготовки — это фактически такие же алгоритмы, только без привязки к конкретной структуре данных или алгоритмической парадигме. Из-за этого систематизировать подготовку к пазлам довольно сложно. Лучшим решением, к которому я смог прийти — это просто «набить руку», решить 40-60 пазлов и в какой-то мере понять как подходить к решению пазлов. Со временем мозг начинает понимать, на что обращать внимание, а что является просто оформлением задачи: например все числа указанные в пазле как правило не просто так. Это не «просто 2 веревки» и не просто «сгорают за 25 минут». Как правило пазлы не содержат бесполезной количественной информации.

Архитектура приложений


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

Алгоритмы и структуры данных


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

  • Arrays
  • Strings
  • Binary Tree
  • Binary Search Tree (BST)
  • Graphs
  • Heaps
  • Linked List
  • Matrix
  • Stack
  • Queue
  • Trie
  • Backtracking
  • Divide & Conquer
  • Dynamic Programming
  • Sorting
  • Greedy

В каждом из разделов есть несколько приемов, которыми просто нужно овладеть. Классическим примером такого приема может быть «медленный» и «быстрый» бегунок в Linked List. Не зная или не понимая этот концепт практически невозможно эффективно решать очень многие задачи на связанные списки. Или BFS/DFS алгоритмы поиска в графе. Как правило многие задания на интервью будут или модификаций известных концептов или же комбинацией нескольких. Поэтому очень критично научится самому решать и распознавать базовые задачи в каждой структуре данных/алгоритме.

Лично я посмотрел несколько лекций от Университета Стэнфорда, а после выписал себе ~5-10 заданий из каждой категории и просто набил руку таким образом. Это занимает много времени и сил, но в результате оно того стоит.

Вот несколько ресурсов которые я использовал для подготовки и поиска заданий:

https://www.quora.com — просто список из ~500 заданий на разную тематику, вместе с решениями на C++. Довольно удобно, иногда есть несколько решений, где одно более оптимальнее чем другое.

https://www.hackerrank.com — удобный ресурс с рубриками и тематиками и со встроенным компилятором для 20+ языков. Помогает быстро и эффективно набить руку.

https://www.glassdoor.com — содержит непосредственно вопросы из интервью и иногда ответы от сообщества.

Для меня этих двух было достаточно, но если вам нет — то эти 3 дадут хорошую идею о том где искать дальше.

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

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

Вам может показаться, что это одно и тоже, но на деле практика на бумаге откроет множество сюрпризов, начиная от того что нужно вначале придумать все решение прежде чем писать (delete и backspace тут нет, удалять и перемещать строки очень затратно), а заканчивая тем, что место на листе/доске нужно грамотно экономить, т.к. оно ограниченно.

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

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

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

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

Удачи всем в подготовке.