LINUX.ORG.RU
ФорумTalks

Фрустрация от собеседования в «Яндекс»

 , ,


0

1

Здравствуйте. Некоторое время назад я собеседовался в «Яндекс». Хочу поделиться здесь моими впечатлениями от собеседования и историей неуспеха.

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

Итак, был дан код класса на C++: это контейнер, как std::vector, который должен уметь возвращать случайный объект согласно весам, которые передаются как float.

Код был написан с использованием функции rand() и содержал одну очевидную ошибку, которую я нашёл, и ещё одну неочевидную, связанную с возможной проблемой при округлении с арифметикой над float, которую я тоже нашёл. Я сказал, что rand() непотокобезопасна; её реализация, как правило, низкого качества; RAND_MAX зависит от платформы; получить честный рандом при заранее неизвестном RAND_MAX сложно; и т.д. Сказал, что в C++11 есть std::random. Интервьювер сказал, что std::random слишком громоздко для собеседования, давайте уж использовать rand().

Что-то там написали, пришло время писать тесты. Написали какой-то тест, который 1000 раз генерирует случайные объекты №1 и №2 с весами 1 и 2 и проверяет, что объектов №2 получилось больше. Далее по ролям: я (Я), интервьювер (И).

И: — Да, только тест недетерминированный, как его сделать детерминированным?

Я: — Можно зафиксировать seed. Если бы мы использовали std::random, там у engine есть метод seed(), а тут…

И: — Есть специальная функция srand()!

Я: — Да, только она зависит от платформы, как и rand().

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

<примечание>

То есть речь идёт о том, чтобы превратить метод

    T getRandomElement() const { … }
в
    T getRandomElement(int (*custom_rand)()) const { … }
И передавать туда либо настоящий rand, либо свою детерминированнуюю реализацию. Даже без void *userdata, насколько я понял — то есть то ли состояние должно храниться в глобальной переменной, либо оно должно возвращать константу. Да, это C++, не в Си. Указатель на функцию, не лямбду.

</примечание>

Я: — Ну можно, но это какой-то мегакостыль, да и зачем уродовать интерфейс для этого…

И: — Ну хорошо, у нас осталось не так много времени, давайте не будем это писать.

---

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

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

Эту тему я создаю в том числе для того, чтобы давать на неё ссылку HR из яндекса, если таковые ко мне ещё когда-либо постучатся.



Последнее исправление: shdown (всего исправлений: 4)

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

Это не крупные компании, это конкретно Яндекс. Не работай с ними и всё будет хорошо.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Всё-таки хочется понять их логику. Почему они требуют такие решения? Что? Зачем? Как?

P.S. Отредактировал пост, а то отвык от LORCODE.

shdown
() автор топика

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

Tark ★★
()
Ответ на: комментарий от Tark

даже если ты переделаешь рандом на допустим физический рандом

Так тест должен быть детерминированным. Какой ещё физический рандом во время детерминированного теста? Что реализация должна уметь работать с любым генератором рандома, хоть детерминированным, хоть нет, — это понятно, решается передачей генератора в класс ещё одним шаблонным параметром (с дефолтным значением). Собственно, я так и предлагал. Во время теста передаём туда *_engine с установленным seed. Это всё уже есть в std::random.

Почему указатели на функции в C++? Где void *userdata?

shdown
() автор топика
Последнее исправление: shdown (всего исправлений: 3)
Ответ на: комментарий от shdown

Почему они требуют такие решения?

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

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

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

i-rinat ★★★★★
()

Это ты еще в тинь не ходил. Не знаю, может их так от желтого цвета плющит...

Lordwind ★★★★★
()
Ответ на: комментарий от shdown

Почему указатели на функции в C++? Где void *userdata?

Ну так простые лямбды без замыканий сводятся к указателю на функцию.

Может, ты std::function имел в виду? К ним может быть неприязнь из-за неуверенности о том, есть ли там в рантайме аллокации или нет.

i-rinat ★★★★★
()

А зачем именно в метод передавать? Можно передавать в конструктор или как параметр шаблона. Первый вариант кривой конечно, потому что размер контейнера ради теста растет

cobold ★★★★★
()
Последнее исправление: cobold (всего исправлений: 1)
Ответ на: комментарий от shdown

Всё-таки хочется понять их логику.

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

hateyoufeel ★★★★★
()
Ответ на: комментарий от i-rinat

без замыканий

А тут как раз нужно замыкание, потому что иначе ты либо возвращаешь константу (42), либо используешь глобальные переменные. Та же проблема, что и в qsort.

И это, если в отдельном translation unit это всё будет, компилятор лямбду не заинлайнит, если там указатель на функцию, а не шаблонный параметр, не?

shdown
() автор топика
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от cobold

А зачем именно в метод передавать?

Вот это мой вопрос основной. Кто на него может дать ответ — не знаю. Разве что кто-то оттуда сюда придёт и ответит :)

shdown
() автор топика
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от shdown

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

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Я же написал, что предложил интервьювер. Передавать указатель на функцию int (*custom_rand)() в метод. Вместо этого я предложил зафиксировать seed каким-либо образом, например, вообще всё сделать на std::random и передавать генератор шаблонным параметром в класс. Из-за этого отказали.

shdown
() автор топика

Это какие-то заморочки яндеха.

Пару лет назад они нашли меня(хотя я не был в поиске уже) и позвали на SRE. Я прошёл три интервью, включая live-кодинг(работа с REST-API, алгоритмы сортировки и т.п) и назначили ещё одно. Опять live-кодинг, но теперь уже какие-то задачки на числодробилки. На этом я с ними попрощался, даже не пытаясь выполнить. Сказали, что могу попробоваться через год, но я этого не делал и делать не буду. А если снова придут сами - откажусь.

