Всем привет! Объявляю набор кандидатов на собеседование Middle С++. Требуются разработчики с опытом 1-3 года. Собеседование проводится только с видео. Если вы хотите проверить свои знания и попасть в новое видео, то пишите мне на почту ambushed.raccoon.tube.mail@gmail.com с темой “Middle собеседование кандидат”. В письме пишите свои контактные данные(желательно telegram), описание ваших знаний или резюме. Со своей стороны гарантирую, что видео будет выложено только с вашего согласия. Так что не бойтесь. Будьте внимательнее с темой письма, потому что они очень легко попадают в спам.
Собеседование: разверни дерево, найди оптимальный путь Реальность на работе: фикс ошибки из-за отсутствующей запятой, катить самому в прод без техлида в пятницу
Охуительно, посмотрел за ужином, о чем они говорят - х.з. но очень интересно. Спасибо ютюбу за рекомндацию ахахахахахаха... Комменты тоже доставляют. Удачи вам парни!
Очень классный контент, для Джуна, много вещей, что надо подтянуть, хочется уже быстрее на работу и задонатить, ты делаешь очень многое для начинающих, спасибо!
@@george.8888 После 24 февраля, много компаний ушло, которые нанимали джунов. Компании которые остались, очень сильно вырос порог входа, а так как я занимался именно unreal engine 4 и все мои проекты были под гейм дев, а гейм дев умер в СНГ, и на вакансию gameplay dev начали откликаться 200+ чел. При том, что я 25 февраля должен был переезжать в Киев, я делал тестовое 3 месяца и прошел на проект сталкер 2. Через месяц, я понял, что остались только продуктовые компании, такие как Яндекс, сбер, Тинькофф, но туда берут в первую очередь олимпиадников и с таких, как МФТИ и т п. Итог: знать надо гораздо больше, конкуренция в 3-4 раза выросла, это я все рассказываю в рамках С++. Нужно хорошо знать алгоритмы и структуры данных, уметь решать с закрытыми глазами, знать тонкости языка, как работает под капотом, этим сможете привлечь внимание, работа долгая и упорная, я с полного нуля занимаюсь 2 года. Я так по приколу за 2 недели начал на js писать)))) Я бы на вашем месте смотрел бы на другой ЯП, у айти бороды есть интервью с лидом по физике геймплея war gaming он там и говорит, что с хорошим наставником, вы станете джуном по С++ за 1,5-2 года, работая про этом. У Сергея немчинского, есть очень много материала, как выбрать ЯП, какой лучше, как правильно учиться. Своему сыну я бы не советовала, в качестве первого языка брать ++ очень сложно и долго. Удачи!
@@vasiliypupkin6311 Спасибо что потратили свое время! Я пришел к выводу что стоит начать с вэб разработки, стандартный пакет с хтмл, цсс, джава скрипт. Всегда будет спрос, всегда можно брать фриланс пока ищешь. работу. Уже после можно изучить языки под узкие направления, которые интересуют, вроде гейм дизайна и тд. Как вы считаете, это правильное решение? Многие говорят про Питон, что он самый лёгкий для начинающих, но мне почему то кажеться самым разумным решением начинать с вэб..
Интервью было интересное, как для студента второго курса очень даже познавательно проверить какие то свои навыки, на большую часть вопросов смог ответить)) Про тхт и бинарники правда как то косвенно отошли от ответа, все таки главный недостаток и преимущество это читабельность данного файла, ведь просто тхт можно спокойно открыть, прочитать/переписать, а в бинарном будут каракули и его не разобрать)) Но в тоже время некая защита/конфиденциальность информации, спасибо за видео, было очень интересно, хочу еще.
сериализация предназначается для программы, человеку незачем её читать, он конечно может, но это не для этого. Если нужна конфиденциальность, то для этого существует шифрование и неважно текст это или бинарное представление. Основная проблема бинарного формата порядок бит на разных платформах, он может отличаться.
Хорошее видео, только я бы уточнил по extern. Автор сказал, что extern говорит, что данная переменная не объявляется здесь. Насколько я помню, extern говорит как раз, что объявление происходит здесь, а вот определение где-то еще. И на этапе компиляции компилятор оставит пустое место, так сказать. А уже на этапе линковки линковщик поищет в других местах определение, и когда найдёт, тогда подставит его в пустое место. А если не найдёт, то будет ошибка линковки.
Прикольно, посмотрел пока только 1ую задачу. И какое-то двоякое мнение: 1)были такие задачи на собесах и сразу бросался решать. Но вот это видео мне попалось вечерком под ужин. И прям 1ое что в голову пришло - написать сначала тесты. И чтобы в них были конер кейсы. Однако когда такие задачи на собесах встречаются, как-то эта мысль не приходит в голову почему-то, видимо нервы) 2)обычно при решении таких задач надо - накидать дубовое решение в лоб. - потом его проговорить его и оценить сложность. - поток уже реализация - потом уже обсудить что получилось. Подсветить плюсы и минусы. - и вот теперь уже попытаться обработать конер-кейсы Пишу это для того чтобы узнать мнение других людей, тех кто ходил на собесы, или может тех кто эти собесы проводит. P.S. на работе обычно вначале прикидывается решение (возможно обсуждается архитектура). Потом прикидываются юзер-кейсы. Потом уже реализация. А на тех.интервью вроде все также, только в обратной последовательности.
Сам я на собесы не ходил (работу как-то плавно получил со стажерства)). Но многие знакомые/друзья говорят, что мол, лучше всего начать писать самое просто решение в лоб, невзирая на особенности и крайности (на примере первой задачи, забить на первый символ, последовательность символов и т.д.) и просто решить общую задачу. А потом уже готовое решение доработать и доделать для решения "тонких" задач.
Для вопроса про сериализацию двунаправленного списка можно сделать намного проще: Обозначаем тип и указываем цикличный этот список или нет, дальше данные кладем в виде массива. На выходе получаем минимальный объём сериализованных данных + обработку за один проход как для записи, так и для чтения.
8:00 Почему std::string() ошибка? Это же просто вызов стандартного конструктора. Пустые фигурные скобки ведь тоже приведет к вызову того же стандартного конструктора.
ну не знаю, какой-нибудь инженер в разы круче, чем программисты. Сейчас программист - это в основном знаток языка, даже без знания математики или дискретки, а раньше нужны были именно инженерные знания
@@mrbibis7229 , на одном чистом языке много не напрограммируешь - нужны ещё знания библиотек. А библиотек разных много: - игровые движки; - базы данных; - редакторы изображений; - распознаватели речи; - работа с протоколами интернета; - ну и библиотеки работы с математикой. На каждую библиотеку её внутренние алгоритмы знать не будешь, а библиотек сотни штук! Вывод: для программиста главное уметь пользоваться софтверными библиотеками. А дискретной математике его за пару месяцев обучит куратор проекта.
Я являюсь преподавателем 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. Стандартные контейнеры можно засунуть в ваши собственные классы, как поля. Тогда не будет проблем з деструкторами. Хорошо было бы сказать об этом кандидату. Считаю, что вопросов мало было задано. Но смотрел все ровно с интересом, поэтому спасибо за видео.
Сначала ты пишешь: "Какая разница, какой у него коммерческий опыт? Я могу за 10 лет поменять 10 компаний, везде быть джуном и рассказывать, что в одной компании я делал одно, в другой другое, и так далее." А потом: "Почему кандидату надо знать об extern "C"? Я работал в нескольких компаниях, и ни разу не было причины использовать это." Не делай так.
@@BloganProgramming Тем, что твое первое утверждение обесценивает твое второе утверждение как аргумент. Твой коммерческий опыт не является доказательством того, что кандидату не надо что-то знать. Это если по твоей логике. Из моего опыта, в среднем, чем больше коммерческий опыт, тем больше у человека знаний потому что он решал больше бизнес задач. Как это проверить - другой вопрос. Но закономерность подтверждается жизнью.
@@grigoriikushnir4927 Ты все еще не понимаешь, что между моими утверждениями нет никакой связи. Первое касается того, что незачем спрашивать за коммерческий опыт. Второе касается того, что вопрос является слишком узконаправленным и довольно простым, чтобы его спрашивать. На этом я заканчиваю эту беседу, так как если ты после этого ничего не поймешь - смысла объяснять тебе далее нету.
если не "прятать" от компилятора тип переменных унасленованного от vector класса, то невиртуальность деструктора ~vector проблем вызвать не должно. в смысле если не делать такое: std::vector * pVec = new TMyInheritedIntVector(); ...; delete pVec;
Впринципе ничего страшного не будет,если мы унаследуемся с модификатором protected от вектора. Так,что на мой взгляд ,собеседуемый сказал правильно: он сказал про private наследование от вектора. Потому,что в таком случае механизм полиморфизма работать не будет. Но есть и достоинства: при таком подходе можно получить доступ к protected членам вектора. При композиции так нельзя сделать. Ещё Здесь есть один риск,если пользователь будет делать reinterpret_cast к вектору(к указателю на вектор) и явно вызывать деструктор. Но по мне это такое себе. Как завещал Скотт Майерс: предпочитайте композицию наследованию.
Только почему никто не озаботился вопросом, насколько часто сам объект вектора создаётся динамически так, чтобы пользоваться им потом через указатель на базовый класс?
Они оба джуны, опрашивающий сам ни в чём не уверен, спросить нормально ничего не может, речь у обоих убогая, два слова связать не могут, вопросы тупые, решения ещё тупее.
@@lightinguniverse4952 Ты прав - тут есть над чем работать. Автор весьма косноязычен, речь не выразительна, много мусора. В одном видео он говорит "прийти НА ОФИС" - несколько раз - стыдно однако
Да нормальный парень. А по поводу extern и тем более union я бы не парилась, это вроде бы и надо знать, но во-первых, молодые всё реже с этим сталкиваются, а во-вторых, если столкнутся - неужели вы думаете, что разработчик такого уровня за пол часика не поймёт как это работает? Гораздо важнее то, как человек мыслит, а не то какой он заучка. Вряд-ли на рабочем месте кому-либо запретят иметь пару томиков на всякий случай. Здесь даже вместо объяснения лучше попросить угадать на опыте дав лёгкий намёк что это может быть, опять же посмотреть как человек мыслит, даже если даст неверный ответ.
55:45 Виртуальный деструктор в подобном кейсе выглядит избыточно. У вектора и методы не виртуальные, поэтому нет смысла кастить указатель на наш произвольный класс к указателю на вектор, потому что при вызове методов всегда будут вызваны методы вектора. Если пользователь такое делает, то пусть возьмет просто вектор, а не производный класс. А если использует "правильно", то и утечки нет
Я программист на питоне и на js. Решил посмотреть в 4 часа утра как писать аимбот, наткнулся на старое видео, из него прыгнул на канал и на новое видео. Зачем мне собес на мидла плюсов….ну ладно, берем попкорн, слушаем)))
в чём вообще смысл твоего комментария ? "хихи посмотрите на меня какой я дурачок завтра егэ, а я хаваю дешевый дофамин)))) Я такой особенный ))))))))))))))))".
По сериализации с двунаправленым списком я не понял.... Каждый элемент имеет указатель на следующий и предыдущий, это есть его определение. Следовательно a->prev->next == a и a->next->prev == a , это правило двунапраленного списка. Если иначе, это уже другая структура данных , граф может быть. В таком случае , непонятно зачем хранить индексы вообще. Сохраняем последовательно элементы от head по next . А при десериализации каждого последующего элемента восстанавливаем связи согласно правилу списка. last->next = cur; cur->prev = last; last = cur;
А зачем во время сериализации двусвязного списка вообще записывать указатели на предыдущий и следующий элементы? Ведь можно его сериализовать просто как массив значений, а все эти указатели воссоздать во время десериализации.
@@airtl7753 Ну и что, что элементы могут быть одинаковые? Они запишутся столько раз, сколько раз они в списке. Если же список замкнутый, то это вообще не список, а другая структура данных.
не понял. у вас написано мидл, а в видео говориться , что собес для уровня джуна ? опечатка или оговорка в видео ? можете объяснить, "что значит учитывая коммерческий опыт" ? вы имеете ввиду, что сейчас на джуна необходима подготовка уровня мидла ?
Не очень понравилась подача copy-on-write строк под соусом того, что они "как будто-бы лучше" (да, я понимаю, что напрямую автор не говорит, что они лучше) std::string'а, потому-что ты их передаешь по значению и они не копируются. Если есть такой страх копирования строки при передаче в функцию, лучше уж её передать по константной ссылке и всё, проблема решена простым механизмом языка, и об этом должен знать как мидл, так и джуниор. У CoW-строк есть самый существенный недостаток - вместо копирования при передаче, они "недетерминированно" копируются при совершенно нормальных операциях, типа замене символа, конкатенации и т.д. За всеми этими случаями ненамеренного копирования следить гораздо сложнее, чем всегда передавать const std::string&.
Давно я на ++ не писал, а что за конструкция for ( var : var)? Это типа foreach в #? Никогда раньше не видел, даже вон глянул документацию майков, там тоже не нашел такого.
Я не знаю с++, поетому может мой вопрос примитивньій. Но, как я понял из первого задания слеш нужно ставить перед символом которьій передаеться в с. А судя по коду он будет ставить етот слеш в начало строки: answer = += "\\" а не в позицию перед етим символом в строке (тип і -1, где і - позиция символа с).
по конечному коду, он идет в цикле и прибавляет к результирующей строке либо просто символ из заданной строки, либо слеш+символ, если он совпадает с условием.
У меня чего-то возникли вопросы к тому кто проводит интервью ;) из претензий наверное: много говорит, не улыбается, не старается расслабить собеседника, соотвественно не ясно как человек будет работать в команде, как-то так
Такие вопросы могут встречаться на собеседованиях на любой уровень. В зависимости от уровня кандидата, ожидается разное погружение и процент отвеченных вопросов. У Александра около одного года коммерческого опыта, что ближе к уровню миддл.
@@thegate8985 позволю себе ответить со своей стороны, так как придерживаюсь такой же позиции. Сеньор это не тот кто знает каждую заковырку с++. Сеньор это тот кто придёт писать код на джаве и, видя ее впервые в жизни, легко поймёт что там и зачем написано с использованием гугла. Ценность не в знании конкретных прикладных технологий, а в понимании общей логики в целом. Глупо платить человеку в 3 раза больше денег просто потому что он знает кучу справочной информации, которую можно за 30 сек найти в гугле при первой необходимости, если при этом этот человек не понимает зачем нужна хэш-таблица или какие подводные камни есть у многопоточности.
@@thegate8985 чем выше позиция, тем меньше человек пишет кода и больше занимается бизнес/архитектурными/тимлидовскими задачами(зависит от позиции, на которую нанимают). Выше уровень абстракции, так скажем, для кода есть джуны и мидлы. Если вы синьор и все ещё пишете код, то вы аппер мидл, имхо.
Вопросов про плюсы я тут не увидел - задачка на алгоритм, вопрос про сишный extern, битовою маску (серьёзно, битовые задачки часто приходится решать?), какая двоичная сериализация, что это за вопрос? Сохранение куска памяти - это не сериализация) Зачем Union в плюсах? Есть же Variant. В Qt стандартная библиотека нифига не отзеркаливается, подходы абсолютно другие. В общем, тут вопросы интервьюеру.
Блин, интересный видос. Помоему вопросы даже до уровня Джуна не доходят. Либо просто я о себе слишком плохого мнения (Middle C# dev, OpenSource C++ dev)
хм... скажем так, зачастую вопрос кажется простым лишь потому, что таков твой уровень... вот, скажем, задача про установку бита -- все ведь очень просто. ведь правда просто? вот только не советую предлагать такое решение задачи в проекты калибра JDK или V8. выебут
Ты удивишься, но найдутся те, кто скажет, что это до уровня стажера не дотягивает. Проблема не в вопросах, с ними все в порядке, а в неумении людей оценивать что-либо объективно (которое является следствием неумения выходить за рамки своего я и своих эмоций)
Интервьюер интервью прошёл! А претендент, что не вопрос то мимо. 🤣🤣🤣🤣 А вообще тут видна типичная ошибка всех умненьких студентиков: учат и козыряют знаниями фреймворков но у них нет простого понятия о программистком повседневном ремесле.
Да, тут интетесны градации между джуном и мидом. Понятно, что всё на усмотрение собеседующего. По этому кандидату видно, что он высокоуровневый программист, хорошо понимает лямбды, но битики-байтики не особо его интересуют, странно что выбрал именно C++ после джавы, не ясно что именно в C++ подкупило. )
@@fedoresko объясни пж как происходит смещение строки если они добавляют символ перед char c, я знаю как это можно на си сделать, но как реализовано в стринг хз
Господа, может кто сможет мне ответить: Автор канала сказал, что есть какой-то обходной путь по разграничению .h .cpp при создании шаблонов. Так вот что это за способ? Было бы неплохо, если сможете скинуть статью.
алё, чуваки, я ждал, что будут задачи (а-ля Роберт Седжвик), т.е. воплощение смыслов, а не синтаксическая грамотность - за неё уже работодатель платит деньги?*??
Когда интервьюер на собеседовании говорит: не готов сейчас к разговору о деревьях. То становится неловко за интервьюера. Я думаю пояснять тут ничего не нужно. В остальном понравилось. Продолжай!
А что тут такого? Я готов к вопросам про деревья с позиции кандидата. Но как интервьюер я придерживаюсь определенного плана, который не включал в себя эту тему. Поэтому решил не развивать этот разговор, особенно на ютубе, где, как мы видим, достаточно людей, которые ищут возможность докопаться до автора.
@@ambushedraccoon6408 с ответом согласен. Просто на мой взгляд на видео это выглядело по-другому. Главное, что продолжаешь снимать и чем дальше тем интересней) респект
Нет. Но если хочется подсчёта ссылок, есть умные указатели для этого: std::shared_ptr А так std::string по сути тот же std::vector, но со встроенным буфером фиксированного размера, чтобы не выделять динамическую память под мелкие строки.
Ну такое..мидл не знает, что шаблоны только в хедере пишутся, какую-то билеберду сначала писал на задаче со строкой. Входные тесты на джуна, которые есть доступом на собес, сложней.
Привет, я, например, front-end разработчик, но получаю огромное удовольствие от написание кода на golang, нежели на js(typescript), не знаю, как-то так уж получилось)
Причины, по которым может не нравится язык, есть у каждого языка. Если бы существовал идеальный, универсальный язык, на нем бы все и писали. Выбор языка - это всегда компромисс. И всегда есть языки, в которых человек не может найти этот компромисс для себя. Например, лично мне в Java не нравится ее многословность. В JS мне не нравиться подход, построенный на прототипном наследовании, динамическая типизация и то, что null по какой-то неведомой причине является в JS объектом. Тем не менее я не против пописать, как на Java, так и на JS.
Нормализацию ролика по громкости хорошо бы сделать. У интервьюера невыразительная дикция и довольно тихий голос (или низкий уровень записи микрофона). У кандидата ровно наоборот. Один шепчет, другой бьёт по мозгам. Большое спасибо, что голос не повышает!
На данный момент я не веду набор кандидатов. Планирую делать новый набор ориентировочно через 2 недели. Уведомление будет в сообществе и телеграм-канале.
Это я первую задачу неправильно понимаю или задача некорретная? Символы ведь после того как его код отработает не станут экранированными, он просто добавил в перед каждым символом по экранированному слэшу.. Или я действительно некорректно понимаю задачу и в этом и суть? Да и вообще, я наверное слишком строг, но чувак на всё отвечает только с подсказок и то не слишком хорошо
@@iforand так называют спецсимволы в строках, по крайней мере в С и С++, если ты просто вставшь, скажем, двойную кавычку в строку, то компилятор распознает её как конец строки и выдаст тебе ошибку, именно поэтому создали экранирование, когда ты перед подобными неудобными символами вставляешь косую черту, чтобы они точно трактовались компилятором именно как символы, а не как часть синтаксиса
@@justman7656 Э-э, что? :D Экранирование - это и есть "просто вставить обратный слешь перед символом". Что вообще означает "вставить неэкраниррванный слешь"? :) Экранирование просто указывает компилятору или другому текстовому процессору, что следующий символ не является управляющим и его нужно воспринимать как обычный символ. Ничего более.
да это почти senior судя потому что он умеет. я вообще не понимаю что он делает и для чего, и о чём они говорят. целый час пытали и отлично себя проявил
Почему то сразу пришло в голову, что для подсчета символов итерировался бы бОльшим объектом, чем символ (размером командного слова на архитектуре например), ну и битовой максой по указателю проверял бы истину. так за меньшее число тактов можно почитать необходимы размер (но на самом деле размер не нужен). /или может быть сразу inline на asm воткнуть/. Попутно "битового пробега" составил бы карту (массив сдвигов) вхождений элементов, который после пробега использовал бы для копирования участков памяти, и между нужными элементами вставляли бы экран. По поводу битовых операторов, не плохо бы сначала определиться с big-endian и liitle-big-endian. Можно просто нечаянно уехать не в ту память. Код написанный для изменения битов содержит else, он там лишний и портит читабельность код (по рукам за такое, мидл так не пишет).
А зачем спрашивать про extern в интервью по С++? Это сишная штука, добавленная исключительно для обратной совместимости. + сам интервьюер не совсем правильно ответил на свой же вопрос. extern нужен как раз для объявление (declare) переменной, а ее определение (definition) может находиться в другом месте. Использование данного трюка в С++ проектах является не очень хорошим стилем.
Неоднократно сталкивался с таким вопросом на собеседованиях. А конструкция extern в плюсовых проектах встречается, каким бы стилем это не являлось. Так же обычно за этим вопросом следует вопрос про extern "C". А то, что сказал что-то неправильно. Ну собеседование не постановочное, могу и оговориться, всякое бывает.
@@z140140 По поводу "если у тебя есть переменная используемая в нескольких модулях - без extern ты не обойдёшься". И это говорит senior+1? Никакой это не senior+1, и даже -- не senior, максимум -- middle. Начиная с C++17, такой способ есть, и настоящий Senior его знает.
Ппц, он вставляет auto даже там где этого можно и не делать. Очевидно же что на вход принимается char. Таким образом заставляет компилятор тратить время на вычисление того, что это ленивец хочет сделать.
Смотря где. В Европе и США очень тяжело без диплома, на постсоветском пространстве проще, но тоже иногда могут спросить. В любом случае диплом лучше иметь, но его отсутствие, конечно же, не причина не строить карьеру программиста.
Я не программер, промотал кусками, в целом вроде адекватно всё, парнишка спокойный, не всё шарит пока (оно и ясно, молодой), но и не тупит, не мычит фуфел вроде - всё как есть рассказывает ровно. Я совсем не разбираюсь в этом, но по ощущению парень должен поработать джуниором какое-то время, если в принципе на него тянет и подходит под профиль задач. Глянул каменты по-диагонали - чел "Blogan" грамотно всё расписал.
получить на вход константную ссылку и пытаться ее изменить - ну такое себе. И даже если на вход не константная переменная подавалась бы - то совсем инвалидацию указателей не учитывал.
Собеседующий не прошёл собеседование. :) return std::string(); Cоздание объекта и возврат, когда слышишь такие казусы , сидишь и думаешь "это проверка?" , а то как то не хочется работать под началом "спеца" с таким уровнем знаний. return {}; можно. return "" ; не рекомендуется так как это всё равно что return std::string(""), то есть будет не явное преобразование типа с вызовом его конструктора. Лучше избегать всех неявный преобразований. Если честно. И это это Мидл ?????
Сори я чет не понял подвох. В параметрах "std::string", а у этого класса есть же метод "replace", почему бы просто не использовать его для замены символа, на бекслеш + заменяемый символ? Это же делается в 1 строку.
Во-первых, потому что входная строка константиная и её все равно придется копировать перед этим, во-вторых, тут топят за скорость выполнения кода, а менять стринг на стринг всяко длительнее. :)
Извиняюсь, но это совершенно не похоже на собеседование. Интервьюер не просто давал хинты, а сам решал задание. Так никаких data-point-ов не соберешь с кандидата.
Face palme. Это не уровень джуна, парень в основах плывет. Интервью не досмотрел дальше первой задачи. Решение, за исключением регулярок, по всей видимости, генерация новой строки после перебора. Как такие люди могут претендовать на высокие зарплаты. IT - новое поле чудес. С Уважением, слесарь 3 р.
Почему бы не экранировать с 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 раза больше памяти, но в среднем затраты будут меньше.
Всем привет! Объявляю набор кандидатов на собеседование Middle С++.
Требуются разработчики с опытом 1-3 года. Собеседование проводится только с видео.
Если вы хотите проверить свои знания и попасть в новое видео, то пишите мне на почту ambushed.raccoon.tube.mail@gmail.com с темой “Middle собеседование кандидат”. В письме пишите свои контактные данные(желательно telegram), описание ваших знаний или резюме.
Со своей стороны гарантирую, что видео будет выложено только с вашего согласия. Так что не бойтесь.
Будьте внимательнее с темой письма, потому что они очень легко попадают в спам.
Странно, что в названии написано "Собеседование Middle C++",а первые слова собеседование на позицию junior.
Собеседование: разверни дерево, найди оптимальный путь
Реальность на работе: фикс ошибки из-за отсутствующей запятой, катить самому в прод без техлида в пятницу
Ну собеседование гораздо интереснее и прикольнее работы, что еще сказать тут
Работаю вместе с джамшутами на стройке. Возле Рублёвки, чистыми выходит ~120. Почему это оказалось у меня в рекомендуемых??
Алгоритмы ки вычислили с кем ты работаешь. Джамшуты программисты и угорают с тебя на стройке. Ки подслушала их разговоры и решила тебе подсобить.
Охуительно, посмотрел за ужином, о чем они говорят - х.з. но очень интересно. Спасибо ютюбу за рекомндацию ахахахахахаха... Комменты тоже доставляют. Удачи вам парни!
Этот парень помогает поверить в свои силы.
Видео клевое, но хочется тайминги еще :) Ждем материала от вас, вы очень приятно объясняете материал
Спасибо) Тайминги сделал.
Очень классный контент, для Джуна, много вещей, что надо подтянуть, хочется уже быстрее на работу и задонатить, ты делаешь очень многое для начинающих, спасибо!
@ Vasiliy Pupkin
Бойтесь своих желаний - они исполняются.
@@alienhazzard7201 уже 7 месяцев как не исполняется(
@@vasiliypupkin6311 Ты был джуном 7 месяцев назад. Почему не получилось? Ответь развернуто, пожалуйста, мне очень интересно как начинающему.
@@george.8888 После 24 февраля, много компаний ушло, которые нанимали джунов. Компании которые остались, очень сильно вырос порог входа, а так как я занимался именно unreal engine 4 и все мои проекты были под гейм дев, а гейм дев умер в СНГ, и на вакансию gameplay dev начали откликаться 200+ чел. При том, что я 25 февраля должен был переезжать в Киев, я делал тестовое 3 месяца и прошел на проект сталкер 2.
Через месяц, я понял, что остались только продуктовые компании, такие как Яндекс, сбер, Тинькофф, но туда берут в первую очередь олимпиадников и с таких, как МФТИ и т п.
Итог: знать надо гораздо больше, конкуренция в 3-4 раза выросла, это я все рассказываю в рамках С++. Нужно хорошо знать алгоритмы и структуры данных, уметь решать с закрытыми глазами, знать тонкости языка, как работает под капотом, этим сможете привлечь внимание, работа долгая и упорная, я с полного нуля занимаюсь 2 года. Я так по приколу за 2 недели начал на js писать))))
Я бы на вашем месте смотрел бы на другой ЯП, у айти бороды есть интервью с лидом по физике геймплея war gaming он там и говорит, что с хорошим наставником, вы станете джуном по С++ за 1,5-2 года, работая про этом.
У Сергея немчинского, есть очень много материала, как выбрать ЯП, какой лучше, как правильно учиться.
Своему сыну я бы не советовала, в качестве первого языка брать ++ очень сложно и долго.
Удачи!
@@vasiliypupkin6311 Спасибо что потратили свое время! Я пришел к выводу что стоит начать с вэб разработки, стандартный пакет с хтмл, цсс, джава скрипт. Всегда будет спрос, всегда можно брать фриланс пока ищешь. работу. Уже после можно изучить языки под узкие направления, которые интересуют, вроде гейм дизайна и тд. Как вы считаете, это правильное решение?
Многие говорят про Питон, что он самый лёгкий для начинающих, но мне почему то кажеться самым разумным решением начинать с вэб..
Интервью было интересное, как для студента второго курса очень даже познавательно проверить какие то свои навыки, на большую часть вопросов смог ответить)) Про тхт и бинарники правда как то косвенно отошли от ответа, все таки главный недостаток и преимущество это читабельность данного файла, ведь просто тхт можно спокойно открыть, прочитать/переписать, а в бинарном будут каракули и его не разобрать)) Но в тоже время некая защита/конфиденциальность информации, спасибо за видео, было очень интересно, хочу еще.
сериализация предназначается для программы, человеку незачем её читать, он конечно может, но это не для этого. Если нужна конфиденциальность, то для этого существует шифрование и неважно текст это или бинарное представление. Основная проблема бинарного формата порядок бит на разных платформах, он может отличаться.
Хорошее видео, только я бы уточнил по extern.
Автор сказал, что extern говорит, что данная переменная не объявляется здесь. Насколько я помню, extern говорит как раз, что объявление происходит здесь, а вот определение где-то еще. И на этапе компиляции компилятор оставит пустое место, так сказать. А уже на этапе линковки линковщик поищет в других местах определение, и когда найдёт, тогда подставит его в пустое место. А если не найдёт, то будет ошибка линковки.
Прикольно, посмотрел пока только 1ую задачу.
И какое-то двоякое мнение:
1)были такие задачи на собесах и сразу бросался решать. Но вот это видео мне попалось вечерком под ужин. И прям 1ое что в голову пришло - написать сначала тесты. И чтобы в них были конер кейсы. Однако когда такие задачи на собесах встречаются, как-то эта мысль не приходит в голову почему-то, видимо нервы)
2)обычно при решении таких задач надо
- накидать дубовое решение в лоб.
- потом его проговорить его и оценить сложность.
- поток уже реализация
- потом уже обсудить что получилось. Подсветить плюсы и минусы.
- и вот теперь уже попытаться обработать конер-кейсы
Пишу это для того чтобы узнать мнение других людей, тех кто ходил на собесы, или может тех кто эти собесы проводит.
P.S. на работе обычно вначале прикидывается решение (возможно обсуждается архитектура). Потом прикидываются юзер-кейсы. Потом уже реализация. А на тех.интервью вроде все также, только в обратной последовательности.
Сам я на собесы не ходил (работу как-то плавно получил со стажерства)). Но многие знакомые/друзья говорят, что мол, лучше всего начать писать самое просто решение в лоб, невзирая на особенности и крайности (на примере первой задачи, забить на первый символ, последовательность символов и т.д.) и просто решить общую задачу. А потом уже готовое решение доработать и доделать для решения "тонких" задач.
Для вопроса про сериализацию двунаправленного списка можно сделать намного проще:
Обозначаем тип и указываем цикличный этот список или нет, дальше данные кладем в виде массива.
На выходе получаем минимальный объём сериализованных данных + обработку за один проход как для записи, так и для чтения.
Можно ещё проще: сериализуем как массив и кладём хер на тип. Кому надо - десереализуют в двунаправленный список. Кому не надо - десереализуют массив.
8:00 Почему std::string() ошибка? Это же просто вызов стандартного конструктора. Пустые фигурные скобки ведь тоже приведет к вызову того же стандартного конструктора.
Сам я не программист, но всегда восхищаюсь этими ребятами.
ну не знаю, какой-нибудь инженер в разы круче, чем программисты. Сейчас программист - это в основном знаток языка, даже без знания математики или дискретки, а раньше нужны были именно инженерные знания
@@mrbibis7229 , на одном чистом языке много не напрограммируешь - нужны ещё знания библиотек. А библиотек разных много:
- игровые движки;
- базы данных;
- редакторы изображений;
- распознаватели речи;
- работа с протоколами интернета;
- ну и библиотеки работы с математикой.
На каждую библиотеку её внутренние алгоритмы знать не будешь, а библиотек сотни штук!
Вывод: для программиста главное уметь пользоваться софтверными библиотеками. А дискретной математике его за пару месяцев обучит куратор проекта.
@@mrbibis7229ну попробуй аллокатор памяти написать под вулкан, или драйвер, или движок, математика не нужна, но мышление на вес золота.
Спасибо за контент. Очень интересно.
блииииин обыкновенное экранирование! мать моя дельфи...))))
Я являюсь преподавателем 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. Стандартные контейнеры можно засунуть в ваши собственные классы, как поля. Тогда не будет проблем з деструкторами. Хорошо было бы сказать об этом кандидату.
Считаю, что вопросов мало было задано. Но смотрел все ровно с интересом, поэтому спасибо за видео.
ладно
Сначала ты пишешь:
"Какая разница, какой у него коммерческий опыт? Я могу за 10 лет поменять 10 компаний, везде быть джуном и рассказывать, что в одной компании я делал одно, в другой другое, и так далее."
А потом:
"Почему кандидату надо знать об extern "C"? Я работал в нескольких компаниях, и ни разу не было причины использовать это."
Не делай так.
@@grigoriikushnir4927 А как эти 2 утверждения взаимосвязаны?) Второе утверждение объясняет то, что вопрос лишний для джунов.
@@BloganProgramming Тем, что твое первое утверждение обесценивает твое второе утверждение как аргумент. Твой коммерческий опыт не является доказательством того, что кандидату не надо что-то знать. Это если по твоей логике.
Из моего опыта, в среднем, чем больше коммерческий опыт, тем больше у человека знаний потому что он решал больше бизнес задач. Как это проверить - другой вопрос. Но закономерность подтверждается жизнью.
@@grigoriikushnir4927 Ты все еще не понимаешь, что между моими утверждениями нет никакой связи. Первое касается того, что незачем спрашивать за коммерческий опыт. Второе касается того, что вопрос является слишком узконаправленным и довольно простым, чтобы его спрашивать. На этом я заканчиваю эту беседу, так как если ты после этого ничего не поймешь - смысла объяснять тебе далее нету.
Ambushed Raccoon - Парень ретурн std::string(); по моему указал правильно , ведь резултат - обект типа std::str а не функция
если не "прятать" от компилятора тип переменных унасленованного от vector класса, то невиртуальность деструктора ~vector проблем вызвать не должно. в смысле если не делать такое: std::vector * pVec = new TMyInheritedIntVector(); ...; delete pVec;
Впринципе ничего страшного не будет,если мы унаследуемся с модификатором protected от вектора. Так,что на мой взгляд ,собеседуемый сказал правильно: он сказал про private наследование от вектора. Потому,что в таком случае механизм полиморфизма работать не будет. Но есть и достоинства: при таком подходе можно получить доступ к protected членам вектора. При композиции так нельзя сделать. Ещё Здесь есть один риск,если пользователь будет делать reinterpret_cast к вектору(к указателю на вектор) и явно вызывать деструктор. Но по мне это такое себе. Как завещал Скотт Майерс: предпочитайте композицию наследованию.
Только почему никто не озаботился вопросом, насколько часто сам объект вектора создаётся динамически так, чтобы пользоваться им потом через указатель на базовый класс?
Не понял, какой вызов функции? Там простой вызов дефолтного конструктора, не важно какие скобки
а вот дальше std::string answer(); уже ошибка most vexing parse
Слава Богу, я скипнул вот эту всю часть computer science про частичные функции в целом, и си в частности.
Здравствуйте. А будет сборка Quake из исходников ?
Очень интересно. Ты располагаешь к тому, чтобы любить c++
Вставка в середину массива, по моему надо использовать linked list
Норм собес, сам вспомнил плюсы :)
"на позицию Middle C++ Developer" - в видео студент на позицию джуна)))))))))))
так одно другому не противоречит, может парень пришел рановато
Они оба джуны, опрашивающий сам ни в чём не уверен, спросить нормально ничего не может, речь у обоих убогая, два слова связать не могут, вопросы тупые, решения ещё тупее.
@@lightinguniverse4952 Ты прав - тут есть над чем работать. Автор весьма косноязычен, речь не выразительна, много мусора. В одном видео он говорит "прийти НА ОФИС" - несколько раз - стыдно однако
Да нормальный парень. А по поводу extern и тем более union я бы не парилась, это вроде бы и надо знать, но во-первых, молодые всё реже с этим сталкиваются, а во-вторых, если столкнутся - неужели вы думаете, что разработчик такого уровня за пол часика не поймёт как это работает? Гораздо важнее то, как человек мыслит, а не то какой он заучка. Вряд-ли на рабочем месте кому-либо запретят иметь пару томиков на всякий случай. Здесь даже вместо объяснения лучше попросить угадать на опыте дав лёгкий намёк что это может быть, опять же посмотреть как человек мыслит, даже если даст неверный ответ.
Я не критикую, но просто интересно, в каком месте кандидат ближе к мидлу?
объясните, зачем при сериализации двусвязного списка с чем-то мудрить? Просто по порядку как массив записал значения и все
вот-вот. сериализация необходима для передачи данных. А уж на месте десериализуй и клади данные куда необходимо.
26:38 "...мы будем сдвигать вправо..." - "Почему не влево?" - "Потому, что это Мак)))"
55:45
Виртуальный деструктор в подобном кейсе выглядит избыточно. У вектора и методы не виртуальные, поэтому нет смысла кастить указатель на наш произвольный класс к указателю на вектор, потому что при вызове методов всегда будут вызваны методы вектора. Если пользователь такое делает, то пусть возьмет просто вектор, а не производный класс.
А если использует "правильно", то и утечки нет
55:55 можно обьяснить при чем здесь виртуальный деструктор, если человек вроде хотел приватно наследоваться?
Я программист на питоне и на js. Решил посмотреть в 4 часа утра как писать аимбот, наткнулся на старое видео, из него прыгнул на канал и на новое видео.
Зачем мне собес на мидла плюсов….ну ладно, берем попкорн, слушаем)))
в чём вообще смысл твоего комментария ? "хихи посмотрите на меня какой я дурачок завтра егэ, а я хаваю дешевый дофамин)))) Я такой особенный ))))))))))))))))".
@@vitalyarbuzov5375 🤨
@@vitalyarbuzov5375 иди поспи, чел. тебе отдохнуть нужно
В первой задаче не возникло вопроса, что делать с уже существующими в строке слешами
Оксимирон теперь интервьюирует по С++???
По сериализации с двунаправленым списком я не понял....
Каждый элемент имеет указатель на следующий и предыдущий, это есть его определение. Следовательно a->prev->next == a и a->next->prev == a , это правило двунапраленного списка. Если иначе, это уже другая структура данных , граф может быть.
В таком случае , непонятно зачем хранить индексы вообще. Сохраняем последовательно элементы от head по next . А при десериализации каждого последующего элемента восстанавливаем связи согласно правилу списка. last->next = cur; cur->prev = last; last = cur;
да, по сути это будет последовательность данных, а при десериализации будет уже создание двунапр. списка
Зря подсказал что цикл не понадобится в задаче с set_bit, было бы прикольно посмотреть как он с циклом решит :D
А зачем во время сериализации двусвязного списка вообще записывать указатели на предыдущий и следующий элементы? Ведь можно его сериализовать просто как массив значений, а все эти указатели воссоздать во время десериализации.
Потому что элементы могут быть одинаковыми по значению. А указатели могут указывать на все что угодно. Список может быть замкнутым и т.д.
@@airtl7753 Ну и что, что элементы могут быть одинаковые? Они запишутся столько раз, сколько раз они в списке. Если же список замкнутый, то это вообще не список, а другая структура данных.
не понял. у вас написано мидл, а в видео говориться , что собес для уровня джуна ? опечатка или оговорка в видео ? можете объяснить, "что значит учитывая коммерческий опыт" ? вы имеете ввиду, что сейчас на джуна необходима подготовка уровня мидла ?
Это собеседование middle?? Напиши что это собеседование для junior.
Ну имхо строку следует считывать прямо на ходу в какой нить вектор посимвольно и просто вставлять экран перед символом…
Не очень понравилась подача copy-on-write строк под соусом того, что они "как будто-бы лучше" (да, я понимаю, что напрямую автор не говорит, что они лучше) std::string'а, потому-что ты их передаешь по значению и они не копируются. Если есть такой страх копирования строки при передаче в функцию, лучше уж её передать по константной ссылке и всё, проблема решена простым механизмом языка, и об этом должен знать как мидл, так и джуниор.
У CoW-строк есть самый существенный недостаток - вместо копирования при передаче, они "недетерминированно" копируются при совершенно нормальных операциях, типа замене символа, конкатенации и т.д. За всеми этими случаями ненамеренного копирования следить гораздо сложнее, чем всегда передавать const std::string&.
Классный контент.
Спасибо большое)
Было бы круто вывести тайм-коды для более быстрого просмотра и самого интересного, для себя
Спасибо))
Спасибо)
Таймкоды будут. Сейчас в приоритете провести собеседования и выложить их.
После этого займусь таймкодами.
@@ambushedraccoon6408 таймкоды сделать это меньш часа лентяй.
Таймкоды сделал.
@@ambushedraccoon6408 спасибо ты лучший!)
хорошее видео, хороший канал, всем спасибо!
Давно я на ++ не писал, а что за конструкция for ( var : var)?
Это типа foreach в #? Никогда раньше не видел, даже вон глянул документацию майков, там тоже не нашел такого.
Привет. Да, можно провести аналогию с foreach.
Называется range-based for loop.
Вот ссылочка на док:
en.cppreference.com/w/cpp/language/range-for
@@ambushedraccoon6408 Спасибо, удобная конструкция
Я не знаю с++, поетому может мой вопрос примитивньій. Но, как я понял из первого задания слеш нужно ставить перед символом которьій передаеться в с. А судя по коду он будет ставить етот слеш в начало строки: answer = += "\\" а не в позицию перед етим символом в строке (тип і -1, где і - позиция символа с).
по конечному коду, он идет в цикле и прибавляет к результирующей строке либо просто символ из заданной строки, либо слеш+символ, если он совпадает с условием.
У меня чего-то возникли вопросы к тому кто проводит интервью ;) из претензий наверное: много говорит, не улыбается, не старается расслабить собеседника, соотвественно не ясно как человек будет работать в команде, как-то так
человек паук вернулся домой и начал кодить
Я думаю это собеседование больше похоже на позицию джуна?
Такие вопросы могут встречаться на собеседованиях на любой уровень.
В зависимости от уровня кандидата, ожидается разное погружение и процент отвеченных вопросов.
У Александра около одного года коммерческого опыта, что ближе к уровню миддл.
@@ambushedraccoon6408 у меня уровень senior+1, если меня спрашивают про особенности языка - я уже понимаю, что это не моя вакансия
@@z140140 можете, пожалуйста, рассказать, почему? То есть вы ожидаете вопросов, связанных больше с какими-то более прикладными задачами?
@@thegate8985 позволю себе ответить со своей стороны, так как придерживаюсь такой же позиции. Сеньор это не тот кто знает каждую заковырку с++. Сеньор это тот кто придёт писать код на джаве и, видя ее впервые в жизни, легко поймёт что там и зачем написано с использованием гугла. Ценность не в знании конкретных прикладных технологий, а в понимании общей логики в целом. Глупо платить человеку в 3 раза больше денег просто потому что он знает кучу справочной информации, которую можно за 30 сек найти в гугле при первой необходимости, если при этом этот человек не понимает зачем нужна хэш-таблица или какие подводные камни есть у многопоточности.
@@thegate8985 чем выше позиция, тем меньше человек пишет кода и больше занимается бизнес/архитектурными/тимлидовскими задачами(зависит от позиции, на которую нанимают). Выше уровень абстракции, так скажем, для кода есть джуны и мидлы. Если вы синьор и все ещё пишете код, то вы аппер мидл, имхо.
Middle C++, не знающий что такое Extern, установка бита числа циклом? Круто... Азов нет, зато OpenCV якобы есть. Веселые вы ребята :)
Ой, еще и минус Union... мы вам перезвоним...
Есть ли смысл выносить "\\" в переменную, чтобы не создавать каждый раз указатель? 14:10. Или компиляторы оптимизируют этот процесс?
Компиляторы оптимизируют твой код иногда до такой степени, что ты даже представить себе не можешь))
@@old_cd_rom9518 здорово тогда
нормальный чувак, всё знает. сделает прекрасную карьеру. а в комментах душнилы
Впечатляет что C++ еще кому-то интересен из молодежи
да это же совершенный язык ! ))
Сейчас все уники только его и дают(естественно есть факультативы например по питону, но то отдельно)
@@bravo2625 А что там дают - семестр на Си и Плюсы вместе взятые - это даже не смешно.
Зачем битовые маски, если есть bitset ?
Вопросов про плюсы я тут не увидел - задачка на алгоритм, вопрос про сишный extern, битовою маску (серьёзно, битовые задачки часто приходится решать?), какая двоичная сериализация, что это за вопрос? Сохранение куска памяти - это не сериализация) Зачем Union в плюсах? Есть же Variant. В Qt стандартная библиотека нифига не отзеркаливается, подходы абсолютно другие. В общем, тут вопросы интервьюеру.
@ Cyril Anisimov
Битовые задачи приходится решать часто. Сохранение куска памяти - это не сериализация.
@@alienhazzard7201 битовые операции - это не плюсы, они есть во многих языках.
И я про это говорю)
Ну почему все говорят "хидер", если он, блин, "хэдер"? Бесчисленное множество раз слышал от разных людей.
Все-таки это уровень Junior'а, а не Middle'а
Блин, интересный видос. Помоему вопросы даже до уровня Джуна не доходят. Либо просто я о себе слишком плохого мнения (Middle C# dev, OpenSource C++ dev)
Скорее из-за высоких требований к себе у тебя завышенные требования к другим)
хм... скажем так, зачастую вопрос кажется простым лишь потому, что таков твой уровень... вот, скажем, задача про установку бита -- все ведь очень просто. ведь правда просто? вот только не советую предлагать такое решение задачи в проекты калибра JDK или V8. выебут
Ты удивишься, но найдутся те, кто скажет, что это до уровня стажера не дотягивает. Проблема не в вопросах, с ними все в порядке, а в неумении людей оценивать что-либо объективно (которое является следствием неумения выходить за рамки своего я и своих эмоций)
Интервьюер интервью прошёл! А претендент, что не вопрос то мимо. 🤣🤣🤣🤣 А вообще тут видна типичная ошибка всех умненьких студентиков: учат и козыряют знаниями фреймворков но у них нет простого понятия о программистком повседневном ремесле.
Да, тут интетесны градации между джуном и мидом. Понятно, что всё на усмотрение собеседующего. По этому кандидату видно, что он высокоуровневый программист, хорошо понимает лямбды, но битики-байтики не особо его интересуют, странно что выбрал именно C++ после джавы, не ясно что именно в C++ подкупило. )
@@fedoresko объясни пж как происходит смещение строки если они добавляют символ перед char c, я знаю как это можно на си сделать, но как реализовано в стринг хз
@@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;
}
Делаешь новую строку - добавил символ, добавил старую: всё готово. )
@@fedoresko понятно, то есть всё равно смещать надо право всю строку, я бы сделал без использования кучи, ну да ладно
@@bookbrain9863 тут нет указания, используется ли куча. На практике небольшие строки аллоцируются на стеке.
39:40 Ждал от собеседующего упоминания о LE и BE. Че там мудрить: двоичная история - это всегда индивидуальная снежинка.
Господа, может кто сможет мне ответить: Автор канала сказал, что есть какой-то обходной путь по разграничению .h .cpp при создании шаблонов. Так вот что это за способ? Было бы неплохо, если сможете скинуть статью.
Спасибо за ответ
смотрю с огромным интересом хоть ни черта не понимаю
а компилятор правда не ругнется на множество реализаций одной функции? ничоси...
алё, чуваки, я ждал, что будут задачи (а-ля Роберт Седжвик), т.е. воплощение смыслов, а не синтаксическая грамотность - за неё уже работодатель платит деньги?*??
Когда интервьюер на собеседовании говорит: не готов сейчас к разговору о деревьях. То становится неловко за интервьюера. Я думаю пояснять тут ничего не нужно.
В остальном понравилось. Продолжай!
А что тут такого? Я готов к вопросам про деревья с позиции кандидата. Но как интервьюер я придерживаюсь определенного плана, который не включал в себя эту тему. Поэтому решил не развивать этот разговор, особенно на ютубе, где, как мы видим, достаточно людей, которые ищут возможность докопаться до автора.
@@ambushedraccoon6408 с ответом согласен. Просто на мой взгляд на видео это выглядело по-другому. Главное, что продолжаешь снимать и чем дальше тем интересней) респект
50:00 а для std string разве нет подсчета ссылок??? хм
Нет. Но если хочется подсчёта ссылок, есть умные указатели для этого: std::shared_ptr
А так std::string по сути тот же std::vector, но со встроенным буфером фиксированного размера, чтобы не выделять динамическую память под мелкие строки.
Думаю, это собеседование на джуна, я не на мидла, и стоит все-таки поменять название видео.
Ну такое..мидл не знает, что шаблоны только в хедере пишутся, какую-то билеберду сначала писал на задаче со строкой. Входные тесты на джуна, которые есть доступом на собес, сложней.
Если сейчас все джуны такие, то залететь на рынок it супер легко
Ну так залетайте.
Бро точно не нашёл работу
Что прошлый ролик, что это - уж очень хочется узнать, чем одному не понравился JavaScript, а другому Java.
Ну у каждого свои предпочтения. Мне лично тоже java не заходит. JS я не пробовал, поэтому ничего сказать не могу.
Привет, я, например, front-end разработчик, но получаю огромное удовольствие от написание кода на golang, нежели на js(typescript), не знаю, как-то так уж получилось)
Причины, по которым может не нравится язык, есть у каждого языка. Если бы существовал идеальный, универсальный язык, на нем бы все и писали. Выбор языка - это всегда компромисс. И всегда есть языки, в которых человек не может найти этот компромисс для себя. Например, лично мне в Java не нравится ее многословность. В JS мне не нравиться подход, построенный на прототипном наследовании, динамическая типизация и то, что null по какой-то неведомой причине является в JS объектом. Тем не менее я не против пописать, как на Java, так и на JS.
Нормализацию ролика по громкости хорошо бы сделать. У интервьюера невыразительная дикция и довольно тихий голос (или низкий уровень записи микрофона). У кандидата ровно наоборот. Один шепчет, другой бьёт по мозгам. Большое спасибо, что голос не повышает!
ну вот и ЗП тебе будут платить 32 битными числами из 5 знаков)) Без негатива, парень не плох
Это мидл из аспирантуры? Весело.🤣
А есть ли какая то возможность попасть к вам на пробное собеседование?)
На данный момент я не веду набор кандидатов. Планирую делать новый набор ориентировочно через 2 недели.
Уведомление будет в сообществе и телеграм-канале.
48:12 - на этот вопрос ответить без мата в сторону стандартизаторов очень сложно
Это я первую задачу неправильно понимаю или задача некорретная? Символы ведь после того как его код отработает не станут экранированными, он просто добавил в перед каждым символом по экранированному слэшу..
Или я действительно некорректно понимаю задачу и в этом и суть?
Да и вообще, я наверное слишком строг, но чувак на всё отвечает только с подсказок и то не слишком хорошо
А что ты понимаешь под "экранированием"?
@@iforand так называют спецсимволы в строках, по крайней мере в С и С++, если ты просто вставшь, скажем, двойную кавычку в строку, то компилятор распознает её как конец строки и выдаст тебе ошибку, именно поэтому создали экранирование, когда ты перед подобными неудобными символами вставляешь косую черту, чтобы они точно трактовались компилятором именно как символы, а не как часть синтаксиса
@@justman7656 так и чем это отличается от "просто добавить перед экранируемым символом по слешу"? :)
@@iforand просто я полагал, что задача в том чтобы вставить неэкранированный слэш и экранировать тем самым заданный символ
@@justman7656 Э-э, что? :D Экранирование - это и есть "просто вставить обратный слешь перед символом". Что вообще означает "вставить неэкраниррванный слешь"? :) Экранирование просто указывает компилятору или другому текстовому процессору, что следующий символ не является управляющим и его нужно воспринимать как обычный символ. Ничего более.
парень студент - хорош
Да "ХЭДЭР" (header), блин! А не хидэр
да это почти senior судя потому что он умеет. я вообще не понимаю что он делает и для чего, и о чём они говорят. целый час пытали и отлично себя проявил
учу С 2 месяца и понимаю о чем идет речь в видео, вопросы точно не уровня мидла
в каком месте сеньер? собеседование уровня джуна чутка продвинутого.
Почему то сразу пришло в голову, что для подсчета символов итерировался бы бОльшим объектом, чем символ (размером командного слова на архитектуре например), ну и битовой максой по указателю проверял бы истину. так за меньшее число тактов можно почитать необходимы размер (но на самом деле размер не нужен). /или может быть сразу inline на asm воткнуть/. Попутно "битового пробега" составил бы карту (массив сдвигов) вхождений элементов, который после пробега использовал бы для копирования участков памяти, и между нужными элементами вставляли бы экран.
По поводу битовых операторов, не плохо бы сначала определиться с big-endian и liitle-big-endian. Можно просто нечаянно уехать не в ту память. Код написанный для изменения битов содержит else, он там лишний и портит читабельность код (по рукам за такое, мидл так не пишет).
насчет битовых операторов... еще раз подумайте хорошенько, и ответьте, почему эндиан не имеет значения
Ребята, return std::string(); или return ""; как раз только и было до С++11. :)
Привыкли вы к питонщине безтиповой вроде {}.
Мидл собеседует джуна, так вижу)
А зачем спрашивать про extern в интервью по С++? Это сишная штука, добавленная исключительно для обратной совместимости. + сам интервьюер не совсем правильно ответил на свой же вопрос. extern нужен как раз для объявление (declare) переменной, а ее определение (definition) может находиться в другом месте. Использование данного трюка в С++ проектах является не очень хорошим стилем.
Неоднократно сталкивался с таким вопросом на собеседованиях. А конструкция extern в плюсовых проектах встречается, каким бы стилем это не являлось. Так же обычно за этим вопросом следует вопрос про extern "C".
А то, что сказал что-то неправильно. Ну собеседование не постановочное, могу и оговориться, всякое бывает.
это как это?? если у тебя есть переменная используемая в нескольких модулях - без extern ты не обойдёшься
@@ambushedraccoon6408 Именно оговориться? :) Ошибиться Вы никак не сможете? ;)
@@z140140 По поводу "если у тебя есть переменная используемая в нескольких модулях - без extern ты не обойдёшься".
И это говорит senior+1?
Никакой это не senior+1, и даже -- не senior, максимум -- middle.
Начиная с C++17, такой способ есть, и настоящий Senior его знает.
@ Elias Shalnev
Это не трюк, а необходимость.
Ппц, он вставляет auto даже там где этого можно и не делать. Очевидно же что на вход принимается char. Таким образом заставляет компилятор тратить время на вычисление того, что это ленивец хочет сделать.
Как будто там серьёзные вычисления происходят
А у вас по высшему образованию берут?
Смотря где. В Европе и США очень тяжело без диплома, на постсоветском пространстве проще, но тоже иногда могут спросить. В любом случае диплом лучше иметь, но его отсутствие, конечно же, не причина не строить карьеру программиста.
серьезно, сейчас для Middle уровня не нужны и шаблоны и битовая арифметика?
Это оксимирон проводит собеседование?
да, а что?
Я не программер, промотал кусками, в целом вроде адекватно всё, парнишка спокойный, не всё шарит пока (оно и ясно, молодой), но и не тупит, не мычит фуфел вроде - всё как есть рассказывает ровно. Я совсем не разбираюсь в этом, но по ощущению парень должен поработать джуниором какое-то время, если в принципе на него тянет и подходит под профиль задач.
Глянул каменты по-диагонали - чел "Blogan" грамотно всё расписал.
там где битовая маска - индекс нужно сдвигать 1
Может быть. Таймкод нужен)
получить на вход константную ссылку и пытаться ее изменить - ну такое себе. И даже если на вход не константная переменная подавалась бы - то совсем инвалидацию указателей не учитывал.
Собеседующий не прошёл собеседование. :)
return std::string();
Cоздание объекта и возврат, когда слышишь такие казусы , сидишь и думаешь "это проверка?" , а то как то не хочется работать под началом "спеца" с таким уровнем знаний.
return {}; можно.
return "" ; не рекомендуется так как это всё равно что return std::string(""), то есть будет не явное преобразование типа с вызовом его конструктора. Лучше избегать всех неявный преобразований.
Если честно. И это это Мидл ?????
❤️
А какого уровня собеседующий, если он на 7:13 говорит ахинею про то, что создание объекта через круглые скобки не сработает?
Перепутал с конструкцией std::string s();
Сори я чет не понял подвох. В параметрах "std::string", а у этого класса есть же метод "replace", почему бы просто не использовать его для замены символа, на бекслеш + заменяемый символ? Это же делается в 1 строку.
Во-первых, потому что входная строка константиная и её все равно придется копировать перед этим, во-вторых, тут топят за скорость выполнения кода, а менять стринг на стринг всяко длительнее. :)
Извиняюсь, но это совершенно не похоже на собеседование. Интервьюер не просто давал хинты, а сам решал задание. Так никаких data-point-ов не соберешь с кандидата.
Точно ли мидл, без опыта то, а по коду так джун чистый.
Face palme.
Это не уровень джуна, парень в основах плывет. Интервью не досмотрел дальше первой задачи. Решение, за исключением регулярок, по всей видимости, генерация новой строки после перебора. Как такие люди могут претендовать на высокие зарплаты. IT - новое поле чудес.
С Уважением, слесарь 3 р.
Почему бы не экранировать с 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 раза больше памяти, но в среднем затраты будут меньше.
Вы приняты в Valve, поздравляем! :D
найс