Собеседование Middle C++
Всем привет!
Провели тренировочное собеседование с Александром на позицию Middle C++ Developer.
Приятного просмотра!
Не забудьте поддержать видео :)
Таймкоды:
00:00 Вступление
00:18 Расскажи о себе
02:48 Задача: экранирование символов
14:28 Заголовочные файлы. Код в них
20:24 extern
22:45 Взвести/Сбросить бит
34:33 Сериализация/Десериализация
40:33 Сериализация двусвязного списка
45:42 union
47:36 1. Про 11-й стандарт. Move-семантика
49:28 Copy on write
47:36 2. Про 11-й стандарт. Move-семантика
51:35 Функтор. Лямбды
53:12 Наследование от stl контейнеров
56:12 Фидбэк
Пікірлер: 366
Всем привет! Объявляю набор кандидатов на собеседование Middle С++. Требуются разработчики с опытом 1-3 года. Собеседование проводится только с видео. Если вы хотите проверить свои знания и попасть в новое видео, то пишите мне на почту ambushed.raccoon.tube.mail@gmail.com с темой “Middle собеседование кандидат”. В письме пишите свои контактные данные(желательно telegram), описание ваших знаний или резюме. Со своей стороны гарантирую, что видео будет выложено только с вашего согласия. Так что не бойтесь. Будьте внимательнее с темой письма, потому что они очень легко попадают в спам.
Собеседование: разверни дерево, найди оптимальный путь Реальность на работе: фикс ошибки из-за отсутствующей запятой, катить самому в прод без техлида в пятницу
Странно, что в названии написано "Собеседование Middle C++",а первые слова собеседование на позицию junior.
Видео клевое, но хочется тайминги еще :) Ждем материала от вас, вы очень приятно объясняете материал
@ambushedraccoon6408
Жыл бұрын
Спасибо) Тайминги сделал.
Спасибо за контент. Очень интересно.
Интервью было интересное, как для студента второго курса очень даже познавательно проверить какие то свои навыки, на большую часть вопросов смог ответить)) Про тхт и бинарники правда как то косвенно отошли от ответа, все таки главный недостаток и преимущество это читабельность данного файла, ведь просто тхт можно спокойно открыть, прочитать/переписать, а в бинарном будут каракули и его не разобрать)) Но в тоже время некая защита/конфиденциальность информации, спасибо за видео, было очень интересно, хочу еще.
@user-po6ex2is6e
Жыл бұрын
сериализация предназначается для программы, человеку незачем её читать, он конечно может, но это не для этого. Если нужна конфиденциальность, то для этого существует шифрование и неважно текст это или бинарное представление. Основная проблема бинарного формата порядок бит на разных платформах, он может отличаться.
Работаю вместе с джамшутами на стройке. Возле Рублёвки, чистыми выходит ~120. Почему это оказалось у меня в рекомендуемых??
@simvoli
2 ай бұрын
Алгоритмы ки вычислили с кем ты работаешь. Джамшуты программисты и угорают с тебя на стройке. Ки подслушала их разговоры и решила тебе подсобить.
Для вопроса про сериализацию двунаправленного списка можно сделать намного проще: Обозначаем тип и указываем цикличный этот список или нет, дальше данные кладем в виде массива. На выходе получаем минимальный объём сериализованных данных + обработку за один проход как для записи, так и для чтения.
@Pavel.Zhigulin
11 ай бұрын
Можно ещё проще: сериализуем как массив и кладём хер на тип. Кому надо - десереализуют в двунаправленный список. Кому не надо - десереализуют массив.
Пару советов для собеседуемого: 1. Сначала придумываем алгоритм, и оцениваем его сложность О(), только потом начинаем писать код. 2. Помним, что изменять коллекцию, от которой уже взят итератор, куда-то передан указатель или ссылка нельзя. 3. Сложный код ведет к неделям отладки, поэтому пишем максимально просто. 4. Когда говорят "забей на проверки", вместо проверок вначаеле вставляем коммент //TODO, чтобы не забыть, иначе есть вероятность, что все так и останеся. Для собеседующего: 1. Не следует слишком "проталкивать" свое решение, возможно, что кандидат немножко поколдовав над кодом вполне сможет найти более элегантное или более простое решение. В реальной работе у него на это 5 минут то будут. Прочее 1. про бинарную сериализацию в 2022 году можно сказать - сериализация при помощи memcpy - говнокод прошлого века. Хорошо если джун знает почему, но если не знает это не проблема.
@ambushedraccoon6408
Жыл бұрын
Все по делу, Спасибо.
@maxch3
Жыл бұрын
//TODO слишком часто тоже так и остается :)
@Nandarion
Жыл бұрын
@@maxch3 Ну если есть код-ревью или при рефакторинге TODO практически наверняка будет замечено, и если есть возможность то исправлено. Отсутствующий код же если и будет замечен то это будет "ага, баг", или "опять он наговнокодил". Ну а что еще можно сделать кроме коммента, если говорят забить на проверки, так как нету времени.
@user-cb8nc5to4z
Жыл бұрын
С вами лучше не спорить.
@myriaxont
Жыл бұрын
Касаемо первого пункта, стоит учитывать локальность памяти и инструкций возможных реализаций алгоритма. Так же стоит учитывать возможность распараллеливания алгоритма, явного или же возможного к выполнению компилятором - как и по средствам многопоточности, так и по средствам векторизации вычислений. А вообще, параметров оценки оптимизации куда больше, но это основные.
Очень классный контент, для Джуна, много вещей, что надо подтянуть, хочется уже быстрее на работу и задонатить, ты делаешь очень многое для начинающих, спасибо!
@alienhazzard7201
Жыл бұрын
@ Vasiliy Pupkin Бойтесь своих желаний - они исполняются.
@vasiliypupkin6311
Жыл бұрын
@@alienhazzard7201 уже 7 месяцев как не исполняется(
@george.8888
Жыл бұрын
@@vasiliypupkin6311 Ты был джуном 7 месяцев назад. Почему не получилось? Ответь развернуто, пожалуйста, мне очень интересно как начинающему.
@vasiliypupkin6311
Жыл бұрын
@@george.8888 После 24 февраля, много компаний ушло, которые нанимали джунов. Компании которые остались, очень сильно вырос порог входа, а так как я занимался именно unreal engine 4 и все мои проекты были под гейм дев, а гейм дев умер в СНГ, и на вакансию gameplay dev начали откликаться 200+ чел. При том, что я 25 февраля должен был переезжать в Киев, я делал тестовое 3 месяца и прошел на проект сталкер 2. Через месяц, я понял, что остались только продуктовые компании, такие как Яндекс, сбер, Тинькофф, но туда берут в первую очередь олимпиадников и с таких, как МФТИ и т п. Итог: знать надо гораздо больше, конкуренция в 3-4 раза выросла, это я все рассказываю в рамках С++. Нужно хорошо знать алгоритмы и структуры данных, уметь решать с закрытыми глазами, знать тонкости языка, как работает под капотом, этим сможете привлечь внимание, работа долгая и упорная, я с полного нуля занимаюсь 2 года. Я так по приколу за 2 недели начал на js писать)))) Я бы на вашем месте смотрел бы на другой ЯП, у айти бороды есть интервью с лидом по физике геймплея war gaming он там и говорит, что с хорошим наставником, вы станете джуном по С++ за 1,5-2 года, работая про этом. У Сергея немчинского, есть очень много материала, как выбрать ЯП, какой лучше, как правильно учиться. Своему сыну я бы не советовала, в качестве первого языка брать ++ очень сложно и долго. Удачи!
@george.8888
Жыл бұрын
@@vasiliypupkin6311 Спасибо что потратили свое время! Я пришел к выводу что стоит начать с вэб разработки, стандартный пакет с хтмл, цсс, джава скрипт. Всегда будет спрос, всегда можно брать фриланс пока ищешь. работу. Уже после можно изучить языки под узкие направления, которые интересуют, вроде гейм дизайна и тд. Как вы считаете, это правильное решение? Многие говорят про Питон, что он самый лёгкий для начинающих, но мне почему то кажеться самым разумным решением начинать с вэб..
Этот парень помогает поверить в свои силы.
Здравствуйте. А будет сборка Quake из исходников ?
Охуительно, посмотрел за ужином, о чем они говорят - х.з. но очень интересно. Спасибо ютюбу за рекомндацию ахахахахахаха... Комменты тоже доставляют. Удачи вам парни!
хорошее видео, хороший канал, всем спасибо!
Впринципе ничего страшного не будет,если мы унаследуемся с модификатором protected от вектора. Так,что на мой взгляд ,собеседуемый сказал правильно: он сказал про private наследование от вектора. Потому,что в таком случае механизм полиморфизма работать не будет. Но есть и достоинства: при таком подходе можно получить доступ к protected членам вектора. При композиции так нельзя сделать. Ещё Здесь есть один риск,если пользователь будет делать reinterpret_cast к вектору(к указателю на вектор) и явно вызывать деструктор. Но по мне это такое себе. Как завещал Скотт Майерс: предпочитайте композицию наследованию.
@billjohnes9380
Жыл бұрын
Только почему никто не озаботился вопросом, насколько часто сам объект вектора создаётся динамически так, чтобы пользоваться им потом через указатель на базовый класс?
Я являюсь преподавателем C++ в ютубе и работаю игровым разработчиком, поэтому добавлю свои 5 копеек. Не понимаю, почему автор видео решил, что кандидат подходит ближе к middle-уровню, если он на большое количество "junior"-вопросов не смог ответить. Какая разница, какой у него коммерческий опыт? Я могу за 10 лет поменять 10 компаний, везде быть джуном и рассказывать, что в одной компании я делал одно, в другой другое, и так далее. А на собеседовании не могу ответить на вопросы. Считаю, что кандидат подходит на позицию Trainee/Intern. Переходим к вопросам. 1. Не понимаю, зачем у кандидатов на позицию junior спрашивать их опыт. Что от этого меняется? Вы будете задавать другие вопросы? Вы вообще их не будете задавать? Я считаю, что на собеседованиях на intern/trainee/junior позиции нужно оценивать только навык программирования. Ну да ладно, это не критично. 2. Не понимаю, почему интервьюер решил сразу начать с сложной (по сравнению с большинством вопросов) задачи, а потом задавать простые вопросы. Кандидат в теории может слиться уже на простых вопросах и тогда незачем будет решать задачу. В теории вы можете так затянуть время собеседования, если кандидат будет нулевым. 3. Не "хИдэр" а "хЭдэр", потому что header читается как "хэдэр". Хоча я не вижу причин в разговоре не говорить "заголовочный файл". 4. Почему кандидату надо знать об extern "C"? Я работал в нескольких компаниях, и ни разу не было причины использовать это. Что мешает junior-разработчику при первом требовании использовать С-функцию, загуглить эту информацию и получить быстрый ответ? Это лишний вопрос. 5. "Битовые задачки - часто возникающая вещь" - вы откуда пришли к такому выводу, можно поинтересоваться?) Надеюсь, вывод не был сделан только с ЛИЧНОГО опыта?) 6. "На какие виды можно разделить сериализацию с точки зрения С++" - максимально непонятный вопрос. Я уверен, что автор его придумал на лету. Готовьте вопросы заранее и убедитесь в их ясности. 7. На счет вопроса по сериализации списка в файле. Я здесь вообще поплыл в ваших (обоих) рассуждениях. "Как понять, какой элемент будет следовать за каким?" Та элементарно - пройтись по списку и просто записывать значение каждого элемента в файл. В файле значения будут хранится как простой набор чисел. А при считывании будет ясно, что первое значение - первый элемент. Второе - второй. Либо я не вообще не понял вашей темы, либо вы оба заблудились в трех соснах. 8. Функтор - это класс/структура, которые должны иметь перезагруженный оператор вызова функции. Все. Функторы могут не иметь "состояния" (полей). На видео была дана неточная формулировка. 9. Предикат - функция, которая анализирует объект/объекты и возвращает ответ анализа в формате "Да/Нет" (то-есть тип bool). Соответственно на 52:46 кандитат ответил точнее, чем интервьюер, потому что предикат должен являться функцией. Функтор - это не функция, хотя функтор может себя вести как функция. Точно так же указатель на функцию также может вести себя как функция, но от не является функтором. 10. Стандартные контейнеры можно засунуть в ваши собственные классы, как поля. Тогда не будет проблем з деструкторами. Хорошо было бы сказать об этом кандидату. Считаю, что вопросов мало было задано. Но смотрел все ровно с интересом, поэтому спасибо за видео.
@he1vann-42
Жыл бұрын
ладно
@grigoriikushnir4927
Жыл бұрын
Сначала ты пишешь: "Какая разница, какой у него коммерческий опыт? Я могу за 10 лет поменять 10 компаний, везде быть джуном и рассказывать, что в одной компании я делал одно, в другой другое, и так далее." А потом: "Почему кандидату надо знать об extern "C"? Я работал в нескольких компаниях, и ни разу не было причины использовать это." Не делай так.
@BloganProgramming
Жыл бұрын
@@grigoriikushnir4927 А как эти 2 утверждения взаимосвязаны?) Второе утверждение объясняет то, что вопрос лишний для джунов.
@grigoriikushnir4927
Жыл бұрын
@@BloganProgramming Тем, что твое первое утверждение обесценивает твое второе утверждение как аргумент. Твой коммерческий опыт не является доказательством того, что кандидату не надо что-то знать. Это если по твоей логике. Из моего опыта, в среднем, чем больше коммерческий опыт, тем больше у человека знаний потому что он решал больше бизнес задач. Как это проверить - другой вопрос. Но закономерность подтверждается жизнью.
@BloganProgramming
Жыл бұрын
@@grigoriikushnir4927 Ты все еще не понимаешь, что между моими утверждениями нет никакой связи. Первое касается того, что незачем спрашивать за коммерческий опыт. Второе касается того, что вопрос является слишком узконаправленным и довольно простым, чтобы его спрашивать. На этом я заканчиваю эту беседу, так как если ты после этого ничего не поймешь - смысла объяснять тебе далее нету.
Сам я не программист, но всегда восхищаюсь этими ребятами.
@mrbibis7229
Жыл бұрын
ну не знаю, какой-нибудь инженер в разы круче, чем программисты. Сейчас программист - это в основном знаток языка, даже без знания математики или дискретки, а раньше нужны были именно инженерные знания
@addressmodel2121
10 ай бұрын
@@mrbibis7229 , на одном чистом языке много не напрограммируешь - нужны ещё знания библиотек. А библиотек разных много: - игровые движки; - базы данных; - редакторы изображений; - распознаватели речи; - работа с протоколами интернета; - ну и библиотеки работы с математикой. На каждую библиотеку её внутренние алгоритмы знать не будешь, а библиотек сотни штук! Вывод: для программиста главное уметь пользоваться софтверными библиотеками. А дискретной математике его за пару месяцев обучит куратор проекта.
@shiftingsandsgames
9 ай бұрын
@@mrbibis7229ну попробуй аллокатор памяти написать под вулкан, или драйвер, или движок, математика не нужна, но мышление на вес золота.
не понял. у вас написано мидл, а в видео говориться , что собес для уровня джуна ? опечатка или оговорка в видео ? можете объяснить, "что значит учитывая коммерческий опыт" ? вы имеете ввиду, что сейчас на джуна необходима подготовка уровня мидла ?
Почему бы не экранировать с 2-ух сторон последовательность нужных символов? Это явно сократит количество новых/служебных символов в новой строке (при условии, что не будет чередования по типу 1 нужный символ - 1 любой и т.д.). Например, str = “acdbbbbadbb”, тогда res = “acd\\bbbb//ad\\bb//“. Тогда res.size() = str.size() + 2 * кол-во последовательностей, состоящих из b (нужного символа). Если str.size() = n => res.size() = n + 2 * (n+1)/2 (worst case, like: “babfbhbsbubdb….b”), то есть также понадобится в 2 раза больше памяти, но в среднем затраты будут меньше.
@kingofbattleonline
Жыл бұрын
Вы приняты в Valve, поздравляем! :D
8:00 Почему std::string() ошибка? Это же просто вызов стандартного конструктора. Пустые фигурные скобки ведь тоже приведет к вызову того же стандартного конструктора.
Прикольно, посмотрел пока только 1ую задачу. И какое-то двоякое мнение: 1)были такие задачи на собесах и сразу бросался решать. Но вот это видео мне попалось вечерком под ужин. И прям 1ое что в голову пришло - написать сначала тесты. И чтобы в них были конер кейсы. Однако когда такие задачи на собесах встречаются, как-то эта мысль не приходит в голову почему-то, видимо нервы) 2)обычно при решении таких задач надо - накидать дубовое решение в лоб. - потом его проговорить его и оценить сложность. - поток уже реализация - потом уже обсудить что получилось. Подсветить плюсы и минусы. - и вот теперь уже попытаться обработать конер-кейсы Пишу это для того чтобы узнать мнение других людей, тех кто ходил на собесы, или может тех кто эти собесы проводит. P.S. на работе обычно вначале прикидывается решение (возможно обсуждается архитектура). Потом прикидываются юзер-кейсы. Потом уже реализация. А на тех.интервью вроде все также, только в обратной последовательности.
@dangername6996
Жыл бұрын
Сам я на собесы не ходил (работу как-то плавно получил со стажерства)). Но многие знакомые/друзья говорят, что мол, лучше всего начать писать самое просто решение в лоб, невзирая на особенности и крайности (на примере первой задачи, забить на первый символ, последовательность символов и т.д.) и просто решить общую задачу. А потом уже готовое решение доработать и доделать для решения "тонких" задач.
Не понял, какой вызов функции? Там простой вызов дефолтного конструктора, не важно какие скобки
@ic6406
Жыл бұрын
а вот дальше std::string answer(); уже ошибка most vexing parse
Очень интересно. Ты располагаешь к тому, чтобы любить c++
Слава Богу, я скипнул вот эту всю часть computer science про частичные функции в целом, и си в частности.
"на позицию Middle C++ Developer" - в видео студент на позицию джуна)))))))))))
@KostopravHD
Жыл бұрын
так одно другому не противоречит, может парень пришел рановато
@lightinguniverse4952
Жыл бұрын
Они оба джуны, опрашивающий сам ни в чём не уверен, спросить нормально ничего не может, речь у обоих убогая, два слова связать не могут, вопросы тупые, решения ещё тупее.
@user-ln2ft2mo3c
Жыл бұрын
@@lightinguniverse4952 Ты прав - тут есть над чем работать. Автор весьма косноязычен, речь не выразительна, много мусора. В одном видео он говорит "прийти НА ОФИС" - несколько раз - стыдно однако
Я не знаю с++, поетому может мой вопрос примитивньій. Но, как я понял из первого задания слеш нужно ставить перед символом которьій передаеться в с. А судя по коду он будет ставить етот слеш в начало строки: answer = += "\\" а не в позицию перед етим символом в строке (тип і -1, где і - позиция символа с).
@nikolay1405
Жыл бұрын
по конечному коду, он идет в цикле и прибавляет к результирующей строке либо просто символ из заданной строки, либо слеш+символ, если он совпадает с условием.
Норм собес, сам вспомнил плюсы :)
Я не критикую, но просто интересно, в каком месте кандидат ближе к мидлу?
если не "прятать" от компилятора тип переменных унасленованного от vector класса, то невиртуальность деструктора ~vector проблем вызвать не должно. в смысле если не делать такое: std::vector * pVec = new TMyInheritedIntVector(); ...; delete pVec;
Классный контент. Спасибо большое) Было бы круто вывести тайм-коды для более быстрого просмотра и самого интересного, для себя Спасибо))
@ambushedraccoon6408
Жыл бұрын
Спасибо) Таймкоды будут. Сейчас в приоритете провести собеседования и выложить их. После этого займусь таймкодами.
@ilyazakharou468
Жыл бұрын
@@ambushedraccoon6408 таймкоды сделать это меньш часа лентяй.
@ambushedraccoon6408
Жыл бұрын
Таймкоды сделал.
@user-ji5vu2ln1j
Жыл бұрын
@@ambushedraccoon6408 спасибо ты лучший!)
Я думаю это собеседование больше похоже на позицию джуна?
@ambushedraccoon6408
Жыл бұрын
Такие вопросы могут встречаться на собеседованиях на любой уровень. В зависимости от уровня кандидата, ожидается разное погружение и процент отвеченных вопросов. У Александра около одного года коммерческого опыта, что ближе к уровню миддл.
@z140140
Жыл бұрын
@@ambushedraccoon6408 у меня уровень senior+1, если меня спрашивают про особенности языка - я уже понимаю, что это не моя вакансия
@thegate8985
Жыл бұрын
@@z140140 можете, пожалуйста, рассказать, почему? То есть вы ожидаете вопросов, связанных больше с какими-то более прикладными задачами?
@nightriver7544
Жыл бұрын
@@thegate8985 позволю себе ответить со своей стороны, так как придерживаюсь такой же позиции. Сеньор это не тот кто знает каждую заковырку с++. Сеньор это тот кто придёт писать код на джаве и, видя ее впервые в жизни, легко поймёт что там и зачем написано с использованием гугла. Ценность не в знании конкретных прикладных технологий, а в понимании общей логики в целом. Глупо платить человеку в 3 раза больше денег просто потому что он знает кучу справочной информации, которую можно за 30 сек найти в гугле при первой необходимости, если при этом этот человек не понимает зачем нужна хэш-таблица или какие подводные камни есть у многопоточности.
@medvital
Жыл бұрын
@@thegate8985 чем выше позиция, тем меньше человек пишет кода и больше занимается бизнес/архитектурными/тимлидовскими задачами(зависит от позиции, на которую нанимают). Выше уровень абстракции, так скажем, для кода есть джуны и мидлы. Если вы синьор и все ещё пишете код, то вы аппер мидл, имхо.
Есть ли смысл выносить "\\" в переменную, чтобы не создавать каждый раз указатель? 14:10. Или компиляторы оптимизируют этот процесс?
@old_cd_rom9518
Жыл бұрын
Компиляторы оптимизируют твой код иногда до такой степени, что ты даже представить себе не можешь))
@grenadier1653
Жыл бұрын
@@old_cd_rom9518 здорово тогда
Ну имхо строку следует считывать прямо на ходу в какой нить вектор посимвольно и просто вставлять экран перед символом…
А есть ли какая то возможность попасть к вам на пробное собеседование?)
@ambushedraccoon6408
Жыл бұрын
На данный момент я не веду набор кандидатов. Планирую делать новый набор ориентировочно через 2 недели. Уведомление будет в сообществе и телеграм-канале.
Вставка в середину массива, по моему надо использовать linked list
В первой задаче не возникло вопроса, что делать с уже существующими в строке слешами
Давно я на ++ не писал, а что за конструкция for ( var : var)? Это типа foreach в #? Никогда раньше не видел, даже вон глянул документацию майков, там тоже не нашел такого.
@ambushedraccoon6408
Жыл бұрын
Привет. Да, можно провести аналогию с foreach. Называется range-based for loop. Вот ссылочка на док: en.cppreference.com/w/cpp/language/range-for
@dangername6996
Жыл бұрын
@@ambushedraccoon6408 Спасибо, удобная конструкция
По сериализации с двунаправленым списком я не понял.... Каждый элемент имеет указатель на следующий и предыдущий, это есть его определение. Следовательно a->prev->next == a и a->next->prev == a , это правило двунапраленного списка. Если иначе, это уже другая структура данных , граф может быть. В таком случае , непонятно зачем хранить индексы вообще. Сохраняем последовательно элементы от head по next . А при десериализации каждого последующего элемента восстанавливаем связи согласно правилу списка. last->next = cur; cur->prev = last; last = cur;
@Matissed
Жыл бұрын
да, по сути это будет последовательность данных, а при десериализации будет уже создание двунапр. списка
объясните, зачем при сериализации двусвязного списка с чем-то мудрить? Просто по порядку как массив записал значения и все
@it_cpp54
Жыл бұрын
вот-вот. сериализация необходима для передачи данных. А уж на месте десериализуй и клади данные куда необходимо.
55:55 можно обьяснить при чем здесь виртуальный деструктор, если человек вроде хотел приватно наследоваться?
Зачем битовые маски, если есть bitset ?
Что прошлый ролик, что это - уж очень хочется узнать, чем одному не понравился JavaScript, а другому Java.
@user-yk7li6ni4o
Жыл бұрын
Ну у каждого свои предпочтения. Мне лично тоже java не заходит. JS я не пробовал, поэтому ничего сказать не могу.
@danilsergeev3339
Жыл бұрын
Привет, я, например, front-end разработчик, но получаю огромное удовольствие от написание кода на golang, нежели на js(typescript), не знаю, как-то так уж получилось)
@phat80
Жыл бұрын
Причины, по которым может не нравится язык, есть у каждого языка. Если бы существовал идеальный, универсальный язык, на нем бы все и писали. Выбор языка - это всегда компромисс. И всегда есть языки, в которых человек не может найти этот компромисс для себя. Например, лично мне в Java не нравится ее многословность. В JS мне не нравиться подход, построенный на прототипном наследовании, динамическая типизация и то, что null по какой-то неведомой причине является в JS объектом. Тем не менее я не против пописать, как на Java, так и на JS.
26:38 "...мы будем сдвигать вправо..." - "Почему не влево?" - "Потому, что это Мак)))"
Зря подсказал что цикл не понадобится в задаче с set_bit, было бы прикольно посмотреть как он с циклом решит :D
Господа, может кто сможет мне ответить: Автор канала сказал, что есть какой-то обходной путь по разграничению .h .cpp при создании шаблонов. Так вот что это за способ? Было бы неплохо, если сможете скинуть статью.
@user-re6xz2xc7s
Жыл бұрын
Можно явно частично инстанциировать шаблон: .hpp: template void foo(T t); .cpp: template void foo(int t); template void foo(string t); template void foo(T t) { // some works } Для не инстанцированых типов будет ошибка что нету реализации для символа
@jacemon
Жыл бұрын
Спасибо за ответ
48:12 - на этот вопрос ответить без мата в сторону стандартизаторов очень сложно
Это собеседование middle?? Напиши что это собеседование для junior.
Почему то сразу пришло в голову, что для подсчета символов итерировался бы бОльшим объектом, чем символ (размером командного слова на архитектуре например), ну и битовой максой по указателю проверял бы истину. так за меньшее число тактов можно почитать необходимы размер (но на самом деле размер не нужен). /или может быть сразу inline на asm воткнуть/. Попутно "битового пробега" составил бы карту (массив сдвигов) вхождений элементов, который после пробега использовал бы для копирования участков памяти, и между нужными элементами вставляли бы экран. По поводу битовых операторов, не плохо бы сначала определиться с big-endian и liitle-big-endian. Можно просто нечаянно уехать не в ту память. Код написанный для изменения битов содержит else, он там лишний и портит читабельность код (по рукам за такое, мидл так не пишет).
@alexeypavlyutkin886
2 ай бұрын
насчет битовых операторов... еще раз подумайте хорошенько, и ответьте, почему эндиан не имеет значения
а компилятор правда не ругнется на множество реализаций одной функции? ничоси...
❤️
Ambushed Raccoon - Парень ретурн std::string(); по моему указал правильно , ведь резултат - обект типа std::str а не функция
Как на счет разобра резюме для C++ разраба? Что на счет пет проектов и на что обращают внимание при просмотрах резюме?
@ambushedraccoon6408
Жыл бұрын
Было уже такое. 4 стрима. Разбирали резюме, которые зрители присылали. Вот плэйлист: kzread.info/head/PLDWyp7QYaNaI1yKWaolh0jS0KNB8rQ_pT
@z140140
Жыл бұрын
@@fuunnyvideospeedrun в с++ мало вакансий и мало кандидатов, а средний уровень кандидатов выше. мне например даже в 21-м году рекрутеры писали раз в месяц. думаю ты с таким числом приглашений просто бы повесился
@user-or1hy4xz8u
Жыл бұрын
@@z140140 а сколько лет опыта на С++ у тебя?
а как можно с Вами связаться?
@ambushedraccoon6408
Жыл бұрын
Здравствуйте. пишите сюда: ambushed.raccoon.tube.mail@gmail.com
так а в чём прикол? не бывает же чистого C++, это либо C++ десктоп либо C++ геймдев. Или я что то не понял ?
А зачем спрашивать про extern в интервью по С++? Это сишная штука, добавленная исключительно для обратной совместимости. + сам интервьюер не совсем правильно ответил на свой же вопрос. extern нужен как раз для объявление (declare) переменной, а ее определение (definition) может находиться в другом месте. Использование данного трюка в С++ проектах является не очень хорошим стилем.
@ambushedraccoon6408
Жыл бұрын
Неоднократно сталкивался с таким вопросом на собеседованиях. А конструкция extern в плюсовых проектах встречается, каким бы стилем это не являлось. Так же обычно за этим вопросом следует вопрос про extern "C". А то, что сказал что-то неправильно. Ну собеседование не постановочное, могу и оговориться, всякое бывает.
@z140140
Жыл бұрын
это как это?? если у тебя есть переменная используемая в нескольких модулях - без extern ты не обойдёшься
@pchelnick
Жыл бұрын
@@ambushedraccoon6408 Именно оговориться? :) Ошибиться Вы никак не сможете? ;)
@billjohnes9380
Жыл бұрын
@@z140140 По поводу "если у тебя есть переменная используемая в нескольких модулях - без extern ты не обойдёшься". И это говорит senior+1? Никакой это не senior+1, и даже -- не senior, максимум -- middle. Начиная с C++17, такой способ есть, и настоящий Senior его знает.
@alienhazzard7201
Жыл бұрын
@ Elias Shalnev Это не трюк, а необходимость.
Оксимирон теперь интервьюирует по С++???
Я программист на питоне и на js. Решил посмотреть в 4 часа утра как писать аимбот, наткнулся на старое видео, из него прыгнул на канал и на новое видео. Зачем мне собес на мидла плюсов….ну ладно, берем попкорн, слушаем)))
@vitalyarbuzov5375
Жыл бұрын
в чём вообще смысл твоего комментария ? "хихи посмотрите на меня какой я дурачок завтра егэ, а я хаваю дешевый дофамин)))) Я такой особенный ))))))))))))))))".
@aquahaze
Жыл бұрын
@@vitalyarbuzov5375 🤨
@chaplin4335
Жыл бұрын
@@vitalyarbuzov5375 иди поспи, чел. тебе отдохнуть нужно
Впечатляет что C++ еще кому-то интересен из молодежи
@alexla_grange8957
Жыл бұрын
да это же совершенный язык ! ))
@bravo2625
Жыл бұрын
Сейчас все уники только его и дают(естественно есть факультативы например по питону, но то отдельно)
@alexla_grange8957
Жыл бұрын
@@bravo2625 А что там дают - семестр на Си и Плюсы вместе взятые - это даже не смешно.
серьезно, сейчас для Middle уровня не нужны и шаблоны и битовая арифметика?
50:00 а для std string разве нет подсчета ссылок??? хм
@iforand
Жыл бұрын
Нет. Но если хочется подсчёта ссылок, есть умные указатели для этого: std::shared_ptr А так std::string по сути тот же std::vector, но со встроенным буфером фиксированного размера, чтобы не выделять динамическую память под мелкие строки.
Ну такое..мидл не знает, что шаблоны только в хедере пишутся, какую-то билеберду сначала писал на задаче со строкой. Входные тесты на джуна, которые есть доступом на собес, сложней.
К первой задаче return std::regex_replace(...) подошел бы?)
@decltruft2882
Жыл бұрын
Такие выкрутасы из CodeWars не прокатят: вся фишка в алгоритмической составляющей вопроса, а не в использовании готовой тулзы
@letmeregisterbitch
Жыл бұрын
Регексп тяжелая штука и здесь оверкилл
@alienhazzard7201
Жыл бұрын
@ 0xSADCAT смысл задачи не в использовании готового инструмента без понимания, как он устроен.
@iforand
Жыл бұрын
Хренасе! Я ещё понимаю вопрос про "почему бы не использовать replace?", но подумать здесь об regex_replace - это новый уровень! Даже не знаю как ещё можно сделать здесь код более тормознутее :)
Блин, интересный видос. Помоему вопросы даже до уровня Джуна не доходят. Либо просто я о себе слишком плохого мнения (Middle C# dev, OpenSource C++ dev)
@artemlipatkin474
Жыл бұрын
Скорее из-за высоких требований к себе у тебя завышенные требования к другим)
@alexeypavlyutkin886
2 ай бұрын
хм... скажем так, зачастую вопрос кажется простым лишь потому, что таков твой уровень... вот, скажем, задача про установку бита -- все ведь очень просто. ведь правда просто? вот только не советую предлагать такое решение задачи в проекты калибра JDK или V8. выебут
смотрю с огромным интересом хоть ни черта не понимаю
человек паук вернулся домой и начал кодить
Это я первую задачу неправильно понимаю или задача некорретная? Символы ведь после того как его код отработает не станут экранированными, он просто добавил в перед каждым символом по экранированному слэшу.. Или я действительно некорректно понимаю задачу и в этом и суть? Да и вообще, я наверное слишком строг, но чувак на всё отвечает только с подсказок и то не слишком хорошо
@iforand
Жыл бұрын
А что ты понимаешь под "экранированием"?
@justman7656
Жыл бұрын
@@iforand так называют спецсимволы в строках, по крайней мере в С и С++, если ты просто вставшь, скажем, двойную кавычку в строку, то компилятор распознает её как конец строки и выдаст тебе ошибку, именно поэтому создали экранирование, когда ты перед подобными неудобными символами вставляешь косую черту, чтобы они точно трактовались компилятором именно как символы, а не как часть синтаксиса
@iforand
Жыл бұрын
@@justman7656 так и чем это отличается от "просто добавить перед экранируемым символом по слешу"? :)
@justman7656
Жыл бұрын
@@iforand просто я полагал, что задача в том чтобы вставить неэкранированный слэш и экранировать тем самым заданный символ
@iforand
Жыл бұрын
@@justman7656 Э-э, что? :D Экранирование - это и есть "просто вставить обратный слешь перед символом". Что вообще означает "вставить неэкраниррванный слешь"? :) Экранирование просто указывает компилятору или другому текстовому процессору, что следующий символ не является управляющим и его нужно воспринимать как обычный символ. Ничего более.
Это оксимирон проводит собеседование?
@marie_baranova
10 ай бұрын
да, а что?
55:45 Виртуальный деструктор в подобном кейсе выглядит избыточно. У вектора и методы не виртуальные, поэтому нет смысла кастить указатель на наш произвольный класс к указателю на вектор, потому что при вызове методов всегда будут вызваны методы вектора. Если пользователь такое делает, то пусть возьмет просто вектор, а не производный класс. А если использует "правильно", то и утечки нет
задача с экранированием символа решена с ошибкой
блииииин обыкновенное экранирование! мать моя дельфи...))))
А у вас по высшему образованию берут?
@ambushedraccoon6408
5 ай бұрын
Смотря где. В Европе и США очень тяжело без диплома, на постсоветском пространстве проще, но тоже иногда могут спросить. В любом случае диплом лучше иметь, но его отсутствие, конечно же, не причина не строить карьеру программиста.
найс
Ну почему все говорят "хидер", если он, блин, "хэдер"? Бесчисленное множество раз слышал от разных людей.
Здравствуйте, подскажите пожалуйста мне 14 и на данный момент изучаю С++, где искать информацию для теории и как мне практиковать задачи? ибо я плохо искал и не знал как решать задачи.
@user-yu5yz7pf4u
11 ай бұрын
Никак иди картошку копать
@ambushedraccoon6408
11 ай бұрын
Здравствуйте! Рекомендую тут начать изучение: ravesli.com/uroki-cpp/ задачки можно брать на литкод(сложность Easy) leetcode.com/ Для более общей подготовки по информатике рекомендую обратить внимание на книгу "Информатика, Методы алгоритмизации, 8-9 класс, Котов В.М., Волков И.А., Лапо А.И." и потом 10-11-й класс.
Для шаблонов есть inl файлы
В первой задаче не понятно, почему для финальной строки 2 длины исходной строки зарезервировали, когда у нас для экранирования каждого символа по 2 слеша прибавляется - значит, в лимите у нас строка в 3 раза длиннее будет, когда все символы равны заданному.
@pkowak
Жыл бұрын
Прибавляется один слеш, если написать "\", то это будет как незакрытая строка, символ после бекслеша воспринимается типа как спец символ, также с , \t, \0 и собственно \\
@RushFuture
Жыл бұрын
Два слеша - потому что обратный слеш в языке C/C++ является экранирующим символом (помните про " ", например?), поэтому сам требует экранирования, соответственно строковый литерал "\\" превратится в строку, состоящую из *одного* символа обратного слеша и завершающего нуля.
Да "ХЭДЭР" (header), блин! А не хидэр
*Создай пожалуста больше видео обучений по ООП про как роботать с указателем this как роботает move_constructor как роботать с класами внутри класов. Буду очень благодарен*
Не очень понравилась подача copy-on-write строк под соусом того, что они "как будто-бы лучше" (да, я понимаю, что напрямую автор не говорит, что они лучше) std::string'а, потому-что ты их передаешь по значению и они не копируются. Если есть такой страх копирования строки при передаче в функцию, лучше уж её передать по константной ссылке и всё, проблема решена простым механизмом языка, и об этом должен знать как мидл, так и джуниор. У CoW-строк есть самый существенный недостаток - вместо копирования при передаче, они "недетерминированно" копируются при совершенно нормальных операциях, типа замене символа, конкатенации и т.д. За всеми этими случаями ненамеренного копирования следить гораздо сложнее, чем всегда передавать const std::string&.
Думаю, это собеседование на джуна, я не на мидла, и стоит все-таки поменять название видео.
получить на вход константную ссылку и пытаться ее изменить - ну такое себе. И даже если на вход не константная переменная подавалась бы - то совсем инвалидацию указателей не учитывал.
Это мидл?)
Привет, можете посоветовать книгу для начала изучения c++ ,
@siskinapiski
Жыл бұрын
Краткое руководство Страуструпа, а после можно перейти к полному
Сори я чет не понял подвох. В параметрах "std::string", а у этого класса есть же метод "replace", почему бы просто не использовать его для замены символа, на бекслеш + заменяемый символ? Это же делается в 1 строку.
@iforand
Жыл бұрын
Во-первых, потому что входная строка константиная и её все равно придется копировать перед этим, во-вторых, тут топят за скорость выполнения кода, а менять стринг на стринг всяко длительнее. :)
Я ищу работу джуном. Но всё что было в вопросах я прекрасно знаю. Что я мидл чтоли? Но у меня нет комерческого опыта…
парень студент - хорош
А какого уровня собеседующий, если он на 7:13 говорит ахинею про то, что создание объекта через круглые скобки не сработает?
@ambushedraccoon6408
Жыл бұрын
Перепутал с конструкцией std::string s();
У меня чего-то возникли вопросы к тому кто проводит интервью ;) из претензий наверное: много говорит, не улыбается, не старается расслабить собеседника, соотвественно не ясно как человек будет работать в команде, как-то так
Qt, OpenCV и всё такое..... Если это собеседование на джуна, где решение алгоритма экранирование сомволов в строке занимает у собеседуемого так много времени, то я я сеньёр
Да нормальный парень. А по поводу extern и тем более union я бы не парилась, это вроде бы и надо знать, но во-первых, молодые всё реже с этим сталкиваются, а во-вторых, если столкнутся - неужели вы думаете, что разработчик такого уровня за пол часика не поймёт как это работает? Гораздо важнее то, как человек мыслит, а не то какой он заучка. Вряд-ли на рабочем месте кому-либо запретят иметь пару томиков на всякий случай. Здесь даже вместо объяснения лучше попросить угадать на опыте дав лёгкий намёк что это может быть, опять же посмотреть как человек мыслит, даже если даст неверный ответ.
Когда интервьюер на собеседовании говорит: не готов сейчас к разговору о деревьях. То становится неловко за интервьюера. Я думаю пояснять тут ничего не нужно. В остальном понравилось. Продолжай!
@ambushedraccoon6408
Жыл бұрын
А что тут такого? Я готов к вопросам про деревья с позиции кандидата. Но как интервьюер я придерживаюсь определенного плана, который не включал в себя эту тему. Поэтому решил не развивать этот разговор, особенно на ютубе, где, как мы видим, достаточно людей, которые ищут возможность докопаться до автора.
@user-ro3yp4sz4h
Жыл бұрын
@@ambushedraccoon6408 с ответом согласен. Просто на мой взгляд на видео это выглядело по-другому. Главное, что продолжаешь снимать и чем дальше тем интересней) респект
да это почти senior судя потому что он умеет. я вообще не понимаю что он делает и для чего, и о чём они говорят. целый час пытали и отлично себя проявил
@rallyguard2437
Жыл бұрын
учу С 2 месяца и понимаю о чем идет речь в видео, вопросы точно не уровня мидла
@mihax56
Жыл бұрын
в каком месте сеньер? собеседование уровня джуна чутка продвинутого.
Все-таки это уровень Junior'а, а не Middle'а
Интервьюер интервью прошёл! А претендент, что не вопрос то мимо. 🤣🤣🤣🤣 А вообще тут видна типичная ошибка всех умненьких студентиков: учат и козыряют знаниями фреймворков но у них нет простого понятия о программистком повседневном ремесле.
@fedoresko
Жыл бұрын
Да, тут интетесны градации между джуном и мидом. Понятно, что всё на усмотрение собеседующего. По этому кандидату видно, что он высокоуровневый программист, хорошо понимает лямбды, но битики-байтики не особо его интересуют, странно что выбрал именно C++ после джавы, не ясно что именно в C++ подкупило. )
@bookbrain9863
Жыл бұрын
@@fedoresko объясни пж как происходит смещение строки если они добавляют символ перед char c, я знаю как это можно на си сделать, но как реализовано в стринг хз
@fedoresko
Жыл бұрын
@@bookbrain9863 если не знаешь, то посмотри. ) Вот например: template basic_string operator+(_CharT __lhs, const basic_string& __rhs) { typedef basic_string __string_type; typedef typename __string_type::size_type __size_type; __string_type __str; const __size_type __len = __rhs.size(); __str.reserve(__len + 1); __str.append(__size_type(1), __lhs); __str.append(__rhs); return __str; } Делаешь новую строку - добавил символ, добавил старую: всё готово. )
@bookbrain9863
Жыл бұрын
@@fedoresko понятно, то есть всё равно смещать надо право всю строку, я бы сделал без использования кучи, ну да ладно
@fedoresko
Жыл бұрын
@@bookbrain9863 тут нет указания, используется ли куча. На практике небольшие строки аллоцируются на стеке.
нормальный чувак, всё знает. сделает прекрасную карьеру. а в комментах душнилы
Точно ли мидл, без опыта то, а по коду так джун чистый.
Вопросов про плюсы я тут не увидел - задачка на алгоритм, вопрос про сишный extern, битовою маску (серьёзно, битовые задачки часто приходится решать?), какая двоичная сериализация, что это за вопрос? Сохранение куска памяти - это не сериализация) Зачем Union в плюсах? Есть же Variant. В Qt стандартная библиотека нифига не отзеркаливается, подходы абсолютно другие. В общем, тут вопросы интервьюеру.
@alienhazzard7201
Жыл бұрын
@ Cyril Anisimov Битовые задачи приходится решать часто. Сохранение куска памяти - это не сериализация.
@cyrilanisimov
Жыл бұрын
@@alienhazzard7201 битовые операции - это не плюсы, они есть во многих языках. И я про это говорю)
Смог досмотреть до extern "C"... "Будут компилироваться как C", чё правда? :) Может лучше не спрашивать того, чего сам не знаешь? И уж тем более стоит не рассказывать свои выдумки поучительным тоном :) Впрочем всё понятно было ещё по "хИдерам" и "сипипи файлам" вместо заголовков и модулей.
Это мидл из аспирантуры? Весело.🤣
алё, чуваки, я ждал, что будут задачи (а-ля Роберт Седжвик), т.е. воплощение смыслов, а не синтаксическая грамотность - за неё уже работодатель платит деньги?*??