Содержание

Как проходит собеседование начинающего разработчика на С++ — Академия Яндекса

Разработчик в Яндексе, студент Школы анализа данных и код-ревьюер курса по С++ в Яндекс.Практикуме Турмец Макоев рассказал, что должен знать начинающий разработчик С++, чтобы получить должность, и составил список терминов, которые стоит повторить перед собеседованием.

Оценка soft skills

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

Образование. Расскажите о том, где учитесь или учились. Если вы прошли дополнительные курсы в Практикуме, на Coursera или еще где-то, обязательно упомяните их. Также не стоит забывать о дополнительном офлайн-образовании. Если у вас в копилке есть какой-нибудь пройденный интенсив или достижения на олимпиадах по программированию, обязательно поделитесь этим.

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

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

Если у вас мало опыта в коммерческой разработке, расскажите про учебные проекты, которые вы выполняли, pet-проекты, упомяните участие в хакатонах и конкурсах, профильных конференциях.

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

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

Заранее продумайте, как вы ответите на такие вопросы:

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

Оценка hard skills

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

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

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

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

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

Я стараюсь идти по следующему пути при решении задачи:

  1. Предложить самое простое решение.
  2. Попытаться улучшить узкие места. Если чувствуете, что, скорее всего, сможете решить лучше, так и скажите: «Вот идея навскидку, но будет лучше». То есть идите от простого к сложному.

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

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

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

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

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

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

  1. Бинарный поиск
  2. Сортировки
  3. Два указателя
  4. Сканирующая линия
  5. Обход в глубину
  6. Обход в ширину

Еще упомяну два важных понятия. Полноценными алгоритмами их не назовешь, но знать их необходимо:

  1. Префикс-/постфикс-сумма, также известная как предподсчет
  2. Рекурсия

Структуры данных. Теперь посмотрим на список по структурам данных, которые необходимо знать:

  1. Вектор
  2. Связный список
  3. Дек
  4. Стек
  5. Очередь
  6. Куча
  7. Деревья поиска, в частности бинарные
  8. Хеш-таблица

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

Чтобы подготовиться к вопросам об алгоритмах и структурах данных, я рекомендую посмотреть курс Максима Бабенко «Алгоритмы и структуры данных поиска» в Школе анализа данных.

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

Конечно, вы должны быть знакомы с синтаксисом. Не обязательно знать все возможные интересные слова, типа explicit, external и volatile, но то, как объявить класс, наследоваться от него и задать оператор меньше, вы знать должны.

Есть базовые знания, которые должны иметь все разработчики, независимо от языка программирования: что такое ООП, базовая работа с Git, базы данных. На этих пунктах я не буду останавливаться. Я сформулировал список обязательных знаний для разработчика С++. Рекомендую изучить его:

  1. Шаблоны
  2. Наследование и полиморфизм, виртуальные методы
  3. Правило пяти
  4. Процесс компиляции и линковки
  5. Инвалидация итераторов
  6. Модель памяти в C++
  7. Move-семантика
  8. Умные указатели
  9. Идиома RAII
  10. Перегрузка операторов

Вам нужно уметь объяснить, как эти вещи устроены и для каких задач используются. Чтобы подготовиться к вопросам по С++, рекомендую пройти курс «Разработчик C++».

После собеседования

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

Полезные ссылки для подготовки к собеседованию

  1. leetcode.com — сайт, где вы можете решать задачи, похожие на те, что задают на собеседованиях.
  2. «Информатикс» — ресурс, где можно найти много полезной информации об алгоритмах и структурах данных.
  3. Статья «Как проходят алгоритмические секции на собеседованиях в Яндекс».
  4. Курс лекций Максима Бабенко «Алгоритмы и структуры данных поиска».

Станьте разработчиком на C++

Собеседование в Яндекс: театр абсурда :/ / Хабр

Привет, хабр!

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

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

Как вы думаете, что делают рекрутеры, когда видят «Alexandr, NOT OPEN FOR WORK»? Правильно, пишут «Алексей, рассматриваете вариант работать в X?» Я обычно игнорирую это, но тут мне предложили попытать счастья с Яндекс.Лавкой, и я не смог пройти мимо — интересно было, смогу ли я устроиться куда-нибудь, когда введут великий российский файерволл. К тому же за последние 3 года я проходил только два интервью, и мне показалось, что я не в теме, что нынче требуется индустрии. Блин, я оказался и вправду не в теме. И вы, скорей всего, тоже — об этом и статья.


Короче, я согласился — буду продавать дошики и похмелье!

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

Вы тоже заметили «вопросы на C++» в методичке для питониста? Не то чтобы я знал C++, но в институте проходили, авось что-нибудь да вспомню на интервью.

Тут что-то написано про leetcode, но я человек ответственный, поэтому к интервью не готовлюсь. Это кстати я не шуткую, реально: если вы ответственный человек, то вы, когда предстаёте перед компанией, отвечаете за то, что вы заявляете как ваши умения. Можно выучить типовые вопросы и даже казаться умнее и опытнее, чем есть, но по факту это переобучение на тестовых заданиях/вопросах. Ребята из ml поймут. Поэтому я гол как сокол и чист как стёклышко или что там ещё блин, если что-то знаю — скажу, что-то не знаю — скажу что не знаю. Таким образом работодатель знает, что он покупает и сколько ещё нужно вложить в меня средств на обучение. Все счастливы.

Интервью 1

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

Мне кинули ссылку на Яндекс.Блокнот (это я его так называю, вообще он Яндекс.Код и живёт тут) — там можно вместе писать текст и включать подсветку синтаксиса. Запускать там, естественно, ничего нельзя, потому что это уже реализовано в coderpad, а он недостоин Яндекса. Ну ок, мне на самом деле проще, потому что написать код и написать хотя бы запускаемый код — это очень разные вещи. Минус — нельзя прогнать тесты и вообще тут как битва самураев: ваша правда против правды рекрутера, один доказывает, почему работает, другой — почему нет.

Итак, о чём вас спросит Яндекс на интервью? Выберите один правильный вариант:

1) прежний опыт

2) текущие проекты

3) как вы будете решать вот эту бизнес-задачу

4) как решить вот эту алгоритмическую задачу без стандартной библиотеки

Именно так! Так давайте решим эту алгоритмическую задачу. Помните, у нас нет collections.Counter, itertools.groupby, set.intersection, вообще случилась война и стандартная библиотека питона погибла, оставив после себя int, bool, for, if и while. Ну ок, хотят проверить знание каких-то базовых вещей.

Задача 1

Даны два массива: [1, 2, 3, 2, 0] и [5, 1, 2, 7, 3, 2]
Надо вернуть [1, 2, 2, 3] (порядок неважен)

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

common = set(a).intersection(set(b))  # найдём общие элементы
for el in common:
    occurs = min(a.count(el), b.count(el))  # и посчитаем, сколько они встречаются

Но меня осадили — у нас война, поэтому никаких intersection, только хардкор. После нескольких итераций и намёков интервьюера я родил вот это:

def common_elements(a, b):
  b_dict = defaultdict(int)  # defaultdict выжил :)
  for el in b:
      b_dict[el] += 1  # я считаю все элементы из b, т. е. типа collections.Counter

  result = []

  for el in a:
      count = b_dict[el]
      if count > 0:  # если какой-то элемент из a встречается в b
          result.append(a)  # то это успех
          b_dict[a] -= 1  # и я "вынимаю" его из b, т.е. уменьшаю его количество на 1

  return result

Внимательные читатели намекнули, что на строчках 11 и 12 нужно использовать el, а не a, но на интервью и так прокатило 🙂

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

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

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

Задача 2

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

Дана строка (возможно, пустая), состоящая из букв A-Z: AAAABBBCCXYZDDDDEEEFFFAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBB
Нужно написать функцию RLE, которая на выходе даст строку вида: A4B3C2XYZD4E3F3A6B28
И сгенерирует ошибку, если на вход пришла невалидная строка.
Пояснения: Если символ встречается 1 раз, он остается без изменений; Если символ повторяется более 1 раза, к нему добавляется количество повторений.

