Java Portal | Программирование
11.8K subscribers
1.5K photos
114 videos
45 files
1.56K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Переименование поля в API изнутри кажется безобидным. Снаружи оно может положить каждый дашборд, который рассчитывал на старое имя.

Любое изменение API попадает в одну из двух категорий, и от этого зависит всё.

Если изменение ломающее, нужно поднимать версию: удаление или переименование полей, добавление обязательных параметров или фундаментальное изменение поведения эндпоинта.

Безопасные изменения можно выпускать без новой версии: добавлять необязательные поля, новые эндпоинты или просто ускорять работу.

Большая часть боли появляется из-за двух противоположных ошибок. Не версионировать вообще — и каждый релиз превращается для пользователей в лотерею. Версионировать всё подряд — и в итоге вы поддерживаете пять версий, а разработчики уже не понимают, какую использовать.

Несколько простых правил помогают держать баланс:

— Показывайте версию явно, например /v1/ в URL, как это делают Stripe и GitHub.
— Используйте семантическое версионирование, чтобы смена мажорной версии сразу означала необходимость изменений в клиентском коде.
— Если версия выводится из эксплуатации, говорите об этом прямо в ответе через заголовок Sunset и давайте 6–12 месяцев на миграцию.

Версия API — это обещание о том, что не изменится.

Нарушать его нужно редко и громко. Никогда — молча.

Какую ошибку вы встречали чаще?

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Валидатор загрузки связей в 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
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Не забывайте поддерживать проекты с открытым исходным кодом, которыми сами пользуетесь.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Spring Boot 4: можно объединять несколько TaskDecorator для асинхронных задач.

Каждый из них может переносить свой контекст в рабочий поток.

Spring Boot объединяет их и определяет порядок выполнения через @Order.

Типичная связка: MDC для логов + контекст безопасности для пользователя.

#SpringBoot4 #Async

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
На одном собеседовании по системному дизайну я использовал Kafka.
На другом — Redis.
На ещё одном — S3.
На ВСЕХ собеседованиях по системному дизайну я использовал базы данных.

Базы данных — основа любой архитектуры независимо от масштаба, стека или предметной области.

Если вы понимаете, как данные хранятся, запрашиваются, индексируются, реплицируются и партиционируются, то вы уже понимаете 70% системного дизайна.

Не отвлекайтесь на каждый новый модный компонент. Очереди, кэши и оркестраторы приходят и уходят.

А базы данных остаются.

Реляционные, NoSQL, временные ряды, векторные базы — подходы меняются, но принципы остаются теми же:

- пути чтения и записи
- индексация и кэширование
- транзакции и изоляция
- репликация и партиционирование

Разберитесь глубоко в том, как движутся данные, и вы увидите, как с ними связаны все остальные части системы.

Изучайте базы данных глубоко.

Большинство других компонентов существуют лишь для того, чтобы перемещать эти данные, защищать их или оптимизировать доступ к ним.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Импортируете 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Java: поверхностное клонирование копирует только сам объект, а вложенные объекты остаются общими.

super.clone() сам по себе создаёт поверхностную копию.

Глубокое клонирование дополнительно копирует и вложенные поля.

Если ссылки остаются общими, изменение вложенного объекта в одной копии будет видно и в другой.

#Java #SoftwareEngineering

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Похоже, это один из самых полных справочников по самостоятельному хостингу.

Огромный открытый гайд со всем, что нужно для старта и дальнейшего изучения self-hosting:

Docker, Kubernetes, базы данных, LLM, сети, Raspberry Pi, Home Assistant, безопасность, программирование и ещё куча всего.

Если давно хотели научиться запускать собственный софт вместо того, чтобы зависеть от SaaS-сервисов, это точно стоит сохранить.

Источник: github.com/mikeroyal/Self-Hosting-Guide

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Разработчику стоит знать основные концепции системного дизайна.

Это помогает показать потенциальным работодателям, что вы умеете превращать требования к архитектуре в готовый к продакшену код.

В курсе разбираются архитектура приложений, проектирование API, кэширование, сети, базы данных и многое другое.

https://freecodecamp.org/news/learn-system-design-principles/

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🚀 Spring Boot 4: @ConfigurationPropertiesSource для внешних типов.

Теперь метаданные можно генерировать даже для типов, которые находятся в другом модуле.

#SpringBoot4 #Config

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Вам доклады по 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. Участие бесплатное, регистрация обязательна.
Подзапросы в SQL сначала могут казаться запутанными, но на деле это просто запросы, которые передают данные другому запросу.

В этой статье Абдулла объясняет, как работают подзапросы и где они используются в SQL.

Разбираются некоррелированные и коррелированные подзапросы, производные столбцы и таблицы, а также операторы IN, ANY, ALL, EXISTS и многое другое.

https://freecodecamp.org/news/how-to-work-with-subqueries-in-sql/

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👀2🌚1
Самое время снова вспомнить о Java Records.

В этом руководстве показано, как record помогает объединять связанные неизменяемые данные в один объект. По сравнению с набором отдельных переменных код становится понятнее и проще в сопровождении.

Если вы ещё не используете record, это один из самых простых способов писать более чистый и выразительный код на Java.

Подробнее: https://social.ora.cl/6012BDGFKM

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Эти заметки — структурированное руководство по собеседованиям по проектированию систем.

Внутри разбираются как базовые подходы к System Design, так и конкретные архитектуры: веб-краулеры, системы уведомлений, платёжные платформы и другие типичные задачи с собеседований.

https://github.com/liquidslr/system-design-notes

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM