Собеседование C++. Разработчик из Яндекс
Всем привет!
Провели тренировочное собеседование с Фаритом.
на позицию Middle C++ Developer.
Темы, которые рассмотрели на собеседовании:
Многопоточность, задачи, рекурсия, шаблоны, constexpr и т.д.
Приятного просмотра!
telegram: t.me/AmbushedRaccoon
twitch: / ambushedraccoontv
Не забудьте поддержать видео :)
Пікірлер: 101
0:28 - Фарит рассказывает о себе 1:31 - задача: развернуть односвязный список 16:48 - задача: найти уникальный элемент 24:47 - опыт работы в Яндексе 27:01 - статические и динамические библиотеки 30:44 - constexpr 35:22 - метапрограммирование 38:52 - static_assert 41:10 - бесконечная рекурсия 42:38 - работа с потоками 51:12 - фидбек
@user-uw4bj2uz5l
Жыл бұрын
Спасибо большое
Надо было ему дать задачу из контеста, где условие на лист а4, как Яндекс даёт на стажировку.
Большое спасибо за Ваши труды, смотрю Ваш канал уже более года, от старта изучения языка до трудоустройства. Видео очень полезные, продолжаю узнавать много нового и интересного для себя. Желаю успеха Вам и Вашему каналу!
@ambushedraccoon6408
Жыл бұрын
Спасибо)
@vasiliypupkin6311
Жыл бұрын
И куда ты устроился за год изучения языка ?
@TheALEXMOTO
3 ай бұрын
@@vasiliypupkin6311на базар
Спасибо за интервью, с каждым видео все интереснее!
constexpr функция при передаче в cout: std::cout
1) Желательно всё же компилировать написанное 2) Терминейтить потоки функциями ос плохая идея - могут зависнуть ресурсы. Тут лучше делать дамп процесса и отправлять разработчикам на анализ, а сам процесс просто перезапустить.
решение задачи про парные элементы, это очень красиво - прям кайфанул❤
@HelloWorld-fy8cd
Жыл бұрын
жаль что парных элементов должно быть четное число, а иначе не прокатит
Спасибо за отличный контент и вашу работу. Есть ли в планах сделать тестовый собес на уровень Senior C++?
@ambushedraccoon6408
Жыл бұрын
И Вам спасибо! Да, сегодня записали. Посмотрим как видео себя покажет.
Во второй задаче решение очевидно, но я бы задал вопрос: найти элемент - это индекс в векторе или достаточно значения?
C XORом очень круто, действительно все гениальное просто.
Божественный Яндекс. Годами не могут пофиксить хваленый Ямаркет и музыку, в маркете - RecycleView падает в exeption, Fragments не сохраняют данные при переключении в Activity. В музыке песни не переключаются. Видимо Listener отвалился. Или играет одна и та же песня. какую бы не включил, видимо Map поплыла с ключами. И все бы ничего, но на собеседовании ты должен быть БОГОМ, решать УМНЫЕ ЛОГИЧСКИЕ ЗАДАЧКИ и вообще знать наизусть как и что устроено внутри STD. У меня всё.
@nullptr_or_null8301
Жыл бұрын
Проблема в том что многие не понимают по каким принципам работают такие крупные компании независимо от названия и страны (также работает и Apple, Google, Amazon и т.д.), и ломятся туда толпами, думая что это же яндекс там мне заплатят много денег, прокачаюсь в знаниях, опыте и т.д., нет это не так работает во главу угла там ставятся деньги, то есть нужен работник пускай криво косо, но будет справляться со своими обязанностями, но платить ему придется минимум на 50% ниже чем по рынку, на качество продукта такой крупной компании насрать, они уже монополист и альтернатив или нет, или конкуренты могут отнять несущественную долю рынку, отсюда в таких крупных компаниях работают в основном люди в лучшем случае середнячки, а то и новички, как только новичок (или глупый середнячок) под обещания повышения поработает в такой компании 1-3 года, обычно такой срок проходит когда до людей доходит что никто не собирается повышать, они сваливают оттуда через этот срок или их просят на выход, если начнут возникать почему не повышают, не платят больше и т.д., потом набираются следующие дурачки клюющие на бренд, и так продолжается до бесконечности, потому что народа немерянно хотящего работать в таких брендовых крупных компаниях, отсюда и кривое качество продуктов.
@maksimgorohov504
Жыл бұрын
@@nullptr_or_null8301 но каким образом ваш рассказ вяжется с жестким отбором людей в эти компании
@nullptr_or_null8301
Жыл бұрын
@@maksimgorohov504 "но каким образом ваш рассказ вяжется с жестким отбором людей в эти компании" - суть в том что отбираются лучшие прошедшие жесткий отбор, но с оплатой ниже рынка и обещаниями что в будущем эту оплату повысят (естественно никто и не собирается повышать), разводка на дурачка который на это поведется, то есть условно если бы так человек пошел бы в не брендовую компанию ему заплатили больше, потому что не стоит очередь из желающих в такую, а в брендовую стоит очередь, ведь большинство, как рассуждает, что если крупная компания то зп у них будет выше рынка, только вот в чем загвоздка выше рынка в таких компаниях только у приблатненных, а у того кого наймут с улицы будет зп ниже рынка, и тянуть он будет к тому же работу и за себя и за приблатненных, причем этот человек вполне может заменить отдел этих приблатненных в одиночку (знаю такой пример), вот так это работает, суть в том что в крупных брендовых компаниях знаний опыта зачастую для обычного человека требуют столько что в других не брендовых, более мелких, он раза в 2 больше будет получать за те же самые знания и опыт, рассуждать правильно надо вставая на место руководства таких компаний, и рассуждения там просты донельзя хочу чтобы работник был гений и за копейки, в крупных это осуществимо, потому что есть очередь из желающих дурачков (до людей выше написал это доходит через 1-3 года и разводка в основном на джунов и слабеньких мидлов), в средне-мелких такого нет, потому что такой очередь там нет, надеюсь теперь понятно, если нет, то уже не знаю как объяснять. P.S. Причем для заманухи естественно в вакансии и пишут зп якобы по рынку или выше, а уже на собесе естественно озвучивается другая сумма существенно ниже рынка и тут либо человек соглашается (ведется) или на выход.
@maksimgorohov504
Жыл бұрын
@@nullptr_or_null8301 "в том что отбираются лучшие прошедшие жесткий отбор" тогда почему у них так плохо написаны приложения, о чем говорил Андрей выше
@nullptr_or_null8301
Жыл бұрын
@@maksimgorohov504 Аааа, джун или слабый мидл, не может априори писать код, выстраивать архитектуру и т.д. как это делают крепкие мидлы и уж тем более сеньоры, потому что последние (мидлы и сеньоры) знают различные варианты решения одной и той же задачи, а также плюсы и минусы этих решений, и знают где и как применять эти решения, начинающий джун (даже если он гений), слабый мидл этого всего не знают им не хватает знаний и опыта, даже если они мега талантливые пройдет 1-3 года как раз чтобы из них вышел хотя бы мидл и то если они будут развиваться на разных типах и сложностях задач (в таких крупных компаниях обычно такого не дают особо) отсюда так как выше писал смена таких работников обычно происходит раз в 1-3 года и отсюда получаются плохо написанные приложения (потому как новый приходящий городит свой велосипед на другие велосипеды, которые писали до него такие же как он новички), а крупной компании на это пох, потому что они монополист и они могут класть большой и толстый на рядовых пользователей, потому как они уже в основном уже аффилированы тесно с государством и основные деньги пилят с госзаказов и госраспилов (суммы там вам и не снились) плять объяснять это долго, я бы дал ссылку на видео где человек в теме все это разжевывает (я и без него это знаю, потому как сам наблюдал это со стороны работая инженером в одной можно сказать госконторе).
Здравствуйте! Интересное интервью, благодарю! Данное собеседование на позицию middle, верно?
@ambushedraccoon6408
Жыл бұрын
Да, на middle, все верно.
И ещё один вопрос. На какую позицию must have паттерны проектирования?
@ambushedraccoon6408
Жыл бұрын
После года опыта, если не набираетесь на работе то рекомендую начать с Солида, а потом плавно перейти на паттерны. Это важно просто для того, чтобы расти как специалист, не только для собеседований.
@arthurlouiskarl
Жыл бұрын
полотёр
Лайк однозначно
@faritavtakhov5115
Жыл бұрын
как нашел
@robban3465
Жыл бұрын
@@faritavtakhov5115 давно подписан, и смотрел некоторые видосы
Т.е. constexpr - это не гарантия вычисления на этапе компиляции?
@ambushedraccoon6408
Жыл бұрын
Нет. Правильнее сказать, что оно может вычислиться на этапе компиляции, но не факт. Как я и приводил пример в одном случае считалось на этапе компиляции, в другом - в рантайме. Рекомендую почитать стандарт en.cppreference.com/w/cpp/language/constexpr и закрепить на практике.
привет! подскажите, что нужно знать для первой джуниорской работы с++ программистом не в геймдев? что кроме самого язык нужно?
@user-yk7li6ni4o
Жыл бұрын
Тут на самом деле очень всё сложно и все требуют разное. Но основное что могу порекомендовать это естественно понимание и знания Git и работа с GitHub(или другие). Стоит изучить Cmake и Conan (или их альтернативы). С их помочью собирать программы и подключать сторонние библиотеки. Стоит после этого начать знакомство с boost. Для начала например парсинг аргументов с помощью boost. Стоит подключить библиотеки для БД и немного их потыкать, полезно немного знать SQL. Если интересно то потыкать QT. Работа с Linux и хоть пару уроков связанных с GDB.
@user-rv6uh3tw2h
5 күн бұрын
@@user-yk7li6ni4oуже изучил по твоим наставлениям GIT и GITLAB. Дальше буду cmake смотреть параллельно на с++ документацию читаю и доучиваю Stl. Спасибо
Как все переусложнено в первой задаче. Надо хранить cur и prev, prev сначала равен nullptr, тогда не нужна будет проверка на "краевые условия" да и сам цикл будет более естественный. Возвращать надо будет prev.
@sugma1142
13 күн бұрын
а это разве не будет занимать дополнительно память?
@mormeoi
12 күн бұрын
@@sugma1142 Нет. Будут те же самые 2 переменные, просто строчек кода будет меньше.
Видео вышло. Так что теперь ждем стрим
@ambushedraccoon6408
Жыл бұрын
О чем речь? Какой стрим?
крутые обои
Классическое решение reverseList и к нему функция печати List, всё это есть в первой главе SICP. На Lisp или Scala это пишется гораздо проще. : ListNode* reverselist(ListNode* list){ auto aux=[](ListNode* curNode, ListNode* prevNode, auto& aux_ref) { if (curNode->next==nullptr) { curNode->next=prevNode; return curNode; } ListNode* nextNode=curNode->next; curNode->next=prevNode; return aux_ref(nextNode, curNode, aux_ref); }; return aux(list,nullptr,aux); } void printList(ListNode* list){ if (list->next==nullptr) { std::cout
Битовые операции - вынос мозга, но решение мощное. Впечатляющий кейс
@shadowfiend8794
Жыл бұрын
что там выносящего? Дефолтная опреация в компьютере. Почти все зануления компилятор как раз с помощью xor делает.
Хочу чтобы начали появляться код ревью)) на канале
@ambushedraccoon6408
Жыл бұрын
Чуть подробнее, пожалуйста. Как вы думаете это должно выглядеть?
@strongful7120
Жыл бұрын
@@ambushedraccoon6408 Что-то по типу такого было бы очень полезно, такого нет по С++ на русском ютубе kzread.info/dash/bejne/n4OHy9SPlbObnNI.html
Is it real 24:14 , return integer in void function ???
@ambushedraccoon6408
Жыл бұрын
it's just a mistake. It happens. In such case scenario we don't have a compiler to show us obvious errors.
@ambushedraccoon6408
Жыл бұрын
And generally speaking, it's acceptable to make such mistakes in most interviews.
в перуом можно было типо стека все сделать и все.
32:40 - собеседующий не слышал про consteval???
@sakost
10 ай бұрын
с C++20 ещё не все знакомы и работали
@pavel_trpn
10 ай бұрын
@@sakost в 23-м году? А драфт ещё раньше был известен. Вся суть C++ разработки)
У меня вопрос-а разработчик ничего кроме синтаксиса и типовых задач литкода знать не должен?))
Решение первой задачи: ListNode* reverse (ListNode* head) { ListNode* prev = nullptr; while(head->next) { ListNode* next = head->next; head->next = prev; prev = head; head = next; } head->next = prev; return head; }
@IExSet
10 ай бұрын
Тоже зациклится на циклическом списке. У сишников с такими структурами бяда 🙂
@janedoe6182
10 ай бұрын
@@IExSet Почему это беда? В условиях задачи не было упоминания цикличности. И там одной проверки всего достаточно, чтобы ее обойти. Нет никакой беды
Про бинарки это задачка на закопать за почти 15 лет практики приходилось использовать раза 2
@shadowfiend8794
Жыл бұрын
Не понятно почему он их бинарные назвал конечно, если это битовые. От специфики работы зависит я вот очень много сталкивался когда работал с bunch сериализацией в UE
@wolfwood1010
Жыл бұрын
@@shadowfiend8794 все правильно назвал xor это бинарный оператор он на вход принимает 2 значения а возвращает 1
@shadowfiend8794
Жыл бұрын
@@wolfwood1010 да это понятно что правильно, но как подсказка это не очень, явно он имел ввиду именно битовые.
@ambushedraccoon6408
Жыл бұрын
Да, я допустил ошибку. Но собеседуемый так или иначе все понял.
Коммент для продвижения
Решение на 14:13 тоже работало
@ambushedraccoon6408
Жыл бұрын
Да, работает. Но читается хуже.
Вот что значит не уважать Лисп, сей алгоритм зациклится на циклическом списке, у которого последний элемент ссылается на первый!!!
Решение 1 Задачи, используя рекурсию, которая не возможна по мнению автора: #include struct ListNode { int val; ListNode* next; ListNode(int x): val(x){} ListNode(int x, ListNode* next): val(x), next(next){} }; ListNode* RevertList(ListNode* head, bool first = true){ if(head == nullptr || head->next == nullptr){ return head; } else{ ListNode* result = RevertList(head->next, false); head->next->next = head; if(first){ head->next = nullptr; } return result; } } int main() { ListNode* prev = nullptr; for(int x = 0; x
@ambushedraccoon6408
4 ай бұрын
Упадет при RevertList(nullptr, true);
@dinrash7613
4 ай бұрын
@@ambushedraccoon6408 Updated
Зачем задаешь вопросы, на которые сам не знаешь ответ?) Про статические библиотеки например
@ambushedraccoon6408
11 ай бұрын
Задаю, потому что знаю. И в принципе я могу просто задать вопрос, чтобы послушать рассуждения интервьюера на данную тему.
@dethomorphin
11 ай бұрын
@@ambushedraccoon6408статическая библиотека это не исполняемый файл, и динамическая тоже. Разница в какой момент символы будут разрешены: при компоновке либо при исполнении
Боже, решение с ксором в задаче о нахождение уникального элемента, просто шикарно. Я кстати когда думал сам над решением, пришел к использованию битовых операций, но только с целью хранения информации о том, что элемент уже есть. (1 есть, 0 нет). Но вот до использования ксора не додумался.
Насчёт RevertList что то сомнения закрались.. Хоть я инженер, не программист не судите строго.. А на стеке хватит памяти если список очень большой.. Если 10 миллионов? Я думал надо что то типа выделяем памяти с запасом, проходимся до конца, записывая всë в массив в этой памяти.. По мере надобности выделяем ещё.. А дойдя до конца, проходимся обратно.. Ну и память удаляем
@user-lc6yf8rz6k
Жыл бұрын
И почему это всё не андефайнд бихевиор? Мы возвращаем указатель на то, что создали на стеке? Если ошибаюсь расскажите пожалуйста в чем.
@damirsob6176
Жыл бұрын
В решении, на стеке хранятся только 3 указателя(cur, prev, temp), независимо от размера списка. А значит, stackoverflow не будет.
@damirsob6176
Жыл бұрын
@@user-lc6yf8rz6k нет, возвращается копия указателя prev, который указывает на первый узел реверснутого списка.
@user-lc6yf8rz6k
Жыл бұрын
Спасибо. Буду разбираться
ну такое, 80% вопросов не релевантны на позицию middle, и в реальных проектах о них вспомнят в последний момент, особенно по constexpr и проверка статического результата. Не реалистичная бредятина
есть два типа людей: 0. Которые хейтят яндекс 1. Те, которые в нем работают Я скоро переметнусь из одной касты в другую, пхехе.
10:12 интервьюер, ты ойкаешь, вздыхаешь, сбиваешь своими вставками с мысли, задал вопрос подожди пока решит задачу и потом покажи какой ты nevyebeniy. Нахера ты лезешь, отбил всё желание смотреть
А это точно разработчик из Яндыкса? Есть большие на эту тему сомнения. Обычно яндекс проводит 3-4 технических собеса на алгоритмы и знание языка. Мне кажется на собесе был самозванец :) Теперь к автору видоса. Автор!, а похоже ты и сам не понимаешь (судя по твоему ответу) разницы между динамическими и статическими библиотеками - подучи-ка, дружок, мат-часть а уже потом вопросы задавай.
@faritavtakhov5115
Жыл бұрын
Я алгоритмы хорошо знаю
@faritavtakhov5115
Жыл бұрын
Поошибался, бывает, че за духота
@sakost
10 ай бұрын
@@faritavtakhov5115а ты на какой позиции? Junior? Middle? Просто если junior, то все наезды в комментариях абсолютно нерелевантны. В любом случае ты большой молодец)
задачи конечно... олимпиадная хрень, это не собес, это бесполезные ребусы
Совершенно бесполезная первая часть собеса с решениями задач. Так как проверяется тупо навык задрачивания решения задач на ЛитКод и тому подобных, которые в реальной разработке редко когда понадобятся. Я бы уже после это части распрощался с таким работодателем
@sakost
10 ай бұрын
ну вообще нет. будь там задача уровня hard с литкода, то да. А это medium с натяжкой. Тут проверяется возможность кандидата мыслить логически. И во многих компаниях(если не во всех. Я прошел больше 50 собесов и только 1-2 раза встречал, когда таких вопросов не было) такое применяют постоянно
@user-ei6lr9vn8u
3 ай бұрын
Более 50 прошёл, задачи на логику, меня терзают смутные сомнения... А ты вообще дееспособен писать каменты😂
Был бы рад вашей оценки моей жалкой попытки. еще только учусь. Тоже первое что пришло в голову это рекурсивная функция, реализовал так - using namespace std; struct ListNode { int value; ListNode* next; ListNode() : value(0), next(nullptr) {} ListNode(int x) : value(x), next(nullptr) {} ListNode(int x, ListNode* next) : value(x), next(next) {} }; void ReverseList(ListNode *header, ListNode* &finalHeader) { if ((*header).next != nullptr) { if ((*header).next->next != nullptr) { ListNode* buffer = (*header).next->next; (*header).next->next = header; ListNode* bufferForNext = buffer->next; buffer->next = (*header).next; (*header).next = nullptr; ReverseList(bufferForNext,finalHeader); bufferForNext->next = buffer; } else { (*header).next->next = header; finalHeader = header->next; } } } int main() { ListNode a1(1); ListNode a2(2); a1.next = &a2; ListNode a3(3); a2.next = &a3; ListNode a4(4); a3.next = &a4; ListNode a5(5); a4.next = &a5; ListNode a6(6); a5.next = &a6; ListNode a7(7); a6.next = &a7; ListNode a8(8); a7.next = &a8; ListNode* finalHeader = nullptr; ReverseList(&a1, finalHeader); }; вершина перевернутого листа находится в указателе finalHeader
@eewwwqqwee
3 ай бұрын
p.s. первая задача
Это пи.здец какой-то)) какой-то там симэйк)) абалдеть просто. в яндексе кто вообще работает?) статика и шарэд либа это же очевидная вещь. какой кошмар