Ну ок, хотят проверить знание каких-то базовых вещей.

Вроде просто: for grouper, items in groupby(string). .. А, да, у нас была война. Ничего нет.

def convert(s: str) -> str:
  result: List[str] = []
  last_sym = None  # последний символ, что мы видели
  count = 0  # и сколько мы его видели

  # мы будем идти по строке и записывать в result при смене символа
  for sym in (list(s) + [None]):  # последний None искусственно триггерит посленюю смену символа

      if last_sym and sym != last_sym:  # если случилась смена символа

          if count == 1:
              result.append(last_sym)
          else:
              result.append(last_sym + str(count))

      	  # начнаем запоминать новый символ
          count = 1
          last_sym = sym

      else:  # символ просто повторился
          count += 1  # ну ок, запомнили что символ видели на 1 раз больше

  return ''.join(result)

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

Так, давайте может что-то другое?

Задача 3

Дан список интов, повторяющихся элементов в списке нет. Нужно преобразовать это множество в строку, сворачивая соседние по числовому ряду числа в диапазоны. Примеры:
[1,4,5,2,3,9,8,11,0] => «0-5,8-9,11»
[1,4,3,2] => «1-4»
[1,4] => «1,4»

Так блин, серьёзно? Я наверно очень мутный тип, если две предыдущие задачи не показали мой скилл на этом классе задач.

Ну ок, хотят проверить знание каких-то базовых вещей.


def repr(group_start, group_end) -> str:
    # это просто правильно печатает группу
    
    if last_group_start == last_group_end:
        return str(last_group_end)

    return f'{last_group_start}-{last_group_end}'


def squeeze(numbers) -> str:
    if not numbers:  # граничный случай
        return ''

    numbers_ = sorted(numbers)  # сначала располагаем по порядку
    groups = []  # тут будем хранить группы

    last_group_start = None
    last_group_end = None

    for n in numbers_:
        # это первая итерация, просто говорим, что группа началась и закончилась
        if last_group_end is None:
            last_group_start = n
            last_group_end = n

        # если предыдущая группа отличается от текущего числа на 1, 
        # то это число входит в группу, то есть становится концом группы
        elif last_group_end == n-1:
            last_group_end = n

        # иначе мы понимаем, что группа закончилась,
        # мы её запоминаем и начинаем новую
        else:
            groups. append(repr(last_group_start, last_group_end))
            last_group_start = n
            last_group_end = n

    else:
        # посленюю группу придётся обработать вручную
        groups.append(repr(last_group_start, last_group_end))

    return ','.join(groups)

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

Через пару часов мне сказали, что всё отлично и меня ждут на следующих интервью — 2 штуки подряд — задачи на написание кода. Так, минуточку, а что было до этого — написание говнокода? Ладно, там видно будет. Уж точно что-то новенькое, следующий этап всё-таки.

Интервью 2

В назначенный час я бахнул кофейку и встретился в зуме с новым рекрутером. Интервью #2 началось.

Задача 4

Я, признаюсь, был готов ко всему, но не к этому:

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

[1, 1, 0]

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

# пример: [0, 0, 1, 1, 0, 1, 1, 0]

def max_ones_length(lst: List[int]) -> int:

    max_ones_length = 0

    # тут мы хотим получить сгруппированные 0 или 1 и их количество:
    subranges = []  # [(0, 2), (1, 2), (0, 1), (1, 2), (0, 1)]
    last_el = None  # последний элемент, который мы просмотрели

    # идём по элементам списка
    for el in lst + [0]:  # [0] - это ручной триггер для обработки последнего элемента

        if last_el != el:  # если произошла смена 0 на 1 или наоборот
            if el == 0:  # если это была смена 1 на 0
              
              	# пример: subranges == [(0, 2), (1, 2), (0, 1), (1, 2)]
                # у нас произошла смена 1 на 0, до смены единица шла 2 раза
                # (см последний элемент subranges) - проверяем, вдруг это
                # максимальная длина
                try:
                    last_ones_length = subranges[-1][1]
                    max_ones_length = max(last_ones_length, max_ones_length)
                except IndexError:
                    pass

                # а может если мы удалим один ноль между элементами 1 и 3,
                # то получится более длинная последовательность единиц?
                try:
                    gap_length = subranges[-2][1]
                    if gap_length == 1:
                        combined_ones_length = subranges[-1][1] + subranges[-3][1]
                        max_ones_length = max(combined_ones_length, max_ones_length)
                except IndexError:
                    pass

            # добавляем новый счётчик последовательности в subranges
            subranges. append((el, 1))

        else:
          	# увеличиваем счётчик последней последовательности на 1
            subranges[-1] = (el, subranges[-1][1]+1])

        last_el = el

    # костыль, граничное условие
    if len(subranges) == 2 and subranges[1][1] == 1:
        return subranges[0][1] - 1

    return max_ones_length

Ну что, Яндекс, ты доволен? Ты доволен?! Кто король алгоритмов?! Я король алгоритмов! Давай, удиви меня…

Задача 5

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

sample = [ (1, 2), (1, 3), (2, 4), (2, 3), ]

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

Ну ок, хотят проверить знание каких-то базовых вещей.

from collections import defaultdict

def max_num_guests(guests: List[tuple]) -> int:

    res = 0

    # для каждого дня посчитаем, сколько приехало и сколько отъехало
    arriving = defaultdict(int)
    leaving = defaultdict(int)

    for guest in guests:  # O(n)
        arriving[guest[0]] += 1
        leaving[guest[1]] += 1

    current = 0
    # едем по дням в порядке увеличения, добавлем приехавших и убавляем уехавших,
    # считаем сколько стало
    for day in sorted(set(arriving.keys()).union(set(leaving.keys()))):  # O(n*log(n)) + O(n)
        current -= leaving[day]
        current += arriving[day]

        if current > res:
            res = current

    return res

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

Интервью 3

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

Задача 6

Sample Input [«eat», «tea», «tan», «ate», «nat», «bat»]
Sample Output [ [«ate», «eat», «tea»], [«nat», «tan»], [«bat»] ]

Т.е. сгруппировать слова по «общим буквам».

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

Эта задача простая, наверно хотят удостовериться, что пока я разруливал дела в отеле, я не забыл, как пользоваться словарём. Не лишено смысла! Давайте накидаем что-нибудь простое.

def group_words(words: List[str]) -> List[List[str]]:

    groups = defaultdict(list)

    for word in words:  # O(n)
        key = sorted(word)
        groups[key].append(word)

    return [sorted(words) for words in groups.values()]  # O(n*log(n))

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

Задача 7

Слияние отрезков:

Вход: [1, 3] [100, 200] [2, 4]
Выход: [1, 4] [100, 200]

Честно говоря, где-то тут мне уже стало плевать на собеседование, Яндекс и все эти алгоритмы, и в реале я бы уже просто послал всех в /dev/null, но мне хотелось знать, что в конце всего этого, ведь конец должен быть? Будет задача, где я завалюсь, и это кончится. Что-то вроде эвтаназии, но в интервью.

Ну ок, хотят проверить знание каких-то базовых вещей.

