@Пожилой Программист посмотри с самого начала. На первых минутах он говорит о своих целях собеседования. Евгений и собеседник прекрасно понимают, что они делают.
36:01 Cache 1) во-первых имеет значение какой именно запрос: обычный query или получение сущности по id Query: 2) для обычных запросов в контексте кэша имеет значение включено ли кэширование запросов (аля кэш третьего уровня) 2.1) при использовании только первого или второго уровня кэша -- обращений к базе будет столько столько запросов, т.е. 4+4=8; 2.2) если запросы кэшированные - выполнится всего 3 запроса; get by id: 3) если под запросом подразумевается получение сущности по id (session.load(), get(), byId()), то: 3.1) если кэш первого уровня -- выполнится по 3 запроса для каждого юзера: 3+3=6; 3.2) если включен кэш второго уровня, то результаты запросов второго юзера будут браться уже из кэша: 3+0=3
Семён молодец. Хочу отметить, что приятно слушать человека, который может выражать мысли понятно. Местами может избыточно, но зато понятно) Жене как всегда респект за мок
Спасибо Евгению за интервью! Было очень круто, вопросы нестандартные и с плавным усложнением. Евгений, хотелось бы получить ответы и материалы на мои неправильные ответы, в частности с @Transactional и с кешами для Hibernate)
Отличное интервью! Евгению большое спасибо за новый микрофон и камеру, контент теперь воспринимается гораздо лучше) Интересно было бы узнать у Семена, почему перешел на java? Ведь делать "умные" железяки наверняка тоже прибыльно ну и еще приятное чувство, когда сразу видишь результат своей работы вживую. Тем более когда сейчас времени не хватает, автоматизация рутины с помощью "умных железок" весьма актуальна.
@@shane2899 Самая большая проблема, что для самые крутые и прибыльные проекты на моей прошлой работе включали в себя вахтовый метод или очень частые командировки, что ввиду текущих жизненных обстоятельств для меня не подходит. Выбор пал на джаву, потому что когда-то давно пришлось диплом в универе на ней писать, поэтому изначально какое-то понимание было о языке) Всем спасибо за теплые отзывы, это очень приятно) Данное интервью помогло выявить пробелы в тех областях, с которыми на данный момент достаточно редко приходиться взаимодействовать. Всем peace!
такие видео прямо очень полезны, когда собеседуешь мидла. чтобы понимать, что насколько разница между мидлом и джуном. было бы круто еще синьора собес посмотреть. а собеседник молодец. видимо очень хорошо усваивает академические знания.
Большое спасибо за интервью, очень ждал) Приятно видеть как растёт качество контента от выпуска к выпуску) Единственное что хотел бы посоветовать: возможно стоит добавить на стены немного аккустического поролона, слышно как звук отражается от стен создавая эхо, и тем самым немного портит качество записи. Но это по желанию, конечно. :)
31:31 проблема N+1 здесь Семён ошибся, а поскольку я сам долго не понимал в чем суть этой проблемы из-за того что ее часто неправильно формулируют, то для меня это принципиально, поэтому хочу прояснить этот момент. Проблема N+1 заключается в том, что когда мы запрашиваем *список родительских сущностей* -- не одну, а именно список, то выполняется один запрос на этот список и дополнительно N запросов -- по одному от каждой родительской сущности на получение дочерних списков. _select * from parent;_ превращается в: 1: select * from parent; 2: select * from child where parent_id=1; 3: select * from child where parent_id=2; ... N: select * from child where parent_id=N;
Вот достаточно лаконичное решение задачи на мой взгляд public static Map calculateRepeats(List input) { Map result = new HashMap(); if (input == null || input.isEmpty()) return Collections.emptyMap(); input.forEach(integer -> result.merge(integer, 1, Integer::sum)); return result; }
5 лет работаю java + spring и всю дорогу думаю для кого такие собеседования, что они показывают, как по ним можно что то понять о работе человека...Притом кто собеседовался в иностранные компании знает что там и близко нет такого. Обычно дают задачу, потом вместе смотрите на решение и могут быть вопросы почему тут так а там вот так сделал. Видно хотя бы что человек может. А тут как в институте, заучиваешь какую то якобы кому то нужную дичь, рассказываешь и ставят оценку. На видео парень заучил дохрена текста, вот единственный навык который тут проверяется. Почему именно в программировании люди проводят собеседования таким образом в РФ, где здравый смысл? Я например хочу нанять художника стену расписать, какая мне разница знает он о толщине волос кисточек из 18 века или чем кормили лошадь если кисть из лошадиных волос пахнет лавандой. Я просто попрошу его показать свои работы а потом дам простое задание практическое и это максимум. Но зато сразу видно какого уровня продукт он производит. Или вот вы хотите нанять к себе плиточника сделать кухню или ванную, неужели вы его будите про толщину плитки спрашивать и про то как вычислить площадь поверхности а потом когда он правильно ответит вы закроете глаза и не зная как он работает, какие у него есть готовые проекты просто отдадите ему деньги и квартиру. Делай что хочешь ты же знаешь про толщину плитки значит все будет ок. Мне кажется бизнес теряет хороших спецов по тому что доверили заучкам из институтов решать кого нанимать надо а кого нет. Они вместо того что бы думать о программисте как о человеке который должен делать работу думают о нем как о студенте в институте которого надо задрочить на собесе как когда то дрочили его самого. Это какая то месть что ли)
Это, конечно, правильно, но не совсем. Истина где-то по середине. Проверка уровня понимания темы также необходима. Знание подкапотного механизма сильно помогает в разработке, чтобы не вляпаться в мягкое. Это также говорит о том, что человек интересуется, имеет пытливый ум. А заучил интервьюи термины или реально понимает, о чём говорит, разобраться очень просто. Здесь больше не про кисти и плитку, а про автомат. Солдат должен, помимо хорошо стрелять, знать ТТХ оружия, как оно устроено, уметь его разобрать/собрать, чтобы использовать все возможности правильно и по максимуму.
@@faniskhalikov9736 Если знаете английский, то посмотрите ua-cam.com/video/1OpAgZvYXLQ/v-deo.html. Там дядька усатый очень хорошо рассказывает про Stream API
@@EugeneSuleimanov я может чего-то не знаю, но разве в контроллерах применяют ООП, паттерны, фреймворки? Ведь сам голый язык, любой, не так и сложно изучить. Самое большое время при изучении уходит на понимание архитектуры приложений, как именно надо делить приложение на классы и модули, как разделять приложения на слои, как строить взаимодействие между ними и т.д. Неужели это все применяется и в программировании контроллеров? Мне всегда казалось, что программки для контроллеров - это просто набор инструкций, где используется процедурный подход, и все, что надо знать - это синтаксис языка, допустим, С, который элементарен, побитовые операции, ну и саму архитектуру контроллера. Как это может помочь в разработке серьезных приложений, не очень понимаю.
@Пожилой Программист Вы точно херню пишете, то что не можете выучить/запомнить сами, не означает что другие не могут... Парень возможно приврал , что работает полгода.
За 15 тестовых собеседований, это смотреть сложнее всего... Семён столько ошибается, но при этом столько рассказывает да еще и с такой уверенностью. Мозг вскипает 🤯 Я его не упрекаю, это прям спецнавык -- на серьезных щах так что-то заливать и при том мимо, да еще и заворачивать такими формулировками, что порой неясно правильно он говорит или пургу несёт. Хорошее качество для работы с клиентами: надо так рассказать о состоянии проекта, чтоб они ничего не поняли, но посчитали, что работа в самом разгаре 😁
42:53 нельзя в спринге вызывать транзакционный метод из другого транзакционного (любого) метода *внутри одного класса*, т.к. при внутреннем вызове аннотация над вызываемым методом игнорируется, или другими словами, нельзя изменить поведение транзакции в процессе вызова другого метода внутри *того же* класса. Почему так: потому что при внешнем вызове мы обращаемся не к нашему классу, а к Spring proxy, который анализирует аннотации над методами. При внутреннем вызове -- мы обращаемся напрямую к нашему классу, а аннотации некому обрабатывать.
5:14 по поводу реализации hashCode: Объект может перемещаться по памяти в процессе работы приложения, поэтому hashCode это не совсем его адрес в памяти. Для хранения значения хешкода используется область заголовка объекта, это значение может быть лениво получено при ПЕРВОМ обращении к нему из адреса объекта по которому тот расположен в этот самый момент ПЕРВОГО обращения.
@@EugeneSuleimanov само собой, я имею в виду - у Вас есть ссылка на источник, где указана стратегия генерации хешкода? Я искал, но официального подтверждения не нашел.
Евгений, спасибо за работу. Подобного материала, именно такого качества, в сети трудно найти. PS, просто очень хочется узнать правильный ответ на Transactional, так как сам часто получаю этот вопрос. В этом интервью ведь ответ был не верный?
Я тоже не понимаю, почему половина каждого интервью про многопоточку. Причем я сейчас не только про интервью с Евгением, а и про те, на которых сам бывал. Потом приходишь на проект и никогда не сталкиваешься с многопоточкой в принципе.
@@durbanpoison8831 Мне кажется это как один из показателей глубины знаний джава в общем. Ну или может перестраховываются люди, чтоб если тебе раз в год дадут таск написать что-то с использованием ExecutorService, Future или банально где-то правильно влепить Atomic или Lock, то ты это написал сразу и правильно, а не за неделю и возможно неправильно)))
@@SleePokeR проблема, кмк, как раз в том, что вопросы эти теоретические "по списку", как на экзамене. Их можно заучить. Я никогда в жизни не работал с многопоточкой но многие ответы просто вызубрил для интервью, я знаю, как на них отвечать и какие могут быть в том числе дополнительные вопросы, но так как нет практики и все равно буду писать задачу неделю, как вы говорите и не факт, что правильно :)
В серьезных проектах часто надо написать параллельный поход в несколько сервисов\баз. Или просто микросервис с разделяяемым обновляемым ресурсом. А еще всякие опенсорс фреймворки очень любят косячить в многопоточке (сам ловил в недрах хадупа, например), так что пригодиться может в самый неожиданный момент.
Всем привет. Такой вопрос по 21:50 -- Что значит сделать потокобезопасным? Я мб чего-то не понимаю, но по-моему он изначально безопасен? Мы же не пишем в общий ресурс, мапа каждый раз новая создаётся. А из того листа, который к нам пришёл мы только читаем данные.
Да, вы правы. Я хотел попросить реализовать возможность распараллелить данный код (на случай больших объёмов данных на вход), но, потом решил не углубляться и поэтому данный фрагмент вышел размазанным и неоднозначным. Сам это заметил, но, не стал вырезать. Спасибо.
@@EugeneSuleimanov Вам спасибо за ответ, а то я уже подумал, что башка не варит после рабочего дня=) Отличное интервью, уровень кандидата хороший, и это только за полгода работы) У меня как-то в голове столько информации не задерживается( Вроде что-то новое периодически изучаешь, но во время просмотра таких видео иногда ловишь себя на мысли, что основы забываются(
Евгений, спасибо за видео. Было интересно посмотреть даже не смотря на опыт. Как думаете, на сколько $ при нынешней ситуации потянет такой разработчик, если окажется на рынке труда?
Евгений, есть вопрос: вот работаю я разработчиком. Но откровенно говоря, сам недоволен своим уровнем развития и хотел бы поднять теоретическую базу во всех направлениях: самом java, spring, алгоритмах, паттернах, с тем же sql поиграться, т.к. на практике мы его используем не очень много. Если просто брать и читать книгу: одну, вторую, то каждый раз начинается все с 0 и практики там не особо много. По факту без практики в голове остается маловато... Можешь посоветовать какой-то путь развития тем, кто уже что то знает, но хочет развиваться дальше. Мб, конкретную какую-то программу, а еще лучше онлайн курс, где будут затронуты все данные аспекты. Или хотя бы основные но основательно. Потому что я сам то одну дисциплину пройду, то про паттерны почитаю, - но как-то системности не вижу, от этого и прогресс около нулевой. Если сформировать вопрос кратко, то "от strong junior к strong middle за пол года". Есть что сказать по этому поводу?) ЗЫ кста, если, ты читаешь этот коммент, ты не Евгений, но тоже есть что сказать - буду признателен =)
Спасибо за интервью как всегда круто получилось, помогает и для прохождения интервью и для проведения!) Хочу все же уточнить один момент на 21:50 разве этот метод не потокобезопасен?
N+1 проблема неверный ведь ответ. Используя Lazy мы получаем n+1 проблему если в родителе есть коллекция. Отчасти проблему можно решить при помощи Eager, но если в родителе 2 коллекции, то получим новую проблему - декартовое произведение. Евгений, согласны или нет?
А можно более структурирванно про разницу между сериализацией и маршалингом? Я так понимаю, что сериализация это частный вид маршалинга. Семен начал говорить про кодовую базу и тут я перестал понимать.
здравствуйте подскажите сколько надо изучать java чтобы написать сервер или чат не списывая и не подсматривая или вы всё таки имеете конспект и подготовленные шпаргалки .Вот у меня проблема опыт программирования какой никакой есть по книге, выполняю все примеры, все задания. Пришёл к более сложному заданию, всё сделал вместе с автором всё работает. Но поймал себя на мысли что я не смогу написать это же код без книги или копипаста это нормально? нету четкого понимания цепочки действий тем самым скорость программирования очень медленное .пожалуйста расскажите как было у вас с этим
Крутое интервью, много ценной информации. Спасибо! Вопрос: сколько навскидку процентов веб-разработчиков на спринговом стеке реально сталкиваются с многопоточкой и работает с ней часто? То есть не просто заглянули, как у них что-то в проекте было давно кем-то написано, а прямо решают эти проблемы. Уж очень много вопросов о многопоточности. Большая часть интервью.
Пытаюсь понять давно смотрю твои видео, ты очень логичный, и это прекрасно, но не могу понять, зачем вырывать зуб не через рот, так же быстрее, Если конкретнее, достаточно было создать одно видео со всеми ответами тебя на твои же вопросы, и ты получил бы больше посмотрела и время всем сэкономил, и себе в т.ч..
@@erlankarabaliyev7330 так такие реалии сейчас. Никому не нужны джуны, которые ничего не знают. Никто не готов учить. Только если подсказывать и направлять.
3:15 у отрицательного инта отрицательный хешкод... а вот когда хешкоды используются для индексирования в массивах, например в хешмапе, то это неприятное обстоятельство устраняется при помощи битовых операций. Стандартный метод вычисления хешкода для ключа хешмапы: (result = hashCode) ^ (result >>> 16) Хешкод (Integer) -2 равен -2, тогда хешкод ключа для хешмапы: бинарное представление (int) -2: 1111 1111 1111 1111 1111 1111 1111 1110 -2 >>> 16: 0000 0000 0000 0000 1111 1111 1111 1111 -2 ^ (-2 >>> 16): 1111 1111 1111 1111 0000 0000 0000 0001 Получаем хешкод ключа: -65535 Он опять отрицательный, как же адресоваться к элементам массива с таким индексом? table[i = (table.length - 1) & hash] длинна массива всегда положительна, значит число (length-1) должно быть больше либо равно нулю, следовательно его старший бит (знаковый) также всегда равен нулю, далее операция логического "И" для нуля (+) и единицы (-) всегда даст 0, т.е. положительное число. Более того, результат всегда будет находиться в рамках [0; length-1]. Например, возьмем дефолтный размер таблицы 16: 0000 0000 0000 0000 0000 0000 0001 0000 (16-1): 0000 0000 0000 0000 0000 0000 0000 1111 (-65535): 1111 1111 1111 1111 0000 0000 0000 0001 (16-1) & (-65535): 0000 0000 0000 0000 0000 0000 0000 0001 что равно 1. Таким образом, ключ (Integer) -2 формирует позицию с индексом 1 во внутреннем массиве хешмапы.
Евгений прими у меня собес, если можешь, сейчас на middle на работу устраиваюсь, через пару недель буду собеседоваться, очень бы хотелось свой уровень проверить
19:51 Чувак сделал грубую ошибку: написал "++map.get(el)". Это прям расстраивает( Говорит о том, что кандидат плохо понимает, как работает префиксный инкремент. 21:18 Зачем выбрасывать NPE?) Выглядит так, что человек знает синтаксис языка, при этом не понимает, что и зачем пишет. Возникло ощущение, что кандидат знает теорию, при этом имеет мало опыта на практике
решение алгоритмической задачки с использованием локальной переменной типа ассоциативного массива не лучшее. Результат лаконичнее мог бы выглядеть так stream.collect(Collectors.toMap(i -> i, i -> 1, (i, j) -> i + 1))
Спасибо за видео. По моему мнению парень реально классно знает теорию, тут или память хорошая или хорошо подготовился. Но видно мало практики и на практических несложных вопросах плывет. Больше практических вопросов надо
Автор молодец. По хэшкоду, для любознательных - есть штук 5-6 стратегий генерации хешкода в jvm. Начиная от простой константы и счетчика, заканчивая различными функциями.
хотел бы спросить, почему метод изначально был не потокобезопасным на решении алго-задачи? Ведь с каждой темп-мапой работает только один поток, ибо при каждом вызове метода с отдельного потока создается отдельная мапа. Общей является только лист, но там мы просто читаем, ничего не меняем. Заранее благодарю
Привет Спасбо видео хочу тебя спросить как опытного (программиста, ...) Я заканчиваю 11 класс учу java (сейчас учу Pattern ... у тебя) Учу max-6 месяцев Как бысть я смогу найти работу и Самое главное что мне учить чтобы не расходы время. Хочу пойти на работу Java Developer если точнее JavaEE (потом может поменяю) Я из Винницы
офигеть Егор Крид в java шарит
Интервью такого уровня очень познавательно смотреть, можно увидеть свои пробелы и понять "в какую сторону гуглить". Спасибо, Евгений, за ваши видео)
Спасибо за отзыв)
@Пожилой Программист посмотри с самого начала. На первых минутах он говорит о своих целях собеседования. Евгений и собеседник прекрасно понимают, что они делают.
@Пожилой Программист можно аргументированно ? А то складывается впечатление что Вы написали херню
За новый микрофон и камеру лайк не глядя :)
Спасибо :)
@@EugeneSuleimanov )
@@EugeneSuleimanov ) до))щ) для
@@EugeneSuleimanov ДД
@@EugeneSuleimanov ДД
Микрофон, камера, таймкоды! Евгений, с новой камерой тебя не узнать!) С обновой, и рад видеть!)
Спасибо :)
36:01 Cache
1) во-первых имеет значение какой именно запрос: обычный query или получение сущности по id
Query:
2) для обычных запросов в контексте кэша имеет значение включено ли кэширование запросов (аля кэш третьего уровня)
2.1) при использовании только первого или второго уровня кэша -- обращений к базе будет столько столько запросов, т.е. 4+4=8;
2.2) если запросы кэшированные - выполнится всего 3 запроса;
get by id:
3) если под запросом подразумевается получение сущности по id (session.load(), get(), byId()), то:
3.1) если кэш первого уровня -- выполнится по 3 запроса для каждого юзера: 3+3=6;
3.2) если включен кэш второго уровня, то результаты запросов второго юзера будут браться уже из кэша: 3+0=3
Очень содержательное интервью. Евгению огромное спасибо за труды, Семён - молодец и умница.
Достойный собеседник. Приятно слушать.
Семён молодец. Хочу отметить, что приятно слушать человека, который может выражать мысли понятно. Местами может избыточно, но зато понятно)
Жене как всегда респект за мок
Спасибо Евгению за интервью! Было очень круто, вопросы нестандартные и с плавным усложнением. Евгений, хотелось бы получить ответы и материалы на мои неправильные ответы, в частности с @Transactional и с кешами для Hibernate)
Постараюсь сделать в финальном фидбеке. И спасибо!
Отличное интервью! Евгению большое спасибо за новый микрофон и камеру, контент теперь воспринимается гораздо лучше) Интересно было бы узнать у Семена, почему перешел на java? Ведь делать "умные" железяки наверняка тоже прибыльно ну и еще приятное чувство, когда сразу видишь результат своей работы вживую. Тем более когда сейчас времени не хватает, автоматизация рутины с помощью "умных железок" весьма актуальна.
@@shane2899 Самая большая проблема, что для самые крутые и прибыльные проекты на моей прошлой работе включали в себя вахтовый метод или очень частые командировки, что ввиду текущих жизненных обстоятельств для меня не подходит. Выбор пал на джаву, потому что когда-то давно пришлось диплом в универе на ней писать, поэтому изначально какое-то понимание было о языке)
Всем спасибо за теплые отзывы, это очень приятно) Данное интервью помогло выявить пробелы в тех областях, с которыми на данный момент достаточно редко приходиться взаимодействовать. Всем peace!
Хорошие вопросы в этом интервью, много чего охвачено
Спасибо за отзыв!
такие видео прямо очень полезны, когда собеседуешь мидла. чтобы понимать, что насколько разница между мидлом и джуном.
было бы круто еще синьора собес посмотреть.
а собеседник молодец. видимо очень хорошо усваивает академические знания.
Сеньору те же самые вопросы задают)) и ещё чуть-чуть больше
Было тут интервью с сеньором, вопросы первоначально те же, просто потом идёт углубление в тему
Семён, ты молодец! Я посмотрел всего 10 минут и мне зашло! Успехов тебе! Я сам тоже вышел из инженеров АСУ ТП и КИП)
Большое спасибо за интервью, очень ждал)
Приятно видеть как растёт качество контента от выпуска к выпуску)
Единственное что хотел бы посоветовать: возможно стоит добавить на стены немного аккустического поролона, слышно как звук отражается от стен создавая эхо, и тем самым немного портит качество записи. Но это по желанию, конечно. :)
круто что под видео подробное описание.
выделил. искать в гугле. и читаешь уже ответ.
прям обучение на ходу)))
Спасибо :)
Супер, гость силён, спасибо за выпуск 👍
Новый формат весьма радует! Спасибо!
31:31 проблема N+1
здесь Семён ошибся, а поскольку я сам долго не понимал в чем суть этой проблемы из-за того что ее часто неправильно формулируют, то для меня это принципиально, поэтому хочу прояснить этот момент.
Проблема N+1 заключается в том, что когда мы запрашиваем *список родительских сущностей* -- не одну, а именно список, то выполняется один запрос на этот список и дополнительно N запросов -- по одному от каждой родительской сущности на получение дочерних списков.
_select * from parent;_ превращается в:
1: select * from parent;
2: select * from child where parent_id=1;
3: select * from child where parent_id=2;
...
N: select * from child where parent_id=N;
Суперское интервью!
Спасибо :)
Первым делом лайк, потом просмотр
Супер классная рубрика, хорошие вопросы.
Спасибо за труд и за контент в целом. Сейчас прохожу паттерны GoF и всегда смотрю Ваши видео.
Вот достаточно лаконичное решение задачи на мой взгляд
public static Map calculateRepeats(List input) {
Map result = new HashMap();
if (input == null || input.isEmpty()) return Collections.emptyMap();
input.forEach(integer -> result.merge(integer, 1, Integer::sum));
return result;
}
Этот иф выглядит не очень, обрати внимание на CollectionUtils
Вот еще лаконичнее.
HashMap m = input.stream().collect(Collectors.toMap(t -> t, i->1 , Integer::sum, HashMap::new));
@@romanfirsov89 и ещё Map integersCountMap = integers.stream().collect(groupingBy(Function.identity(), counting()));
Крутое интервью)!!! Спасибо за труды
Спасибо за отзыв!
5 лет работаю java + spring и всю дорогу думаю для кого такие собеседования, что они показывают, как по ним можно что то понять о работе человека...Притом кто собеседовался в иностранные компании знает что там и близко нет такого. Обычно дают задачу, потом вместе смотрите на решение и могут быть вопросы почему тут так а там вот так сделал. Видно хотя бы что человек может. А тут как в институте, заучиваешь какую то якобы кому то нужную дичь, рассказываешь и ставят оценку. На видео парень заучил дохрена текста, вот единственный навык который тут проверяется. Почему именно в программировании люди проводят собеседования таким образом в РФ, где здравый смысл? Я например хочу нанять художника стену расписать, какая мне разница знает он о толщине волос кисточек из 18 века или чем кормили лошадь если кисть из лошадиных волос пахнет лавандой. Я просто попрошу его показать свои работы а потом дам простое задание практическое и это максимум. Но зато сразу видно какого уровня продукт он производит. Или вот вы хотите нанять к себе плиточника сделать кухню или ванную, неужели вы его будите про толщину плитки спрашивать и про то как вычислить площадь поверхности а потом когда он правильно ответит вы закроете глаза и не зная как он работает, какие у него есть готовые проекты просто отдадите ему деньги и квартиру. Делай что хочешь ты же знаешь про толщину плитки значит все будет ок. Мне кажется бизнес теряет хороших спецов по тому что доверили заучкам из институтов решать кого нанимать надо а кого нет. Они вместо того что бы думать о программисте как о человеке который должен делать работу думают о нем как о студенте в институте которого надо задрочить на собесе как когда то дрочили его самого. Это какая то месть что ли)
Это, конечно, правильно, но не совсем. Истина где-то по середине. Проверка уровня понимания темы также необходима. Знание подкапотного механизма сильно помогает в разработке, чтобы не вляпаться в мягкое. Это также говорит о том, что человек интересуется, имеет пытливый ум. А заучил интервьюи термины или реально понимает, о чём говорит, разобраться очень просто. Здесь больше не про кисти и плитку, а про автомат. Солдат должен, помимо хорошо стрелять, знать ТТХ оружия, как оно устроено, уметь его разобрать/собрать, чтобы использовать все возможности правильно и по максимуму.
Не, это первый этап только. Потом должно быть интервью с решением задач
Красава поднял уровень видео
Спасибо :)
Решение на Stream API:
return list.stream().collect(Collectors.toMap(e -> e, e -> 1, Integer::sum, TreeMap::new));
Спасибо, элегантно ) Разобрал, оказывается ничего сложного
@@faniskhalikov9736 Если знаете английский, то посмотрите ua-cam.com/video/1OpAgZvYXLQ/v-deo.html. Там дядька усатый очень хорошо рассказывает про Stream API
Этот же дядька про Collectors ua-cam.com/video/pGroX3gmeP8/v-deo.html
@@faniskhalikov9736 Можно элегантней) list.stream().collect(Collectors.groupingBy(k -> k, summingInt(k -> 1)))
Как же приятно послушать двух умных людей)
он точно работает джава девелопером пол года? или просто с первого раза все понимает и запоминает?)
согласен. тут миддл явный
@@NummeSpnet до этого контроллеры писал, а это мимо не походит )
@@EugeneSuleimanov я слышал. у меня на работе есть такие инженеры КИПиА, которые пишут на OMRON
@@EugeneSuleimanov я может чего-то не знаю, но разве в контроллерах применяют ООП, паттерны, фреймворки? Ведь сам голый язык, любой, не так и сложно изучить. Самое большое время при изучении уходит на понимание архитектуры приложений, как именно надо делить приложение на классы и модули, как разделять приложения на слои, как строить взаимодействие между ними и т.д. Неужели это все применяется и в программировании контроллеров? Мне всегда казалось, что программки для контроллеров - это просто набор инструкций, где используется процедурный подход, и все, что надо знать - это синтаксис языка, допустим, С, который элементарен, побитовые операции, ну и саму архитектуру контроллера. Как это может помочь в разработке серьезных приложений, не очень понимаю.
@Пожилой Программист Вы точно херню пишете, то что не можете выучить/запомнить сами, не означает что другие не могут... Парень возможно приврал , что работает полгода.
#Нифигасебе! Сегодня не "прокуренный балкон", а студия подкаста прям)) Хотя суть от этого не меняется, но глазу приятно. Благодарю!
Спасибо :)
За 15 тестовых собеседований, это смотреть сложнее всего...
Семён столько ошибается, но при этом столько рассказывает да еще и с такой уверенностью. Мозг вскипает 🤯 Я его не упрекаю, это прям спецнавык -- на серьезных щах так что-то заливать и при том мимо, да еще и заворачивать такими формулировками, что порой неясно правильно он говорит или пургу несёт.
Хорошее качество для работы с клиентами: надо так рассказать о состоянии проекта, чтоб они ничего не поняли, но посчитали, что работа в самом разгаре 😁
Классное интервью, спасибо обоим
Лайк - отлично!
Но по сложности, до красно-черного дерева почти прижал;) отличный собез - хоть и по верхам
Мне до него ещё год учить надо.
Интересные интервью снимаете
42:53 нельзя в спринге вызывать транзакционный метод из другого транзакционного (любого) метода *внутри одного класса*, т.к. при внутреннем вызове аннотация над вызываемым методом игнорируется, или другими словами, нельзя изменить поведение транзакции в процессе вызова другого метода внутри *того же* класса.
Почему так: потому что при внешнем вызове мы обращаемся не к нашему классу, а к Spring proxy, который анализирует аннотации над методами. При внутреннем вызове -- мы обращаемся напрямую к нашему классу, а аннотации некому обрабатывать.
Таким людям надо посложнее задачки давать 😁.
вся задача на знание метода merge()
5:14 по поводу реализации hashCode:
Объект может перемещаться по памяти в процессе работы приложения, поэтому hashCode это не совсем его адрес в памяти. Для хранения значения хешкода используется область заголовка объекта, это значение может быть лениво получено при ПЕРВОМ обращении к нему из адреса объекта по которому тот расположен в этот самый момент ПЕРВОГО обращения.
Это зависит от реализации JVM. В современных версиях - это просто псевдослучайное число.
@@EugeneSuleimanov а не подскажите на какой источник можно сослаться на собеседовании, если у интервьюера будет иное мнение?
@@AlexeySilichenko документация или авторитетная статья
@@EugeneSuleimanov само собой, я имею в виду - у Вас есть ссылка на источник, где указана стратегия генерации хешкода?
Я искал, но официального подтверждения не нашел.
@@AlexeySilichenko в данном случае - код + дока к коду. Код реализации JVM.
Супер! Очень круто!
Спасибо!
беру на работу. Молодца
Все супер! По причёске сразу видно - удалёнка))
Это точно :))
Надеюсь ето не на джуна собеседование?)))
На стажёра*
Евгений, надеюсь с вами все хорошо...ждем весточки.
Да, всё хорошо, спасибо :) Был крайне загружен по работе, но, сейчас должно быть легче и попробую в этом месяце выпустить новые видео.
Евгений, спасибо за работу. Подобного материала, именно такого качества, в сети трудно найти. PS, просто очень хочется узнать правильный ответ на Transactional, так как сам часто получаю этот вопрос. В этом интервью ведь ответ был не верный?
Ааа кто-то меня вчера спрашивал про кеши в хибернете )), гц с микром
ошибочка containsKey() а не contains кажется
О, rode приехал!)
Такой вопрос:
На собеседованиях часто спрашивают про многопоточность?
Я так понимаю она не на всех проектах используется
Я тоже не понимаю, почему половина каждого интервью про многопоточку. Причем я сейчас не только про интервью с Евгением, а и про те, на которых сам бывал. Потом приходишь на проект и никогда не сталкиваешься с многопоточкой в принципе.
@@durbanpoison8831 Мне кажется это как один из показателей глубины знаний джава в общем. Ну или может перестраховываются люди, чтоб если тебе раз в год дадут таск написать что-то с использованием ExecutorService, Future или банально где-то правильно влепить Atomic или Lock, то ты это написал сразу и правильно, а не за неделю и возможно неправильно)))
@@SleePokeR проблема, кмк, как раз в том, что вопросы эти теоретические "по списку", как на экзамене. Их можно заучить. Я никогда в жизни не работал с многопоточкой но многие ответы просто вызубрил для интервью, я знаю, как на них отвечать и какие могут быть в том числе дополнительные вопросы, но так как нет практики и все равно буду писать задачу неделю, как вы говорите и не факт, что правильно :)
При понимании многопоточности и памяти, другими глазами смотришь на код
В серьезных проектах часто надо написать параллельный поход в несколько сервисов\баз. Или просто микросервис с разделяяемым обновляемым ресурсом. А еще всякие опенсорс фреймворки очень любят косячить в многопоточке (сам ловил в недрах хадупа, например), так что пригодиться может в самый неожиданный момент.
Здравствуйте, хотел узнать можно ли как-то попасть к Вам на интервью
можно видео про докер(с нуля)? или как за деплоить pet project на сервак?
а за микрофон и камеру большое спасибо))
Всем привет. Такой вопрос по 21:50 -- Что значит сделать потокобезопасным? Я мб чего-то не понимаю, но по-моему он изначально безопасен? Мы же не пишем в общий ресурс, мапа каждый раз новая создаётся. А из того листа, который к нам пришёл мы только читаем данные.
Да, вы правы. Я хотел попросить реализовать возможность распараллелить данный код (на случай больших объёмов данных на вход), но, потом решил не углубляться и поэтому данный фрагмент вышел размазанным и неоднозначным. Сам это заметил, но, не стал вырезать.
Спасибо.
@@EugeneSuleimanov Вам спасибо за ответ, а то я уже подумал, что башка не варит после рабочего дня=) Отличное интервью, уровень кандидата хороший, и это только за полгода работы) У меня как-то в голове столько информации не задерживается( Вроде что-то новое периодически изучаешь, но во время просмотра таких видео иногда ловишь себя на мысли, что основы забываются(
@@SleePokeR Согласен, все переменные локальные и каждый поток, который в метод будет заходить будет создавать новые инстансы
Тоже сижу и думаю над этим после просмотра, спасибо за вопрос и ответ, а то уж было подумал, что я совсем ку-ку)))
Лайк, не глядя
Евгений, спасибо за видео. Было интересно посмотреть даже не смотря на опыт. Как думаете, на сколько $ при нынешней ситуации потянет такой разработчик, если окажется на рынке труда?
В Москве от 200 тысяч смело можно просить. И это вопрос 1-2 дней. Можно и на 250 зайти,если по собесам побольше походить.
Хороший был бы вопрос для собеседования: отличие EntityManager от SessionFactory
Евгений, привет! Спасибо за видео! Люблю твои алгоритмические задачи.
Если кому интересно лаконичное решение -
private static Map calculateRepeats(List ints) {
return ints.stream() .collect(HashMap::new, (map, i) -> map.put(i, map.containsKey(i) ? map.get(i) + 1 : 1), (map, result) -> result.putAll(map));
}
Однако вопрос - а читаемо ли оно? :) Весьма спорно.
@Nonnull
private static Map countElements(@Nonnull List input) {
return input.stream()
.collect(Collectors.groupingByConcurrent(
x -> x,
ConcurrentHashMap::new,
Collectors.counting()));
}
Евгений, как бы вы оценили знания парня?
По моему мнению - твёрдый мидл точно.
Евгений, есть вопрос: вот работаю я разработчиком. Но откровенно говоря, сам недоволен своим уровнем развития и хотел бы поднять теоретическую базу во всех направлениях: самом java, spring, алгоритмах, паттернах, с тем же sql поиграться, т.к. на практике мы его используем не очень много.
Если просто брать и читать книгу: одну, вторую, то каждый раз начинается все с 0 и практики там не особо много. По факту без практики в голове остается маловато...
Можешь посоветовать какой-то путь развития тем, кто уже что то знает, но хочет развиваться дальше.
Мб, конкретную какую-то программу, а еще лучше онлайн курс, где будут затронуты все данные аспекты. Или хотя бы основные но основательно.
Потому что я сам то одну дисциплину пройду, то про паттерны почитаю, - но как-то системности не вижу, от этого и прогресс около нулевой.
Если сформировать вопрос кратко, то "от strong junior к strong middle за пол года".
Есть что сказать по этому поводу?)
ЗЫ кста, если, ты читаешь этот коммент, ты не Евгений, но тоже есть что сказать - буду признателен =)
Присоединяюсь к вопросу
dmdev канал на ютубе, теория основательно поднимается, практика тоже на уровне
@@timon59388 спс, посмотрю
Хорошее интервью, но задача действительно слишком легкая. Подобное решается за месяц изучение джавы
Спасибо за интервью как всегда круто получилось, помогает и для прохождения интервью и для проведения!)
Хочу все же уточнить один момент на 21:50 разве этот метод не потокобезопасен?
Спасибо за отзыв!
По поводу вопроса - уже писал ниже, что вопрос не корректен с моей стороны.
N+1 проблема неверный ведь ответ. Используя Lazy мы получаем n+1 проблему если в родителе есть коллекция. Отчасти проблему можно решить при помощи Eager, но если в родителе 2 коллекции, то получим новую проблему - декартовое произведение. Евгений, согласны или нет?
А можно к вам на собеседование?)
У меня скоро собеседование и волосы дыбом встали от таких вопросов, а потом увидел что это в Украине и выдохнул. 😰
Эти вопросы интернациональны) Тут еще не жестили, так как собес всего 40 минут, сильно по верхам.
А можно более структурирванно про разницу между сериализацией и маршалингом?
Я так понимаю, что сериализация это частный вид маршалинга.
Семен начал говорить про кодовую базу и тут я перестал понимать.
@Eugene_Suleimanov, Так он верно ответил про кеши 1 и 2 уровня? сколько запросов будет?
здравствуйте подскажите сколько надо изучать java чтобы написать сервер или чат не списывая и не подсматривая или вы всё таки имеете конспект и подготовленные шпаргалки .Вот у меня проблема опыт программирования какой никакой есть по книге, выполняю все примеры, все задания. Пришёл к более сложному заданию, всё сделал вместе с автором всё работает. Но поймал себя на мысли что я не смогу написать это же код без книги или копипаста это нормально? нету четкого понимания цепочки действий тем самым скорость программирования очень медленное .пожалуйста расскажите как было у вас с этим
Жаль не увидел решение задачи с использованием группировки Stream API (как предложил Евгений). То что предложил собеседуемый (через forEach) - не айс
Крутой если полгода
Микрофон в кадре вроде не из плохих, а звук будто на микроф вебки дешевой записан. Качество звука ужасное
Техника в руках дикаря... )
> Попробуй сейчас сделать текущий метод потоко-безопасным 21:55
Это как?
Уже отвечал на этот вопрос, если кратко, то ерунду сказал )
Евгений здравствуйте, не могли бы вы посоветовать что-нибудь по Java для продвинутых (книги)?
Если именно по языку и не для новичков, то вот:
www.amazon.com/Effective-Java-Joshua-Bloch/dp/0134685997
О каком инструменте была речь в последнем вопросе про интеграционное тестирование микросервисов? Не расслышал(((
Это подход CI/CD.
Крутое интервью, много ценной информации. Спасибо! Вопрос: сколько навскидку процентов веб-разработчиков на спринговом стеке реально сталкиваются с многопоточкой и работает с ней часто? То есть не просто заглянули, как у них что-то в проекте было давно кем-то написано, а прямо решают эти проблемы. Уж очень много вопросов о многопоточности. Большая часть интервью.
Сложно сказать, по моим наблюдениям, процентов 20-30.
@@EugeneSuleimanov Спасибо за ответ. Ну, это прилично так, да.
когду новое видео?
Пол года учит джаву?) Никогда не поверю
Судя по достаточно глубокому понимаю теории, у парня минимум пара лет опыта
Пол года работает програмистом на java.
Тот случай когда с 1.5х поставил на 1.0х 😂
Короче, если бы я был, то я провалил полностью.
peek нельзя использовать
Как у вас прокатила строчка ++map.get(el) ?
Здесь же сам подход важен, поэтому на такие вещи можно и закрыть глаза иногда :)
@@EugeneSuleimanov Скажите пожалуйста, вы занимаетесь курированием новичков, на начальных этапах карьеры?
Мне прям было стремно слушать сначала, когда понимал, что чел знает внутрянку явы лучше меня, но когда дошло до практики, все встало на свои места...
Пытаюсь понять давно смотрю твои видео, ты очень логичный, и это прекрасно, но не могу понять, зачем вырывать зуб не через рот, так же быстрее,
Если конкретнее, достаточно было создать одно видео со всеми ответами тебя на твои же вопросы, и ты получил бы больше посмотрела и время всем сэкономил, и себе в т.ч..
Цели у видео несколько другие. Не в ответах счастье... )
@@EugeneSuleimanov Я уважаю то что ты делаешь, я лишь предложил
Собеседование на позицию junior???
да, а на какую еще, если человек полгода только работает?
@@phat80 вопросы сложные
@@erlankarabaliyev7330 так такие реалии сейчас. Никому не нужны джуны, которые ничего не знают. Никто не готов учить. Только если подсказывать и направлять.
Согласен
3:15 у отрицательного инта отрицательный хешкод...
а вот когда хешкоды используются для индексирования в массивах, например в хешмапе, то это неприятное обстоятельство устраняется при помощи битовых операций.
Стандартный метод вычисления хешкода для ключа хешмапы:
(result = hashCode) ^ (result >>> 16)
Хешкод (Integer) -2 равен -2, тогда хешкод ключа для хешмапы:
бинарное представление (int) -2:
1111 1111 1111 1111 1111 1111 1111 1110
-2 >>> 16:
0000 0000 0000 0000 1111 1111 1111 1111
-2 ^ (-2 >>> 16):
1111 1111 1111 1111 0000 0000 0000 0001
Получаем хешкод ключа: -65535
Он опять отрицательный, как же адресоваться к элементам массива с таким индексом?
table[i = (table.length - 1) & hash]
длинна массива всегда положительна, значит число (length-1) должно быть больше либо равно нулю, следовательно его старший бит (знаковый) также всегда равен нулю, далее операция логического "И" для нуля (+) и единицы (-) всегда даст 0, т.е. положительное число. Более того, результат всегда будет находиться в рамках [0; length-1].
Например, возьмем дефолтный размер таблицы 16:
0000 0000 0000 0000 0000 0000 0001 0000
(16-1):
0000 0000 0000 0000 0000 0000 0000 1111
(-65535):
1111 1111 1111 1111 0000 0000 0000 0001
(16-1) & (-65535):
0000 0000 0000 0000 0000 0000 0000 0001
что равно 1.
Таким образом, ключ (Integer) -2 формирует позицию с индексом 1 во внутреннем массиве хешмапы.
Евгений прими у меня собес, если можешь, сейчас на middle на работу устраиваюсь, через пару недель буду собеседоваться, очень бы хотелось свой уровень проверить
Напишите на почту - proselytear@yahoo.com - обсудим детали.
не реальные знания.....мегамозг
19:51 Чувак сделал грубую ошибку: написал "++map.get(el)". Это прям расстраивает( Говорит о том, что кандидат плохо понимает, как работает префиксный инкремент.
21:18 Зачем выбрасывать NPE?) Выглядит так, что человек знает синтаксис языка, при этом не понимает, что и зачем пишет.
Возникло ощущение, что кандидат знает теорию, при этом имеет мало опыта на практике
Ю
Юзю9}
За {{{
Собес на программиста похож (наверное) на то как встречают зэки в хате. Задают абсолютно бесполезные вопросы с целью выявить насколько ты свой
решение алгоритмической задачки с использованием локальной переменной типа ассоциативного массива не лучшее. Результат лаконичнее мог бы выглядеть так stream.collect(Collectors.toMap(i -> i, i -> 1, (i, j) -> i + 1))
Весьма продвинутый парень.
За {{{
В Москве с такими знаниями можно смело от 250 тысяч на руки просить.
Спасибо за видео. По моему мнению парень реально классно знает теорию, тут или память хорошая или хорошо подготовился. Но видно мало практики и на практических несложных вопросах плывет. Больше практических вопросов надо
Автор молодец. По хэшкоду, для любознательных - есть штук 5-6 стратегий генерации хешкода в jvm. Начиная от простой константы и счетчика, заканчивая различными функциями.
Мощный выпуск, гость прокачанный, спасибо за труды!
Спасибо за отзыв!
Ёмаё, очень ценный материал. Я прям вовремя наткнулся на ваш канал, Евгений! Спасибо большое! Очень интересно увидеть процесс интервьюирования)
Спасибо :)
хотел бы спросить, почему метод изначально был не потокобезопасным на решении алго-задачи? Ведь с каждой темп-мапой работает только один поток, ибо при каждом вызове метода с отдельного потока создается отдельная мапа. Общей является только лист, но там мы просто читаем, ничего не меняем. Заранее благодарю
Евгений, подскажите как можно попасть на ваше собеседование?
Привет Спасбо видео хочу тебя спросить как опытного (программиста, ...)
Я заканчиваю 11 класс учу java (сейчас учу Pattern ... у тебя)
Учу max-6 месяцев
Как бысть я смогу найти работу и Самое главное что мне учить чтобы не расходы время.
Хочу пойти на работу Java Developer если точнее JavaEE (потом может поменяю) Я из Винницы
Спасибо за ролик
довольно хороший разработчик
взгляд как от специалиста уровня middle (belarus)
Да, уровень хороший
ну так его и спрашивали, не как джуна)