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 ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)