def merge(ranges: List[Tuple[int, int]]) -> List[Tuple[int, int]]:

    if not ranges:
        return []

    result_ranges = []
    last_range = None  # последний отрезок, что мы видели

    for rng in sorted(ranges):  # обязательно сортируем

        if not last_range:
            last_range = rng
            continue

        # если начало текущего отрезка меньше конца предыдущего
        if rng[0] <= last_range[1]:
            # расширяем предыдущий отрезок на текущий
            last_range = (last_range[0], max(rng[1], last_range[1])

        # старый отрезок всё, начинаем новый
        else:
            result_ranges.append(last_range)
            last_range = rng

    else:
        # граничный случай для последнего элемента
        result_ranges.append(last_range)

    return result_ranges

Задача 8

Время собеседования подходит к концу, но всё-таки можно ещё поболтать про кодинг и поспрашивать практические вопросы, например по Django или SqlAlchemy:

Дан массив точек с целочисленными координатами (x, y). Определить, существует ли вертикальная прямая, делящая точки на 2 симметричных относительно этой прямой множества. Note: Для удобства точку можно представлять не как массив [x, y], а как объект {x, y}

Ну ок, хотят проверить знание каких-то базовых вещей.

Тут я как всегда пошёл куда-то не туда и написал вот что:

from statistics import mean

def is_vertical_symmetry(points: List[Point]) -> bool:

  	# сначала найдём вертикальную прямую в середине всех точек
    x_center = mean(p.x for p in points)

    # тут будем хранить точки, для которых пока не нашли пары:
    unmatched_points = defaultdict(int)
    
    for point in points:

        if point.x == x_center:  # если точка на прямой, то она сама себе пара
            continue

        # создадим "брата" - точку, которая симметрична текущей относительно вертикальной прямой
        brother = Point(
            x = x_center * 2 - point.x,
            y = point.y,
        )
        
        # если этот брат есть в unmatched_points, то достаём его оттуда и говорим, что текущая точка сматчилась
        if unmatched_points[brother]:
            unmatched_points[brother] -= 1
            
        # иначе добавляем эту точку в не-сматченные
        else:
            unmatched_points[point] += 1

    return not any(unmatched_points.values())

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

Так, третье собеседование пройдено, и эти садисты сказали, что я прошёл дальше. Ну вот за что?

Интервью 4

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

По собственным ощущениям я добрался до какого-то мини-босса и на предстоящем интервью у меня должна была пройти какая-то битва на более общие вопросы. А рекрутер мне пишет: знаете, Яндекс настоятельно советует потренироваться на задачках с leetcode. А там опять алгоритмы. Ох, не к добру это…

Ну тут уж я сломился и решил таки глянуть, что там за задачки, раз мне так настойчиво намекают. Вообще там есть сложные, и над ними было прикольно подумать и порешать в уме, но я так и не понял, как это поможет в интервью. Задачек слишком много и, что более важно, они, блин, разные, и решив одну, я не решаю класс задач — я решаю одну задачу. Соответственно либо я решаю их все и зачем мне тогда ваш Яндекс после такого, либо… короче, я опять не готовился. Ответственный человек, помните?

Кстати, где-то в этот момент я узнал, что я юзаю что-то вроде тора, но для собеседований: я общаюсь с рекрутером, мой рекрутер общается с рекрутером Яндекса, а рекрутер Яндекса общается с собеседователями, а может цепочка ещё больше.2) в решениях, так может я у вас посчитаю длину цепочки от кандидата до собственно интервьюера и спрошу «а можно оптимальнее?!«

Итак, началась четвёртое (да, ей-Богу) интервью. Интервьюер спрашивает, на каком языке я буду решать задачки. На йоптаскрипте, разумеется. Кстати, по косвенным признакам я понял, что интервьюер больше в C, чем в питон, и это тоже здорово. Итак: после того как компания решила нанять сеньор питон разраба за 200к и сношала его 3 часа на долбанных задачках, она отправляет на собеседование сишника и спрашивает, на каком языке кандидат будет сношаться с долбанными задачками. Л — логика!

Итак, вот задачка от мини-босса:

Задание 9

Даны две строки.

Написать функцию, которая вернёт True, если из первой строки можно получить вторую, совершив не более 1 изменения (== удаление / замена символа).

Погодите, да это же… Ну ок, хотят проверить знание каких-то базовых вещей. Сссссуууу…пер.

Если вы хотите решить задачу не так, как хотел интервьюер, то смотрите:

def no_more_than_one_change(string1: str, string2: str) -> bool:
  
  	# string1: a b c d
    # string2: a b c

    max_length = max(len(string1), len(string2))  # наибольшая длина строк
    diff = abs(len(string1) - len(string2))  # разница в длине строк

    # дополняем строки до максимальной длины при помощи zip_longest,
    # то есть на место "недостающих" элементов ставим None, и строки
    # теперь одинаковой длины;
    #          ---->
    # string1: a b c d
    # string2: a b c None
    
    # идём слева направо по обеим строкам и сравниваем символы,
    # находим индекс, при котором строки начинают отличаться:
    change_left = None
    for i, (char1, char2) in enumerate(zip_longest(string1, string2)):  # O(n)
        if char1 != char2:
            change_left = i  # в нашем примере будет 3
            break
    else:
        # если мы такой индекс не нашли, то строки просто совпадают
        return True

    # теперь делаем то же, но идём справа налево:
    # string1:    a b c d
    # string2: None a b c
    #               <----
    change_right = None
    for j, (char1, char2) in enumerate(zip_longest(reversed(string1), reversed(string2))):  # O(n)
        if char1 != char2:
            # тут строки прям сразу отличаются, т.е. в индексе j=0;
            # но это у нас индекс в системе "справа налево",
            # а мы его переводим в индекс в системе "слева направо":
            i = max_length - j - 1 + diff
            break
    else:
        assert False, 'Я дебил и что-то не учёл'

    # ну а теперь смотрим, если строки отличаются в одном и том же месте 
    # при сканировании слева направо и справа налево, то это нам подходит
    return change_left == change_right

Внимательный читатель может заметить, что, по-моему, это даже на приведённом примере не работает 🙂 , хотя пофиксить несложно. Так или иначе, вот такие вещи как я написал лично мне тяжело гонять в голове, и интервьюеру тоже; интервьюер принял это как решение, прогнав несколько тестов в уме. Если хотите возвести это в абсолют, то пишите сразу на brainfucke и с умным видом объясняйте, почему оно будет работать. А вообще я просто тонко намекаю, что всё-таки компилятор/интерпретатор под рукой нужен.

Задание 10

Осталось совсем немного времени, и вот в довершение пара реально сложных заданий на понимание многопоточности и gil в python:

Дан список интов и число-цель.___[range(0,3)=range(0,2)+5=3, range(1,3)=range(1,2)+5=2, range(2,3)=5]

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

>> Сейчас я нахожусь здесь <<

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

К чему всё это

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

Сколько вопросов, блин, можно спросить про http, rest, django orm, sql, python, stdlib, docker, multithreading/multiprocessing/async, да про что угодно — что вы там в лавке делаете? — спросите про похмелье, но зачем 4 часа алгоритмов? Что это показывет — что я устойчив к тупости? Честно говоря, я уже не уверен.

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

А если вам нужен вывод, то вот несколько, берите любой:

  • Тестировать кандидатов нужно на реальных задачах, а не синтетических

  • Нужно уважать время кандидатов

  • Кто-то в яндексе пересмотрел «день сурка»

  • Знаете, когда целое не равно сумме частей? Вот тут так же: люди тебя собеседуют хорошие и встречи приятные, а в целом всё гавно.

  • Открыто новое достижение: ругательство «да пошёл ты в яндекс!»

  • Большие компании ай-яй-яй

  • Какой-то чувак написал смешную статью

И да, если вы ищете работу на питоне — залетайте к нам. У нас не Яндекс.

Я единственный из 1400, или самый крутой рекрутинг, что я проходил / Хабр

Я уже лет 10 пишу код на питоне, и последние 2.5 года стабильно работал на американскую компанию. Наверно, многим знакома история, когда ты кодишь-кодишь, вроде всё неплохо, и внезапно ты — самый знающий и опытный в команде и добро пожаловать в тим лиды. Астрологи объявили неделю менеджмента, количество кода снизилось на 100%.

Попробовав себя менеджером, я понял, что я дебил (как менеджер), и начал искать другую работу. Ребятушки, я офигел от того, насколько разный подход у компаний к найму. И мне кажется, я нашёл кое-что интересное, а если точнее — самый логичный и организованный процесс найма, что я видел.


Как это бывает

Прежде чем холиварить на тему «как надо», давайте вместе согласимся, как не надо.

HR

