25698
Все самое полезное для Java-разработчика в одном канале. Список наших каналов: https://t.me/proglibrary/9197 Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising
📊 А правда, что математика в Data Science не нужна?
Нет. Без неё вы не пройдёте собес и не поймёте, почему модель ведёт себя странно. Линал, матан и вероятности — это база, без которой работа в ML превращается в угадайку.
🔥 Эту базу можно собрать за 2 месяца на экспресс-курсе «Математика для Data Science».
👩🏫 Кто ведёт курс:
→ Мария Тихонова
PhD, руководитель исследовательского направления в SberAI, доцент ВШЭ.
→ Диана Миронидис
Преподаватель ВШЭ, автор научпоп-материалов по математике для блога МТС.
→ Ксения Кондаурова
Преподаватель преподаватель T-Банка, автор курсов ЦУ и Edutoria.
→ Маргарита Бурова
Академический руководитель программ по аналитике и ML, Wildberries & Russ.
🎁 Что сейчас доступно:
→ бесплатный тест, чтобы узнать свой уровень математики;
→ скидка 40% до 30 ноября;
→ если оплатить до конца ноября, курс «Базовая математика» в подарок.
👉 Пишите менеджеру, если хотите попасть в поток
👑 Магия IntelliJ IDEA: Language Injection
Пишешь SQL запрос в строке — ни подсветки синтаксиса, ни проверки, ни автодополнения. Опечатка в названии таблицы найдется только в рантайме. JSON в тесте? Вручную экранируешь кавычки и молишься, что не забыл запятую.
А IDEA умеет превращать строковые литералы в полноценные мини-редакторы с поддержкой нужного языка.
🔹 Что делает
— Внедряет поддержку другого языка (SQL, JSON, RegEx, HTML) внутри строкового литерала Java
— Включает подсветку синтаксиса, автодополнение, проверку ошибок для внедренного языка
— Позволяет редактировать в отдельном окне с полноценным редактором
— Понимает контекст: для SQL подключается к БД и предлагает реальные таблицы и колонки
🔹 Зачем это нужно
— Нативные SQL запросы в JDBC перестают быть черным ящиком — видишь ошибки до запуска
— JSON в тестовых данных валидируется на лету, форматируется одной кнопкой
— RegEx с подсветкой групп захвата и встроенным тестером
— HTML/XML в шаблонах проверяется на корректность структуры
— Xpath выражения с автодополнением элементов
🔹 Как использовать
— Автоматически: IDEA часто сама определяет язык (например, для методов createQuery, Pattern.compile)
— Вручную: Alt+Enter на строке → "Inject language or reference"
— Через аннотацию: добавить @Language("SQL") над String параметром
— Редактирование: Alt+Enter → "Edit SQL/JSON/RegEx fragment" — открывает полноценный редактор в popup
🐸 Библиотека джависта
#Enterprise
❓ Расскажите про паттерн Strategy?
Strategy — это поведенческий паттерн, который позволяет определить семейство алгоритмов, инкапсулировать каждый из них и сделать их взаимозаменяемыми.
Когда использовать:
— есть несколько способов выполнения одной операции;
— нужно избежать множественных if-else или switch;
— алгоритмы должны выбираться в runtime.
Преимущества: соблюдение Open/Closed Principle, устранение условных операторов, гибкость выбора алгоритма.
🐸 Библиотека собеса по Java
#core
🐸 Библиотека джависта
#DevLife
🎉 Большая распродажа Proglib Academy — минус 40% на всё!
📚 Выбирай свой курс:
▫️ «Экспресс-курс по математике для DS» — получи фундамент для построения успешной карьеры в Data Science
▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «Специалист по ИИ» или «AI-агенты», или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.
▫️ «Архитектуры и шаблоны проектирования» — чтобы писать гибкий, масштабируемый код как мидл+ разработчик.
▫️ «Основы IT для непрограммистов» — для тех, кто хочет понимать, как устроены технологии, не будучи разработчиком.
🎁 Бонусы ноября:
▫️ Розыгрыш MacBook Pro 14 — купи любой курс и пройди 2 недели обучения до 30 ноября.
▫️ Бесплатный тест по математике — за 5 минут покажет, какие темы стоит подтянуть перед DS.
👉 Выбрать курс со скидкой
Помните, как это было? Кофе, зачетка и возможность просто учиться без спринтов и задач
29 ноября в 16:00 будет Back to Uni — встреча-ностальгия в кампусе Центрального университета для ИТ-сообщества.
Что вас ждет:
— Пары от преподавателей ЦУ — применять знания не обязательно, будет просто интересно.
— Возможность узнать, как и зачем ИТ-специалисту преподавать в вузе, даже если нет опыта или страшно начать.
— Студенческие клубы, разговоры по душам в коридорах и та самая атмосфера, где можно просто вдохновляться.
Пары будут вести руководитель отдела прикладного ML в AI-центре Т-Банка Андрей Мельников, руководитель аналитики международного Яндекс Поиска Роман Васильев, к.м.н., руководитель направления исследований «Мышление и AI» в лаборатории нейронаук и поведения человека Сбера Яна Венерина и другие эксперты.
Это бесплатно. Приходите с однокурсниками — ностальгировать вместе.
Регистрируйтесь по ссылке тут!
🔍 Просто о сложном: Testcontainers
Testcontainers — это Java-библиотека, которая позволяет запускать Docker-контейнеры прямо из тестов.
Забудьте про моки базы данных, embedded PostgreSQL и H2 "вместо настоящей БД" — тестируйте на реальных зависимостях.
Библиотека предоставляет лёгкий API для управления жизненным циклом контейнеров: автоматический запуск перед тестом, проброс портов, ожидание готовности сервиса и гарантированная очистка после завершения.
Больше не нужно поднимать локальный PostgreSQL, настраивать Kafka кластер или держать Redis на машине разработчика — всё запускается изолированно в Docker и удаляется после тестов.
🔹 Ключевые моменты
▪️ Поддержка 50+ готовых модулей: PostgreSQL, MySQL, MongoDB, Redis, Kafka, Elasticsearch, Localstack и др.
▪️ Можно использовать любой Docker-образ через GenericContainer.
▪️ Автоматическая очистка — контейнеры удаляются после тестов.
▪️ Реальная изоляция — каждый тест может иметь свежее окружение.
▪️ Интеграция с JUnit 5, Spring Boot Test, Spock.
🔹 Под капотом
Testcontainers общается с Docker через docker-java клиент. При запуске теста библиотека:
1. Создаёт контейнер с нужным образом.
2. Ждёт готовности (health check или проверка порта).
3. Пробрасывает рандомный порт на localhost.
4. Передаёт connection URL в тест.
5. После теста останавливает и удаляет контейнер.
Есть механизм Ryuk (контейнер-уборщик) — он следит, что все тестовые контейнеры будут убиты, даже если JVM упала.
🔹 Подводные камни
— Нужен Docker
— Медленнее unit-тестов
— Потребление ресурсов
— Проблемы с сетью на CI
— Не забывайте фиксировать версии образов
✔️ Когда использовать
— Интеграционные тесты с БД (JPA, JDBC, jOOQ);
— Тестирование Kafka consumers/producers;
— Проверка работы с Redis, Elasticsearch;
— E2E тесты с реальным окружением;
— Локальная разработка (docker-compose замена);
— Тестирование миграций БД (Flyway, Liquibase);
— Проверка совместимости с разными версиями зависимостей.
❌ Не подходит:
— Unit-тесты (слишком тяжело);
— Когда Docker недоступен;
— Performance-тесты (overhead на контейнеры);
— Простые CRUD операции (можно обойтись H2);
— CI с ограниченными ресурсами.
🔧 Бонус-трюк: используйте @ServiceConnection в Spring Boot 3.1+ — он автоматически сконфигурирует DataSource из TestContainer без ручного прописывания URL.
🐸 Библиотека джависта
#CoreJava
⚙️ JMH (Java Microbenchmarking Harness)
JMH — это фреймворк для точного микробенчмаркинга в Java 📈
Он предназначен для создания тестов производительности, которые помогают анализировать, как различные изменения в коде влияют на его эффективность.
📌 Фичи:
▪️ измерение времени выполнения на уровне микроопераций;
▪️ поддержка сложных случаев оптимизации JVM;
▪️ вывод подробной статистики;
▪️ возможность настройки параметров теста;
▪️ точные результаты без влияния JVM-оптимизаций.
🔗 JMH на GitHub
🐸 Библиотека джависта
#Enterprise
😵💫 Усиль свои позиции на собесе в Data Science знаниями математики!
Чем важна математика расскажет Мария Тихонова - кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ на курсе «Математика для Data Science» от Proglib Academy.
👀 Мария - человек, который реально работает с LLM и делает так, чтобы модели понимали человеческую речь, а не делали вид.
📌 Добавь в свое портфолио проект, выделись среди конкурентов
Курс предусматривает выполнение практического проекта с фидбеком от экспертов. За проект можно взять темы:
• обучите градиентный спуск для предсказания цен на квартиры
• создадите классификатор тональности или тематики текста
• построите простую рекомендательную систему на матричных разложениях
Бонусы:
- скидка 40% до 30 ноября
- если оплатить до конца ноября, получите курс «Базовая математика» в подарок
➡️ Пройти бесплатный тест на знание математики
👇👇👇
Записаться на курс
🎓 Экспресс-курс «Математика для Data Science» стартует 4 декабря
Этот курс для вас, если вы:
🧑💻 Программист
Когда нужно понять, что происходит «под капотом» ML-алгоритмов.
📊 Начинающий DS / аналитик / студент
Чтобы закрыть теорию, подтянуть фундамент и собрать портфолио.
📈 Смежный специалист
Чтобы уверенно работать с моделями, статистикой и гипотезами.
🎁 Сейчас лучший момент стартовать:
— скидка 40% на курс до конца ноября
— можно пройти бесплатный тест на знание основ математики
👉 Записаться на курс
🎯 Record Patterns в Java 21: как компилятор превращает деструктуризацию в bytecode
После двух preview (Java 19-20), Record Patterns стали финальной фичей в Java 21. Разберем механику работы под капотом.
🔹 Что такое Record Patterns
Это расширение pattern matching для деструктуризации record классов:
record Point(int x, int y) {}
// До Java 21
if (obj instanceof Point point) {
int x = point.x();
int y = point.y();
// use x, y
}
// Java 21
if (obj instanceof Point(int x, int y)) {
// x и y автоматически в scope
System.out.println(x + y);
}
record Point(int x, int y) {}
record Rectangle(Point upperLeft, Point lowerRight) {}
// Одна строка вместо цепочки вызовов
if (shape instanceof Rectangle(Point(int x1, int y1),
Point(int x2, int y2))) {
int area = Math.abs((x2-x1) * (y2-y1));
}
// Исходный код
if (obj instanceof Point(int x, int y)) {
process(x, y);
}
// Что генерирует компилятор (упрощенно)
if (obj instanceof Point __temp) {
int x = __temp.x();
int y = __temp.y();
process(x, y);
}
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
record Triangle(double a, double b, double c) implements Shape {}
double area(Shape shape) {
return switch(shape) {
case Circle(double r) -> Math.PI * r * r;
case Rectangle(double w, double h) -> w * h;
case Triangle(double a, double b, double c) -> {
double s = (a + b + c) / 2;
yield Math.sqrt(s * (s-a) * (s-b) * (s-c));
}
};
}
String classify(Object obj) {
return switch(obj) {
case Point(int x, int y) when x == y -> "diagonal";
case Point(int x, int y) when x > y -> "above diagonal";
case Point(int x, int y) -> "below diagonal";
default -> "not a point";
};
}
// Работало в preview
for (Point(int x, int y) : points) { }
// Больше не работает в Java 21 final
🐸 Библиотека джависта
#DevLife
👑 Магия IntelliJ IDEA: Multiple Cursors
Нужно переименовать пять переменных одновременно? Или добавить .orElseThrow() к каждому Optional в цепочке? Обычно копируешь первую строчку, вставляешь, правишь, повторяешь еще четыре раза.
Скучно, медленно, и легко ошибиться. А можно умнее.
🔹 Что делает
— Создает несколько курсоров в разных местах кода одновременно
— Все изменения применяются параллельно: печатаешь один раз → меняется везде
— Работает с выделением: можно выделить несколько фрагментов и редактировать их синхронно
— Понимает контекст: может выбрать все вхождения переменной или строки в файле
🔹 Зачем это нужно
— Массовые однотипные правки за секунды вместо копипасты
— Видишь все изменения сразу, до применения
— Идеально для инициализации билдеров: добавляешь .with перед каждым полем одним движением
— Работает с вертикальными блоками кода: легко править список параметров или цепочку вызовов
🔹 Как использовать
— Способ 1: Alt+J (Windows/Linux) или ⌃+G (macOS) — выделяет следующее вхождение слова под курсором.
Нажимайте повторно, чтобы добавить еще вхождения, или Ctrl+Alt+Shift+J / ⌃+⌘+G для всех сразу
— Способ 2: Alt+Shift+Click (Windows/Linux) или ⌥+Shift+Click (macOS) — ставит курсор в место клика.
Кликайте в нужные места, создавая множество курсоров вручную
— Способ 3: Alt+Shift+Insert (Windows/Linux) или ⌘+Shift+8 (macOS) — Column Selection Mode для вертикального выделения.
Для отмены всех курсоров кроме основного: Esc
🐸 Библиотека джависта
#Enterprise
✔️ Java-тест: Config edition
Представим задачу 👇
У вас есть Spring Boot-приложение с PostgreSQL. Нужно написать конфиг application.yml, который:
— настраивает подключение к БД;
— включает Hibernate DDL auto-update в dev-режиме;
— настраивает логирование SQL-запросов;
— устанавливает максимальный размер пула соединений = 10.
💬 Решения под спойлер.
🐸 Библиотека собеса по Java
#practise
📘 Хочешь в Data Science, но есть пробелы в знаниях математики?
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
🐸 Библиотека джависта
#DevLife
💬 Обратная связь
Коллеги, давайте всем комьюнити соберёмся и составим базу годных ресурсов по Java помимо нашего канала.
✔️ Что ищем
— Блоги и статьи
— Telegram-каналы
— YouTube-каналы и подкасты
— Актуальные книги
— Репозитории
— Доклады
❌ Что НЕ ищем
Курсы "java с нуля за месяц", базовые туториалы и переводы официальной документации.
💬 Закидывайте в комменты ваши любимые источники. Для работы, для учёбы, для повседневного чтения.
🐸 Библиотека джависта
#DevLife
☕️ Java — это не только про фабрики бинов
Принято считать, что джавист — это суровый энтерпрайз-боец. Но на деле хороший бэкендер — это гибкий специалист, который может масштабироваться в тимлида или архитектора. Одно из главных условий такого роста — постоянный приток новой информации и анализ чужого опыта.
Вместо, того чтобы искать релевантный контент по всему тг, загляните в папку, где собраны несколько авторских каналов. Можно узнать много полезностей не только про Java, но и про актуальные инструменты и смежные технологии. Пригодится для вашего профессионального роста.
🔍 Kubernetes + Spring Boot
Вместо того чтобы копировать чужие манифесты с GitHub, вы настраиваете полноценный production-ready деплоймент через промпт.
Оптимизированный Dockerfile с multi-stage сборкой, Deployment с resource limits и health probes, Service Discovery через Kubernetes DNS, Ingress с TLS терминацией, автоскейлинг через HPA, NetworkPolicy для изоляции, RBAC для безопасности, и observability через Prometheus/Grafana.
📝 Промпт:
Generate a production-ready Spring Boot 3 application deployment to Kubernetes with enterprise-grade configuration:
— Create optimized multi-stage Dockerfile: Eclipse Temurin JDK 21, layered JAR, non-root user, distroless runtime image, minimal attack surface.
— Configure Kubernetes Deployment: resource requests/limits (CPU/memory), pod anti-affinity, PodDisruptionBudget, rolling update strategy with maxSurge/maxUnavailable, replica count.
— Implement health probes: liveness (/health/liveness), readiness (/health/readiness), startup probe for slow apps, custom health indicators, initial delays and timeouts.
— Set up configuration management: ConfigMaps for application.yml, Secrets for credentials, environment-specific overlays, volume mounts, Spring Cloud Kubernetes Config integration.
— Configure Service and Ingress: ClusterIP Service, NGINX Ingress with path/host routing, TLS termination via cert-manager, rate limiting, CORS policies.
— Implement RBAC: ServiceAccount, Role with least-privilege, RoleBinding, pod security context (runAsNonRoot, readOnlyRootFilesystem).
— Set up autoscaling: HorizontalPodAutoscaler based on CPU/memory/custom metrics, VerticalPodAutoscaler, scaling thresholds.
— Add NetworkPolicy: ingress/egress rules, namespace isolation, pod selector-based restrictions, deny-all default.
— Configure observability: Prometheus ServiceMonitor, Grafana dashboards, Spring Boot Actuator metrics, distributed tracing with Jaeger/Tempo, Loki for logs.
— Implement graceful shutdown: SIGTERM handling, preStop hooks, connection draining, termination grace period (30s+).
— Add secrets management: External Secrets Operator, HashiCorp Vault, AWS/GCP Secrets Manager CSI drivers.
— Create Helm chart: values.yaml with environment configs, templates for all resources, chart dependencies, deployment notes.
— Add Kustomize setup: base manifests, environment-specific overlays, ConfigMap generators.
— Configure init containers: database migrations (Flyway), wait-for-dependencies, secret fetching.
— Implement GitOps: ArgoCD Application manifest, sync policies, health checks, automated rollback.
Deliverables:
— Dockerfile with multi-stage build
— kubernetes/*.yaml (deployment, service, ingress, configmap, secret, hpa, networkpolicy)
— helm/ chart with templates and values
— kustomize/ with base and overlays
— prometheus-servicemonitor.yaml
— grafana-dashboard.json
— README with deployment guide and troubleshooting
🎧 Что послушать — #подкаст Javaswag #82
🔹 Ведущий: Дмитрий Волыхин
🔹 Гость: Владимир Ситников
🔹 Продолжительность: 2 часа 6 минут
Владимир рассказывает о перфоманс-инжиниринге, роли нагрузочного тестирования, создании собственного профайлера, работе с Java Flight Recorder и Async Profiler, а также делится опытом управления PR в Open Source проектах и участия в конференциях.
🔹 Ключевые темы выпуска
02:31 — Перфоманс-инжиниринг
07:40 — Роль нагрузочного тестирования
29:46 — Кэширование запросов в Oracle и Postgres
35:42 — Платная поддержка Spring
38:17 — Создание собственного профайлера
56:13 — Оптимизация записи метрик
58:18 — Java Flight Recorder и Async Profiler
01:38:00 — Управление PR и их обсуждение
01:45:02 — Доклады и конференции
🔗 Слушать выпуск
🐸 Библиотека джависта
#DevLife
🤖 AI сейчас на пике — и математика снова в центре внимания.
«На конференции AIJ только и разговоров, что о AI и математике. Ведь в основе генеративных моделей Gen AI лежит фундаментальная математика.»
🐸 Библиотека джависта
#DevLife
⌛ Сохраняйте шпаргалку по основным командам Docker
🐸 Библиотека джависта
#Enterprise
🐸 Библиотека джависта
#DevLife
🔥 Как настроить Liquibase для управления миграциями БД
Liquibase — это инструмент для версионирования схемы базы данных. Забудьте про ручные SQL-скрипты и проблемы с синхронизацией между окружениями.
Работает декларативно, отслеживает все изменения, поддерживает rollback и работает с любыми реляционными БД.
1️⃣ Добавляем зависимости
Нужна одна основная зависимость: liquibase-core. Если используете Spring Boot, добавьте spring-boot-starter-liquibase — он автоматически интегрируется с DataSource и запускается при старте приложения.
Критически важно добавить JDBC-драйвер вашей БД (postgresql, mysql-connector и т.д.). Без него Liquibase не сможет подключиться и применить миграции.
2️⃣ Создаём структуру changelog-файлов
Создайте директорию resources/db/changelog/. В корне положите главный файл db.changelog-master.yaml — это точка входа, которая включает все остальные миграции.
В мастер-файле перечисляете пути к конкретным changeset-файлам в порядке применения. Называйте файлы по схеме: v1.0-create-users-table.yaml, v1.1-add-email-column.yaml — так проще ориентироваться в истории изменений.
3️⃣ Настраиваем application.yml
В конфигурации укажите путь к мастер-файлу через параметр spring.liquibase.change-log. По умолчанию это classpath:db/changelog/db.changelog-master.yaml.
Обязательно настройте параметры enabled (включить/выключить), drop-first (очистка БД перед стартом — только для dev!) и contexts (для разделения миграций по окружениям: dev, test, prod).
4️⃣ Пишем changeset'ы
Каждое изменение оборачивается в changeset с уникальным id и автором. Liquibase отслеживает, какие changeset'ы уже применены через служебную таблицу databasechangelog.
Основные типы изменений:
▪️ createTable / dropTable — создание/удаление таблиц
▪️ addColumn / dropColumn — добавление/удаление колонок
▪️ createIndex — создание индексов для оптимизации запросов
▪️ addForeignKey — настройка связей между таблицами
▪️ insert / update — заполнение справочников и тестовых данных
▪️ sql / sqlFile — для сложных кастомных запросов
Используйте preconditions для проверки условий перед применением: например, не создавать таблицу, если она уже существует.
5️⃣ Настраиваем rollback
Liquibase умеет откатывать изменения. Для большинства операций rollback генерируется автоматически, но для sql и sqlFile нужно явно указывать rollback-блок.
Добавляйте тег rollback с SQL-командами отката. Для createTable это будет dropTable, для addColumn — dropColumn. Это критически важно для production — без rollback вы не сможете откатить проблемную миграцию.
6️⃣ Работа с разными окружениями
Используйте contexts и labels для разделения миграций. Тестовые данные помечайте context="dev", production-миграции — context="prod". При запуске приложения указывайте нужный context в конфигурации.
Можно создать отдельные файлы для каждого окружения: db.changelog-dev.yaml с тестовыми данными и db.changelog-prod.yaml только со структурными изменениями. Подключайте их условно через профили Spring.
7️⃣ Лучшие практики
▪️ Никогда не изменяйте уже применённые changeset'ы — создавайте новые для исправлений
▪️ Один changeset = одно атомарное изменение. Не пихайте всё в один файл
▪️ Используйте runOnChange="false" чтобы changeset применялся только один раз
▪️ Добавляйте failOnError="true" для критичных миграций
▪️ Тестируйте миграции на копии production БД перед деплоем
✔️ Что происходит под капотом
При старте приложения Liquibase подключается к БД и проверяет наличие служебных таблиц DATABASECHANGELOG и DATABASECHANGELOGLOCK. Если их нет — создаёт.
Затем читает master-файл, получает список всех changeset'ов и сверяет с таблицей DATABASECHANGELOG. Новые changeset'ы применяются последовательно, информация о них записывается в таблицу с MD5-хэшем для контроля целостности.
💡 Бонус-совет
Интегрируйте Liquibase с CI/CD. Перед деплоем запускайте команду liquibase validate для проверки корректности changelog'ов. В pipeline добавьте команду liquibase updateSQL чтобы увидеть, какой SQL будет выполнен, без реального применения.
🐸 Библиотека джависта
#Enterprise
👑 Фишка Lombok: @With
Как вы обычно обновляете одно поле в неизменяемом объекте? Создаёте копию с нужным значением?
Муторно. Lombok умеет делать это просто и элегантно.
🔹 Аннотация @With
Генерирует методы withX(...), которые создают копию объекта с изменённым полем. Подходит для immutable-моделей и паттерна builder. Класс при этом должен быть final (например, через @Value или вручную).
🔹 Пример
@Value
@With
public class User {
String name;
int age;
}
User user1 = new User("Alice", 25);
User user2 = user1.withAge(30); // создаётся новый объект с новым age
🚀 В IT ценится не перфекционизм, а движение вперёд, и если вы давно откладывали обучение — самое время начать.
❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!
Что нужно:
⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.
🎓 Курсы, которые участвуют
👉 Участвовать
☕️ Java && Coffee
У меня пока ещё всё зелено, а в РФ видел снега нападало ❄️
Отправляйте снежные фото в комментарии👇🏻
🐸 Библиотека джависта
#DevLife
❓ Helidon vs Spring Boot: стоит ли переходить на лёгкий Jakarta-стек?
Наш подписчик спрашивает:
Мы разрабатываем корпоративный сервис на Spring Boot 2.7, планируем переход на 3.x, но всё чаще в обсуждениях мелькает Helidon Nima и вообще подходы «lightweight без магии». Сомневаюсь: Spring привычный, предсказуемый и богатая экосистема. Но Helidon обещает минимальный overhead, предсказуемую модель и высокую производительность. Что выбрать?
🔍 MongoDB + Spring Boot
Вместо того чтобы копировать чужие сниппеты с StackOverflow, вы настраиваете полноценный слой персистентности через промпт.
Соединения через MongoDB Java Driver, Spring Data MongoDB для репозиториев, audit-логирование, транзакции для replica set, валидацию схемы, health checks, и observability через Micrometer.
📝 Промпт:
Generate a production-ready Spring Boot 3 + MongoDB integration with enterprise-grade configuration:
— Configure MongoDB connection using MongoClientSettings: connection pool size, max idle time, socket timeout, server selection timeout, heartbeat frequency, and SSL/TLS.
— Set up Spring Data MongoDB repositories: custom converters, projection interfaces, pagination, aggregation pipelines, and @Document annotations with proper indexes.
— Implement schema validation using JSON Schema or validator expressions: required fields, enums, type constraints, and validation actions.
— Configure replica set / sharded cluster connectivity: read preference, write concern, journal mode, retryWrites, maxStalenessSeconds, tag sets for multi-region deployments.
— Add connection pooling monitoring with Micrometer: pool sizes, checkout time, wait queues, timeouts, and heartbeat metrics.
— Implement MongoDB health checks with Spring Boot Actuator: ping validation, replica set status check, custom health indicators for stale secondaries.
— Configure transaction management for replica set: multi-document transactions, timeout settings, retryable writes, and error classification for transient transaction errors.
— Set up resilience patterns with Resilience4j: retries with exponential backoff, timeouts, circuit breaker for degraded nodes, fallback strategies for reads.
— Add credentials management: environment variables, Spring Cloud Config, HashiCorp Vault, AWS Secrets Manager, Kubernetes Secrets.
— Configure SSL/TLS: CA certificates, mutual TLS support, certificate revocation checks, hostname verification.
— Implement audit logging: operation time, slow operations, connection churn alerts, replicated writes latency.
— Add MongoDB-specific performance optimizations: index hints, collation settings, fetch size for cursors, batch inserts/updates, compression algorithms (Snappy/Zstd).
— Provide Docker Compose with MongoDB 7.x replica set initialization + Mongo Express UI + Spring Boot container with proper networking.
— Include integration tests using Testcontainers: replica set mode, transaction testing, TTL index validation.
— Add sample @Document entities with indexes: TTL, unique, sparse, compound indexes.
— Configure application.yml profiles: dev (single-node MongoDB), staging (replica set), prod (replica set with sharded cluster).
— Include aggregation examples: $lookup, $facet, $project, $graphLookup, and pipeline-based projections.
— Add encryption-at-rest & field-level encryption (CSFLE) configuration.
Deliverables:
— application.yml with environment-specific profiles
— build.gradle/pom.xml with MongoDB and Spring Data dependencies
— MongoConfig.java with custom MongoClientSettings
— JSON Schema validation file for collections
— Example @Document, repository, and service layer
— Integration tests with Testcontainers (replica set)
— docker-compose.yml with MongoDB replica set + Mongo Express
— README with connection troubleshooting and performance tuning