12073
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
Redis может быть самым большим предательством в истории open source.
В 2009 итальянский разработчик по имени Salvatore Sanfilippo работал над стартапом, а MySQL был слишком медленным. Тогда он в свободное время сделал собственную in-memory базу данных и выложил её в open source бесплатно.
Он назвал её Redis.
Twitter использовал его. GitHub использовал его. Snapchat использовал его. Stack Overflow использовал его. Каждая крупная технологическая компания в мире запускала Redis где-то в своём стеке.
К 2020 году Salvatore выгорел после 11 лет поддержки проекта в одиночку. Он передал проект Redis Labs и ушёл.
В марте 2024 Redis Labs изменили лицензию.
За ночь Redis перестал быть open source. Облачные провайдеры больше не могли предлагать его как managed service без оплаты Redis Labs. Сообщество, которое выросло вокруг кода Salvatore, проснулось и оказалось заблокированным.
Они не спорили. Они не писали посты. Они форкнули проект.
Через восемь дней Linux Foundation объявил Valkey. Поддержка от AWS, Google, Oracle, Ericsson и Snap. Более 50 компаний присоединились за несколько недель.
В течение года Fedora, Ubuntu, Debian и Arch полностью отказались от Redis и сделали Valkey стандартом. AWS перенёс миллионы узлов на Valkey. Valkey достиг 1.19 миллиона запросов в секунду. На 230% быстрее версии Redis, которую прекратили развивать.
Потом Redis вернул Salvatore, чтобы попытаться вернуть сообщество.
Он вернулся. Он выступил на Hacker News, защищая изменение лицензии. Он пытался восстановить доверие.
Сообщество уже двинулось дальше без него.
Redis построил 15 лет доверия в open source. Проверил его один раз. Потерял за 8 дней.
В open source сообщество — это не просто пользователи. Сообщество — это ров.
👉 Java Portal
20 законов разработки, которые должен знать каждый инженер
1. Закон Галла: Работающая сложная система вырастает из работающей простой.
2. KISS: Делай проще. Всё остальное — оверхеад.
3. Закон Конвея: Компании проектируют системы, которые повторяют структуру их коммуникаций.
4. Закон Хайрума: У достаточно большого API уже неважно, что ты обещал в контракте. Кто-нибудь уже зависит от каждого observable-поведения твоей системы.
5. CAP-теорема: Выбери два: консистентность, доступность, устойчивость к разделению.
6. Закон Завински: Любая программа разрастается до тех пор, пока не научится читать почту.
7. Закон Брукса: Добавление людей в опаздывающий проект делает его ещё более поздним.
8. Эффект Рингельмана: Производительность каждого участника группы падает с ростом группы.
9. Закон Прайса: Половину работы делают квадратный корень от всех людей.
10. Эффект Даннинга — Крюгера: Новички переоценивают свои способности, эксперты — недооценивают.
11. Закон Хофштадтера: Всё занимает больше времени, чем ты планируешь, даже с учётом этого закона.
12. Закон Паркинсона: Работа расширяется, чтобы заполнить всё отведённое на неё время.
13. Закон Гудхарта: Когда метрика становится целью, она перестаёт быть хорошей метрикой.
14. Закон Гилба: Измерять неточно лучше, чем не измерять вообще.
15. Принцип Кнута: Забудь о микрооптимизациях в 97% случаев. Преждевременная оптимизация — корень всех зол.
16. Закон Амдала: Ускорение одной части системы ограничено долей времени, которое эта часть реально используется.
17. Закон Мёрфи: Если что-то может пойти не так, оно пойдёт не так.
18. Закон Постела: Будь консервативен в том, что отправляешь, и либерален в том, что принимаешь.
19. Закон Стерджена: 90% всего на свете — фигня.
20. Закон Каннингема: Лучший способ получить правильный ответ в интернете — не задать вопрос, а написать неправильный ответ.
👉 Java Portal
Java: Начиная с Java 8, отдавайте предпочтение java.time вместо Date и Calendar.
API из java.time неизменяемые (immutable), потокобезопасные (thread-safe) и намного понятнее в использовании.
Преимущества:LocalDate.of(2026, 5, 31) — май действительно означает май.
Нет изменяемых объектов, которые легко случайно испортить.
Форматтеры из DateTimeFormatter потокобезопасны.
Удобная работа с часовыми поясами через ZonedDateTime.
Более читаемый и предсказуемый код.
Вместо:
Date
Calendar
SimpleDateFormat
LocalDate
LocalDateTime
ZonedDateTime
Instant
DateTimeFormatter
Горутины и виртуальные треды. Слева Go с горутинами, справа Java с виртуальными потоками. Оба создают миллион задач.
Забавно наблюдать, как одни и те же люди твердят, что язык справа медленный и многословный, а язык слева бесконечно лучше. А на деле оба справляются с одним и тем же объёмом. Просто каждый по-своему.
👉 Java Portal
AI-инструменты можно любить и ненавидеть, но работать без них в IT уже практически невозможно 🤩
Коллеги из AvitoTech 11 июля зовут в их офис на Лесной на AI Hardcore Day. Приглашают тех, кто каждый день сталкивается с AI в работе и даже пишет своих AI-агентов. Обещают доклады и нетворкинг-сессию на террасе после — и всё это без записи.
💫 Среди тем:
— Spec-Driven Development: теория, инструменты, практика.
— Разработка и тестирование MCP для внутренних агентных систем аналитики.
— Выпрямляем руки агентов: как сделать MCP удобными и действительно полезными.
— Атаки на GenAI-агентов: OWASP на практике.
➡ Регистрация тут!
Docker-ошибка, которую я вижу почти в каждом junior Dockerfile:
COPY . .
RUN npm install
COPY package*.json ./
RUN npm install
COPY . .
COPY . . ломает кэш, и всё после него (включая npm install) пересобирается с нуля при каждой сборкеpackage.json
💡 Java tip: Use the Stream API для работы с коллекциями в декларативном стиле.
List<String> names = users.stream()
.filter(User::isActive)
.map(User::getName)
.sorted()
.toList();
Java-паттерны: Builder
Паттерн Builder помогает создавать сложные объекты более гибким и понятным способом.
На примере выше хорошо видно проблему длинных конструкторов:
new Order("Mario", "Laptop", 2, true, "Leave at door");true, а при добавлении новых параметров конструктор быстро становится неудобным.Order order = Order.builder()
.customer("Mario")
.product("Laptop")
.quantity(2)
.express(true)
.note("Leave at door")
.build();
build()@Builder.
Java: отдавай предпочтение неизменяемым объектам (immutable), чтобы упростить потокобезопасность.
❌ Изменяемое состояние, разделяемое между потоками
public class Balance {
private BigDecimal amount = BigDecimal.ZERO;
public void deposit(BigDecimal v) {
amount = amount.add(v);
}
public BigDecimal get() {
return amount;
}
}deposit(), возможны потерянные обновления (lost updates), гонки данных (race conditions) и чтение неконсистентного состояния.public record Balance(BigDecimal amount) {
public Balance deposit(BigDecimal v) {
return new Balance(amount.add(v));
}
}snapshot), а каждый вызов deposit() возвращает новый объект.List<String> roles = List.of("READ", "WRITE");
Map<String, Integer> limits =
Map.of("free", 10, "pro", 100);List<String> snapshot = List.copyOf(mutableRoles);
synchronized, блокировок и ошибок многопоточности. Поэтому современные API Java (record, List.of(), Map.of(), Optional, LocalDateTime) активно используют неизменяемые объекты по умолчанию.
Java: используйте полиморфизм вместо цепочек instanceof.
Проверки типов часто приводят к разрастающимся if/else, нарушают принцип Open/Closed и заставляют изменять существующий код при добавлении новых сущностей.
❌ До:
public String describe(Animal animal) {
if (animal instanceof Dog) {
return "Woof";
} else if (animal instanceof Cat) {
return "Meow";
} else if (animal instanceof Cow) {
return "Moo";
}
throw new IllegalArgumentException("Unknown animal");
}public interface Animal {
String sound();
}
public final class Dog implements Animal {
public String sound() {
return "Woof";
}
}
public final class Cat implements Animal {
public String sound() {
return "Meow";
}
}
public final class Cow implements Animal {
public String sound() {
return "Moo";
}
}
public String describe(Animal animal) {
return animal.sound();
}instanceof и приведения типовpublic final class Sheep implements Animal {
public String sound() {
return "Baa";
}
}describe(new Sheep());
Совет по Spring: ставь circuit breaker на удалённые вызовы
Если сервис ходит в другой сервис через Feign, этот вызов может зависнуть, упасть или начать возвращать ошибки.
@CircuitBreaker(name = "CircuitBreakerService")
String getInstance();
public String getAuthorServiceInstanceFallback(Exception ex) {
return "Fallback content";
}application.yml можно задать порог ошибок и время ожидания:failure-rate-threshold: 50
wait-duration-in-open-state: 5s
gRPC в Java раньше означал proto-файлы, codegen, build-плагины, настройку сервера и client channels. Куча возни ещё до первого hello world.
Spring Boot 4.1 закрывает большую часть этой рутины.
Если ты умеешь писать REST-приложение, базовые шаги уже знакомы:
→ описать контракт
→ добавить bean с @GrpcService
→ заинжектить stub на клиенте
Полный сервер, клиент и in-memory тест с нуля 👇
https://github.com/danvega/hello-grpc
👉 Java Portal
В чем разница между балансировщиками нагрузки, обратными прокси и API-шлюзами?
🍩Балансировщик нагрузки распределяет клиентские запросы между серверами, выбирая их по алгоритму, чтобы равномерно распределять нагрузку, избегать перегрузок и обеспечивать стабильную работу системы.
Он получает запрос, перенаправляет его на сервер, принимает ответ и отправляет его обратно клиенту.
Это увеличивает пропускную способность, снижает задержки и оптимизирует использование ресурсов.
🍩Обратные прокси работают как посредники между клиентами и серверами, обрабатывая запросы и передавая данные, скрывая серверы и повышая их безопасность.
Они обеспечивают контроль за сетевым трафиком, снижая риски атак и угроз.
Дополнительно, они могут кэшировать контент для уменьшения нагрузки на сервер, сжимать данные для ускорения передачи и управлять SSL/TLS-шифрованием, разгружая веб-серверы.
🍩API-шлюзы работают как единая точка входа для всех API-запросов, направляя их к нужным микросервисам и собирая результаты.
Они упрощают взаимодействие клиентов с разными сервисами, добавляют защиту, применяют правила, переводят между веб-протоколами и агрегируют данные.
Идеально подходят для работы с микросервисной архитектурой.
👉 Java Portal
До сих пор вручную собираешь шаблон проекта каждый раз, когда начинаешь что-то новое?
Я недавно наткнулся на Better-Fullstack — генератор, который помогает быстро поднять основу приложения и не тратить время на однотипную настройку.
Что умеет:
1️⃣ Поддерживает четыре основных экосистемы: TypeScript, Rust, Python и Go.
2️⃣ Более 270 комбинаций технологий, которые можно свободно комбинировать.
3️⃣ Позволяет выбрать фронтенд, бэкенд, базу данных, аутентификацию, платежи, AI-интеграции и DevOps-компоненты в одном месте.
4️⃣ Автоматически генерирует готовый каркас проекта, который можно использовать сразу после создания.
Главная польза не столько в экономии времени, сколько в том, что тебе не приходится снова и снова заниматься настройкой окружения. Вместо этого можно сосредоточиться на бизнес-логике и функциональности продукта.
Подойдёт для соло-разработчиков, команд с типовыми стек-требованиями и проектов с жёсткими сроками.
GitHub: https://github.com/Marve10s/Better-Fullstack
👉 Java Portal
🤖 Как создать B2B CRM с ИИ на Джеймикс и не потерять контроль над разработкой?
➡️ 2023 — попробуй ChatGPT
➡️ 2024 — генерируй код
➡️ 2025 — используй агентов
➡️ 2026 — пора разобраться, как встроить ИИ в управляемый процесс разработки
16 июня в 16:00 МСК — практический воркшоп от Джеймикс (Java-платформа с ИИ для разработки корпоративных систем), Kodacode и OpenIDE.
Покажем, как пройти путь от постановки задачи до рабочего контура корпоративной CRM. Не в теории — в коде.
Что разберём:
🔹 как сформировать спецификацию для разработки с ИИ
🔹 как удержать агента в рамках проекта
🔹 как создать модель данных, экраны и бизнес-логику
🔹 типичные ошибки агентного режима и как их исправлять
🔹 чем управляемая ИИ-разработка отличается от вайб-кодинга
Заберёте с собой:готовый код open-source B2B CRM на Java со встроенным ИИ-ассистентом — можно сразу брать за основу в своих проектах.
👉 Регистрируйтесь
#реклама
О рекламодателе
Kafka в event-driven архитектурах: 5 ключевых паттернов
Большинство разработчиков знают Kafka как систему обмена сообщениями, но мало кто действительно понимает, как использовать всю её мощь в event-driven архитектурах.
Kafka — это не просто продюсирование и потребление сообщений. Это основа масштабируемых, отказоустойчивых и реально-временных систем, используемых крупнейшими компаниями мира.
Вот 5 ключевых паттернов Kafka, которые должен знать каждый инженер:
1. Централизованное управление логами — стримьте логи из нескольких приложений в Kafka для долгосрочного хранения и анализа.
2. Распределение данных в реальном времени — публикуйте данные для множества потребителей эффективно через pub/sub архитектуру Kafka.
3. Бесшовная репликация логов — обеспечивайте консистентность в распределённых системах через репликацию и воспроизведение изменений логов.
4. Многоступенчатая обработка событий — обрабатывайте потоки событий в несколько этапов для обнаружения паттернов и аналитики в реальном времени.
5. Продвинутая автоматизация workflow через события — автоматизируйте процессы, обнаруживая и анализируя паттерны событий в реальном времени.
Освоение этих паттернов поможет проектировать масштабируемые event-driven архитектуры для реальных приложений.
Сохраните этот пост для будущего. Поделитесь с теми, кто готовится к system design интервью или работает с event-driven системами.
👉 Java Portal
Исторический момент. Новый HTTP-метод в стандарте.
QUERY. Альтернатива GET и POST.
Как GET — не меняет состояние ресурса. Как POST — можно использовать тело запроса. Шлёшь JSON, кешируешь ответ.
Только что повышен до Proposed Standard.
👉 Java Portal
Твой Java-проект в Claude Code не должен каждый раз стартовать с пустого промпта.
claude-code-java — это готовая рабочая область для Java-разработчиков. Внутри навыки, шаблоны, MCP-конфиг и скрипты для настройки. Всё, что нужно для типичной Java-работы.
Он делает Claude Code одинаково полезным в любом проекте. Подсовывает структурированные markdown-скиллы для код-ревью, тестов, коммитов, архитектурных решений и работы с Maven.
Что внутри:
- 18 навыков для Java: код-ревью, архитектура, Spring Boot, JPA, Maven, безопасность, логирование
- Быстрый старт через setup-project.sh — создаёт .claude/, привязывает навыки, генерирует CLAUDE.md
- Можно брать по одному навыку, выборочно или сразу всё
- В комплекте шаблоны CLAUDE.md, MCP-конфиг, настройки
- README подсказывает, как подключить те же навыки к автоматическому PR-ревью
Открытый исходный код под MIT.
👉 Java Portal
Что нового в PostgreSQL 19?
PostgreSQL 19 продолжает одну важную тенденцию. Postgres превращается во что-то гораздо большее, чем просто реляционная база.
Самые интересные новинки:
Графовые запросы через SQL/PGQ
PostgreSQL 19 научился выполнять SQL Property Graph Queries. Теперь можно запрашивать связи прямо на SQL, без отдельной графовой базы. Пригодится для соцсетей, рекомендаций, поиска мошенничества и графов зависимостей.
GROUP BY ALL
Вместо того чтобы перечислять все колонки в GROUP BY, пишешь GROUP BY ALL. Postgres сам группирует по неагрегатным колонкам. Меньше шаблонного кода, меньше ошибок.
WAIT FOR LSN
Фича для приложений, которые используют реплики чтения. Позволяет подождать, пока реплика догонит основную базу, прежде чем читать данные. Полезно для консистентности «прочитал то, что написал».
Лучшая поддержка JSON
Postgres и дальше улучшает работу с полуструктурированными данными, не теряя при этом SQL, индексы, соединения и транзакции.
PostgreSQL 19 пока в бете. Детали могут поменяться к релизу. Но направление понятно. Postgres потихоньку становится одной платформой под всё: реляционные данные, документы, графы, аналитика и векторы для AI.
👉 Java Portal
Java Tip: Не перегружайте методы параметрами
Если метод принимает слишком много аргументов, возрастает риск передать значения в неправильном порядке, а код становится сложнее читать и поддерживать.
❌ Плохо:
createUser(firstName, lastName, street, city, zip, country);
createUser(firstName, lastName,
new Address(street, city, zip, country));
Spring Boot 4.1 приносит с собой много новых фич, включая автоконфигурацию job repository для Spring Batch на базе MongoDB.
\ Читай об этом здесь
👉 Java Portal !
SQLBolt - изучайте SQL с помощью простых интерактивных упражнений.
https://sqlbolt.com/
👉 Java Portal
Spring Boot 4.1 добавляет всего одно свойство:
spring.datasource.connection-fetch=lazy
@Transactional получают соединение с БД сразу при открытии транзакции, даже если запрос в итоге так и не выполняется.return, долгий вызов внешнего API перед сохранением данных — во всех этих случаях соединение просто простаивает без дела.lazy откладывает получение соединения до момента, когда действительно выполняется SQL-запрос.acquire count) падает примерно со 100 до почти 0.
🔥VPS + ISPmanager со скидкой до 100% на Waicore
Запускаете сайты на VPS? Сейчас самое время попробовать ISPmanager практически бесплатно.
➕ Наши акции:
— 100% скидка на первый месяц лицензии ISPmanager при заказе VPS из категории «Веб-хостинг»
— Скидка 60% на лицензии ISPmanager при отдельной покупке
Также доступны:
🛡 SSL-сертификаты
🛡 BitNinja для защиты серверов от атак, спама и вредоносного ПО.
Получаете готовый VPS с установленной панелью управления и можете сразу приступать к работе с сайтами, почтой, базами данных и другими сервисами.
⚡️Акция действует месяц.
Подробнее на сайте WAICORE.
DBeaver уже 15 лет остаётся де-факто стандартом среди SQL-клиентов.
Инструмент мощный, но это ещё и тяжёлый Java-монолит, который может запускаться по 20 секунд.
Кто-то решил переписать его с нуля на Rust и добавить возможности, которых в DBeaver никогда не было.
Проект называется Tabularis. 2.5 тыс. звёзд. Лицензия Apache 2.0. Последняя активность — 17 часов назад.
Самое интересное:
Tabularis создал один разработчик — Debba — как эксперимент по AI-assisted разработке.
Цель была простой: проверить, насколько далеко AI-агенты способны зайти при создании реального продукта.
В итоге получилось 55 релизов, 1192 коммита и SQL-клиент, который уже конкурирует с продуктами компаний, где над подобными инструментами работают десятки инженеров.
Что есть в Tabularis, а в DBeaver нет:
✅ Встроенный MCP-сервер — Claude, Cursor и Windsurf могут читать схему БД и выполнять запросы прямо из чата
✅ SQL Notebooks с графиками внутри ячеек и общими переменными между ними
✅ Визуальный EXPLAIN с AI-анализом плана выполнения
✅ Визуальный конструктор запросов с drag-and-drop JOIN'ами
✅ Автоматическая генерация ER-диаграмм
✅ Поддержка PostgreSQL, MySQL/MariaDB, SQLite и ClickHouse через плагины
✅ Редактор на базе Monaco с интеллектуальным автодополнением
✅ Без телеметрии, аккаунтов и подписок
Чего пока нет в Tabularis, но есть в DBeaver:
❌ SQL Server
❌ Oracle
Если работаешь с ними, DBeaver пока остаётся более очевидным выбором.
Во всех остальных случаях Tabularis запускается примерно за 2 секунды, занимает меньше ресурсов и позволяет AI-агентам работать с базой напрямую.
https://github.com/TabularisDB/tabularis
👉 Java Portal
Совет по Java: не ловите Exception на всякий случай
Плохая практика:
catch (Exception e)
NullPointerException, проблемы с памятью и другие сбои.catch (IOException e) { ... }
catch (JsonProcessingException e) { ... }
catch (DuplicateKeyException e) { ... }catch (Throwable t)
OutOfMemoryError, StackOverflowError и другие критические ошибки, после которых приложение зачастую уже не способно нормально продолжать работу.
Наткнулся на хороший репозиторий со Skills для Spring Boot-агентов. Стоит посмотреть.
https://github.com/rrezartprebreza/spring-boot-skills
👉 Java Portal
💡 Совет по Java: всегда закрывайте ресурсы вроде BufferedReader, InputStream и OutputStream через try-with-resources, чтобы избежать утечек памяти и ресурсов. #Java #BestPractices
👉 Java Portal
Circuit Breaker — это паттерн отказоустойчивости, который предотвращает постоянные попытки выполнить операцию, если она с высокой вероятностью завершится ошибкой.
В этом подробном руководстве Джессика показывает, как реализовать собственный Circuit Breaker в Spring Boot.
Из статьи ты узнаешь:
- зачем нужны Circuit Breaker;
- как обеспечиваются гарантии конкурентного доступа и переходов между состояниями;
- как отслеживать и учитывать ошибки;
- как устроена логика срабатывания Circuit Breaker;
- и многое другое.
Источник: https://freecodecamp.org/news/how-to-build-your-own-circuit-breaker-in-spring-boot-and-really-understand-resilience4j/
👉 Java Portal
💡 Java: Ловите ошибки ещё на этапе компиляции, помечая переопределённые методы аннотацией @Override. #Java #Annotations
// ❌ Опечатка в имени метода — код компилируется,
// но вы НЕ переопределили toString()
public class User {
private final String name;
public User(String name) {
this.name = name;
}
public String toStrng() { // хотели toString()
return name;
}
}
// Баг остаётся незамеченным — println(user)
// не будет использовать ваш метод
// ✅ @Override превращает опечатку в ошибку компиляции
public class User {
private final String name;
public User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User(" + name + ")";
}
}
// @Override
// public String toStrng() { ... }
//
// Ошибка компиляции:
// method does not override or implement a method from a supertype