В более-менее крупных компаниях есть HR — это скрипты, которые по ключевым словам находят людей в LinkedIn и пишут им шаблонные сообщения (и даже способны вести диалог на уровне яндекс.алисы: знают захардкоженные ответы, по всему остальному отсылают куда-нибудь). Очень часто компаниям лень писать такие скрипты и они нанимают миловидных девушек для этого, но блин, ребята, за один вечер можно написать неплохого HR, который будет донимать людей в соцсетях и писать описание вакансии в телеграме — так ещё и работать будет 24/7, и стоить дешевле. Рекомендую.

Так как я искал работу, то я осмелился включить в LI опцию «open to job offers» — и меня завалило предложениями, бессмысленными и беспощадными. Шутят, что LinkedIn — это сайт знакомств для айтишников, где последние постоянно отшивают девушек. В какой-то момент я задолбался тратить время на вводную часть и хотел хакнуть систему, говоря, чтобы они сразу дали мне самое сложное тестовое задание, и если я справлюсь, то имеет смысл говорить дальше — но меня редиректили на стадию «нужно сначала познакомиться друг с другом».

Какой я вынес из этого вывод? Увы, HR сейчас повсюду, летают над линкедином и ищут добычу, но пользы от них я не вижу — они просто делают редирект тебя на работодателя, хотя вообще-то я и так ищу работу, смотрю всякие доски объявлений и биржи, и если вашей компании нужен я, просто раскидайте везде объявления — это сэкономит всем время.

Пока я уворачиваюсь от помидоров тех, кто считает, что HR это здорово и полезно, мы плавно подходим к следующей части рекрутинга…

Интервью

На моей старой работе мы интервьюировали многих — начиналось с того, что мой босс рассказывал минут 10 про компанию, потом мы минут 15 слушали, какой кандидат классный и что он умеет, потом 5 минут смотрели на него во время live coding, и всё было решено. Нет, мы давали кандидатам время, чтобы они закончили задание, но вообще-то уже после 5 минут было понятно, нравятся нам его скиллы или нет, и получается, что только эти минуты были по-настоящему важны. А мы просто теряли время.

Я был и с другой стороны баррикад. Однажды я потратил целый час на общение с hr из епама — блин, мы уже разве что только не поженились, мы уже обговорили график работы и на каких условиях моя тушка будет релоцироваться. Через пару дней я завалил их собеседование. Итого: два человека продолбили по часу, обсуждая то, чего не будет; два человека продолбили по часу, чтобы понять, что один не подходит. 4 часа просто в никуда. В денежном эквиваленте мы все потратили тысяч 10 наверно, это прикольно осознавать.

Знаете, какой должен был быть первый вопрос от этой компании? Вот такой сниппет на питоне:

a = 400
b = 400
id(a) == id(b)  # true or false?

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

Оказывается, интервью можно сократить процентов на 90% и не потерять ничего, просто поменяв порядок вопросов.

Независимость умений

У нас был случай, когда чел успешно прошёл интервью — сделал 2 небольших задания, не идеально, но показал, что может быстро учиться, ну и решение работало в конце концов. Мы его наняли. Потом мы узнали, что он не очень в гите, не умел отлаживать, код был так себе, а ide была atom, и он, например, не мог jump to definition или search class например. Про статический анализ кода вообще молчу.

Мы попали на деньги, потому что (конечно) я дебил-менеджер, а ещё потому что мы ожидали, что если человек умеет кодить, то он умеет отлаживать и делает это за конечное время. Наивные!

Интервью должно в идеале покрыть всё, что вы ожидаете от кандидата. Нельзя ждать, что если A, то B — проверяйте и A, и B.

Background

Люди продают себя, и поэтому CV — это как Инстаграм: люди добавляют туда только лучшее, а всё что «не очень», деликатно умалчивают.

Как-то у нас было собеседование с мужчиной — лет 40, почасовая оплата такая, что я шёл на интервью, как будто это он меня будет собеседовать, а не я его. Как он классно говорил про свои проекты! Я был просто уверен, что он крут, залетит к нам на проект, всё наконец заработает, меня вышвырнут как слабое звено и я останусь ни с чем, буду плакать и искать работу. Когда мы дали ему тестовое задание, он его зафейлил, от слова «совсем». Я прям не верил глазам, там всего-то пробежать по json и вытащить определённые значения — но он был слишком крут для этого. И тут я понял: CV, описание опыта, всякие там профили на сайтах — это всё ничто, это только bias, который зачастую ошибочен, потому что это одна сторона медали — лучшая. Мы все не без недостатков — но как работодатель, я хочу знать все стороны — с некоторыми я могу мириться, с некоторыми нет.

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

Ребята, я нашёл

Да, я нашёл ту компанию, которая возвела рекрутинг в абсолют. Они ушли от стандартной «HR, Interview, Test task» схемы, и сделали рекрутинг постоянно изменяющимся процессом, когда собирается статистика и на её основе части процесса добавляются/изменяются/удаляются. Когда я устраивался в эту компанию, я проходил через пятую версию процесса отбора кандидатов. Сейчас мы работаем над седьмой.

Далее я расскажу про все шаги, через которые я прошёл. Вакансия: senior python developer (django, remote only) — это важно, потому что иная вакансия привела бы к совершенно другим шагам.

Итак, как это выглядит.

Без HR

Тут нет HR. Зачем? Мы постим объявление на разных площадках и имеем постоянный поток кандидатов. Есть подозрение, что это даже дешевле HR.

Размещаемое объявление максимально полно описывает вакансию, то есть если кандидат подаёт заявку — он уже знает, сколько и когда нужно будет работать, какая вилка, какие правила в компании и тд, и чтобы это узнать, он потратил 5 минут, а не час на телефоне. Если ему стало интересно, он может почитать наш порядок работы на github — репа публичная.

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

Самый тупой фильтр на свете

Представьте, что у вас есть постоянный поток кандидатов. Интервью с каждым — самоубийство. Разбор тестового задания каждого — куча времени. Что, если я скажу, что есть способ отсечь 80% неподходящих кандидатов вообще без телодвижений?

Первый вопрос кандидату — его стаж. Это не какое-то число из головы — напротив, мы взяли статистику и нашли такое число N, что кандидаты со стажем меньше N лет никогда не проходили все этапы. То есть, согласно всем нашим наблюдениям, это минимальный порог для успешного прохождения собеседования. Поэтому мы запилили формочку, где кандидат тыкает своё число и либо проходит дальше, либо мы вежливо отказываем. Зачем это? Каждый этап отбора стоит компании всё больше и больше (и по деньгам, и по ресурсам), и этот маленький вопрос значительно снижает нагрузку.

Пиши код

Кто-то тут на Хабре писал, что тестовые задания фу-фу-фу, но я-то знаю, что задания на кодинг как старый добрый кольт: уравнивают всех. Много опыта, мало опыта, красивое CV или его отсутствие — покажите мне свой код, и я скажу, кто вы. Сколько раз было: на словах ты Лев Толстой, а на деле у вас тут мешок эксепшнов. Не знаю, если кто-то тут нанимает разрабов без хоть какого-то кодинга — расскажите мне, как так-то?

У нас раньше был live coding, но есть огромные минусы:

1) это стресс для кандидатов — никто не любит, когда рассматривают и оценивают, как он кодит;

2) он не показывает реальные способности программиста в обычной среде — обычно человек кодит в спокойной обстановке, попивая кофе, а тут он висит на звонке и должен что-то сообразить — я сам, например, люблю live coding, но тупею процентов на 50;

3) live coding требует, чтобы кто-то из команды на нём присутствовал.

Итак, задание на написание кода нужно, но только не live coding и без человеческого участия. Как вы, наверно, догадались, есть много сервисов, которые позволяют тестировать кандидатов в автоматическом режиме. Мы используем один из таких, там есть окно для ввода кода и можно запускать программы на питоне (и на других языках тоже). Просто кидается ссылка на тест, а потом можно забрать результаты по API. Наши задания простые, на их решение хватает и 15 минут, но мы даём 1.5 часа. На некоторые задания уходит менее 2 минут, так что это действительно простые вещи. Ну, например, инвертировать содержимое в маленьком файле, типа data[::-1], без подводных камней. Вы не поверите, но это отсекает 80% народа, серьёзно — хотя они претендуют на место senior python developer.

