12073
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
💡 Java — не стоит считать, что десятичным разделителем всегда будет точка.
✅ Шаблоны вроде #,###.## всё равно используют символы, зависящие от локали.
✅ Нужные разделители можно задать через DecimalFormatSymbols(locale).
✅ В Италии число будет выглядеть как 1.234,56, а в США — 1,234.56.
#Java #JavaDev
👉 Java Portal
Эти заметки — структурированное руководство по собеседованиям по проектированию систем.
Внутри разбираются как базовые подходы к System Design, так и конкретные архитектуры: веб-краулеры, системы уведомлений, платёжные платформы и другие типичные задачи с собеседований.
https://github.com/liquidslr/system-design-notes
👉 Java Portal
Подзапросы в SQL сначала могут казаться запутанными, но на деле это просто запросы, которые передают данные другому запросу.
В этой статье Абдулла объясняет, как работают подзапросы и где они используются в SQL.
Разбираются некоррелированные и коррелированные подзапросы, производные столбцы и таблицы, а также операторы IN, ANY, ALL, EXISTS и многое другое.
https://freecodecamp.org/news/how-to-work-with-subqueries-in-sql/
👉 Java Portal
Вам доклады по Go или Java? VK приглашает на митап с двойной начинкой
26 августа VK собирает Go- и Java-инженеров, чтобы прокачать знания.
В программе два трека — Go и Java, по три доклада в каждом.
Трек Go:
• «Компиляция Go в динамическую либу, или как мы ускорили выкатку фичи в два раза, но нам не понравилось», Михаил Кичигин, бэкенд-разработчик, Avito Tech
• «Go-платформа VK: как мы построили единую основу для создания Go-сервисов», Александр Апанасенко, руководитель команды SDK Backend, VK
• «Почтальон от Kubernetes до Palo Alto. Как осуществляется доставка информации об адресах», Дарья Кулькина, бэкенд-разработчик, Точка Банк
Трек Java:
• «Перформанс-трюки в поисковой платформе Ozon», Пётр Портнов, ведущий разработчик среднего поиска, Ozon
• «Архитектура современного движка платёжной системы и переход к новой архитектуре», Игорь Крикунов, технический лидер разработки DBC, Альфа-Банк
• «Переход от федерации S3-кластеров в пользу коммунального и мультитенантного кластера», Кирилл Боблак, ведущий разработчик One-cloud, VK
А ещё будет мастер-класс по прокачке навыка, который сделает вас звездой любого вечера, и афтепати, чтобы обсудить доклады в неформальной обстановке.
Встречаемся в 17:00, начало в 18:00. Участие бесплатное, регистрация обязательна.
Разработчику стоит знать основные концепции системного дизайна.
Это помогает показать потенциальным работодателям, что вы умеете превращать требования к архитектуре в готовый к продакшену код.
В курсе разбираются архитектура приложений, проектирование API, кэширование, сети, базы данных и многое другое.
https://freecodecamp.org/news/learn-system-design-principles/
👉 Java Portal
Java: поверхностное клонирование копирует только сам объект, а вложенные объекты остаются общими.super.clone() сам по себе создаёт поверхностную копию.
Глубокое клонирование дополнительно копирует и вложенные поля.
Если ссылки остаются общими, изменение вложенного объекта в одной копии будет видно и в другой.
#Java #SoftwareEngineering
👉 Java Portal
9 советов по высокой производительности при использовании MySQL с JPA и Hibernate.
https://vladmihalcea.com/9-high-performance-tips-when-using-mysql-with-jpa-and-hibernate/
👉 Java Portal
На одном собеседовании по системному дизайну я использовал Kafka.
На другом — Redis.
На ещё одном — S3.
На ВСЕХ собеседованиях по системному дизайну я использовал базы данных.
Базы данных — основа любой архитектуры независимо от масштаба, стека или предметной области.
Если вы понимаете, как данные хранятся, запрашиваются, индексируются, реплицируются и партиционируются, то вы уже понимаете 70% системного дизайна.
Не отвлекайтесь на каждый новый модный компонент. Очереди, кэши и оркестраторы приходят и уходят.
А базы данных остаются.
Реляционные, NoSQL, временные ряды, векторные базы — подходы меняются, но принципы остаются теми же:
- пути чтения и записи
- индексация и кэширование
- транзакции и изоляция
- репликация и партиционирование
Разберитесь глубоко в том, как движутся данные, и вы увидите, как с ними связаны все остальные части системы.
Изучайте базы данных глубоко.
Большинство других компонентов существуют лишь для того, чтобы перемещать эти данные, защищать их или оптимизировать доступ к ним.
👉 Java Portal
Не забывайте поддерживать проекты с открытым исходным кодом, которыми сами пользуетесь.
👉 Java Portal
Валидатор загрузки связей в JPA
В статье показано, как программно проверять, каким образом JPA и Hibernate загружают связанные сущности — через JOIN или отдельными дополнительными запросами.
Проблема особенно заметна с FetchType.EAGER. Например, @ManyToOne и @OneToOne используют его по умолчанию, из-за чего Hibernate может незаметно генерировать дополнительные запросы и приводить к классической проблеме N+1.
Автор строит собственный валидатор поверх механизмов Hibernate Statistics и Event Listeners. Он позволяет прямо в тестах определить
→ какие связанные сущности были загружены
→ какие пришли через дополнительные SQL-запросы
→ какие были получены через JOIN
Например, можно проверить, что запрос неожиданно загрузил две PostComment отдельными запросами и ещё один Post через JOIN. После замены запроса на JOIN FETCH валидатор подтверждает, что дополнительные SQL-запросы исчезли.
По сути, это способ ловить проблемы со стратегией загрузки и N+1 ещё на уровне тестов, до того как они попадут в продакшен.
https://vladmihalcea.com/jpa-association-fetching-validator/
👉 Java Portal
Интеграционное тестирование базы данных с помощью Testcontainers
https://vladmihalcea.com/testcontainers-database-integration-testing/
👉 Java Portal
Предсказание ветвлений всплывает снова и снова, потому что его влияние на производительность действительно огромное. Эту тему стоит понимать глубже.
У BitLemonSw как раз вышло новое видео о том, как работает предсказание ветвлений в современных процессорах.
Суть простая. В коде постоянно встречаются ветвления: циклы, if, switch/case, вызовы функций и возвраты.
Проблема в том, что процессоры работают конвейерно и не могут каждый раз ждать, пока станет известно, по какой ветке пойдёт выполнение. Иначе это сильно тормозило бы процессор.
Поэтому процессор заранее угадывает результат ветвления и продолжает загружать инструкции по предполагаемому пути. Если прогноз оказался верным — всё быстро. Если нет — часть работы приходится выбросить и начать заново.
https://youtu.be/UbDIoNY9E0w
👉 Java Portal
90% PostgreSQL в 2026 году сводится к этим 10 вещам. Всё остальное — в основном споры об расширениях.
1. MVCC + VACUUM
Обновления создают мёртвые строки. Если autovacuum настроен плохо, таблицы и индексы раздуваются, а задержки постепенно растут неделями.
2. Индексы под реальные сценарии запросов
Порядок колонок в составных индексах важен. Нужно понимать частичные и покрывающие индексы, а также почему ORM иногда незаметно приводит к полному сканированию таблицы.
3. Блокировки и DDLALTER TABLE может заблокировать запись. Важно понимать режимы блокировок, очереди и безопасные приёмы вроде CREATE INDEX CONCURRENTLY и обновления данных небольшими партиями.
4. Уровни изоляции и аномалииRead Committed, Repeatable Read, Serializable. Пропавшие или дублирующиеся строки часто нужно разбирать через конкурентные транзакции, а не искать проблему только в коде.
5. Управление соединениями
Слишком много соединений убивает CPU и память. Нужны PgBouncer, адекватные размеры пулов и контроль долгих транзакций в состоянии idle in transaction.
6. WAL, checkpoints и репликация
Объём WAL напрямую влияет на ввод-вывод. Плохие настройки checkpoints вызывают скачки задержек, а отставание реплик ломает чтение с реплик и делает переключение при сбое рискованным.
7. Основы планировщика запросовEXPLAIN (ANALYZE, BUFFERS) — ваш отладчик. Нужно понимать оценки количества строк, типы JOIN и когда требуется ANALYZE или расширенная статистика.
8. Наблюдаемость, привязанная к реальным сбоям
Следите за p95 задержкой, ожиданием блокировок, временными файлами, попаданиями в кэш, отставанием autovacuum и реплик. Добавьте журнал медленных запросов с нормальными порогами.
9. Резервные копии и проверка восстановления
Базовые бэкапы плюс архивирование WAL — минимум. Главная ошибка — никогда не проверять восстановление и уже во время аварии выяснить, что не хватает ролей, расширений или восстановление занимает слишком долго.
10. Безопасность и права
Минимально необходимые права, отдельные владельцы объектов, никакого superuser у приложения, регулярная смена учётных данных, ограничение сетевого доступа и закрытая на запись схема public в production.
👉 Java Portal
Как настроить JPA и Hibernate в Spring Petclinic с помощью Hypersistence Optimizer:
https://vladmihalcea.com/spring-petclinic-hypersistence-optimizer/
👉 Java Portal
Чувак декомпилировал Java-игру, чтобы посмотреть, как она устроена внутри.
На выходе получил полностью обфусцированный код: вместо нормальных имён — $$1, $$2 и прочий мусор. Для человека разбирать такое вручную — боль.
Но для LLM это почти идеальная задача. Она довольно быстро восстанавливает смысл кода, понимает связи между классами и объясняет, что именно происходит.
Такие задачи идеал для ИИ.
👉 Java Portal
Современная Java — сверху, Rust — снизу.
Той Java, которую вы привыкли представлять, больше нет.
👉 Java Portal
Самое время снова вспомнить о Java Records.
В этом руководстве показано, как record помогает объединять связанные неизменяемые данные в один объект. По сравнению с набором отдельных переменных код становится понятнее и проще в сопровождении.
Если вы ещё не используете record, это один из самых простых способов писать более чистый и выразительный код на Java.
Подробнее: https://social.ora.cl/6012BDGFKM
👉 Java Portal
Оптимизация производительности Spring Boot.
https://vladmihalcea.com/spring-boot-performance-tuning/
👉 Java Portal
🚀 Spring Boot 4: @ConfigurationPropertiesSource для внешних типов.
✅ Теперь метаданные можно генерировать даже для типов, которые находятся в другом модуле.
#SpringBoot4 #Config
👉 Java Portal
Похоже, это один из самых полных справочников по самостоятельному хостингу.
Огромный открытый гайд со всем, что нужно для старта и дальнейшего изучения self-hosting:
Docker, Kubernetes, базы данных, LLM, сети, Raspberry Pi, Home Assistant, безопасность, программирование и ещё куча всего.
Если давно хотели научиться запускать собственный софт вместо того, чтобы зависеть от SaaS-сервисов, это точно стоит сохранить.
Источник: github.com/mikeroyal/Self-Hosting-Guide
👉 Java Portal
Импортируете CSV в Postgres? Используйте COPY или \copy.
Это быстро, потому что данные передаются одной массовой командой с минимальным количеством обменов по протоколу, одним разбором и планированием, прямым преобразованием строк и без накладных расходов на отдельный запрос для каждой строки.
Что важно знать:FORMAT csv
Включает стандартный разбор CSV: запятые, поля в кавычках и экранированные кавычки.
Список целевых столбцов
Порядок столбцов в CSV редко совпадает с таблицей. Всегда указывайте целевые столбцы в том порядке, в котором они идут в файле. Postgres сопоставляет их по позиции, а не по имени из заголовка CSV.HEADER / HEADER n
Пропускает строки заголовка. Обычный HEADER пропускает первую строку. Ожидается, что Postgres 19 позволит передавать число, например HEADER 2, чтобы пропускать несколько начальных строк.DEFAULT 'string'
Позволяет сопоставить специальную строку в CSV, например '__DEFAULT__', с выражением DEFAULT соответствующего столбца.
Неуказанные столбцы
Столбцы таблицы, которые не указаны в списке целевых столбцов, автоматически получают DEFAULT или NULL.
Лишние столбцы в CSV
Postgres выдаст ошибку, если в CSV больше полей, чем указано целевых столбцов. Обрежьте файл или сначала загрузите данные в более широкую промежуточную таблицу.
NULL-значения
В формате csv стандартным представлением NULL является пустая строка без кавычек. Это можно изменить через NULL 'string'.
Обработка ошибок через ON_ERROR и REJECT_LIMIT
Исторически COPY останавливался на первой ошибке преобразования. В новых версиях появились:
• ON_ERROR ignore в Postgres 17 — пропускает некорректные строки и сообщает их количество
• REJECT_LIMIT n в Postgres 18 — задаёт максимальное число плохих строк при ON_ERROR ignore, после которого импорт будет остановлен
• ON_ERROR set_null в Postgres 19 — заменяет некорректное поле на NULL вместо того, чтобы отбрасывать всю строку
👉 Java Portal
🔴 Тестовый собес с Java-разработчиком уже завтра!
[+ разбор 50 сложных вопросов в подарок ]
19 августа (уже завтра!) в 19:00 по мск приходи онлайн, чтобы посмотреть на настоящее интервью на Middle Java-разработчика!
Собеседование проведёт Сергей Чамкин - старший разработчик из Uzum, ex-WildBerries
Как это будет:
📂 Сергей задаст разработчику-добровольцу вопросы и задачи, которые могут спросить на реальном собесе
📂 После каждого ответа респондента ты услышишь подробный комментарий от ментора и поймёшь, чего на самом деле ожидает собеседующий на интервью
📂 В конце сможешь задать любой вопрос Сергею и получить на него развёрнутый ответ
Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы
Но ты можешь посмотреть его бесплатно 🔥
Только завтра, в прямом эфире!
🎁 Подарок для всех, кто зарегается на веб — файл с ОТВЕТАМИ НА 50 СЛОЖНЫХ ВОПРОСОВ с Java-собеседований 🔥
Жми на кнопку, чтобы попасть на эфир и забрать подарок ↓
@shortcut_sh_bot
Реклама.
О рекламодателе.
Spring Boot 4: можно объединять несколько TaskDecorator для асинхронных задач.
Каждый из них может переносить свой контекст в рабочий поток.
Spring Boot объединяет их и определяет порядок выполнения через @Order.
Типичная связка: MDC для логов + контекст безопасности для пользователя.
#SpringBoot4 #Async
👉 Java Portal
11 принципов разработки ПО, которые стоило понять гораздо раньше.
1. SOLID — более качественное объектно-ориентированное проектирование
2. DRY — не повторяйся
3. KISS — не усложняй
4. YAGNI — не реализуй то, что пока не нужно
5. SRP — одна ответственность
6. Open/Closed — расширяй, не ломая существующее
7. Dependency Inversion — уменьшай связанность
8. Composition — собирай систему из гибких компонентов
9. Separation of Concerns — разделяй ответственность между частями системы
10. Fail Fast — обнаруживай проблемы как можно раньше
11. Measure First — оптимизируй только то, что действительно имеет значение
👉 Java Portal
Переименование поля в API изнутри кажется безобидным. Снаружи оно может положить каждый дашборд, который рассчитывал на старое имя.
Любое изменение API попадает в одну из двух категорий, и от этого зависит всё.
Если изменение ломающее, нужно поднимать версию: удаление или переименование полей, добавление обязательных параметров или фундаментальное изменение поведения эндпоинта.
Безопасные изменения можно выпускать без новой версии: добавлять необязательные поля, новые эндпоинты или просто ускорять работу.
Большая часть боли появляется из-за двух противоположных ошибок. Не версионировать вообще — и каждый релиз превращается для пользователей в лотерею. Версионировать всё подряд — и в итоге вы поддерживаете пять версий, а разработчики уже не понимают, какую использовать.
Несколько простых правил помогают держать баланс:
— Показывайте версию явно, например /v1/ в URL, как это делают Stripe и GitHub.
— Используйте семантическое версионирование, чтобы смена мажорной версии сразу означала необходимость изменений в клиентском коде.
— Если версия выводится из эксплуатации, говорите об этом прямо в ответе через заголовок Sunset и давайте 6–12 месяцев на миграцию.
Версия API — это обещание о том, что не изменится.
Нарушать его нужно редко и громко. Никогда — молча.
Какую ошибку вы встречали чаще?
👉 Java Portal
Сопоставление с образцом для instanceof: переменную можно объявить прямо в проверке.
Старый подход: сначала instanceof, затем отдельное приведение типа.
Новый подход: if (obj instanceof Dog d) — переменная d сразу готова к использованию.
При этом d существует только там, где условие проверки истинно.
#Java #PatternMatching
👉 Java Portal
Ещё один отличный плейлист по структурам данных и алгоритмам от pmavrin.
https://youtube.com/playlist?list=PLrS21S1jm43igE57Ye_edwds_iL7ZOAG4&si=4mS5lXn3uxI-V2LM
👉 Java Portal
Типы классов в Java:
1. Concrete Class — обычный класс с полной реализацией методов.
2. Abstract Class — нельзя создать напрямую через new; может содержать абстрактные методы.
3. Final Class — нельзя наследовать.
4. Static Nested Class — статический вложенный класс внутри другого класса.
5. Inner Class — нестатический класс внутри другого класса.
6. Local Class — класс, объявленный внутри метода или другого блока.
7. Anonymous Class — класс без имени, обычно используется для одноразовой реализации.
8. Singleton Class — класс, спроектированный так, чтобы существовал только один его экземпляр.
9. POJO — простой Java-класс без специальных требований к наследованию или фреймворкам.
10. Record Class — компактная форма класса для хранения данных; появилась как предварительная возможность в Java 14.
11. Enum Class — класс, представляющий фиксированный набор констант.
👉 Java Portal
Spring Boot 4: теперь лучше использовать RestTestClient вместо TestRestTemplate.
У него более удобный API в стиле RestClient, он работает как с MockMvc, так и с реальным портом приложения.
При необходимости добавьте @AutoConfigureRestTestClient.
#SpringBoot4 #RestTestClient
👉 Java Portal
Используйте Collectors.summarizingInt(), чтобы за один проход получить количество элементов, сумму, минимум, максимум и среднее значение.
Так не придётся несколько раз прогонять один и тот же поток данных.
Метод возвращает объект IntSummaryStatistics.
Для long и double есть аналогичные методы: summarizingLong() и summarizingDouble().
#Java #Streams
👉 Java Portal