Переименование поля в API изнутри кажется безобидным. Снаружи оно может положить каждый дашборд, который рассчитывал на старое имя.
Любое изменение API попадает в одну из двух категорий, и от этого зависит всё.
Если изменение ломающее, нужно поднимать версию: удаление или переименование полей, добавление обязательных параметров или фундаментальное изменение поведения эндпоинта.
Безопасные изменения можно выпускать без новой версии: добавлять необязательные поля, новые эндпоинты или просто ускорять работу.
Большая часть боли появляется из-за двух противоположных ошибок. Не версионировать вообще — и каждый релиз превращается для пользователей в лотерею. Версионировать всё подряд — и в итоге вы поддерживаете пять версий, а разработчики уже не понимают, какую использовать.
Несколько простых правил помогают держать баланс:
— Показывайте версию явно, например
— Используйте семантическое версионирование, чтобы смена мажорной версии сразу означала необходимость изменений в клиентском коде.
— Если версия выводится из эксплуатации, говорите об этом прямо в ответе через заголовок
Версия API — это обещание о том, что не изменится.
Нарушать его нужно редко и громко. Никогда — молча.
Какую ошибку вы встречали чаще?
👉 Java Portal
Любое изменение API попадает в одну из двух категорий, и от этого зависит всё.
Если изменение ломающее, нужно поднимать версию: удаление или переименование полей, добавление обязательных параметров или фундаментальное изменение поведения эндпоинта.
Безопасные изменения можно выпускать без новой версии: добавлять необязательные поля, новые эндпоинты или просто ускорять работу.
Большая часть боли появляется из-за двух противоположных ошибок. Не версионировать вообще — и каждый релиз превращается для пользователей в лотерею. Версионировать всё подряд — и в итоге вы поддерживаете пять версий, а разработчики уже не понимают, какую использовать.
Несколько простых правил помогают держать баланс:
— Показывайте версию явно, например
/v1/ в URL, как это делают Stripe и GitHub.— Используйте семантическое версионирование, чтобы смена мажорной версии сразу означала необходимость изменений в клиентском коде.
— Если версия выводится из эксплуатации, говорите об этом прямо в ответе через заголовок
Sunset и давайте 6–12 месяцев на миграцию.Версия API — это обещание о том, что не изменится.
Нарушать его нужно редко и громко. Никогда — молча.
Какую ошибку вы встречали чаще?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Валидатор загрузки связей в JPA
В статье показано, как программно проверять, каким образом JPA и Hibernate загружают связанные сущности — через
Проблема особенно заметна с
Автор строит собственный валидатор поверх механизмов Hibernate Statistics и Event Listeners. Он позволяет прямо в тестах определить
→ какие связанные сущности были загружены
→ какие пришли через дополнительные SQL-запросы
→ какие были получены через
Например, можно проверить, что запрос неожиданно загрузил две
По сути, это способ ловить проблемы со стратегией загрузки и N+1 ещё на уровне тестов, до того как они попадут в продакшен.
https://vladmihalcea.com/jpa-association-fetching-validator/
👉 Java Portal
В статье показано, как программно проверять, каким образом 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/
Please open Telegram to view this post
VIEW IN TELEGRAM
Vlad Mihalcea
JPA Association Fetching Validator - Vlad Mihalcea
Learn how to implement a JPA Association Fetching Validator that asserts if associations are fetched using joins or secondary queries.
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
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 — оптимизируй только то, что действительно имеет значение
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: можно объединять несколько
Каждый из них может переносить свой контекст в рабочий поток.
Spring Boot объединяет их и определяет порядок выполнения через
Типичная связка: MDC для логов + контекст безопасности для пользователя.
#SpringBoot4 #Async
👉 Java Portal
TaskDecorator для асинхронных задач.Каждый из них может переносить свой контекст в рабочий поток.
Spring Boot объединяет их и определяет порядок выполнения через
@Order.Типичная связка: MDC для логов + контекст безопасности для пользователя.
#SpringBoot4 #Async
Please open Telegram to view this post
VIEW IN TELEGRAM
На одном собеседовании по системному дизайну я использовал Kafka.
На другом — Redis.
На ещё одном — S3.
На ВСЕХ собеседованиях по системному дизайну я использовал базы данных.
Базы данных — основа любой архитектуры независимо от масштаба, стека или предметной области.
Если вы понимаете, как данные хранятся, запрашиваются, индексируются, реплицируются и партиционируются, то вы уже понимаете 70% системного дизайна.
Не отвлекайтесь на каждый новый модный компонент. Очереди, кэши и оркестраторы приходят и уходят.
А базы данных остаются.
Реляционные, NoSQL, временные ряды, векторные базы — подходы меняются, но принципы остаются теми же:
- пути чтения и записи
- индексация и кэширование
- транзакции и изоляция
- репликация и партиционирование
Разберитесь глубоко в том, как движутся данные, и вы увидите, как с ними связаны все остальные части системы.
Изучайте базы данных глубоко.
Большинство других компонентов существуют лишь для того, чтобы перемещать эти данные, защищать их или оптимизировать доступ к ним.
👉 Java Portal
На другом — Redis.
На ещё одном — S3.
На ВСЕХ собеседованиях по системному дизайну я использовал базы данных.
Базы данных — основа любой архитектуры независимо от масштаба, стека или предметной области.
Если вы понимаете, как данные хранятся, запрашиваются, индексируются, реплицируются и партиционируются, то вы уже понимаете 70% системного дизайна.
Не отвлекайтесь на каждый новый модный компонент. Очереди, кэши и оркестраторы приходят и уходят.
А базы данных остаются.
Реляционные, NoSQL, временные ряды, векторные базы — подходы меняются, но принципы остаются теми же:
- пути чтения и записи
- индексация и кэширование
- транзакции и изоляция
- репликация и партиционирование
Разберитесь глубоко в том, как движутся данные, и вы увидите, как с ними связаны все остальные части системы.
Изучайте базы данных глубоко.
Большинство других компонентов существуют лишь для того, чтобы перемещать эти данные, защищать их или оптимизировать доступ к ним.
Please open Telegram to view this post
VIEW IN TELEGRAM
9 советов по высокой производительности при использовании MySQL с JPA и Hibernate.
https://vladmihalcea.com/9-high-performance-tips-when-using-mysql-with-jpa-and-hibernate/
👉 Java Portal
https://vladmihalcea.com/9-high-performance-tips-when-using-mysql-with-jpa-and-hibernate/
Please open Telegram to view this post
VIEW IN TELEGRAM
Vlad Mihalcea
9 High-Performance Tips when using MySQL with JPA and Hibernate - Vlad Mihalcea
Introduction Although there is an SQL Standard, every relational database is ultimately unique, and you need to adjust your data access layer so that you get the most out of the relational database in use. In this article, we are going to see what you can…
Импортируете CSV в Postgres? Используйте
Это быстро, потому что данные передаются одной массовой командой с минимальным количеством обменов по протоколу, одним разбором и планированием, прямым преобразованием строк и без накладных расходов на отдельный запрос для каждой строки.
Что важно знать:
Включает стандартный разбор CSV: запятые, поля в кавычках и экранированные кавычки.
Список целевых столбцов
Порядок столбцов в CSV редко совпадает с таблицей. Всегда указывайте целевые столбцы в том порядке, в котором они идут в файле. Postgres сопоставляет их по позиции, а не по имени из заголовка CSV.
Пропускает строки заголовка. Обычный
Позволяет сопоставить специальную строку в CSV, например
Неуказанные столбцы
Столбцы таблицы, которые не указаны в списке целевых столбцов, автоматически получают
Лишние столбцы в CSV
Postgres выдаст ошибку, если в CSV больше полей, чем указано целевых столбцов. Обрежьте файл или сначала загрузите данные в более широкую промежуточную таблицу.
NULL-значения
В формате
Обработка ошибок через
Исторически
•
•
•
👉 Java Portal
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 вместо того, чтобы отбрасывать всю строкуPlease open Telegram to view this post
VIEW IN TELEGRAM
👍3
Java: поверхностное клонирование копирует только сам объект, а вложенные объекты остаются общими.
Глубокое клонирование дополнительно копирует и вложенные поля.
Если ссылки остаются общими, изменение вложенного объекта в одной копии будет видно и в другой.
#Java #SoftwareEngineering
👉 Java Portal
super.clone() сам по себе создаёт поверхностную копию.Глубокое клонирование дополнительно копирует и вложенные поля.
Если ссылки остаются общими, изменение вложенного объекта в одной копии будет видно и в другой.
#Java #SoftwareEngineering
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
Огромный открытый гайд со всем, что нужно для старта и дальнейшего изучения self-hosting:
Docker, Kubernetes, базы данных, LLM, сети, Raspberry Pi, Home Assistant, безопасность, программирование и ещё куча всего.
Если давно хотели научиться запускать собственный софт вместо того, чтобы зависеть от SaaS-сервисов, это точно стоит сохранить.
Источник: github.com/mikeroyal/Self-Hosting-Guide
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - mikeroyal/Self-Hosting-Guide: Self-Hosting Guide. Learn all about locally hosting (on premises & private web servers)…
Self-Hosting Guide. Learn all about locally hosting (on premises & private web servers) and managing software applications by yourself or your organization. Including Cloud, LLMs, WireGuar...
Разработчику стоит знать основные концепции системного дизайна.
Это помогает показать потенциальным работодателям, что вы умеете превращать требования к архитектуре в готовый к продакшену код.
В курсе разбираются архитектура приложений, проектирование API, кэширование, сети, базы данных и многое другое.
https://freecodecamp.org/news/learn-system-design-principles/
👉 Java Portal
Это помогает показать потенциальным работодателям, что вы умеете превращать требования к архитектуре в готовый к продакшену код.
В курсе разбираются архитектура приложений, проектирование API, кэширование, сети, базы данных и многое другое.
https://freecodecamp.org/news/learn-system-design-principles/
Please open Telegram to view this post
VIEW IN TELEGRAM
freeCodeCamp.org
Learn System Design Principles and Prepare for an Job Interview
Mastering system design is important for anyone who wants to build scalable and reliable applications. System design includes a range of topics from basic computer architecture to complex networking concepts, each playing an important role in creatin...
🔥1
🚀 Spring Boot 4:
✅ Теперь метаданные можно генерировать даже для типов, которые находятся в другом модуле.
#SpringBoot4 #Config
👉 Java Portal
@ConfigurationPropertiesSource для внешних типов.✅ Теперь метаданные можно генерировать даже для типов, которые находятся в другом модуле.
#SpringBoot4 #Config
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. Участие бесплатное, регистрация обязательна.
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. Участие бесплатное, регистрация обязательна.
Оптимизация производительности Spring Boot.
https://vladmihalcea.com/spring-boot-performance-tuning/
👉 Java Portal
https://vladmihalcea.com/spring-boot-performance-tuning/
Please open Telegram to view this post
VIEW IN TELEGRAM
Vlad Mihalcea
Spring Boot performance tuning - Vlad Mihalcea
Learn how to speed up the data access layer in a Spring Boot application using the Hypersistence Optimizer performance tuning utility.
👀1
Подзапросы в SQL сначала могут казаться запутанными, но на деле это просто запросы, которые передают данные другому запросу.
В этой статье Абдулла объясняет, как работают подзапросы и где они используются в SQL.
Разбираются некоррелированные и коррелированные подзапросы, производные столбцы и таблицы, а также операторы
https://freecodecamp.org/news/how-to-work-with-subqueries-in-sql/
👉 Java Portal
В этой статье Абдулла объясняет, как работают подзапросы и где они используются в SQL.
Разбираются некоррелированные и коррелированные подзапросы, производные столбцы и таблицы, а также операторы
IN, ANY, ALL, EXISTS и многое другое.https://freecodecamp.org/news/how-to-work-with-subqueries-in-sql/
Please open Telegram to view this post
VIEW IN TELEGRAM
freeCodeCamp.org
How to Work with Subqueries in SQL
Whenever you see a query nested inside another query in SQL, that's a subquery. A subquery is also known as an inner query while the one that contains it is called the main or outer query. Subqueries
👀2🌚1
Самое время снова вспомнить о Java Records.
В этом руководстве показано, как
Если вы ещё не используете
Подробнее: https://social.ora.cl/6012BDGFKM
👉 Java Portal
В этом руководстве показано, как
record помогает объединять связанные неизменяемые данные в один объект. По сравнению с набором отдельных переменных код становится понятнее и проще в сопровождении.Если вы ещё не используете
record, это один из самых простых способов писать более чистый и выразительный код на Java.Подробнее: https://social.ora.cl/6012BDGFKM
Please open Telegram to view this post
VIEW IN TELEGRAM
Эти заметки — структурированное руководство по собеседованиям по проектированию систем.
Внутри разбираются как базовые подходы к System Design, так и конкретные архитектуры: веб-краулеры, системы уведомлений, платёжные платформы и другие типичные задачи с собеседований.
https://github.com/liquidslr/system-design-notes
👉 Java Portal
Внутри разбираются как базовые подходы к System Design, так и конкретные архитектуры: веб-краулеры, системы уведомлений, платёжные платформы и другие типичные задачи с собеседований.
https://github.com/liquidslr/system-design-notes
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - liquidslr/system-design-notes: Notes of the book System Desgin Interview - An Insider's Guide
Notes of the book System Desgin Interview - An Insider's Guide - liquidslr/system-design-notes