Тестируется всё, что требуется от кандидата

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

1) это последняя линия обороны перед участием человека в рекрутинге, то есть если человек прошёл этот этап, компания начинает тратить ресурсы на рекрутинг;

2) это задание, которое довольно хорошо отбирает сеньоров;

3) оно опять же полностью автоматическое.

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

Итак, после этого шага перед нами есть сеньор помидор, и мы ничего на это не потратили. Ура! Но пора вспомнить, что у нас есть совесть, и начать уже общаться с кандидатом.

Тестовое задание

Далее уже сложнее — тестовое задание. Кандидат ставит трекер и логгирует время, потраченное на решение задания. Оно тоже классное по нескольким причинам:

1) позволяет кандидату разобраться с трекером, который используется в компании,

2) мы оцениваем продуктивность кандидата (потому что трекер считает время) — это наверно одно из самых важных свойств, потому что вы не сможете сделать успешный продукт, если кандидат будет в 10 раз медленнее, чем вы от него ожидаете

3) мы оцениваем умение кандидата работать удалённо

4) задание «fuzzy» — сказано, что должно быть в итоге, но как это получить — кандидат решает сам; мы оцениваем, насколько кандидат умеет здраво мыслить и понимать требования клиентов

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

Да, это долгий процесс — может занимать 3 часа у кандидата. Как сделать, чтобы он не бросил эту затею? Мы заранее говорим, что все работы будут оценены вручную, и по каждой из них будет сделан детальный code review. И мы делаем, причём каждый такой ревью занимает в среднем 40 минут — но тем не менее мы не игнорируем ни одного кандидата. Это мотивирует, потому что даже если кандидата завернут, он точно будет знать, почему и над чем нужно работать.

Интервью

Вот тут уже случается разговор с СЕО компании. Это не интервью в классическом смысле — скорее знакомство и ответы на вопросы. На этом этапе никакого отсева 🙂

Пробный период

Далее кандидат попадает на пробный период.

Он прекрасен для кандидата, потому что

1) кандидату платят полную ставку, как если бы он уже полноценно работал,

2) кандидат считается полноценным членом команды (без всяких исключений) и имеет равный со всеми голос.

Этот же период ужасен для комании, потому что

1) компания может потратить в 5 раз больше заработанного кандидатом только на его сопровождение — то есть кандидат наработал на 40$, но все люди, задействованные в этом, потратили на это своё время на 200$.

Избыточные задания

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

1) опять же выявляют способности кандидата в некоторых специфических областях;

2) позволяют сравнить кандидата; так как все в компании прошли через эти задачи, можно считать эти задачи эталонными и использовать для сравнения членов команды: кто быстрее, у кого лучше скиллы и так далее (это кстати популярная тема — дать одно задание разным разрабам и смотреть как каждый будет решать его)

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

Некритичные задачи

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

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

К чему всё это

Заголовок не врёт — до меня компания забраковала 1400 кандидатов. Когда я это узнал, я почувствовал, что я самый классный парень на деревне — кто ещё может таким похвастаться? А потом подумал и понял, что нет. Не я самый классный, а рекрутинг.

У меня на прошлой работе есть чел, который мультитул — он круто пишет код, может настроить логгирование в cloudwatch, позвонить в какую-нибудь компанию и договориться с ними о сотрудничестве, попутно тренируя какой-нибудь xgboost или spacy. Ещё у меня есть друг, который всё схватывает на лету и просто мозг — я себя рядом с ним чувствую мобильным процессором с низким энергопотреблением. Круче ли они меня? Совершенно точно. Прошли бы они всё, что я описал? Я сомневаюсь.

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

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

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

UPD:

Холивар на тему трекера можно начинать здесь: https://habr.com/ru/post/534902/#comment_22463766
Холивар «1400 это много, вы тратите время людей» здесь: https://habr.com/ru/post/534902/#comment_22464006

Задачки для CTO на собеседовании / Хабр

Вдохновившись постом «Собеседование в Яндекс: Театр абсурда» хочу поделиться своими весёлыми историями. Обе этих истории случились несколько лет назад.

Я не то, чтобы редко собеседуюсь на работу — я этого обычно вообще не делаю. У меня и резюме-то нет, по большому счёту, а только профиль в LinkedIn’е. Мой основной род деятельности — CTO и co-founder в IT-стартапах.

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

История первая

В далёком 2011 я стал со-основателем и CTO стартапа в области “новых финансовых технологий”. Стартап рос и органично развивался, однако затем, скажем так, потенциальные юридические расходы стали слишком высоки и учредители решили закрыть компанию. А мой давний друг Frank предложил купить все технические наработки стартапа и пригласил меня поработать CTO в его компании в Стокгольме. Я с радостью согласился, у них была небольшая команда и было огромное поле для деятельности в области улучшения процессов разработки.

Но история не об этом. Шведская компания моего друга (а тогда уже и частично моя) прорабатывала вопрос о слиянии с очень-очень крупной и авторитетной американской компанией. И эта компания сказала — мы хотим провести интервью с вашими ключевыми сотрудниками.

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

И тут Frank мне пишет, что они хотят говорить со мной. Я всегда рад новым знакомствам, но напомню, что я — техдиректор и совладелец компании.

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

В назначенный час я на связи, звоню, там на видео вежливый парень со славянским именем и фамилией. Говорю — привет, как дела, он отвечает — хорошо, но “I prefer English for essential things”. Тогда мне показалось, что наше интервью слушал кто-то ещё вне видимости камеры, но мне об этом не сказали.

Он сперва попросил рассказать о себе, мы очень хорошо поговорили десять минут — я рассказывал о своём опыте управления разработкой, он задавал уточняющие вопросы, очень тактично затем немного рассказал о технической части со своей стороны и прозвучала сакраментальная фраза “We’re going to do a bit of coding, it should be fairly easy for you”.

Говорю — так мне не интересна позиция разработчика у вас, на что получил ответ — “да-да, мы в курсе, но всё же мы должны предложить вам порешать задачки”.

Как там @kesn писал — “Ну ок, решили проверить знание базовый вещей”. Не окей! Я очень вежливо, но настойчиво отказался (в задачи CTO компании любого уровня сложности входит много всего интересного, но умение решать алгоритмические задачки — точно не ключевая компетенция).

Интервьюер оказался очень хорошим человеком, и ответил — “окей!”, тогда поговорим про ваш опыт как project manager и CTO. И мы провели оставшееся время в увлекательной беседе, которая, как мне показалось была ему интересна (судя по множеству вопросов по сути, а не “для галочки”).

Через 5 минут после завершения мне приходит емейл, что второе интервью мне не нужно. Я думаю — ну наконец сообразили, но странно, надо было интервью с менеджером делать вместо интервью с инженерами, ну ладно.

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

Быть может даже вся M&A сделка сорвалась из-за того, что я отказался решать задачки на собеседовании.

История вторая

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

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

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

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

Вместо послесловия

@kesn всё верно написал в конце своего поста. Кандидатов нужно уважать, и тестировать те знания и умения, которые будут нужны на той позиции, куда его хотят нанять.

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

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

Что спрашивают на собеседовании в Яндекс? — Хабр Q&A

Юзер без аккаунта попросил меня запостить его ответ:

«Я не так давно был на собеседовании в Яндексе, поэтому, если сочтете нужным выложить это в коммент, вот некоторые пункты собеседования:

сначала просто общие вопросы, чтобы узнать, откуда человек узнал о вакансии. Очень кривят лица, если сказать, что ты в то время просто массово рассылал резюме и тебе ответили из нескольких контор, включая Яндекс. Видимо, надо дать понять, что ты сразу шёл именно к ним. Иначе сразу -5 к успеху.

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

спросят, знаете ли Вы о существовании таск-менеджеров и умеете ли ими пользоваться;