shell-script ★★★★★
()

Забей на эту помойку, ничего там хорошего нет кроме пива по бейджику. Галера жуткая.

masa ★★★
()

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

masa ★★★
()

ХЗ что тут фатального, но фактически предложили замокать rand, т. е. сделать именно то, что делают в тестах. Все эти srand - ad-hoc, не масштабируется на общий случай, не позволяет выдать нужную тебе последовательность.

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

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

unsigned ★★★★
()

Сначала снизили грейд до «мидл-минус», потом вообще сказали, что не возьмём никуда.

Крипово блин. Только что с отцом поговорил он сказал что в мск есть люди знакомые и возьмут меня в яндекс без проблем если захочу быть devopsом.

TheNewDragon
()
Ответ на: комментарий от shdown

Ну мотивация могла быть простая - все методики с фиксом seed полагаются на то, что реализация использует какой-то алгоритм. То есть, гипотетический тест твоего кода с фиксом seed полагается на конкретную реализацию, что делает тест сломанным в случае смены реализации. Ну и во-вторых, в твою реализацию внезапно заезжает еще и вся эта тряхомудия из std:random или как там его, что усложняет эксплуатацию кода.

Но я уверен, что отказали тебе не из-за этого, потому что это как раз вкусовщина.

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

no-dashi-v2 ★★★★
()
Ответ на: комментарий от unsigned

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

Вот именно это я и сказал интервьюверу. Цитирую топик:

Я: — Да, только она зависит от платформы, как и rand().

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

Лол, нет. Это даже как бы в плюс записали. Запощу кусок фидбэка по первому собеседованию:

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

Ну а дальше про то, что не придумал указатель на функцию.

shdown
() автор топика
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от no-dashi-v2

То есть, гипотетический тест твоего кода с фиксом seed полагается на конкретную реализацию, что делает тест сломанным в случае смены реализации

Чувак, ты вообще читал текст топика?

Я: — Да, только она зависит от платформы, как и rand().

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

Кто такие «криптаны» вообще? Мы занимаемся HFT, никаких «криптанов» не знаю.

Но я уверен, что отказали тебе не из-за этого, потому что это как раз вкусовщина.

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

shdown
() автор топика
Последнее исправление: shdown (всего исправлений: 1)

А может это собеседование/вакансия изначально проводилось не для того чтобы взять кого-то на работу?

Bad_ptr ★★★★★
()

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

Если тебе станет от этого легче, то я тоже не прошёл собеседование в «Яндексе» какое-то время назад. Однако я не только не возмущаюсь по этому поводу, а только рад, что я сглупил на собеседовании и сейчас поясню почему. Суть в том, что по вопросам собеседователя можно многое узнать о нём самом, чем он занимается на предприятии и какого сотрудника собеседователь ищет.

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

Enthusiast ★★★
()
Ответ на: комментарий от shdown

Чувак, ты вообще читал текст топика?

У меня все хорошо с памятью. А вот у тебя не очень:

Я: — Можно зафиксировать seed.

Это ты написал.

Кто такие «криптаны» вообще? Мы занимаемся HFT, никаких «криптанов» не знаю

Это все кто так или иначе ходит возле криптовалют. Процитирую твое резюме:

Implemented efficient parallel calculation of a digital signature based on Pedersen hash, needed for dYdX cryptocurrency exchange, in x86-64 assembly and C · Implemented a fast emulator of EVM programs to calculate price slippage for a given amount for SushiSwap, Uniswap v2 and v3 pools

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

no-dashi-v2 ★★★★
()
Ответ на: комментарий от no-dashi-v2

Я: — Можно зафиксировать seed.

Это не обязательно означает srand(). Это передача дополнительным шаблонным параметром Г(П)СЧ в класс. Можно использоовать *_engine из std::random (там есть .seed()), можно что-то своё написать, можно даже тот же чёртов rand туда передавать или свою реализацию его.

Мой тезис в том, что указатель на функцию — идиотизм и не идиоматический С++. Ну и усложнять сигнатуру getRandomElement()…

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

Ну и дураки, хер ли.

shdown
() автор топика
Ответ на: комментарий от shdown

Не могут даже причину настоящую сказать, выходит?

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

no-dashi-v2 ★★★★
()

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

m0rph ★★★★★
()
Ответ на: комментарий от hibou

твой Pedersen

Это не мой, это криптобиржа требует им подписывать. Я только написал реализацию на Си + asm.

shdown
() автор топика
Ответ на: комментарий от no-dashi-v2

Вот поэтому я никогда не интересуюсь результатами собеседований и всякой новомодной обратной связью. А зачем? Бессмысленно. Свои недостатки сам знаю.

hibou ★★★★★
()
Ответ на: комментарий от shdown

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

hibou ★★★★★
()

Одно время меня яндексовые HR доставали предложениями сходить на собес. Сразу отказывал без раздумий, нах не нужна эта потогонная галера. В последний год их что-то не видно. Или я в чёрном списке, или кризис в стране.

ox55ff ★★★★★
()

Написали какой-то тест, который 1000 раз генерирует случайные объекты №1 и №2 с весами 1 и 2 и проверяет, что объектов №2 получилось больше.

Так вот чей код теперь работает в поисковой выдаче Яндекса! Зря ты им это написал. :) И так с релевантностью было так себе, а сейчас вообще похоже именно вышеописанный рандом выдаётся. А «ничего не найдено» я вообще не помню когда последний раз видел….

Stanson ★★★★★
()

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

Leupold_cat ★★★★★
()
Последнее исправление: Leupold_cat (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)