Совет: держите код рядом. Следите, чтобы вычисление было как можно ближе к месту, где используется это значение. Это улучшает читаемость и удобство рефакторинга, снижает вероятность багов и делает код более устойчивым к ошибкам.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Совет по Java: используйте
👉 Java Portal
Collectors.groupingBy(...), чтобы группировать результаты стрима по классификатору.Please open Telegram to view this post
VIEW IN TELEGRAM
👀4
Пессимистическая vs оптимистическая блокировка
Частый вопрос на собеседованиях по backend.
[Пессимистическая блокировка]: -
- Запись недоступна другим потокам, пока текущий поток не закончит с ней работу.
- Даже чтение данных другими потоками невозможно, пока блокировка не снята.
- Пример:
- Минусы: снижает производительность при высоком уровне конкуренции.
- Когда использовать: когда критически важна точность данных.
[Оптимистическая блокировка]: -
- Не блокирует данные при чтении, но при сохранении проверяет версию записи.
- Пример: аннотация
- Если версия изменилась другим потоком, выбрасывается
- Минусы: нужно разруливать конфликты.
- Когда использовать: когда чтений много, а вероятность конфликтов низкая.
Какой подход ты чаще используешь в своих проектах?
👉 Java Portal
Частый вопрос на собеседованиях по backend.
[Пессимистическая блокировка]: -
- Запись недоступна другим потокам, пока текущий поток не закончит с ней работу.
- Даже чтение данных другими потоками невозможно, пока блокировка не снята.
- Пример:
EntityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE) в JPA.- Минусы: снижает производительность при высоком уровне конкуренции.
- Когда использовать: когда критически важна точность данных.
[Оптимистическая блокировка]: -
- Не блокирует данные при чтении, но при сохранении проверяет версию записи.
- Пример: аннотация
@Version в JPA (колонка для хранения версии).- Если версия изменилась другим потоком, выбрасывается
OptimisticLockException.- Минусы: нужно разруливать конфликты.
- Когда использовать: когда чтений много, а вероятность конфликтов низкая.
Какой подход ты чаще используешь в своих проектах?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Задумывался, как работают ActiveMQ и RabbitMQ?
В основе у них producer/consumer паттерн.
Как его реализовать?
Это базовая схема обмена данными между несколькими потоками. Поток-продюсер отправляет объекты на условную обработку, а потоки-консьюмеры асинхронно их получают и обрабатывают.
Общий вид решения такой:
продюсер кладет объекты в специальную коллекцию, буфер. Когда консьюмер освобождается, он запрашивает из буфера один объект. Если буфер пустой, консьюмер блокируется и ждёт; если буфер переполнен, ждёт продюсер.
Реализовать этот паттерн можно по-разному.
Самый правильный способ для продакшена: брать готовую реализацию из стандартной библиотеки, например
На собеседованиях обычно просят написать реализацию с нуля. На картинке показан один из вариантов.
Модификатор
👉 Java Portal
В основе у них producer/consumer паттерн.
Как его реализовать?
Это базовая схема обмена данными между несколькими потоками. Поток-продюсер отправляет объекты на условную обработку, а потоки-консьюмеры асинхронно их получают и обрабатывают.
Общий вид решения такой:
продюсер кладет объекты в специальную коллекцию, буфер. Когда консьюмер освобождается, он запрашивает из буфера один объект. Если буфер пустой, консьюмер блокируется и ждёт; если буфер переполнен, ждёт продюсер.
Реализовать этот паттерн можно по-разному.
Самый правильный способ для продакшена: брать готовую реализацию из стандартной библиотеки, например
BlockingQueue.На собеседованиях обычно просят написать реализацию с нуля. На картинке показан один из вариантов.
Модификатор
synchronized гарантирует, что в один момент времени выполняется только один из методов и только одним потоком. Этого достаточно для корректной работы, пока буфер не пуст и не переполнен. Когда буфер пустой или полный, управление явно передаётся продюсеру или консьюмеру соответственно через notify() и wait().Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Почему твой бэкенд начинает тупить на 10k юзеров, хотя на 100 всё летало
Обычно причина одна из этих:
1️⃣ N+1 запросы
→ один запрос незаметно триггерит сотню походов в БД
2️⃣ Нет индексов
→ на каждом поиске полный проход по таблице
3️⃣ Тяжелая работа синхронно
→ письма, обработка картинок прямо внутри request cycle
4️⃣ Нет стратегии кеширования
→ один и тот же запрос в БД выполняется 1000 раз
5️⃣ Единая точка отказа
→ один инстанс БД тащит на себе вообще всё
Приложение не стало внезапно медленным.
Оно просто доросло до момента, когда плохие решения стали заметны.
👉 Java Portal
Обычно причина одна из этих:
→ один запрос незаметно триггерит сотню походов в БД
→ на каждом поиске полный проход по таблице
→ письма, обработка картинок прямо внутри request cycle
→ один и тот же запрос в БД выполняется 1000 раз
→ один инстанс БД тащит на себе вообще всё
Приложение не стало внезапно медленным.
Оно просто доросло до момента, когда плохие решения стали заметны.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤2
Совет по Java:
Избавляет от
👉 Java Portal
Stream.toArray(Type[]::new) это аккуратный и типобезопасный способ получить массив из стрима.Избавляет от
Object[] и ручных кастов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
Вопрос для интервью по Java Spring Boot:
С тех пор как AI начал активно залезать в мир разработки, паттерны на собеседованиях меняются.
Тренд, который я недавно наблюдал: дают сниппет кода, и ты должен его проревьюить и отрефакторить логику под прод.
[Дано]:
Команда написала логику отправки письма после регистрации пользователя. На проде иногда бывает ситуация: письма приходят, а пользователя в базе нет. Найди проблему и почини:
[Задачи]:
- Объясни, в каком сценарии письмо будет отправлено, но пользователь не сохранится
- Исправь код так, чтобы событие обрабатывалось только после того, как пользователь сохранён
Код:
👉 Java Portal
@Transactional + @EventListenerС тех пор как AI начал активно залезать в мир разработки, паттерны на собеседованиях меняются.
Тренд, который я недавно наблюдал: дают сниппет кода, и ты должен его проревьюить и отрефакторить логику под прод.
[Дано]:
Команда написала логику отправки письма после регистрации пользователя. На проде иногда бывает ситуация: письма приходят, а пользователя в базе нет. Найди проблему и почини:
[Задачи]:
- Объясни, в каком сценарии письмо будет отправлено, но пользователь не сохранится
- Исправь код так, чтобы событие обрабатывалось только после того, как пользователь сохранён
Код:
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final ApplicationEventPublisher eventPublisher;
@Transactional
public void register(UserDto dto) {
User user = new User(https://dto.email());
https://userRepository.save(user);
eventPublisher.publishEvent(new UserRegisteredEvent(user));
}
}
@Component
@RequiredArgsConstructor
public class EmailListener {
private final EmailSender emailSender;
private final SomeOtherService someOtherService;
@EventListener
public void onUserRegistered(UserRegisteredEvent event) {
emailSender.sendWelcome(event.user().getEmail());
someOtherService.doSomething();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
Ищу хороший репозиторий с Claude skills для Java, Spring Boot и т.п. Нашёл вот этот: https://github.com/decebals/claude-code-java.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - decebals/claude-code-java: Reusable AI development infrastructure for Java projects, optimized for Claude Code
Reusable AI development infrastructure for Java projects, optimized for Claude Code - decebals/claude-code-java
🔥4😁1💊1
Spring Boot:
1.
2.
3. Никакого Tomcat (и других встроенных серверов).
4. Запросы выполняются внутри через
👉 Java Portal
@AutoConfigureMockMvc позволяет тестировать контроллеры, не поднимая сервер. Она говорит Spring Boot автоматически сконфигурировать экземпляр MockMvc в тестовом контексте.@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1));
}
}
1.
@SpringBootTest поднимает полный application context.2.
@AutoConfigureMockMvc настраивает MockMvc.3. Никакого Tomcat (и других встроенных серверов).
4. Запросы выполняются внутри через
DispatcherServlet от Spring.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Видел интересное видео от CTO Zerodha про то, как они масштабировали Postgres с 7+ млн таблиц.
Технология просто выносит мозг, а если копнуть глубже, становится еще веселее:
- синхронщина? не масштабируется, значит выкидываем.
- все в async. тяжелую генерацию отчетов ставим в очередь.
- независимый middleware, которому все равно на базу и на приложение.
- собрали “DungBeetle” на Go: обобщенные, независимые от СУБД HTTP API, чтобы тянуть отчеты из любой базы.
- результаты сливаем в отдельную Results DB, а приложение читает уже оттуда.
Вот так выглядит настоящий масштаб.
Смотреть видео
👉 Java Portal
Технология просто выносит мозг, а если копнуть глубже, становится еще веселее:
- синхронщина? не масштабируется, значит выкидываем.
- все в async. тяжелую генерацию отчетов ставим в очередь.
- независимый middleware, которому все равно на базу и на приложение.
- собрали “DungBeetle” на Go: обобщенные, независимые от СУБД HTTP API, чтобы тянуть отчеты из любой базы.
- результаты сливаем в отдельную Results DB, а приложение читает уже оттуда.
Вот так выглядит настоящий масштаб.
Смотреть видео
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯2
Java tip: Начиная с Java 12 можно использовать
✅ Добавление пробелов:
✅ Удаление пробелов:
👉 Java Portal
String.indent(n), чтобы красиво форматировать многострочные строки, добавляя нужный отступ.n > 0: добавляет n пробелов в начале каждой строки.n < 0: удаляет до n ведущих пробелов из каждой строки.String text = "Text\ncontent";
System.out.println(text.indent(0));
System.out.println(text.indent(4));
System.out.println(text.indent(0));
String text = " Text\n content";
System.out.println(text.indent(-4));
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Скачал Java, написал код, запустил - работает. Можно выдохнуть? 😎
Спойлер: нет.
Потому что завтра нужно будет написать что-то свое, без туториала. И тут выяснится, что public static void main - это для тебя просто магический ритуал, а не код.
❌ Копировать с экрана - не значит понимать.
❌ Выучить 10 уроков на YouTube - не значит стать разработчиком.
❇️ Ребята из Merion Academy (того самого YouTube-канала про IT) на бесплатных вводных уроках по Java разбирают код построчно, чтобы ты не просто копировал, а понимал, что пишешь.
Что внутри:
✔️ Что такое Java и с чем ее едят
✔️ Как настроить среду без боли (чтобы все взлетело с первого раза)
✔️ Разбор синтаксиса построчно - никакой магии
✔️ Как написать свое первое REST API (да, сразу)
➡️ Запишись на бесплатные вводные уроки
Разберись, как Java работает на самом деле.
Спойлер: нет.
Потому что завтра нужно будет написать что-то свое, без туториала. И тут выяснится, что public static void main - это для тебя просто магический ритуал, а не код.
❌ Копировать с экрана - не значит понимать.
❌ Выучить 10 уроков на YouTube - не значит стать разработчиком.
❇️ Ребята из Merion Academy (того самого YouTube-канала про IT) на бесплатных вводных уроках по Java разбирают код построчно, чтобы ты не просто копировал, а понимал, что пишешь.
Что внутри:
✔️ Что такое Java и с чем ее едят
✔️ Как настроить среду без боли (чтобы все взлетело с первого раза)
✔️ Разбор синтаксиса построчно - никакой магии
✔️ Как написать свое первое REST API (да, сразу)
➡️ Запишись на бесплатные вводные уроки
Разберись, как Java работает на самом деле.
Merion Academy
DevOps-инженер с нуля
Стань DevOps-инженером с нуля и научись использовать инструменты и методы DevOps
😁4👍1
This media is not supported in your browser
VIEW IN TELEGRAM
5 часто задаваемых вопросов на собеседованиях по Java Generics.
На сколько из них ты сможешь ответить?
1. В чем разница между
2. В чем разница между
3. В чем разница между
4. Можно ли добавлять элементы в
5. Чем
👉 Java Portal
На сколько из них ты сможешь ответить?
1. В чем разница между
Object<?> и Object в Java?2. В чем разница между
List<?> и List<Object>?3. В чем разница между
List<? extends Number> и List<? super Number>?4. Можно ли добавлять элементы в
List<?>?5. Чем
T отличается от ? в дженериках?Please open Telegram to view this post
VIEW IN TELEGRAM
🤯6