если Вы приглашены на вакансию менеджера какого-либо сервиса (Почта-Карты и тп), будут подробно и долго спрашивать, что бы Вы изменили в этом сервисе (если приглашают на программиста общего профиля, будут задавать тестовые задания по специфике с привязкой к какому-нибудь своему сервису). Тут будет ошибкой активно восхвалять конкурентов (я надеялся на объективность и при вопросе „Какой почтой пользуетесь? И почему?“ я честно сказал „Гугловской“. И почему). Предложенные правки к сервису выслушали, кое-где поспорили, кое-что они потом поправили, судя по всему.

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

очень большое внимание уделяется а) насколько лично Вы понравитесь тому, кто проводит собеседование (Марина — это человек из отдела HR, она просто организует интервьб и присутствует на нём, но непосредственно проводить собеседование будет Ваш будущий коллега), б) насколько хорошо Вы чувствуете себя в команде.»

Собеседование в яндекс — Вопросы, этапы, как пройти собеседование

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

Этап первый – заполнение заявки

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

Само страшное впереди

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

Резюме

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

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

Разговор по телефону или

Если будет возможность, даже к нему стоит тщательно подготавливаться. Так как в процессе этого общения вам придется показывать свои знания. Например, если вы претендуете на должность в раздел Видео, готовьтесь отвечать на вопросы  о bash, алгоритмах, *nix, shell-скриптингу, Python, awk, системах контроля версий и всем в этом роде. Также в конце собеседования вы можете получить домашнее задание.

Собеседование

Настоящее собеседование в офисе компании будет состоять из двух частей: приветствия с банальными вопросами и непосредственно проверки ваших умений.

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

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

Какие советы вам пригодятся:

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

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

Рейтинг автора

Автор статьи

Директор кадрового агентства

Написано статей

Лайфхак, как устроиться в Яндекс и пройти там все собеседования.

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

Этапы устройства в Яндекс

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

  1. Экспресс-собеседование. Первый шаг, на котором важно показать себя исключительно с лучшей стороны. Не допускается опоздание или неряшливый вид. Обычно собеседование происходит с одним их специалистов Яндекс. Длительность не более 15 минут. Вопросы достаточно обобщенные, об интересах, ожиданиях. Главная задача — это получить общее представление о кандидате.
  2. Онлайн-собеседование. Еще до начала встречи кандидату присылают список вопросов, по которым можно подготовиться, так как эксперт Яндекса будет проверять квалификацию респондента. Собеседование может продолжаться до 1 часа. Потребуется не только отвечать на вопросы, но и выполнять различные задания. По истечению времени будет сразу дан ответ, подходит ли соискатель или нет.
  3. Очное собеседование. После прохождение первой отбраковки, наступает ответственная часть череды встреч с представителями компании. Главной их задачей будет выяснить, насколько хорошо кандидат может справляться с самыми разнообразными задачами. Важно не бояться вступать с ними в диалог, конкретизировать задачу, задавать наводящие вопросы.
  4. Выбор места работы. Если все трудности собеседования позади, то наступает время для выбора места работы. Для этого будет проведен ряд встреч с представителями нескольких команд Яндекса. На выбор предоставляется офис компании, или удалённая работа из дома. Кадровый сотрудник определит дату примерного выхода на работу.

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

Безопасность | Стеклянная дверь

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

Nous aider à garder Glassdoor sécurisée

Nous avons reçu des activités suspectes venant de quelqu’un utilisant votre réseau internet.
Подвеска Veuillez Patient que nous vérifions que vous êtes une vraie personne.Вотре содержание
apparaîtra bientôt. Si vous continuez à voir ce message, veuillez envoyer un
электронная почта à
pour nous informer du désagrément.

Unterstützen Sie uns beim Schutz von Glassdoor

Wir haben einige verdächtige Aktivitäten von Ihnen oder von jemandem, der in ihrem
Интернет-Netzwerk angemeldet ist, festgestellt. Bitte warten Sie, während wir
überprüfen, ob Sie ein Mensch und kein Bot sind. Ihr Inhalt wird в Kürze angezeigt.
Wenn Sie weiterhin diese Meldung erhalten, informieren Sie uns darüber bitte по электронной почте:
.

We hebben verdachte activiteiten waargenomen op Glassdoor van iemand of iemand die uw internet netwerk deelt.
Een momentje geduld totdat, мы узнали, что u daadwerkelijk een persoon bent. Uw bijdrage zal spoedig te zien zijn.
Als u deze melding blijft zien, электронная почта:
om ons te laten weten dat uw проблема zich nog steeds voordoet.

Hemos estado detectando actividad sospechosa tuya o de alguien con quien compare tu red de Internet. Эспера
mientras verificamos que eres una persona real.Tu contenido se mostrará en breve. Si Continúas recibiendo
este mensaje, envía un correo electrónico
a para informarnos de
que tienes problemas.

Hemos estado percibiendo actividad sospechosa de ti o de alguien con quien compare tu red de Internet. Эспера
mientras verificamos que eres una persona real. Tu contenido se mostrará en breve. Si Continúas recibiendo este
mensaje, envía un correo electrónico a
para hacernos saber que
estás teniendo problemas.

Temos Recebido algumas atividades suspeitas de voiceê ou de alguém que esteja usando a mesma rede.Aguarde enquanto
confirmamos que Você é Uma Pessoa de Verdade. Сеу контексто апаресера эм бреве. Caso продолжить Recebendo esta
mensagem, envie um email para
пункт нет
informar sobre o проблема.

Abbiamo notato alcune attività sospette da parte tua o di una persona che condivide la tua rete Internet.
Attendi mentre verifichiamo Che sei una persona reale. Il tuo contenuto verrà visualizzato a breve. Secontini
visualizzare questo messaggio, invia un’e-mail all’indirizzo
per informarci del
проблема.

Пожалуйста, включите куки и перезагрузите страницу.

Это автоматический процесс. Ваш браузер в ближайшее время перенаправит вас на запрошенный контент.

Подождите до 5 секунд…

Перенаправление…

Заводское обозначение: CF-102 / 684c76fcd834d89d.

Интерактивные веб-учебные пособия и ответы на вопросы на собеседовании, запрос неверного URL-адреса.

Запрошенный URL-адрес не найден.
Или сообщите нам о неработающей ссылке или запрошенной странице по адресу [email protected]

Мы приглашаем вас начать обучение прямо сейчас
прочь, например HTML Tutorial ,

Учебник по XML
,
Учебник XSLT
,

CSS
Учебник
,

SEO
Учебник
, Учебник JavaScript , Учебник по SQL,
Статьи базы данных, Интернет
Hosting Guide
и многое другое. Самые распространенные технологии
используется для создания веб-страниц, взаимодействия с базой данных и т. д.Мы будем
поможет вам изучить ресурсы всемирной паутины и развить свои навыки
от основ до продвижения. Мы поможем вам в любом деле. GGL Technologies
поможет вам стать профессиональным веб-разработчиком, хорошо подготовленным к
будущее. С нашими расширенными редакторами вы можете редактировать примеры и экспериментировать с кодом.
скоро он-лайн.


H
До того, как мы предоставим все виды HTML, JavaScript, XML, CSS и веб-авторинга
руководство, от абсолютно новичка к более высокоразвитому материалу.
Если вы новый веб-разработчик и ищете несколько учебных пособий по простому английскому HTML,
тогда вы попали в нужное место.
Здесь вы быстро узнаете, как
сделать страницу быстро и легко, полностью с нуля без специальных
софт вообще. При желании можно сразу перейти к
первое руководство по сайту.
Если вы уже разбираетесь в основах и хотите
немного более сложного материала, тогда непременно посмотрите вокруг.
SiteMap дает более полный список
все, что здесь.GGL Technologies работает над обучением новичков веб-программированию
особенно, как использовать HTML с Java Script и CSS. Приглашаем вас начать
прямо сейчас, чтобы развить ваши навыки, потому что мы Skilling Peoples бесплатно.

Интервью Вопросы и ответы.
Какую тему вам нравится изучать? Оцените свои способности в HTML, XML,
C ++, Сеть, CSS, База данных, JavaScript, PHP, SQL, VB и многие другие
методы веб- и настольного программирования. GGL предоставит вам возможность поделиться
вопросы интервью, комментарии и любые вопросы.

