Собеседование Middle C++

  Рет қаралды 25,870

Ambushed Raccoon

Ambushed Raccoon

9 ай бұрын

Всем привет!
Провели тренировочное собеседование с Валентином на позицию Middle C++ Developer.
Приятного просмотра!
Не забудьте поддержать видео :)
Twitch: / ambushedraccoontv
Telegram: t.me/AmbushedRaccoon
Donate: www.donationalerts.com/r/ambu...

Пікірлер: 86
@user-kc4nd
@user-kc4nd 9 ай бұрын
Спасибо, как всегда, круто 👍🏻
@lyaskamutchaev6569
@lyaskamutchaev6569 9 ай бұрын
не знал что оксимирон проводит собесы
@user-pg4uv1xs1t
@user-pg4uv1xs1t 9 ай бұрын
Наконец-то что-то новое по cpp
@aleksanderaksenov1363
@aleksanderaksenov1363 9 ай бұрын
Ну и на каких реальных проектах решаются такие типовые задачи?)Решаются задачи вроде разбор архитектуры,нахождение эффективного решения,написание опредленных подсистем,тут намного больше нужно аналитическое мышление чем знание синтакиса С++.Если возникают проблемы с синтксисом то это гуглиться за пару минут.Весь этот литкодный подход это на поиск кодера,человека который бездумного просто будет выполнять задачи.В настоящее время переизбычтка игфрмации запоминание типовых алгоритмов-вздор😁Намного больше смысла для позиции от Middle давать задачи на построение архитектуры и эффективного решения,даже на псевдокоде
@olexayko
@olexayko 5 ай бұрын
Кинь пожалуйста тогда ссылку на какой-то собес, который тебе понравился, по С++
@CatcherStat
@CatcherStat 9 ай бұрын
Во время обсуждения реаллокации вектора ждал что упомянут инвалидацию итераторов, указателей и ссылок, но не услышал. Но момент не всегда очевидный и новички периодически на него попадаются.
@allex-all
@allex-all 5 ай бұрын
Ага, а ещё конструкторы перемещения/ копирования могут бросать исключения. И кстати выбор между ними, и оптимизация реаллокции простых типов.
@user-dk5rx1be6v
@user-dk5rx1be6v 8 ай бұрын
👍
@StasonST19
@StasonST19 9 ай бұрын
nice
@Pa36ouHuK
@Pa36ouHuK 9 ай бұрын
По второй задаче: изначально можно было идти по аналогии с std::string::find. Вернуть аналог npos. Чувак удивил, что смог isSame реализовать, но не выдал базу про set :)
@allex-all
@allex-all 5 ай бұрын
Может isSame он и смог благодаря документации)
@mrbibis7229
@mrbibis7229 5 күн бұрын
хз, очень странно что он не знает что такое специализация, потому что начал в оригинальном шаблоне писать но мб прост волновался, каждый мнит себя Страуструпом видя собес со стороны)
@vilture5706
@vilture5706 9 ай бұрын
Спасибо, понял, что стоит подучить stl, а то как то нервно стало на шаблонах. Да и winapi посмотреть. Ps но все таки есть мысль, что для миддла важнее паттерны проектирования, алгоритмы и все что более существенно влияет на жизнь и стоимость проекта. Все таки шаблоны , stl и низкий уровень нужен тем, кто пишет библиотеки, а не десктоп. Важнее быстро написать надежный код, а не написать быстрый код.
@bergest4348
@bergest4348 9 ай бұрын
Так можно вообще писать код на ноде или питоне. Зачем вам плюсы тогда?
@jnarical
@jnarical 9 ай бұрын
Быстро написать надёжный и ПОНЯТНЫЙ код ))) но я ненастоящий сварщик, хотя и пытаюсь стать настоящим
@bergest4348
@bergest4348 9 ай бұрын
@@jnarical так быстро и понятно это не в плюсы . Тут ни того ни другого.
@whoknows4728
@whoknows4728 9 ай бұрын
Вот именно, в первую очередь с чем ты сталкиваешься это с архитектурой ПО, а уже потом все остальное, если алгоритмы ты можешь нагуглить и выучить по ходу применения, то с архитектурой не все так однозначно
@bergest4348
@bergest4348 9 ай бұрын
@@whoknows4728 нагуглить и вкурить паттерны
@yuriynevazhno2542
@yuriynevazhno2542 9 ай бұрын
Ну что то мало. Хотелось увидеть лямбды, особенности их работы, применение в стандартных алгоритмах. Ну и потихоньку подтягивать фичи из новых стандартов (ranges, views).
@valentynmudryk2869
@valentynmudryk2869 9 ай бұрын
Дык а что лямбды разбирать. Генерируется класс функтор с перегруженным оператором. Не вижу ничего сильно интересного в них
@mrbibis7229
@mrbibis7229 5 күн бұрын
@@valentynmudryk2869 а зря, в них много интересного, например как использовать лямбды внутри списковой инициализации структур, что из себя представляет лямбда с auto аргументом (в функции до недавних времен auto в аргументы было нельзя писать, а в лямбды можно), про friend'овость лямбд объявленных в методах структуры (есть ли вообще возможность обращаться к private), про проблемы с оптимизацией в лямбдах, что делает mutable по отношению к лямбде и тп. :)
@billjohnes9380
@billjohnes9380 9 ай бұрын
27:34 - совсем не обязательно переходить к ssize_t, теряя половину возможных значений, хотя требуется всего одно. Тем более, что в стандартах C/C++ этот тип не определён, хотя можно найти решение даже в этом случае, например, std::make_signed_t. Вполне достаточно пожертвовать всего одним значением, а именно -- максимальным, и ограничений это не внесёт никаких в силу наличия NULL-указателя. Для этого можно использовать SIZE_MAX (требуются header'ы cstdint и climits) или std::numeric_limits::max() (требуется header limits). Есть небольшое ощущение, что у интервьюера за последние полгода-год уровень подрос.
@bergest4348
@bergest4348 9 ай бұрын
Создавать в коде спящие баги не очень хорошо =) Хоть я и не могу представить ситуацию когда потребуется полностью заполненный вектор... У меня был этап когда я писал максимально ужатый код. Пытаясь выиграть по максимум памяти и быстродействия, ни к чему хорошему это не приводит обычно. Сложность возрастает, расширяемость падает. Да и не ты один над кодом трудишься... А в данном случае я бы возвращал булевский результат. А значение отправлял по ссылку. Ну или дополнительно где-нибудь добавил флаг ошибки. Всё зависит от конечного использования.
@billjohnes9380
@billjohnes9380 9 ай бұрын
@@bergest4348 Возвращать не значение, а bool'вский результат, а само значение -- по ссылке, может быть неудобно. Это не похоже на "спящий bug", тем более, что SIZE_MAX практически наверняка недостижимо, ибо как минимум один адрес (NULL) исключается. Если вы посмотрите на cppreference описание strtoul в части возвращаемого значения, то увидите, что там подход -- аналогичный. В стандартной библиотеке C++ тоже создают спящие bug'и?
@bergest4348
@bergest4348 9 ай бұрын
@@billjohnes9380 В любом случае это особенность которую нужно помнить. По поводу логики - а смысл тогда возвращать ошибку если мы не делаем обработку этих ошибок. Единственная проблема - 2 доп переменных, которые в случае с ограниченной памятью нам не нужны. Ну моё мнение - реализация зависит от конкретной задачи.
@billjohnes9380
@billjohnes9380 9 ай бұрын
​@@bergest4348 Эта "особенность" широко распространена, включая случаи возврата беззнаковых типов, и даже встречается в стандартной библиотеке. В программировании вообще много особенностей, про которые следует помнить, иначе -- чревато. Может быть так, что обработка ошибок отдаётся выше в вызывающие функции, и в случае возврата SIZE_MAX при ошибке нет необходимости в переменной. И даже если не отдавать ошибки на обработку выше, то в вашем случае невозможно завести const'антную переменную, которая примет значение. Однако, моё изначальное замечание касалось не разумности применения в данном случае техники возврата специального значения как индикатора ошибки, а всё-таки использования данной техники разумным способом, а не тем, который был озвучен во время собеседования.
@bergest4348
@bergest4348 9 ай бұрын
@@billjohnes9380 с этим я полностью согласен =)
@user-bp8dl5hi5x
@user-bp8dl5hi5x 4 ай бұрын
По первой задаче: Кто нибудь, объясните мне, дураку, почему этот код вообще должен работать? if (n = number) - оно же никогда не выполнится. N последовательно перебирается элементами массива, number = 3. Может, если надо найти самую длительную последовательность из 3, надо так: unsigned int max_arr = 0; for (auto n: arr) { if (n % number != 0) continue; if ((n / number) > max_arr) max_arr = n; } Тогда на выходе, да, получим самый длинный элемент, состоящий из последовательности number
@alexplaytop
@alexplaytop Ай бұрын
Для Джуна здесь много незнакомого, и многое непонятно))
@user60336
@user60336 9 ай бұрын
Разве решение первой задачи не является ошибочным? Оно не учитывает числа, большие чем number. Так для number = 3. оно проигнорирует 33, 333 и т. д.
@crazyboom8909
@crazyboom8909 9 ай бұрын
Я недавно начал изучать c++, попробовал решить эту задачу, у меня получилось так: int getMax(const int *arr, int size, int number) { int maxFirst = 0; int maxSecond = 0; for (int i = 0; i < size; ++i) { if (arr[i] == number) { ++maxFirst; if (maxSecond < maxFirst) { maxSecond = maxFirst; } continue; } maxFirst = 0; } return maxSecond; }
@user60336
@user60336 9 ай бұрын
Там условие задачи звучит как "найдите количество цифр в самой длинной последовательности, состоящей из числа number." Этот код явно делает не это) И я бы Вам порекомендовал использовать std контейнеры вместо встроенных массивов
@crazyboom8909
@crazyboom8909 9 ай бұрын
@@user60336 С тем, что лучше использовать встроенные контейнеры вместо массивов я с вами согласен, но с чего вы решили, что данный код не удовлетворяет условию задачи?
@user60336
@user60336 9 ай бұрын
@@crazyboom8909 Как минимум потому, что он для последовательности чисел, приведённых в видео, для которых он должен возвращать ответ 4, возвращает 1)
@user60336
@user60336 9 ай бұрын
@@crazyboom8909 Если я правильно понял условия задачи, как-то так должен выглядеть ответ. int find_range_n(const std::vector& vec, int number) { int max{}; for (auto n : vec) { int temp_max{}; while (n > 0) { if (n % 10 == number) { temp_max++; } n /= 10; } if (temp_max > max) { max = temp_max; } } return max; }
@vladimir7666
@vladimir7666 8 ай бұрын
Это такой тест на мидла? )))))))))
@l_y5398
@l_y5398 9 ай бұрын
можно ссылку на документацию?
@soulspirit8687
@soulspirit8687 7 ай бұрын
где таких лажовых мидлов брать?
@RedBallOfLove
@RedBallOfLove 9 ай бұрын
Какие навыки или опыт проверяет первая задача?
@arthurlouiskarl
@arthurlouiskarl 9 ай бұрын
умение соображать
@RedBallOfLove
@RedBallOfLove 9 ай бұрын
@@arthurlouiskarl решать задачки и писать код это совершенно разные задачи. Он собесит на должность в команду спортивного программирования?
@arthurlouiskarl
@arthurlouiskarl 9 ай бұрын
@@RedBallOfLove С этим никто не спорит. Вот только вызубрить документацию, фреймворки и паттерны может любой, что там проверять-то? а такие задачи решит не любой, даже с подготовкой. Только тут виден ум и находчивость кандидата
@RedBallOfLove
@RedBallOfLove 9 ай бұрын
​@@arthurlouiskarl Только в 0.01% случаев, а может быть и меньше, вам приходится сталкиваться с сортировками. Остальное же время приходится прикручивать разные фреймворки, настраивать, ловить сотни различных багов и обходить их, собирать всё это вместе, пытаясь заставить этого монстра работать. Практически любое узкое место можно выловить на этапе оптимизации, а вот написать код, который можно будет читать, поддерживать и расширять - реальная проблема.
@arthurlouiskarl
@arthurlouiskarl 9 ай бұрын
​@@RedBallOfLove я и не спорю с этим. На подробное обсуждение построения архитектуры нужно много времени и это делается на отдельном интервью (так и называется обычно, дизайн приложений), на алго-интервью важно понять, насколько человек умеет думать. Если вы никогда не сталкивались с кем-то, кто хорошо говорит, имеет много лет "опыта", но не может понять логику простой сортировки или бинарного поиска - то, поверьте, такие бывают и их много.
@Sergey_Kyl
@Sergey_Kyl 6 ай бұрын
Смотрю такие видео и думаю: а они вообще программировать умеют?😅😂😂😂😂
@Alexander_Gurov_RF
@Alexander_Gurov_RF 6 ай бұрын
Ответ про специальные команды процессора для работы с исключениями убил. 😂 И чел явно путает try и __try.
@Lala-gu4qi
@Lala-gu4qi 9 ай бұрын
Первая задача вроде как решена не правильно. find находит первый элемент в контейнере - получается эта функция для вектора vec = {5, 1, 1, 4, 1, 1, 1, 1, 1} и number = 1 вернет 3 (зацепив 5-ку), хотя правильный ответ 5. Я так понимаю он хотел написать что-то типа этого: size_t max = 0; auto first_match = std::find(vec.begin(), vec.end(), number); while(first_match != vec.end()) { auto last_match = std::find_if(first_match, vec.end(), [number](const int elem){return elem != number;}); max = std::max(static_cast(std::distance(first_match, last_match)), max); first_match = std::find(last_match, vec.end(), number); } return max; Хотя он, вроде как, не эффективнее наивного решения (Оба за O(N)), просто выглядит компактнее и более читаемо
@theministryofnonsense
@theministryofnonsense 9 ай бұрын
Плохая привычка не проверять своё решение, разве так сложно собрать проект и проверить правильно ли работает ваша программа? Судя по софту, что сегодня выпускают, на работе они тоже программы даже не тестируют и не запускают... надеюсь когда нибудь эта привычка уйдет у разработчиков
@ambushedraccoon6408
@ambushedraccoon6408 6 ай бұрын
Далеко не на каждом собеседовании у вас будет возможность собрать и запустить решение. Тем не менее критику я учел.
@AndreySedov
@AndreySedov 9 ай бұрын
КьюТЭ. Всё -уволен. Не прошел 😂😂😅 Ваще нифига не понял чо за дичь в задачах была и почему типеид не катит
@RedJerick
@RedJerick 8 ай бұрын
Потому что "типеид" не будет работать при выключенном RTTI. И вопрос был именно про шаблоны а не RTTI.
@Mapdyk
@Mapdyk 3 ай бұрын
У нас в конторе все говорят "кутИ", хоть кол на голове чеши)
@alexgorodecky1661
@alexgorodecky1661 9 ай бұрын
Что-то унылый какой-то мидл, я так пару недель в VisualStudio посижу и за синьора сойду 😀
@bergest4348
@bergest4348 9 ай бұрын
Как по мне инкрементить значения при переборе не имеет смысла(1я задача). Достаточно использовать разницу указателей. Поскольку вектор это тот же массив в юбке.
@isljack3117
@isljack3117 9 ай бұрын
Привет. Не мог ты показать пример? Опыт лишним не будет :) Я cделал так (по сути схоже с его реализацией): int find_range_n(const std::vector& vec, int number){ int count{0}, maxCount{0}; for (auto a:vec) { if (a == number) { count++; if (maxCount < count) { maxCount = count; } } else { count = 0; } } return maxCount; } Громоздко.
@bergest4348
@bergest4348 9 ай бұрын
@@isljack3117 int find_range_n(const std::vector& vec, int number){ const int* first = nullptr; long int res = 0; for(auto& i : vec) { if(number == i) { if(!first) first = &i; } else { if(first) { res = std::max(res, &i - first); first = nullptr; } } } if(first) { return std::max(res, (&vec.back() - first) + 1); } return res; }
@RedJerick
@RedJerick 8 ай бұрын
@@bergest4348 Твое решение хуже читается и менее эффективно. У тебя на каждую итерацию делается больше условных проверок, которые сложнее чем просто инкрементировать значение. Так же твое решение хуже масштабируется, если нам в будущем понадобится реализовать такой же алгоритм для другого типа контейнера, например, для списка, твое решение не будет работать.
@user-yq8rw1rf9q
@user-yq8rw1rf9q 7 ай бұрын
слабоваты вопросы для позиции мидла уж мне кажется
@vartan_babayan_4388
@vartan_babayan_4388 9 ай бұрын
КККланг а не СИланг
@vladimirchizh8853
@vladimirchizh8853 9 ай бұрын
Хех, я примерно так и понял, слишком уж хорошо отвечает и слишком много всяких штук помнит.
@valentynmudryk2869
@valentynmudryk2869 9 ай бұрын
Без того чтобы помнить, документация не поможет. Это инструмент поддержки
@vladimirchizh8853
@vladimirchizh8853 9 ай бұрын
@@valentynmudryk2869 Конечно нужно с этим работать, чтобы в этом инструменте был смысл, но он действительно даёт буст на собесах. Например я не уверен, что вспомню сейчас как сфинае писать, т.к на работе не пишу его. Но что это знаю, и с этой штукой точно отвечу на вопрос, а без неё - не уверен. Тут вопрос подготовки, на собесах очень часто спрашивают то, что как правило не используется на работе. Те же шаблоны, редко на практике применяются.
@valentynmudryk2869
@valentynmudryk2869 9 ай бұрын
@@vladimirchizh8853 SFINAE разное бывает) Что-то можно без подготовки написать, а что-то уже затруднительно
@ParticleNosedive
@ParticleNosedive 9 ай бұрын
Мда уж
@skynowa2626
@skynowa2626 5 ай бұрын
Чел сидит и гуглит параллельно
@ambushedraccoon6408
@ambushedraccoon6408 5 ай бұрын
Не совсем так. 1:00:38 - тут про это говорю.
@user-tv4kh4pc7s
@user-tv4kh4pc7s 8 ай бұрын
Какой он унылый, печатает со скоростью секретарши, мидл школьник
@AgnosTeos
@AgnosTeos 9 ай бұрын
Не понятно какой документацией он пользовался ? Очень удобная штука, напишите название пожалуйста.
@valentynmudryk2869
@valentynmudryk2869 9 ай бұрын
Zeal
@AgnosTeos
@AgnosTeos 9 ай бұрын
Zeal
@revingar
@revingar 6 ай бұрын
Zeal
@sashabroslavskiy7904
@sashabroslavskiy7904 9 ай бұрын
Как по мне на typescript-е люди посложней решают задачи)) перебирать массивчики это такое себе)) спроси лучше что такое тред пул и как работают форки например)) как пробросить исключение через поток и т.д
@vilture5706
@vilture5706 9 ай бұрын
Так он сказал же, что исключениями не пользуются, а только ловят. Зачем тогда это спрашивать? Много где считают, что исключениями пользоваться не надо. Это убивает смысл С++.
Собеседование Junior C++
54:00
Ambushed Raccoon
Рет қаралды 37 М.
Собеседование C++
47:00
Ambushed Raccoon
Рет қаралды 23 М.
Barriga de grávida aconchegante? 🤔💡
00:10
Polar em português
Рет қаралды 36 МЛН
Айттыңба - істе ! | Synyptas 3 | 7 серия
21:55
kak budto
Рет қаралды 1,6 МЛН
Собеседование Middle C++
52:34
Ambushed Raccoon
Рет қаралды 19 М.
Собеседуем Школьника. C++
57:23
Ambushed Raccoon
Рет қаралды 12 М.
Собеседование Middle C++
58:19
Ambushed Raccoon
Рет қаралды 136 М.
Собеседование Middle C++
43:44
Ambushed Raccoon
Рет қаралды 10 М.
Собеседование Junior C++
45:32
Ambushed Raccoon
Рет қаралды 94 М.
Собеседование C++. Разработчик из Яндекс
53:31
Barriga de grávida aconchegante? 🤔💡
00:10
Polar em português
Рет қаралды 36 МЛН