Тестовое собеседование Java разработчика #23 - Аскар Сариев
Vložit
- čas přidán 1. 07. 2024
- Кандидат - будущий Java разработчик - Аскар Сариев.
Аскар долгое время занимается изучением Java стека и планирует в ближайшее время стать backend инженером.
Материалы для разработчиков:
proselyte.net/
Телеграмм канал для общения:
t.me/pse_club
00:00:00 Знакомство
00:01:21 Каким образом передаются переменные в методы, по ссылке или по значению?
00:02:05 Какие отличия между примитивными и ссылочными типами данных?
00:02:44 Как устроена память в JVM?
00:06:42 Что такое сборка мусора?
00:10:23 Многопоточность, параллелизм и асинхронность.
Определения и какие между ними отличия?
00:13:11 Разница между виртуальными и реальными потоками.
00:14:51 Future и CompletableFuture. Их назначение и отличия.
00:18:38 Коллекция HashMap. Устройство и особенности работы.
Является ли она потокобезопасной?
00:25:31 Что находится под буквой L в принципах SOLID?
00:30:08 Решение алгоритмической задачи.
00:57:03 Что такое индексы в базах данных?
00:58:53 Особенности удаления данных, связанных через FOREIGN KEY.
01:00:44 Что такое Result Set в JDBC? Особенности его конфигурации.
01:02:39 Что такое хранимые процедуры и какой способ их вызова через JDBC?
01:05:27 Что такое SessionFactory в Hibernate?
01:06:43 Управление уровнями изоляции транзакций в Hibernate.
01:08:07 Как работает аутентификация и авторизация в Spring Security с использованием JWT токена?
01:15:16 Что такое юнит-тестирование?
01:16:14 Ответы на вопросы кандидата.
01:17:17 Финал
Ссылка на статью с разбором:
proselyte.net/mock-interview-23/
Наше дружное сообщество:
t.me/pse_club
К сожалению ссылка не рабочая
@@user-oy1kl1vx8q VPN?
@@EugeneSuleimanov хм, не пробовал. обязательно через впн?
@@user-oy1kl1vx8q стоит попробовать, проблема может быть в этом. Сайт рабочий.
@@EugeneSuleimanov видимо пока не судьба, фиг найти рабочий впн, в РФ много заблочееных сервисов...
Рад что ты обустроился.
Заждались качественного контента.
Спасибо!
Огромное спасибо. Про память и тд много нового. Евгений, рада, что ваши видео снова стали выходить.
Спасибо за комментарий!
Евгений спасибо, что возобновили выпуск видео с собеседованиями. Особенно спасибо за ссылки с разбором вопросов.
Спасибо за отзыв!
Супер полезный контент, качественный подход. Мы ценим ваш труд, Евгений!
Спасибо за отзыв!
Большое спасибо за интервью! Творческих и профессиональных успехов тебе и развития канала!
Спасибо за отзыв!
Ооо, с возвращением, легенда!))
Спасибо за комментарий :)
хорошо получилось.
Мне нравится )
Спасибо, Женя.
Спасибо за отзыв, Серега :)
Спасибо огромное. Очень полезно и как всегда интересно)
Спасибо за отзыв :)
Отличные вопросы! Спасибо Евгению и гостю за отличное времяпрепровождение. С удовольствием послушал.
Учитывая волнение, на мой взгляд, хорошо сплавился.
Все прошло отлично :)
Спасибо за комментарий!
Спасибо что добавил алгоритмическую часть, мало у кого есть такие примеры, пускай даже долго но явно полезно!
Спасибо за отзыв!
к слову, большинство задачек на интервью берутся с литкода, коллекция top interview questions)
@@ainurryamov5091 подтверждаю - я не буду исключением :)
Очень удивился, когда после хороших знаний по кору, собеседуемый застопорился на изи задаче из топа литкода. Видимо, мало праковался именно писать. У меня же - обратная ситуация. Буквально за минуту придумал 2 решения за константную память (сортировка и voting алгоритм), но про асинхронность, параллелизм и тонкости jvm впервые тут услышал))
Спасибо за новый контент, Юджин!
Спасибо за отзыв!
Как же не легко даётся обучение на java)))
Но благодаря качественному контенту, в частности каналу Евгения - этот путь легче осилить!!!
Евгений, Вам, как всегда ОГРОМНАЯ благодарность за Ваш труд👍👍👍
Спасибо за отзыв, Максим :)
Java это просто инструмент, и чем раньше ты это поймёшь, тем лучше.
@@NummeSpnet здесь нужно время - а потом все становится на свои места :)
Спасибо за интервью!
Спасибо за отзыв!
В одном из видео Евгения спросили: "Насколько важно уметь решать алгоритмические задачи?". На что Евгений ответил, что важно, но если времени нет, то лучше получить опыт написания Spring приложений и получить работу. А потом хоть обрешайся.
Я абсолютно с ним согласен. Надо понять для себя какую цель ты перед собой ставишь: научиться решать алг.задачи/знать алгоритмы или получить релевантные знания и получить работу? Потому что решение задачек это как качать мышцу - качаешь растет, бросил - атрофировалась. И на накачивание тоже уйдет полгода-год.
Решая алг.задачи, мозг работает по одному шаблону. Пишешь приложения - мозг выстраивает другой шаблон работы. Мой мозг не может одномоментно переключиться с одного шаблона на другой.
Что касаемо моей задачи, да она была очень простая, но все мысли разбежались по углам :) Потому что решение алг.задач онлайн - это тоже навык.
В общем, учить много, а времени нет :) Пока изучаешь технологию, она уже изменилась. То что ты учил уже не актуально. А другие технологии тоже не стоят на месте. И новые появляются. А потом необходимо время на постоянное повторение, иначе всё забудешь и все твои труды и время коту под хвост. Ибо повторение - мать учения!
Всем удачи! Евгению еще раз спасибо!
Остаюсь при том же мнении :)
Спасибо за твоё время, Аскар!
Жень, спасибо! Этот контент полезен не только джунам))
Спасибо :)
Круто, что вернулся!))
было бы неплохо, если б сделал разбор касательно Spring Security по OAuth2 (Auth server и тд) для последних версий
а то видео найти можно, но в них объясняется мало, что и как там происходит
Спасибо)
Имею ввиду собственный авторизационный сервер, а не сторонние
Спасибо за отзыв :)
Сейчас как раз в работе вдел по SecurityFiterChain + WebFlux.
Аскар красавчик, я бы про Future и JDBC не смог ничего сказать. Евгений, спасибо большое за то что делаешь для нас отличный контент.
Спасибо за отзыв :)
Господь, святой Будда! Я восхищаюсь Аскаром! Как вызубрить это все
какой хороший собес и толковый джун. аж неловко стало -я бы на половину нормально бы не ответил, есть теперь что почитать. спасибо!
Спасибо за отзыв 😊
Хорошее интервью. Решение алгоритмических задач это навык, который надо оттачивать. Если человек на собесе способен предложить любое решение и его реализовать и оценить сложность, то зачет. Если придумает тестовые данные, которые рассматривают крайние случаи, то еще плюс. Если он потом предложит идею с оптимизацией, то вообще класс. Если человек пишет алгоритм и не может объяснить или пишет его молча, то это минус.
Боль спасибо за отзыв!
Я человек простой, Евгений выпускает ролик - ставлю лайк
Спасибо за отзыв :)
Спасибо!!
Спасибо за отзыв!
Евгений,пожалуйста запишите видео Security + jwt +web(rest) ,у вас крутой ролик получился на эту тему,но Security как бешеная собака поменял уже кучу версий ,удалил классы и перешел на функциональщину.Спасибо за Ваш труд!
если решить задачку за константную память и линейное время, то можоо создать массив freq[200+1] и в цикле увеличивать частоту freq[arr[i]+100]++, ну и максимальную записывать в переменную
Немного необычно видеть одновременно вопросы про сложность хэшмапы и коллизии, и асинхрощину. Для начинающего разработчика, Аскар очень хорош. Я знаю миддлов и синьоров, которые бы куда менее уверенно отвечали на эти вопросы.
Спс , Евгений за контент.... Вы очень терпеливый и корректный человек.... Получил огромное удовольствие от просмотра ..... Но на задачке, парень, видимо растерялся..... Кроме того, видимо, нужно учитывать то обстоятельство, что создание объектов, коллекций и т.д. - это тоже очень нагрузочная операция для системы, поэтому , думаю, что намного более множественные операции с примитивами или с другими возможностями не создания дополнителльных объектов, могут дать снижение нагрузки на процессор и существенное снижение времени выполнения операции. Очень теоретично.... Но задача весьма популярная..... Формально, то использование коллекций для ее решения, - это лучший вариант.... )))))))))))))))))) Жду Вашего следующего контента!!!
Спасибо за отзыв :)
По задаче - вы правы - она может быть решена без выделения доп. памяти. Я опубликую вариант решения вместе с разбором собеседования. И да - Аскар, вероятнее всего, просто растерялся из-за волнения.
@@EugeneSuleimanov Благодарю Вас за ответ.... У меня есть слабость в решении логических задач. Для меня это как поехать в отпуск к гетерам. Поэтому, видимо, прицепился к этому.... Не примите за моветон
@@JavaDevOld Привет Олег, это еще не сложные задачки, кругом инты, не флоатов не дабл чисел нет)))
@@GK-tw7nu спасибо за критику. Это важно, вы правы. Но в видео я просто вырезал такие паузы для «динамичности». Они были :)
@@GK-tw7nu Мой лайк Вам, коллега. Реально не додумался до такого простого решения этой проблемы. ЗАЧОТ!!!! ))))))))
Спасибо за такой контент, очень полезно! Я сам уже 2 года работаю в компании и уже позабыл эти основы. А такие видео как раз хорошо помогают освежить часть памяти, выяснить что совсем забыл. Мне интересно, Евгений Вы сами тщательно готовитесь к интервью или уже всё это очень хорошо знаете и не забываете?
Спасибо за отзыв :)
По работе постоянно повторяю и подготовка видео тоже помогает быть в тонусе.
@@EugeneSuleimanov Спасибо за ответ!)
Что-то так хорошо на теорию отвечал по Core, и на такой простенькой задачке поплыл)
Волнение и не много опыта в решении задач, вероятнее всего.
Дорогой Евгений , Господи спасибо что ты вернулся ! 🙂🙂 Обнимаем всей семьей тебя , привет из Томска ❤
Спасибо за отзыв :)
Понудю немного, но в строчке 28 должен быть не int, a Integer - иначе как проверить на null; а в 37 строчки упадет NPE, данный if-блок нужно включить в блок else.
красава!
Спасибо за комментарий :)
1) Аскар, молодец. Теоретическую часть хорошо ответил для джуна.
С алгоритмическими заданиями у меня тоже плохо. Нужно отдельно тренировать)
Минимальные требования к Джуну неплохи😏 .
Теперь это Java Core, БД, JPA, Spring. Набор джентельмена😁
Мне вот самому хочется пройти собеседование, но потом думаю, а если я где затуплю, как стыдно будет😏
2) Евгений, спасибо за контент. На ютубе много кто проводит собесы.
Но смотрю ваши. Есть чему поучиться✌
Спасибо за отзыв :)
Спасибо за отзыв. По правде говоря я тоже боялся публичности и попросил Евгения перед собеседованием не публиковать видео, но Евгений меня переубедил :) Да, мне стыдно за алгоритмический блок, но я все равно не жалею, т.к. опыт важнеее отрицательных мнений других людей. Мы всегда смотрим на то, что подумают о нас другие и строим барьеры. Нужно идти навстречу своим страхам :) Как модно говорить - расширять свою зону комфорта :)
Тем более Евгений чутко чувствует где дальнейшее погружение в тему стоит остановить, когда видит плавание в теме. Я это почувствовал. И если что-то не знаешь, то так и говорить.
@@user-gd1xv7lq6y Я тебе скажу так. Решение задач онлайн или на собесе, это долбанный стресс, что работодатель не использует как критерий оценки. Больше оценивается не само решение, не важно, верно или нет, а твои размышления, что есть очень важно. Ты ответил достойно, не парься!
@@user-bs2on1db6z Игорь, спасибо за поддержку :)
Привет, ошибаюсь я или нет, если скажу, что вариант алгоритма Бойера-Мура, который вы привели в своем решении по ссылке найдет цифру из которой состоит наиболее длинная последовательность этой цифры подряд, а не цифру, которая встречается чаще всего?
Жень, а расскажи, как понимать, какая сложность у алгоритма? Это просто заучивается, какая у списка, какая у сета?
Как таблица умножения - заучивается и всегда нужно уметь объяснить почему.
Здесь есть базовое объяснение:
proselyte.net/algorithms/intro/algorithms-complexity/
В решении алгоритмической задачи n не до 104, а до 10^4 (10 в 4-й степени), аналогично с ограничениями на элементы массива -- от -10^9 до 10^9.
Да, вы правы. Спасибо за уточнение.
Чтобы следить за изменениями в сторед процедурах , можно использовать Ликвибнйз или ФлайВей, и покрывать е2е тестами, а не юнит😅. Хотя в любом случае тогда надо создавать другую процедуру.
Конечно, есть варианты, но зачем? Тем более, когда мы сталкиваемся с необходимостью масштабировать систему - с БД это не так и просто :)
@@EugeneSuleimanov конечно, это я пошутил. А так сам столкнулся с такой фигнёй когда сервисы просто дёргают километровые сторед процедуры на всех эндпоинтах. Это жесть.
алгоритм.задача на алгоритм сортировки подсчетом( кажется ).саму сортировку вырезаем. основные алгоритмы надо знать как Отче наш перед собеседованиями, как я понял)
class Lesson {
public static void maxQuantitRepeat(int[] array)
{
final int MAX_VALUE = 5 * 104;
int[] count = new int[MAX_VALUE];
int maxQuantity = 0;
int maxRepeatElement = 0;
for (int i = 0; i < array.length ; i++) {
count[array[i]] = count[array[i]] + 1;
}
for (int i = 0; i < count.length; i++) {
if (count[i] > maxQuantity) {
maxQuantity = count[i];
maxRepeatElement = i;
}
}
System.out.println(maxRepeatElement);
}
public static void main(String args[])
{
int arr[] = { 2,2,1,1,2,2 };
maxQuantitRepeat(arr);
int arr1[] = { 3,1,3 };
maxQuantitRepeat(arr1);
}
}
Вот мой результат.
public static void main(String[] args) {
HashMap map = new HashMap();
int[] nums = new int[]{2, 1, 2, 1, 1, 5, 5, 5, 5};
for(int i = 0; i < nums.length; i++) {
int k = 0;
if(map.containsKey(nums[i]))
k = map.get(nums[i]);
map.put(nums[i], ++k);
}
System.out.println(map.entrySet().stream().max(Comparator.comparing(Map.Entry::getValue)).get().getKey());
}
@@overdrive5772 мне вот интересно, когда задачи такие на собеседованиях, типа надо показать, как ты знаешь алгоритмы сортировки разные и чтобы за On/Ologn решалось или строчи как хочешь, лишь бы ответ совпал
Хороший вариант, его можно оптимизировать и сократить код - я опубликую в разборе.
Да, рабочий вариант. Здесь сложность по памяти линейная - это можно оптимизировать.
Обычно, хотят посмотреть и послушать как человек размышляет. А уже потом понимание алгоритмов и структур данных. Хороший инженер должен их знать.
Как-то очень долго вы решение задачи рожали. Я уже давно вот это написал и несколько бутербродов съел:
public static int majorityElement(int[] nums) {
var mapNums = new HashMap();
final var halfLength = nums.length / 2;
for (var n : nums) {
var count = mapNums.compute(n, (k, v) -> v == null ? 1 : v + 1);
if (count > halfLength) {
return n;
}
}
throw new RuntimeException("can't find majority element");
}
Было бы клёво увидеть интервью с девушкой :)
Если есть кандидаты, которые хотят пройти собеседование - просто напишите на почту proselytear@yahoo.com
Никаких ограничений по полу нет :)
21:54
Разве сложность операции не становится равна Log(N) при большом количестве коллизий ?
Ведь если все объекты попадают в 1 ячейку, ячейка после преобразования становится TreeSetом, а худшее время у TreeSetа Log(N). Или это не так ?
Вы правы, с учетом оптимизации это так. Без неё - по классике - O(N)
А Джун ответил О(1). Главное - уверенно врать.
По хранимым процедурам я бы добавил что это плохо в случае с Java проектами, точнее с проэктами, которые основаны не на БД software(где всетаки вся логика пишется в самой бд), потому что если нам прийдется менять базу данных(например на nosql, graphdb, ну или другое рбд), то мы потеряем эту логику. И это просто ломает архитекутуру проекта, ведь смысл Spring'a в гибкости и возможности легко заменять слои сервиса(repository/service/controller). А использование процедур это нарушит.
Спасибо за комментарий и хорошее дополнение!
Если я правильно понял задачку, вот мое решение с учетом Constraints -109 109
public int majorityElement(int[] array){
int[] ar = new int[219];
Arrays.fill(ar,0);
int maxSize = 0;
int maxElement = array[0];
for (int i = 0; i < array.length; i++) {
if(++ar[array[i]] > maxSize){
maxElement = array[i];
maxSize = ar[array[i]];
}
}
return maxElement;
}
Первая половина меня просто удивила, думаю вот это мощный парень, про память в джаве как рассказал! А на практике с мапой потёк (( может переволновался просто?
Да, вероятнее всего из-за волнения
Женя, я правильно понял, что когда какое-то приложение (возможно веб-сервис) имеет сбой, тормозит - причина может заключаться в активизации Garbage Collector - удалении ненужного?
Чаще всего, это связано с кодом, который пишут разработчики, а не GC.
@@EugeneSuleimanov спасибо. Но с gc может быть тоже связанно?
@@anjelomanoranjan да, но крайне маловероятно.
@@EugeneSuleimanov спасибо. А ещё хочу тебя попросить, сделать харжкорное видео по тому, как разработчики ищут по трассировке стека крыши и правят их. Говорят - это очень сложный процесс. Хочется посмотреть как это все на практике)
Взяли ли кандидата на работу?
Что важнее в интервью, хорошо ориентироваться в теоретических вопросах или умение решить задачу?
Спасибо за комментарий!
Это мок-собеседование (тренировочное).
По важности - важно все в комплексе.
Первый вопрос от собеседующего и сразу его поправлю, мы не передаем переменные в методы, мы передаем значения этих переменных. А вот, как передаются эти значения в виде копий или видом ссылок на эти значения, вот тут и вопрос Не понимаю что хочешь получить в ответ, когда ставишь так вопрос. Почитайте что такое переменные.
Ваш ответ не корректный, если я верно все понял. Здесь можно поиграть в семантику, но технически этот комментарий не имеет смысла. Поправьте меня, пожалуйста, если я что-то упустил.
@@EugeneSuleimanov Спасибо за ваше внимание, да я поправлю с вашего разрешения. Переменная это область памяти, она обозначена именем в котором хранится физический адрес. По адресу в будущем будет сохранено значение определенного типа. Если вы решили создать функцию, то вы создаете адресное пространство с новыми переменными обозначающие свои личные (область видимости) адреса. И нельзя передать переменную от слова совсем. Но можно передать значение этой переменной. Вы же просто спросили - "Как функция принимает переменные?". Правильно поставлен вопрос должен был звучать - "Каким образом, созданные функции в программе, могут принимать значения переменных из другой области видимости, для данного языка программирования?"
Именно функции во множественном числе, иначе бы я попросил вас, показать мне ту функцию о которой вы лично спросили.
@@JIockjoy я понял о чем вы, спасибо. И как и говорил ранее - здесь семантика. Таким же образом можно усложнить и ваш вопрос (хоть передачи информации о состоянии кварков), но суть от этого не изменится. Для Java разработчиков - это одно и тоже.
Собеседования реально так проходят, или обычно ни кто не разжевывает так ничего?
Зависит от ситуации, но не всегда дают время кандидату на «раскачку»
Евгений, какой вердикт? Взяли бы парня, если бы это было реальное собеседование?
На позицию junior - да
По теории очень сильный, по практическому программированию достаточно слабый. Кстати часто встречается после интенсивных курсов где людей по теории натаскивают а практики практически нет.
Спасибо за комментарий!
Опыт - дело наживное.
Я не люблю теорию. лучше задачи. А лучше вообще тестовое задание а потом по нему разговаривать.
В реальности крайне небольшой процент достойных кандидатов соглашается на выполнение тестового до собеседования. Но вы правы - это хороший подход. Несколько раз сталкивался с ситуацией, когда на собеседовании просто нужно было реализовать простое АПИ (лайв кодинг) и по ходу выполнения как раз общались по коду.
@@EugeneSuleimanov нет мне кажется только синьор будет выебываться и откажется от тестового. А если джун или мидл. Так просто сократишь пул кандидатов. Другое дело, что тогда не удастся сбить зп во время собеса. Кстати апи с секьюрити и jwt ?
@@racot7145 нет, там было стандартное АПИ с немного мудрёной логикой.
@@EugeneSuleimanov Буквально вчера проходил собеседование на котором мы обсуждали мой код тестового задания - небольшое CRUD Spring Boot REST приложение. Мы шли по теории ООП, SOLID и Spring Core и одновременно меня просили показать в коде где я это использовал и найти ошибки. Затем меня попросили доработать свой метод, чтобы нам возвращался json с иерархической структурой сущностей @OneToMany. Этот практический блок я снова завалил. Потому что я пока не могу во время собеседования собрать мысли в кучу и сразу выдать решение. Мне нужно сначала подумать, поэкспериментировать с кодом. Затем пошли вопросы по мапе, шаблонам и т.д.
В общем волнение очень сильно мешает.
чудово
Дякую за відгук!
HashMap не коллекция
Не в иерархии Collection интерфейса, но входит в Collection Framework с версии 1.2
Элементарная задача, это тот самый случай, когда кандидат превосходно заучил теорию, но на практике в коде - никакущий, что сразу анулирует все его теор. знания. Поэтому всегда необходимы алгоритмические задачи на собеседованиях.
Моє побажання на майбутнє. Русачків не потрібно розвивати, нехай там в болоті в себе самі крутяться
Ппц, теперь я понял, что ничего не знаю про Java
Такая же штука :)
Привет, Женя а почему ты не спрашиваешь кандидатов гит?
Привет!
Спасибо за комментарий :)
По опыту - если кандидат сильный, то и так знает основные команды. А экзотика нужна крайне редко и легко ищется в доке. И сама необходимость использовать «экзотику» возникает только если процессы выстроены не лучшим образом.
@@EugeneSuleimanov Задал вопрос такой))) А сам за рабочий день не один комит не сделал, спасибо за контент!)
@@fara0n333 :)
Коммент для поддержки канала. Задачу можно по короче
private int majorityElement (int[] some) {
return Arrays.stream(some).boxed().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElse(0);
}
Большое спасибо за поддержку!