Начните свой выбор вопросов и ответов на собеседовании.

Язык JavaScript
это простой язык программирования, встроенный в Netscape 2.0 и выше.
Он интегрирован с HTML и встроен в него. Это позволяет лучше контролировать веб-страницу
поведение, чем только HTML. Давайте начнем подробное руководство по JavaScript и наслаждаемся.
JavaScript используется на веб-сайтах для улучшения его внешнего вида, проверки форм, браузеров.
определение версий, файлы cookie и обработка исключений и многое другое, это язык программирования на стороне клиента.
Подробности доступны в разделе «Учебник по JavaScript».

Изучите JavaScript с помощью сотен примеров.

CSS — это каскадные таблицы стилей.
CSS — это просто текст
файлы (.css), состоящие из строк кода, которые сообщают браузерам, как показывать
HTML-страница.К
изучая CSS, можно отделить HTML-контент от его внешнего вида,
отличать стиль от структуры и лучше оптимизировать веб-сайт.

Изучите CSS от начала до совершенства.

SQL (язык структурированных запросов)
это компьютерный язык, используемый для хранения, управления,
и извлекать данные, хранящиеся в базах данных.Изучите SQL в Global Guide Line.
Почти все современные системы управления реляционными базами данных, такие как MS SQL Server, Microsoft Access,
MSDE, Oracle, IBM DB2, Sybase, MySQL, Postgres и Informix используют SQL в качестве стандартного языка баз данных.
Стандарты для SQL существуют. Однако SQL, который сегодня можно использовать в каждой из основных СУБД, — это
в разных вкусах. В этом
SQL Tutorial, такие различия отмечены там, где это необходимо. Все подробности доступны
в разделе SQL Tutorial.

Щелкните здесь, чтобы узнать об основах SQL и развить свои навыки.

яндекс Интервью Вопросы и ответы | yandex Placement Papers

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

Как Яндекс научил меня проводить собеседования с программистами

После того, как я изложил свою историю «трудоустройства» в Яндексе в комментарии к нашумевшей заметке «Как я проработал 3 месяца в Y.Маркетируй и уходи », было бы несправедливо скрывать выгоду, которую я извлек из своего опыта работы с Яндекс.Сообщения.

В мои должностные обязанности входит техническое собеседование с кандидатами на должность Fullstack JavaScript / TypeScript Developer, я активно занимаюсь этим бизнесом (стоит ли говорить, что мне немного надоело?) Более года у меня более 30 технических интервью.

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

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

Обычно камни отправляют в сад интервьюеров Яндекса за:

1. Задачи, не имеющие практического значения;
2. Необходимость решить эти задачи на листках бумаги карандашом или на доске.

Уже 2019 год и пора запускать отдельную производственную линию по отливке котлов в ад для тех, кто заставляет людей писать от руки текст, не говоря уже о коде.Каждый человек пишет по-разному, и при подготовке текста для этой заметки мне пришлось переписывать, например, конкретно этот абзац шесть раз — если бы я писал заметки для Хабра на бумаге, я бы не писал заметки для Хабра.

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

  getRanges ([0, 1, 2, 3, 4, 7, 8, 10])  

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

  function getRanges (arr: number []) {return arr.map ((v, k) => {if (v - 1 === arr [k - 1]) {if (arr [k + 1] === v + 1) {return ''} else {return `- $ {v},`}} else {return v + ','}}).join (''). split (', -'). join ('-')}  

Из минусов: доступ к массиву по несуществующему индексу и уродливые манипуляции со строками: join-split-join. Это решение также неверно, потому что в примере getRanges ([1, 2, 3, 5, 6, 8]) возвращается «1-3,5-6,8», и для «уничтожения» запятой в В конце концов, вам нужно еще больше улучшить условия, усложнив логику и снизив удобочитаемость.

Вот решение в стиле Яндекса:

  const getRanges = arr => arr.reduceRight ((r, e) => r.length? (r [0] [0] === e + 1? r [0] .unshift (e): r.unshift ([e])) && r: [[e]], []) .map (a => a.join ('-')). join (',')  

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

UPD: , как заметил пользователь MaxVetrov, мое решение неверное:

  getRanges ([1,2,3,4,6,7])  

Таким образом, я сам не смог правильно решить эту проблему проблема пока.

UPD2: В целом комментарии убедили меня, что этот код оказался плохим, даже если он работал корректно.

Я не зря потратил время на перевод статей в офисе Яндекса, ведь на этом уроке я понял, как самому стать эффективным интервьюером. Я взял за основу идею и формат их задач, но:

  • Я не предлагал писать код на бумаге, а попросил написать в code.yandex-team.ru. Это многопользовательский онлайн-редактор кода без возможности его исполнения.Возможно есть другой, более удобный вариант, но был поиск и было лень;
  • Идеального решения не требовалось, но просил как-нибудь его решить;
  • Ему не требовалось знать язык наизусть, можно было спросить желаемую функцию или метод;
  • Он сократил время технического собеседования до 30 минут.

Одна из целей нашего технического интервью:

  let n = 0 while (++ n <5) {setTimeout (() => console.log (n), 10 + n)}  

Я думаю, что это очень важный тест для разработчика JavaScript. И дело здесь не в закрытии и понимании различий между преинкрементом и постинкрементом, а в том, что по какой-то необъяснимой причине четверть респондентов полагает, что console.log выполнится до завершения цикла. Я не преувеличиваю. У этих людей не менее двух лет резюме и опыта работы, и они успешно решали другие задачи, не привязанные к обратным звонкам.Либо это новое поколение разработчиков JavaScript, выросших на async / await, которые слышали что-то еще о Promise, но обратные вызовы для них — как дисковый телефон для современного подростка — будут набирать номер, даже если не в первый раз, но не пойму как это работает и почему.

У этой задачи есть продолжение: вам нужно добавить код, чтобы console.log также запускалась внутри setTimeout, но значения 1, 2, 3, 4 отображались в консоли. Поговорка «живи, учись» здесь уместна, потому что однажды один из респондентов предложил такое решение:

  setTimeout (n => console.log (n), 10 + n, n)  

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

А вот эту задачу я позаимствовал у Яндекса как есть:

  fetchUrl ('https: // google / com') .then (...) .catch (...)  

Вот проверенные навыки работы с Promise . Обычно я прошу вас решить эту проблему на чистых обещаниях, а затем использовать async / await.С помощью async / await решение интуитивно простое:

  function async fetchUrl (url) {for (let n = 0; n <5; n ++) {try {return await fetch (url)} catch (err) {}} throw new Error ('Fetch failed after 5 попытки')}  

Вы также можете применить к этому решению поговорку «живи, учись», но в отношении моего интервьюера в Яндексе: он не указал, что async / await может / нельзя использовать, и когда я написал это решение, он был удивлен: «Я не работал с async / await, я не думал, что это можно решить так легко."Он, вероятно, ожидал увидеть что-то вроде этого:

  function fetchUrl (url, try = 5) {return Promise.resolve () .then (() => fetch (url)) .catch (() => try-- ? fetchUrl (url, попытка): Promise.reject ('Fetch failed after 5 попытки'))} 'error'  

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

  const transaction = Promise.resolve () для (const user of users) {transaction.then (() => {return some_action ...})}  

И он задался вопросом, почему только один пользователь появился в его транзакции. Можно использовать Promise.all, но можно знать, что Promise.prototype.then не добавляет еще один обратный вызов, а создает новое обещание, и это будет примерно так:

  let transaction = Promise.resolve () for (const user of users) {transaction = transaction.then (() => {await perform_some_operation ... return some_action...})}  

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

  public async addTicket (data: IAddTicketData): Promise  {const user = data. fromEmail? жду этого.getUserByEmail (data.fromEmail): undefined let category = data.category if (category === 'INCIDENT' && await this.isCategorizableType (data.type)) {category = 'INC_RFC'} const xml = await this.twig.render ('Assyst / Views / add.twig', {from: data.fromEmail, text: data.text, category, user,}) const response = await this.query ('events', 'post', xml) return new Обещание ((разрешить, отклонить) => {xml2js.parseString (response, (err, result) => {if (err) {return reject (new Error (err.message))} if (result.исключение) {return reject (new Error (result.exception.message))} resolve (result.event.id - 5000000)})})}  

