LINUX.ORG.RU
ФорумTalks

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

 , ,


1

8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

---

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

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

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



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

Тред не читал, но работал в верификации HDL. Короче, как фиксируют рандом для тестов? Если будет два теста параллельно идти и извлекать рандомы из одного генератора то они разумеется дадут недетерминированную последовательность, будет «как повезет»

Выход - создавать свой генератор рандома в каждый экземпляр теста со своим начальным seed. В программировании это передача указателя на такую функцию. А если несколько потоков? Тоже как повезет будет брать?

Но вообще, я бы не стал мучить кодом, а выяснил бы понимание именно словами. Тем более это проблема уровня «проверил, увидел что не повторяется входная последовательность, добился чтобы повторялась» и делов то

I-Love-Microsoft ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)