Вчера с учеником проводили мок-собеседование по темам:
🦸♂️ SOLID
🎮 Интерфейсы
🎮 Функциональные интерфейсы
🎮 Лямбды
🎮 Stream API
Вот несколько (на мой взгляд) интересных вопросов на эту тему:
1. Можете привести пример того, как внедрение функциональных интерфейсов помогло сохранить обратную совместимость?
2. Часто говорят, что есть терминальные и промежуточные операции в стримах. Но есть еще ленивые и не ленивые операции, stateful и stateless операции. Можете рассказать о них?
3. Почему функциональный интерфейс может быть создан только с 1 абстрактным методом?
4. Приведите пример нарушения принципа LSP
5. Что такое Spliterator и связан ли он со Stream API, если да, то каким образом?
Накидайте своих ответов в коментах, а чуть погодя скину вам свои шпоры по этим темам 🖨
Вот несколько (на мой взгляд) интересных вопросов на эту тему:
1. Можете привести пример того, как внедрение функциональных интерфейсов помогло сохранить обратную совместимость?
2. Часто говорят, что есть терминальные и промежуточные операции в стримах. Но есть еще ленивые и не ленивые операции, stateful и stateless операции. Можете рассказать о них?
3. Почему функциональный интерфейс может быть создан только с 1 абстрактным методом?
4. Приведите пример нарушения принципа LSP
5. Что такое Spliterator и связан ли он со Stream API, если да, то каким образом?
Накидайте своих ответов в коментах, а чуть погодя скину вам свои шпоры по этим темам 🖨
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥6
Привет, друзья!
Как обещал кидаю шпоры по темам из предыдущего поста, надеюсь будет полезно 🤗
👽 Примеры нарушения SOLID
👽 Вопросы по интерфейсам
👽 Вопросы по Stream API
Последнее время что-то тяжко поднять жопу и нагенерить контента для группы, не говоря уже о видосах.
Я сам себе обещал 10 постов за 2 недели.
Завтра две недели подойдут к концу и это мой второй пост😀
Поделитесь, как вы мотивируете себя делать важные вещи?
Как обещал кидаю шпоры по темам из предыдущего поста, надеюсь будет полезно 🤗
Последнее время что-то тяжко поднять жопу и нагенерить контента для группы, не говоря уже о видосах.
Я сам себе обещал 10 постов за 2 недели.
Завтра две недели подойдут к концу и это мой второй пост
Поделитесь, как вы мотивируете себя делать важные вещи?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤3👍2
Когда я учился на Java разработчика мне было сложно .
Сложна не сама Java, хотя она и не проста. А сложно долгое время находиться в состоянии неопределенности.
Сколько еще учиться? А получится ли у меня?
Было сложно продолжать заниматься этим, когда на собесы не звали несколько месяцев подряд🤯 .
В самые трудные времена меня поддерживали чужие истории успеха.
Я думал раз у них получилось, то и я смогу.
Я смог.
Как смог и Никита , о котором я писал почти год назад, а недавно получил отзыв и от него💪
Как сможет и любой человек, продолжительное время фокусирующий свои усилия на своей цели🎯 .
Ну а если вы уже смогли 💪, то поделитесь своей историей. Это капец как помогает ребятам, которые пока еще только взбираются на эту гору 🏔
Сложна не сама Java, хотя она и не проста. А сложно долгое время находиться в состоянии неопределенности.
Сколько еще учиться? А получится ли у меня?
Было сложно продолжать заниматься этим, когда на собесы не звали несколько месяцев подряд
В самые трудные времена меня поддерживали чужие истории успеха.
Я думал раз у них получилось, то и я смогу.
Я смог.
Как смог и Никита , о котором я писал почти год назад, а недавно получил отзыв и от него
Как сможет и любой человек, продолжительное время фокусирующий свои усилия на своей цели
Ну а если вы уже смогли 💪, то поделитесь своей историей. Это капец как помогает ребятам, которые пока еще только взбираются на эту гору 🏔
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤🔥4🔥2💯2❤1
Ребята, вдруг стало интересно узнать кто тут во что играет)
Прокликайте плз: Я имел опыт (хоть мало мальский и чисто для себя) программирования на стеках:
Прокликайте плз: Я имел опыт (хоть мало мальский и чисто для себя) программирования на стеках:
Anonymous Poll
89%
Java + Spring MVC
14%
Java + Spring Webflux
4%
Kotlin + Spring MVC
2%
Kotlin + Sping Webflux
2%
Все это херня, щас напишу в комментах на чем люди кодят
🔥4
Задача которая меня вымотала
Дисклеймер: Писал с телефона в состоянии индифферентности к форматированию
На работе меня передали в аренду в другую команду для реализации интеграции со сторонней системой.
Задача по интеграции заключалась в том, чтобы забрать данные из двух табличек сторонней базы данных в наши таблицы, а потом, на основании полученных данных, формировать записи в третьей таблице.
Первый камень о который я споткнулся называется Microsoft SQL Server. Это именно та база из которой нужно было забирать данные.
А второй камень - это r2dbc. У нас на проекте стоит Kotlin и WebFlux, реактивный стек. А r2dbc - это реактивный драйвер для баз данных.
Ну так вот, нужно мне фильтрануть данные в исходной табличке по дате.
В базе стоит тип smalldatetime. В документации майкрософта написано, что для Java smalldatetime парсится в java.sql.Timestamp.
Но r2dbc не поддерживает java.sql.Timestamp, он поддерживает LocalDateTime. Но при передачи значения фильтра в виде LocalDateTime ругается уже MS SQL.
Ну не хотят дружить, со всеми бывает. Решил передать значение фильтра по дате тупо как строку и распарсить в самом запросе.
Что-то типа такого:
‘’’
Select *
From table
Where date > CAST(‘2024-07-14 10:00:00’ as smalldatetime)
‘’’
И вроде заработало… А вроде и нет. Часть дат парсится нормально, а часть падает с ошибкой.
С помощью метода тыка, танцев с бубном и заветов Ванги возникла одна безумная теория.
А что если все даты отображаются в базе в формате YYYY-MM-DD, но парсить их надо в формате YYYY-DD-MM?
Безумие, скажете вы. Продукты майкрософт отвечу я. Да действительно. Оказалось нужно передавать сначала день, потом месяц. Но при отображении в бд все отображается по человески.
Тут мои мозги закончились вместе с желанием разбираться дальше почему люди не любят пилить интеграции, но впереди меня ждало еще много интересных, но очень не вкусных открытий.
Ставь 🔥, если интересно почитать через что я прошел, чтобы запилить MR на 2.7К строк, и расскажу почему я не люблю r2dbc и как я в очередной раз убедился что от соприкосновения со всем, где в названии есть слово Microsoft все таки укачивает.
На работе меня передали в аренду в другую команду для реализации интеграции со сторонней системой.
Задача по интеграции заключалась в том, чтобы забрать данные из двух табличек сторонней базы данных в наши таблицы, а потом, на основании полученных данных, формировать записи в третьей таблице.
Первый камень о который я споткнулся называется Microsoft SQL Server. Это именно та база из которой нужно было забирать данные.
А второй камень - это r2dbc. У нас на проекте стоит Kotlin и WebFlux, реактивный стек. А r2dbc - это реактивный драйвер для баз данных.
Ну так вот, нужно мне фильтрануть данные в исходной табличке по дате.
В базе стоит тип smalldatetime. В документации майкрософта написано, что для Java smalldatetime парсится в java.sql.Timestamp.
Но r2dbc не поддерживает java.sql.Timestamp, он поддерживает LocalDateTime. Но при передачи значения фильтра в виде LocalDateTime ругается уже MS SQL.
Ну не хотят дружить, со всеми бывает. Решил передать значение фильтра по дате тупо как строку и распарсить в самом запросе.
Что-то типа такого:
‘’’
Select *
From table
Where date > CAST(‘2024-07-14 10:00:00’ as smalldatetime)
‘’’
И вроде заработало… А вроде и нет. Часть дат парсится нормально, а часть падает с ошибкой.
С помощью метода тыка, танцев с бубном и заветов Ванги возникла одна безумная теория.
А что если все даты отображаются в базе в формате YYYY-MM-DD, но парсить их надо в формате YYYY-DD-MM?
Безумие, скажете вы. Продукты майкрософт отвечу я. Да действительно. Оказалось нужно передавать сначала день, потом месяц. Но при отображении в бд все отображается по человески.
Тут мои мозги закончились вместе с желанием разбираться дальше почему люди не любят пилить интеграции, но впереди меня ждало еще много интересных, но очень не вкусных открытий.
Ставь 🔥, если интересно почитать через что я прошел, чтобы запилить MR на 2.7К строк, и расскажу почему я не люблю r2dbc и как я в очередной раз убедился что от соприкосновения со всем, где в названии есть слово Microsoft все таки укачивает.
🔥27❤2👍1😁1
Как разбирать проблемы в коде?
Сегодня на курсе разбирал проблему с JS-скриптом, и вдруг понял, что при разборе практически любой проблемы я делаю одно и то же.
Представьте, вы кликаете на ссылку. Что происходит дальше?
1. Отправляется запрос на сервер.⤵️
2. Выполняется код контроллера.⤵️
3. Контроллер вызывает метод сервиса.⤵️
4. Сервис обращается к репозиторию.⤵️
5. Репозиторий формирует SQL-запрос в базу данных.⤵️
6. База возвращает данные обратно в репозиторий.⤵️
7. Репозиторий передаёт их сервису.⤵️
8. Сервис возвращает данные контроллеру.⤵️
9. Контроллер отправляет результат в веб-интерфейс.⤵️
Это как доставка посылки: вы забираете её из пункта выдачи и возвращаетесь домой.
Данные — это ваша "посылка", а маршрут — это выполнение кода программы.
Важно знать этот маршрут и контрольные точки, через которые проходят данные🗺 .
Контрольные точки — это методы в коде, и на каждой из них данные могут изменять свой вид. Например:
🃏 Запрос — это JSON.
🃏 В контроллере данные преобразуются в объект DTO.
🃏 В сервисе — это уже сущность (Entity).
Понимание того, как выглядят данные на каждой контрольной точке, помогает быстро обнаружить место, где что-то идёт не так.
Итак, чтобы эффективно находить проблемы:
1. Поймите маршрут потока данных.
2. Определите ключевые контрольные точки.
3. Проверьте, как данные меняются на каждом этапе.
Следуя этому алгоритму, разбор любой проблемы становится намного проще.
Будь у меня волшебная кнопка, я бы насильно впихнул эту простую истину в каждую голову.
Я часто вижу как ребята не пользуются этими простыми правилами и прыгая растерянно от класса к классу выглядят как потерявшиеся телята на незнакомом пастбище.
Сегодня на курсе разбирал проблему с JS-скриптом, и вдруг понял, что при разборе практически любой проблемы я делаю одно и то же.
Представьте, вы кликаете на ссылку. Что происходит дальше?
1. Отправляется запрос на сервер.
2. Выполняется код контроллера.
3. Контроллер вызывает метод сервиса.
4. Сервис обращается к репозиторию.
5. Репозиторий формирует SQL-запрос в базу данных.
6. База возвращает данные обратно в репозиторий.
7. Репозиторий передаёт их сервису.
8. Сервис возвращает данные контроллеру.
9. Контроллер отправляет результат в веб-интерфейс.
Это как доставка посылки: вы забираете её из пункта выдачи и возвращаетесь домой.
Данные — это ваша "посылка", а маршрут — это выполнение кода программы.
Важно знать этот маршрут и контрольные точки, через которые проходят данные
Контрольные точки — это методы в коде, и на каждой из них данные могут изменять свой вид. Например:
Понимание того, как выглядят данные на каждой контрольной точке, помогает быстро обнаружить место, где что-то идёт не так.
Итак, чтобы эффективно находить проблемы:
1. Поймите маршрут потока данных.
2. Определите ключевые контрольные точки.
3. Проверьте, как данные меняются на каждом этапе.
Следуя этому алгоритму, разбор любой проблемы становится намного проще.
Будь у меня волшебная кнопка, я бы насильно впихнул эту простую истину в каждую голову.
Я часто вижу как ребята не пользуются этими простыми правилами и прыгая растерянно от класса к классу выглядят как потерявшиеся телята на незнакомом пастбище.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍3❤2
Где взять время?
Один из наиболее злободневных вопросов. Где взять время на изучение Java?
Где взять время на изучение чего-либо? Где мне взять время на посты, менторскую деятельность, другие мои проекты?
В целом я не знаю, расходимся)
Ну серьезно, дополнительного времени не взять ниоткуда, это ограниченный ресурс, который мы можем только как-то распределять.
Это очень похоже на проблему потребления ресурсов приложением.
У приложения может возрастать нагрузка. Пользователей становится все больше, ресурсы потребляются более активно.
Да, мы можем добавить оперативки, поднять мощность железа, но в конце концов мы упремся в некоторый предел.
В какой-то момент придется пересматривать архитектурный подход, внедрять кэширование, поднимать реплики сервисов, добавлять nosql и проводить рефакторинг.
Мы можем вывезти условно 10к юзеров на простых инструментах, но если хотим кратно большей выдержки, то просто вынуждены будем пересматривать наш инструментарий.
Так и в жизни. У каждого из нас есть определенный набор инструментов- паттернов поведения. Режим сна, питания, спорта, развлечений, работы, зависимостей (конструктивных и деструктивных).
Каждому из нас его личный набор таких инструментов обеспечил определенный уровень жизни.
Если мы хотим кратного улучшения уровня нашей жизни, лучшей работы, лучшего тела, лучшего партнера итд, итп, то нам нужно пересматривать архитектурные подходы, которые лежат в основе нашего внутреннего психического устройства.
Какая-то реклама психотерапии получилась, а не менторства по Java 😄
Но с другой стороны заметил, что в менторстве, помимо передачи структурированных знаний, нужно давать моральную поддержку и мотивацию 🥊
И кажется, что структурированные знания самостоятельно получить гораздо легче, чем вот эту вот гармонию от единения с бесконечно вечным 🧘
Итого не ищите время, ищите утечки времени)
Один из наиболее злободневных вопросов. Где взять время на изучение Java?
Где взять время на изучение чего-либо? Где мне взять время на посты, менторскую деятельность, другие мои проекты?
В целом я не знаю, расходимся)
Ну серьезно, дополнительного времени не взять ниоткуда, это ограниченный ресурс, который мы можем только как-то распределять.
Это очень похоже на проблему потребления ресурсов приложением.
У приложения может возрастать нагрузка. Пользователей становится все больше, ресурсы потребляются более активно.
Да, мы можем добавить оперативки, поднять мощность железа, но в конце концов мы упремся в некоторый предел.
В какой-то момент придется пересматривать архитектурный подход, внедрять кэширование, поднимать реплики сервисов, добавлять nosql и проводить рефакторинг.
Мы можем вывезти условно 10к юзеров на простых инструментах, но если хотим кратно большей выдержки, то просто вынуждены будем пересматривать наш инструментарий.
Так и в жизни. У каждого из нас есть определенный набор инструментов- паттернов поведения. Режим сна, питания, спорта, развлечений, работы, зависимостей (конструктивных и деструктивных).
Каждому из нас его личный набор таких инструментов обеспечил определенный уровень жизни.
Если мы хотим кратного улучшения уровня нашей жизни, лучшей работы, лучшего тела, лучшего партнера итд, итп, то нам нужно пересматривать архитектурные подходы, которые лежат в основе нашего внутреннего психического устройства.
Какая-то реклама психотерапии получилась, а не менторства по Java 😄
Но с другой стороны заметил, что в менторстве, помимо передачи структурированных знаний, нужно давать моральную поддержку и мотивацию 🥊
И кажется, что структурированные знания самостоятельно получить гораздо легче, чем вот эту вот гармонию от единения с бесконечно вечным 🧘
Итого не ищите время, ищите утечки времени)
👍7🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Всем привет!
Расскажу что происходит в моей жизни.
Работа 😔
Очень. Много. Работы.
С одной стороны обычная пятидневка, но сил забирает больше, чем если бы у меня было три вечно недовольные жены.
В этом месяце я стал проводить технические интервью. Провел около 10.
Основная проблема у соискателей с иммутабельностью. Не многие могут определить в коде проблемы с мутабельными сущностями.
Разработал крутой модуль, который позволяет отображать на карте технику и поезда с их фактическим перемещением. Разработал его ранее, а в этом месяце перевел его на стероиды.
Запилил интеграцию с внешней системой и работал на двух тимлидов сразу. Понял, что не люблю когда меня отдают в аренду кому-то.
Боролся с выгоранием. И в этом мне помогла
Бачата.
Когда-то я писал, что хожу на нее. Теперь же уже отходил год и 3 месяца. И вот я мидл бачата танцор, лол. Занимаюсь по 6-10 часов в неделю. Рекомендую всем, действенное средство от выгорания, поднятие энергии, и, наверное, силы земли) Видос моих танцевальных потугов выше 🕺
Курс.
Когда-то в мае я запускал курс по разработке проектов на спринге. В ноябре курс подошел к концу.
Скоро я буду запускать второй поток, и подробнее расскажу о том, что там и как.
Наставничество.
Буквально сегодня у меня появился второй ученик и теперь их у меня целых 2)
Влад разрабатывает анонимный чат на микросервисах и брокерах сообщений. Кажется что проект довольно интересный, чувствую вот это вот наитие внутри и зуд в ручках. Надеюсь наша работа будет плодотворной. 📑👨💻
Борьба с самим собой.
Я выпал из ведения блога, из-за выгорания на работе и загрузки большой. Понимаю что есть множество вещей, о которых хочется рассказать, но как то сложно ворваться в активный ритм после перерыва, а начать с чего-то нужно.
В планах стараться как-то максимально лайтово вкатиться в создание интересного контента. Будем посмотреть, что из этого выйдет 🙏
Хотелось конечно подобрать иллюстраций ко всему, но привычка все записывать и фоткать еще не сформирована, так что ловите только часть танца поздравления 😅
Расскажу что происходит в моей жизни.
Работа 😔
Очень. Много. Работы.
С одной стороны обычная пятидневка, но сил забирает больше, чем если бы у меня было три вечно недовольные жены.
В этом месяце я стал проводить технические интервью. Провел около 10.
Основная проблема у соискателей с иммутабельностью. Не многие могут определить в коде проблемы с мутабельными сущностями.
Разработал крутой модуль, который позволяет отображать на карте технику и поезда с их фактическим перемещением. Разработал его ранее, а в этом месяце перевел его на стероиды.
Запилил интеграцию с внешней системой и работал на двух тимлидов сразу. Понял, что не люблю когда меня отдают в аренду кому-то.
Боролся с выгоранием. И в этом мне помогла
Бачата.
Когда-то я писал, что хожу на нее. Теперь же уже отходил год и 3 месяца. И вот я мидл бачата танцор, лол. Занимаюсь по 6-10 часов в неделю. Рекомендую всем, действенное средство от выгорания, поднятие энергии, и, наверное, силы земли) Видос моих танцевальных потугов выше 🕺
Курс.
Когда-то в мае я запускал курс по разработке проектов на спринге. В ноябре курс подошел к концу.
Скоро я буду запускать второй поток, и подробнее расскажу о том, что там и как.
Наставничество.
Буквально сегодня у меня появился второй ученик и теперь их у меня целых 2)
Влад разрабатывает анонимный чат на микросервисах и брокерах сообщений. Кажется что проект довольно интересный, чувствую вот это вот наитие внутри и зуд в ручках. Надеюсь наша работа будет плодотворной. 📑👨💻
Борьба с самим собой.
Я выпал из ведения блога, из-за выгорания на работе и загрузки большой. Понимаю что есть множество вещей, о которых хочется рассказать, но как то сложно ворваться в активный ритм после перерыва, а начать с чего-то нужно.
В планах стараться как-то максимально лайтово вкатиться в создание интересного контента. Будем посмотреть, что из этого выйдет 🙏
Хотелось конечно подобрать иллюстраций ко всему, но привычка все записывать и фоткать еще не сформирована, так что ловите только часть танца поздравления 😅
🔥13❤6👍1
Когда работа аналитиком в команде с разрабами, которые прям задрали со своими уточнениями по тз достала, и ты пошла в стюардессы, но проф-деформацию еще не проработала 🗿
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6🤣2
Всем привет!
Вчера писал, что на технических интервью многие соискатели испытывают проблемы с mutable/immutable сущностями.
Один из вопросов который мы задаем такой:
🤔 Как сделать объект immutable?
Большинство ребят отвечают примерно так:
1. Сделать класс final
2. Все поля - final, задавать их через конструктор
3. Убрать сеттеры
С этим я согласен, но мало кто вспоминает про еще один пункт:
4. Для ссылочных типов в геттерах необходимо возвращать копии объектов.
Если спросить зачем нам нужны immutable классы, часто можно услышать, что такие классы более безопасны.
Но чувствуется, что большинству недостает понимания потенциальной опасности использования mutable структур.
Рассмотрим такой пример. Как вы думаете, что не так с этим классом?🤔
Проблемы могут быть не так очевидны, в связке с ломбоком, однако они есть.
Попробуйте определить их самостоятельно, прежде чем читать сокрытый текст.
1. В конструкторе передается ссылка на объект списка и присваевается полю names.
А это значит, что если список, который передали в конструктор класса будет модифицирован, он изменится и в объекте demo.
2. В геттере возвращается ссылка на объект списка names.
А это значит, что данный список, могут модифицировать извне.
Это можно увидеть в коде ниже:
Такое может привести к ошибкам в программе⚠️
И это один из примеров того, почему immutable классы более безопасны.
Есть еще одна вещь, но она в большей степени на слуху.
У immutable объектов не изменится hashCode3️⃣ 6️⃣ 0️⃣ 8️⃣ 8️⃣ 7️⃣ 1️⃣
Что делает их более предпочтительными для использования в Hash-коллекциях
Но в основном, у большинства возникают сложности с обнаружением проблем в рабочем коде.
Будьте внимательны при работе с mutable классами, они таят в себе скрытую угрозу🔫
Вчера писал, что на технических интервью многие соискатели испытывают проблемы с mutable/immutable сущностями.
Один из вопросов который мы задаем такой:
Большинство ребят отвечают примерно так:
1. Сделать класс final
2. Все поля - final, задавать их через конструктор
3. Убрать сеттеры
С этим я согласен, но мало кто вспоминает про еще один пункт:
4. Для ссылочных типов в геттерах необходимо возвращать копии объектов.
Если спросить зачем нам нужны immutable классы, часто можно услышать, что такие классы более безопасны.
Но чувствуется, что большинству недостает понимания потенциальной опасности использования mutable структур.
Рассмотрим такой пример. Как вы думаете, что не так с этим классом?
@AllArgsConstructor
@Getter
class Demo {
private List<String> names;
}
Проблемы могут быть не так очевидны, в связке с ломбоком, однако они есть.
Попробуйте определить их самостоятельно, прежде чем читать сокрытый текст.
1. В конструкторе передается ссылка на объект списка и присваевается полю names.
А это значит, что если список, который передали в конструктор класса будет модифицирован, он изменится и в объекте demo.
2. В геттере возвращается ссылка на объект списка names.
А это значит, что данный список, могут модифицировать извне.
Это можно увидеть в коде ниже:
public static void main(String[] args) {
final var names = new ArrayList<>(List.of("e1", "e2"));
final var demo = new Demo(names);
names.add("e3");
// [e1, e2, e3]
System.out.println(demo.getNames());
final var newNames = demo.getNames();
newNames.add("e4");
// [e1, e2, e3, e4]
System.out.println(demo.getNames());
}Такое может привести к ошибкам в программе
И это один из примеров того, почему immutable классы более безопасны.
Есть еще одна вещь, но она в большей степени на слуху.
У immutable объектов не изменится hashCode
Что делает их более предпочтительными для использования в Hash-коллекциях
Но в основном, у большинства возникают сложности с обнаружением проблем в рабочем коде.
Будьте внимательны при работе с mutable классами, они таят в себе скрытую угрозу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤5👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Кажется, чем старше становится человек, тем осознаннее его любовь к мемасам)
🤣8🔥6😁4
5 пет-проектов, которые реально помогли стать Java разработчиками
Если все время учить Java Core и ООП, и не браться за создание пет-проекта, то можно стать очень похожим на человека, который знает 100 техник соблазнения, но остается девственником 🫣.
Сегодня вы узнаете, с помощью каких проектов мои ученики удовлетворили влажные фантазии горячих HR специалистов и сказали своей карьерной невинности прощай⚡
Погнали🔜
1️⃣ Хранилище скриптов продаж.
Представьте себе страницу на которой можно делать всего две вещи:
1. Создавать и редактировать скрипты продаж
2. Скопировать скрипт продаж в буфер обмена
Добавьте сюда авторизацию, и получите пет-проект, который принес первое трудоустройство
2️⃣ Система заказа питания для школьников.
Приложение с веб-интерфейсом, через который учителя формируют заказ продуктов питания для школьников с отправкой заказов на кухню по email.
Проект, который реально внедрили в школу и который принес трудоустройство #2
3️⃣ Абонементы в качалку.
Система с веб-интерфейсом и ТГ-ботом для управления абонементами в качалке.
Вжух, и еще одна компания закрыла острую потребность в молодом и перспективном специалисте
4️⃣ Система для управления бронированием записей к барберу
Видели барберов, к которым можно записаться через ТГ бот?
Я тоже не видел, проект не вышел в прод)
Но это и не важно.
А знаете что важно?
Правильно - еще одна взбалмошная представительница касты HR осталась удовлетворена проделанной работой и закрытой дырой в кадровом ресурсе 😏
Когда твоя мечта сходу попасть в сбер, то выход один:
5️⃣ Система, которая рассчитывает премию для кредитных специалистов в банке.
По сути система, которая заменила бы excel файл, по которому производится расчет премии для банковских сотрудников.
Почему заменила бы? Потому что ребята продолжают использовать excel. Но это и не важно. Почему? Правильно, потому что это трудоустройство #5, прямо в сбер.
Так что если ты все еще учишь Java core, то:
1. Найди кого-то, кому нужно что-то
2. Сделай это что-то на Java за банку соленых огурцов
3. Теперь ты фрилансер
4. Найди ближайшую HR и скажи то, что видишь на картинке к посту
5. Профит, твоя жизнь никогда не будет прежней
PS В январе я запускаю второй поток своего курса по созданию пет-проекта на Spring, ставь 🔥если интересно узнать, какой проект мы будем делать
Если все время учить Java Core и ООП, и не браться за создание пет-проекта, то можно стать очень похожим на человека, который знает 100 техник соблазнения, но остается девственником 🫣.
Сегодня вы узнаете, с помощью каких проектов мои ученики удовлетворили влажные фантазии горячих HR специалистов и сказали своей карьерной невинности прощай
Погнали
Представьте себе страницу на которой можно делать всего две вещи:
1. Создавать и редактировать скрипты продаж
2. Скопировать скрипт продаж в буфер обмена
Добавьте сюда авторизацию, и получите пет-проект, который принес первое трудоустройство
Приложение с веб-интерфейсом, через который учителя формируют заказ продуктов питания для школьников с отправкой заказов на кухню по email.
Проект, который реально внедрили в школу и который принес трудоустройство #2
Система с веб-интерфейсом и ТГ-ботом для управления абонементами в качалке.
Вжух, и еще одна компания закрыла острую потребность в молодом и перспективном специалисте
Видели барберов, к которым можно записаться через ТГ бот?
Я тоже не видел, проект не вышел в прод)
Но это и не важно.
А знаете что важно?
Правильно - еще одна взбалмошная представительница касты HR осталась удовлетворена проделанной работой и закрытой дырой в кадровом ресурсе 😏
Когда твоя мечта сходу попасть в сбер, то выход один:
По сути система, которая заменила бы excel файл, по которому производится расчет премии для банковских сотрудников.
Почему заменила бы? Потому что ребята продолжают использовать excel. Но это и не важно. Почему? Правильно, потому что это трудоустройство #5, прямо в сбер.
Так что если ты все еще учишь Java core, то:
1. Найди кого-то, кому нужно что-то
2. Сделай это что-то на Java за банку соленых огурцов
3. Теперь ты фрилансер
4. Найди ближайшую HR и скажи то, что видишь на картинке к посту
5. Профит, твоя жизнь никогда не будет прежней
PS В январе я запускаю второй поток своего курса по созданию пет-проекта на Spring, ставь 🔥если интересно узнать, какой проект мы будем делать
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤4👍4
Затестил ИИ от сбера, прикольно и немного наивно)
Как бы то ни было, типы ссылок в Java.
В Java есть 4 типа ссылок.
1. Сильная ссылка (Strong Reference)
Это стандартная ссылка, которую вы используете каждый день.
Объект, на который ссылается хотя бы 1 сильная ссылка не будет удален сборщиком мусора.
📌 Пример:
🔥 Когда использовать: Всегда, если объект должен быть в памяти.
2. Мягкая ссылка (Soft Reference)
Если на объект ссылаются только мягкие ссылки, такой объект может быть удален сборщиком мусора в случае нехватки памяти.
📌 Пример:
🔥 Когда использовать: Для кэшей, которые можно восстановить.
3. Слабая ссылка (Weak Reference)
Если объект не имеет сильных или мягких ссылок, сборщик мусора безжалостно удалит его из памяти.
📌 Пример:
🔥 Когда использовать: Например, для ключей в WeakHashMap.
4. Фантомная ссылка (Phantom Reference)
Используется для отслеживания объектов перед их удалением из памяти, что, в свою очередь, позволяет приложению получать уведомления о том, что объект готов к финализации. То есть, мы имеем возможность выполнить определенные действия перед его окончательным удалением.
Это самый слабый тип ссылок в Java. Когда объект становится доступным только через фантомную ссылку, это означает, что он уже помечен для удаления и это является неизбежным. Мы не можем получить доступ к самому объекту и его данным, а лишь сигнал о том, что объект будет удален.
📌 Пример:
🔥 Когда использовать: Для работы с системными ресурсами.
Честно скажу, с вероятностью 94.5% эта инфа вам не понадобится в работе 🤷♂️
Но на собесе может оказаться крайне полезной🤓
Как бы то ни было, типы ссылок в Java.
В Java есть 4 типа ссылок.
1. Сильная ссылка (Strong Reference)
Это стандартная ссылка, которую вы используете каждый день.
Объект, на который ссылается хотя бы 1 сильная ссылка не будет удален сборщиком мусора.
📌 Пример:
String strongRef = "Hello";
🔥 Когда использовать: Всегда, если объект должен быть в памяти.
2. Мягкая ссылка (Soft Reference)
Если на объект ссылаются только мягкие ссылки, такой объект может быть удален сборщиком мусора в случае нехватки памяти.
📌 Пример:
SoftReference<String> softRef = new SoftReference<>(new String("Soft"));
String value = softRef.get();🔥 Когда использовать: Для кэшей, которые можно восстановить.
3. Слабая ссылка (Weak Reference)
Если объект не имеет сильных или мягких ссылок, сборщик мусора безжалостно удалит его из памяти.
📌 Пример:
WeakReference<String> weakRef = new WeakReference<>(new String("Weak"));
String value = weakRef.get();🔥 Когда использовать: Например, для ключей в WeakHashMap.
4. Фантомная ссылка (Phantom Reference)
Используется для отслеживания объектов перед их удалением из памяти, что, в свою очередь, позволяет приложению получать уведомления о том, что объект готов к финализации. То есть, мы имеем возможность выполнить определенные действия перед его окончательным удалением.
Это самый слабый тип ссылок в Java. Когда объект становится доступным только через фантомную ссылку, это означает, что он уже помечен для удаления и это является неизбежным. Мы не можем получить доступ к самому объекту и его данным, а лишь сигнал о том, что объект будет удален.
📌 Пример:
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> phantomRef = new PhantomReference<>(new String("Phantom"), queue);
🔥 Когда использовать: Для работы с системными ресурсами.
Честно скажу, с вероятностью 94.5% эта инфа вам не понадобится в работе 🤷♂️
Но на собесе может оказаться крайне полезной🤓
👍8🔥7
🔥 Проблемы изоляции транзакций: как это выглядит в жизни и коде 🚀
Обещал рассказать про сложности, с которыми я столкнулся на работе.
Долго думал, как описать это интересно, понятно и без нарушения NDA. Вот что получилось! 😊
🧠 Представим кофейню:
Клиент делает заказ. Он участник программы лояльности, у него есть баллы.
☕️ Кассир спрашивает:
"Молодой человек, что делаем с баллами? Списываем или копим?"
👤 Клиент отвечает:
"Списываем!"
Кассир нажимает кнопки и говорит:
"Подтвердите списание!"
Клиент достаёт телефон, заходит в Телеграм и видит сообщение от бота:
💬 "Вы уверены, что хотите списать 324 балла?"
Кнопки: 🔘 Да | 🔘 Нет
Клиент нажимает Да, касса печатает чек.
Как это работает на сервере? 🖥
На сервере процесс списания баллов требует подтверждения. Всё начинается с запроса:
1️⃣ В таблице client_ask фиксируется вопрос клиенту и ожидается его ответ.
2️⃣ На основании ID созданной записи отправляется сообщение клиенту в ТГ.
3️⃣ Сервер ждёт, когда в записи появится ответ в колонке response.
Код выглядит примерно так: 👇
🤯 Где начинаются проблемы?
Метод
Метод
🚨 Ошибка!
Данные, созданные транзакцией
Причина: уровень изоляции транзакций по умолчанию —
Транзакция видит только закоммиченные изменения.
🔧 Как мы решили проблему?
Мы выбрали простой, но спорный метод:
👉
Да, это костыль, но он работает. 😅
🛠 Какие ещё есть варианты?
1️⃣ Событийно-ориентированная архитектура:
Можно отправлять события вместо прямого обновления БД.
2️⃣ Выделить создание записи в отдельный сервис:
Это откроет новую транзакцию, которая завершится, и данные станут видимыми.
3️⃣ Изменить уровень изоляции:
Попробовать
А как бы вы решили такую задачу? Делитесь мыслями в комментариях! ✍️
Обещал рассказать про сложности, с которыми я столкнулся на работе.
Долго думал, как описать это интересно, понятно и без нарушения NDA. Вот что получилось! 😊
🧠 Представим кофейню:
Клиент делает заказ. Он участник программы лояльности, у него есть баллы.
☕️ Кассир спрашивает:
"Молодой человек, что делаем с баллами? Списываем или копим?"
👤 Клиент отвечает:
"Списываем!"
Кассир нажимает кнопки и говорит:
"Подтвердите списание!"
Клиент достаёт телефон, заходит в Телеграм и видит сообщение от бота:
💬 "Вы уверены, что хотите списать 324 балла?"
Кнопки: 🔘 Да | 🔘 Нет
Клиент нажимает Да, касса печатает чек.
Как это работает на сервере? 🖥
На сервере процесс списания баллов требует подтверждения. Всё начинается с запроса:
1️⃣ В таблице client_ask фиксируется вопрос клиенту и ожидается его ответ.
2️⃣ На основании ID созданной записи отправляется сообщение клиенту в ТГ.
3️⃣ Сервер ждёт, когда в записи появится ответ в колонке response.
Код выглядит примерно так: 👇
@Service
public class MyService {
@Autowired
private ClientAskRepository clientAskRepository;
@Autowired
private TgMessageService messageService;
@Transactional
public void askClient() {
ClientAsk clientAsk = new ClientAsk(1L, null);
clientAskRepository.save(clientAsk);
// Отправка запроса на подтверждение
messageService.sendClientAsk(clientAsk);
while (clientAsk.getResponse() == null) {
// Ждём ответа
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
clientAsk = clientAskRepository.findById(clientAsk.getId()).orElse(null);
}
}
@Transactional
public void saveClientResponse(Long id, String response) {
clientAskRepository.findById(id).ifPresent(clientAsk -> {
clientAsk.setResponse(response);
clientAskRepository.save(clientAsk);
});
}
}
🤯 Где начинаются проблемы?
Метод
askClient создаёт запись и отправляет запрос в ТГ бот. Он ждёт, пока response обновится.Метод
saveClientResponse должен записывать ответ, но...🚨 Ошибка!
Данные, созданные транзакцией
askClient, недоступны для других транзакций, пока они не закоммичены.Причина: уровень изоляции транзакций по умолчанию —
READ_COMMITTED.Транзакция видит только закоммиченные изменения.
🔧 Как мы решили проблему?
Мы выбрали простой, но спорный метод:
👉
saveClientResponse создаёт новую запись, а askClient ждёт появления новой записи вместо обновления существующей.Да, это костыль, но он работает. 😅
🛠 Какие ещё есть варианты?
1️⃣ Событийно-ориентированная архитектура:
Можно отправлять события вместо прямого обновления БД.
2️⃣ Выделить создание записи в отдельный сервис:
Это откроет новую транзакцию, которая завершится, и данные станут видимыми.
3️⃣ Изменить уровень изоляции:
Попробовать
READ_UNCOMMITTED. Но, увы, в нашем случае это не помогло.А как бы вы решили такую задачу? Делитесь мыслями в комментариях! ✍️
👍7❤3⚡2🔥1
Короче написал полотно текста, выдал всю боль, натер мазоли на пальцах и в мозгу, попросил чат gpt расставить смайлики для поста в телегу, он взял и тупо перехерачил весь текст, оставив от моих интеллектуальных потугов процентов 20…
Вышло вроде хорошо, но как то бездушно, искусственно.
Но я че, я лентяй, и так сойдет. Не самому же эти смайлики расставлять 😅
PS речь про предыдущий пост
Вышло вроде хорошо, но как то бездушно, искусственно.
Но я че, я лентяй, и так сойдет. Не самому же эти смайлики расставлять 😅
PS речь про предыдущий пост
🔥7😁4👾1