И попросил избавиться от ключевых слов async / await. С тех пор это задание было первым и в половине случаев последним на собеседовании - часто он действительно перегружен.

Сам никогда не решал эту проблему до написания этой заметки и делаю это первый раз третий раз (первый слишком длинный, а во втором я не заметил одного оставшегося await):

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

Напоследок дам еще одно задание из истории с Яндексом, никому еще не показывал * , разобрался с тем, что называется частным случаем. Есть набор баннеров, у каждого баннера есть «вес», который указывает, как часто баннер будет отображаться относительно других баннеров:

  const баннеры = [{name: 'banner 1', weight: 1}, { name: 'banner 2', weight: 1}, {name: 'banner 3', weight: 1}, {name: 'banner 4', weight: 1}, {name: 'banner 5', weight: 3}. , {name: 'banner 6', weight: 2}, {name: 'banner 7', weight: 2}, {name: 'banner 8', weight: 2}, {name: 'banner 9', вес: 4}, {name: 'banner 10', weight: 1},]  

Например, если есть три баннера с весом 1, 1, 2, их общий вес равен 4, а вес третьего - 2. / 4 от общего веса, поэтому он должен отображаться в 50% случаев.Необходимо реализовать функцию getBanner, которая случайным образом, но с учетом весов, возвращает один баннер для отображения. Решение можно проверить в этом фрагменте, где отображается ожидаемое и фактическое распределение.

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

О приеме на работу в Яндекс / Судо Null IT News

Идея статьи вынашивалась у меня давно, но как ее выдать я понял только после прочтения материала Николая Михеева «О приеме на работу в Google» и Microsoft ».

Желание работать в Яндексе возникло давно и спонтанно. Срок давности около 2,5 лет, за которые я воплотил в жизнь идею о спонтанности количества писем и интервью. Всего было написано с десяток писем, дважды приходило приглашение на собеседование.

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

Лето 2006 г. , зашел на http://company.yandex.ru/inside/job/, выбрал вакансию из группы «системный администратор», ответил на вопросы, отправил резюме.В ответ тишина. В общем, неудивительно, почему компании с серьезным профилем нужен аспирант (5 курс), с небольшим опытом работы. Что бывает, все бывает.

Февраль 2007 г. , зашел на http://company.yandex.ru/inside/job/, выбрал вакансию из группы «системный администратор», ответил на вопросы, отправил резюме. Ответ на письмо - расписка. Уже приятно, что вакансия не пропадет и кто-то посмотрит резюме.

Через пару дней звонок на сотовый, приглашение на собеседование в офис на Самокатной. На карте все: метро, ​​маршрутка, офис. Офис действительно поразил своим размахом и некоторой неординарностью. Желающие могут оценить формат офиса в статье «Экскурсия на Яндекс», в целом фото вполне соответствуют увиденному. Это первое, что было найдено в поисковике по данной теме, так как вы сами понимаете, что в тот день мне было явно не до фотографий.

Встреча прошла с руководителем отдела и лидером группы в классическом стиле: вопрос - ответ. Иногда ответом была попытка решить проблему или подход. Не везде в России есть кластеры по 50 машин.

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

Через два дня письмо:

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

Что все бывает, все бывает, но в том, что писали о будущем, они сами виноваты.

Лето 2008 г. (Москва) .
Ввиду того, что одно время можно было обмениваться электронной почтой напрямую с начальником административного отдела, я написал ей напрямую. Ответ в виде заполнения анкеты на их сайте меня не устроил, и я предложил разослать ответы (и свои мысли) на все вакансии в группе «Системное администрирование». И тут начинается самое интересное. Два года спустя у сайта возникают те же вопросы.

Наши доблестные системные администраторы по-прежнему:
1) Установить FreeBSD сразу на 50 машин;
2) Обновить ядра и пакеты сразу на 10 и более машинах;
3) Копируем сервер на лету;
4) И они, конечно, работают с RAID-массивами.
и т. Д. И т. Д.

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

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

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

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

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

Итак, общие результаты:

1) Как было написано выше, нужно идти на собеседования. Из всех мест, где я был: Яндекс, Рамблер, КАВ и Связной, Яндекс понравился больше всего: офис, подход к кандидатам, команда.

2) Всю вторичную информацию о многих крупных компаниях можно и нужно найти в Интернете. Даже зарплата в Яндексе не секрет. Например, попробуйте прорваться через почтовый ящик менеджера по персоналу, который пригласит вас на собеседование. Остальное - дело техники; Нашел как минимум два блога, в которых подробно описан порядок работы с Яндексом.

3) Коллеги с Яндекса (знаю, вы читаете Хабр, вас здесь много) просят пжл. руководство меняет вопросы на сайте, потому что скоро лето 2009, как вы понимаете.:)

Интервью с Андреем Себрантом из Яндекс - Product Management Festival

Родился в 1954 году в Москве, в 1977 году окончил Московский физико-технический институт, кандидат физических наук. С 1995 года работал в сфере интернет-маркетинга: директор по маркетингу Glasnet (ISP), генеральный продюсер Lycos в России, директор по маркетингу продуктов в Яндексе с 2004 года. Главный редактор журнала «Интернет-маркетинг» (Россия) с 2001 года.

Какое отношение вы имеете к управлению продуктами и что для вас значит PM?

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

Без какого инструмента вы не смогли бы жить?

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

Какое самое главное качество PM?

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

Какая самая лучшая функция в продукте, в который вы внесли свой вклад?

Согласованность.

К какой теме вы собираетесь подойти во время PMF? Почему вы выбрали эту тему?

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

Какой продукт вам нравится?

Продукты Яндекса: не любить своих детей сложно.

Какие книги, блоги и курсы вы рекомендуете?
Даниэль Канеман - Думая, быстро и медленно
Эрик Сигель - Предиктивная аналитика

Что спросить на собеседовании в Яндексе? - код-поток.клуб

Не знаю про c ++, я сегодня одил на python-ist.
\ r
Насколько я понимаю, базовое - это доскональное знание языка, вплоть до специфики низкоуровневой памяти и т.д. (в основном собеседование состоит из этих вопросов). Немного интересует общее представление о построении алгоритмов. Заинтересованы только в глубоком понимании предметной области вакансии (широкий профиль и опыт работы в смежных областях вас не спасут).
\ r
Классика, для Яндекса задача неоднократно упоминается в Радио-Т, про пивократию.Задача простая, и наплевать. Однако нужен только один конкретный правильный ответ, на который я лично, к своему стыду, не подумал. Вспомнил задачи по разведке (про монеты, рюкзаки и очки), на которые можно ответить, только зная ответ.
\ r
Предлагаю написать кусок кода для оценки стиля кодирования. Так что лучше потратить больше времени и написать кратко, элегантно, шутливо. На этом этапе мое интервью для меня лично из-за изогнутых лиц и слов «в Python обычно все компактно» (я думаю, что это было не единственное замечание).
\ r
Согласен больше всего напоминает экзамен (не суровую правду, которую надо было сдавать и, кстати, сдавать) Бада по предмету я знаю, но почему-то дурак, не подготовился (читай: в Яндексе не работал).
\ r
В общем, им нужны специалисты, которые работали в Яндексе или подобных структурах. Эти ребята все знают и все видели, вас не удивишь. Если есть белые пятна лучше не лезть, сразу выскакивают. Если вы человек адекватный (сам люблю так думать), но страдаете провалами памяти, вам, вероятно, предложат стажировку.
\ r
Отдельно стоит упомянуть, что собеседование берется для досужих разговоров, которые конкретно мешают, когда нужно основательно поскрипеть мозги.
\ r
Сами иногда путались в показаниях, в частности, возник вопрос по поводу ограничения количества файлов в одном каталоге ext3, чего не было и в помине.
\ r
И да, выходя из здания, кисло надоело.

.