Telegram Web Link
⚙️ Генерация CI/CD пайплайна

Автоматизация сборки, тестирования и деплоя — must-have даже для pet-проекта. Но настраивать GitLab CI или GitHub Actions вручную? Спросите AI — и получите готовый пайплайн, адаптированный под ваш стек.

📝 Промпт:

Generate a CI/CD pipeline for a Java Spring Boot application using GitLab CI.
— Include stages: build, test, integration-test, package, deploy.
— Use Gradle (or Maven) as the build tool.
— Include support for Docker image build and push to container registry.
— Run integration tests using Testcontainers.
— Use caching to speed up pipeline runs.


💡 Расширения:

— Добавьте environment-specific deployments: отдельные джобы для dev/stage/prod с переменными окружения, secrets и условиями по веткам (only/except или rules).
— Интегрируйте notifications в Telegram или Slack на стадии failed/success для быстрой обратной связи.
— Добавьте security scan stage: используйте Snyk или OWASP Dependency Check для анализа уязвимостей зависимостей.
— Автоматизируйте Docker image tagging: используйте Git tag или commit hash, чтобы образы были отслеживаемыми.

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍41🥱1
🔍 Правильное понимание Single Responsibility Principle (SRP)

О принципе единственной ответственности слышали все. Конечно правильный ответ согласно книги Роберта Мартина "Чистая архитектура": SRP - это принцип единой ответственности.

Но при попытке разобраться в более дательном понимании принципа его часто трактуют слишком буквально:
Метод должен реализовывать одну задачу

Класс должен отвечать за один функционал


Да, это отчасти верно и такой принцип тоже есть, но он применяется на низшем уровне системы. SRP же применяется на более высоком уровне.

В итоге получаются сервисы, в которых вроде как всё «по SRP», но изменения в одном бизнес-сценарии ведут к каскадным правкам в десятках файлов. Это сигнал: принцип нарушен, несмотря на формальное соблюдение.

🔹 О чём на самом деле говорит SRP

В классическом изложении (по Роберту Мартину):
Модуль должен иметь только одну причину для изменения.


И под модулем понимается не метод и не даже один класс, а группа классов и интерфейсов, объединённая общим потребителем — актором.

🔹 Что это означает на практике

1. Определите акторов
Актор — это не всегда пользователь. Это может быть внешний сервис, внутренний инструмент, регламент. Важно: требования акторов не должны пересекаться. Если они меняются независимо — значит, им нужны отдельные модули.

2. Постройте модули вокруг акторов

Частая ошибка — «модуль пользователей», в котором и логика регистрации, и рассылка писем, и обработка GDPR-запросов.
Лучше разделить:
▪️ один модуль обслуживает end-user’а,
▪️ другой — юридические требования,
▪️ третий — внутреннюю админку.

3. Не дробите код ради SRP, если это нарушает целостность модуля

SRP — это не о размере, а о мотивации изменений. Метод в 100 строк, обслуживающий один сценарий, допустим. А вот класс, который реагирует на десяток независимых событий — нет.

🔹 Пример


Плохо:
public class OrderService {
public void placeOrder() { ... }
public void notifyCustomer() { ... }
public void saveAuditLog() { ... }
}


Этот класс изменится при любом изменении в бизнес-логике, в уведомлениях или в логировании. Три причины изменения — три актора.

✔️ Хорошо:

▪️ OrderProcessor — отвечает за бизнес-сценарий
▪️ NotificationService — отправка сообщений
▪️ AuditService — логирование

Каждый компонент обслуживает одного актора, имеет свою причину для изменений и независимую эволюцию.

🔹 Вывод

SRP стоит понимать как инструмент для проектирования архитектуры. Его задача — отделить контексты, которые меняются по разным причинам, и тем самым минимизировать связность и ограничить зону изменений. Не методы, не классы, а контексты и акторы.

🔼 Если пост был интересен/полезен → поддержите бустом канал

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍135🔥3🤔1
Виртуальные потоки — будущее или сырой эксперимент?

С выходом Java 21 виртуальные потоки (Virtual Threads) стали доступными для продакшна. Обещают удобный и масштабируемый способ работы с параллелизмом и без боли реактивщины.

▪️ Сторонники Virtual Threads уверены: это долгожданный прорыв. Теперь можно писать привычный синхронный код, не заморачиваясь с CompletableFuture и реактивными фреймворками. Масштабируемость? Да! Сотни тысяч потоков без overhead-а — вполне реально.

▪️ Напротив: tooling и экосистема пока не готовы. IDE лагают при отладке, JMX и трейсы работают криво, баги не редкость. Да и блокировки никуда не делись — просто теперь они маскируются, а не устраняются. По сути — "асинхронность для ленивых".

💬 Стоит ли сразу использовать их в новых проектах или подождать пару релизов?

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥32
👑 Магия IntelliJ IDEA

Когда нужно что-то быстро протестировать, написать фрагмент кода, проверить регулярку или сериализацию — не создавайте новый класс. Вместо этого используйте Scratch File (Ctrl + Alt + Shift + Insert).

🔹 Что делает


— Создаёт временный файл вне проекта
— Поддерживает Java (и другие языки), автодополнение, импорт, выполнение
— Сохраняется автоматически, можно переключаться между файлами

🔹 Зачем это нужно

— Быстрые пробы кода без засорения проекта
— Подходит для написания утилит, генерации данных, логов
— Удобно держать список SQL-запросов, curl-ов или шаблонов прямо в IDE

🔹 Как использовать


— Нажмите Ctrl + Alt + Shift + Insert → выберите язык (например, Java)
— Пишите как обычно: public static void main, System.out.println() — и запускайте
— Можно открыть менеджер Scratch-файлов через Project > Scratches and Consoles

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥53
🔼 От конкурентного программирования к промышленному производству

В разработке ПО ключевым фактором успеха является не только качество кода, но и способность команды эффективно решать сложные задачи. В статье рассматривается, как алгоритмическое мышление помогает разработчикам:

▪️ Оптимизировать производительность: использование алгоритмов для улучшения скорости и эффективности приложений.

▪️ Управлять сложностью: применение структур данных и алгоритмов для упрощения разработки и поддержки кода.

▪️ Повышать качество продукта: снижение количества ошибок и улучшение стабильности приложений.

Особое внимание уделяется переходу от теоретического понимания алгоритмов к их практическому применению в промышленной разработке.

🔗 Подробнее в статье

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🔥1
🔥 Сегодня стартует курс по AI-агентам!

Онбординг уже сегодня, но ещё можно вписаться — ПОСЛЕДНИЙ ШАНС это сделать.

Мы больше года собирали мультиагентные системы: экспериментировали, переделывали и в итоге — оформили всё в 5 плотных вебинаров.

😤 «А можно ли вообще научиться чему-то за 5 вебинаров?!»

Если вы хотите просто послушать — нет
Если хотите разбираться и делать — да

➡️ На курсе:
— мы не читаем слайдики, а работаем в коде в реальном времени
— можно задавать вопросы прямо на вебинаре
— после каждого вебинара есть домашка и поддержка в чате

И главное — вы получаете системное понимание, а не набор хаотичных туториалов.

️Если вы думаете, что успеете потом — не успеете.
Старт сегодня:
— а те, кто вписался сейчас, будут вас опережатьв проектах, на грейде и в зарплате

Знакомьтесь, эксперт нашего курса:
Никита Зелинский — Chief Data Scientist МТС, Head of ML Platforms, руководитель центра компетенций по Data Science.

Стартуем сегодня — забронируй свое место
4👍1🔥1💯1
Lombok — спасение от boilerplate или технический долг?

Lombok давно стал популярным решением. Аннотации вроде @Getter, @Builder, @Slf4j избавляют от рутинного кода и ускоряют разработку.

▪️ За Lombok
— Устраняет шаблонный код и снижает количество ручных ошибок.
— Удобен при работе с immutable‑объектами и внедрении зависимостей через конструкторы.

▪️ Против Lombok
— Зависимость от нестабильных internal‑API.
— Требует обязательной поддержки на всех IDE/CI.
— За «синтаксический сахар» приходится платить техническим долгом.

💬 Подключать Lombok и ускорять разработку ценой стабильности, или отказаться и держать чистоту кода?

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥1
🆕 Java Digest: подборка материалов

🔹 Towards a JSON API for the JDK

Разработчики OpenJDK анонсировали JSON API для Java, пока только на уровне рассылки, но обещают скоро подготовить JEP или обновить JEP 198. Добавление JSON API видится крайне полезным, по крайней мере для простых проектов и скриптов.

🔹
Redis is now available under the AGPLv3 open source license

Начиная с версии Redis 8 система снова доступна под открытой лицензией AGPLv3, одобренной OSI. Вместе с этим в Redis 8 интегрированы технологии Redis Stack, включая поддержку JSON и Time Series, а еще представлен новый тип данных — vector sets.

🐸 Библиотека джависта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥1
Какое регулярное выражение соответствует строке, которая состоит только из латинских строчных букв (a–z) и имеет длину ровно 8 символов?
Anonymous Quiz
47%
[a-z]{8}
38%
^[a-z]{8}$
5%
[a-z]+{8}
5%
^a-z{8}$
5%
^[a-z]{1,8}$
👍83🔥1
😮 Топ-вакансий для джавистов за неделю

Senior + / Lead Java Developer — 4 500 - 6 500$ — удалёнка

Руководитель команды разработки (Java) — от 300 000 ₽ — офис (Омск)

Team Lead Full Stack разработчик (Java + React) — от 300 000 до 400 000 ₽ — удалёнка

Разработчик Java — от 180 000 до 250 000 ₽ — гибрид (Москва)

➡️ Еще больше топовых вакансий — в нашем канале Java jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥1🤩1
🎮 Реализация аутентификации с использованием Spring Security

Проблема: обеспечение безопасности приложения требует надёжной системы аутентификации и авторизации пользователей.

Решение: в книге «Java 17 Backend Development» автор предлагает процесс настройки Spring Security для реализации аутентификации с использованием JWT-токенов.

Пример кода:
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtTokenProvider tokenProvider;

public JwtAuthenticationFilter(JwtTokenProvider tokenProvider) {
this.tokenProvider = tokenProvider;
}

@Override
protected void doFilterInternal(HttpServletRequest request, FilterChain chain) throws ServletException, IOException {
String token = tokenProvider.resolveToken(request);
if (token != null && tokenProvider.validateToken(token)) {
String username = tokenProvider.getUsernameFromToken(token);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, null);
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
chain.doFilter(request, response);
}
}


Преимущества:


— Защита приложения от несанкционированного доступа.
— Возможность настройки различных уровней доступа.
— Лёгкая адаптация к изменениям в требованиях безопасности.

Еще больше полезных книг — в нашем канале @progbook

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3👏1👾1
⚙️ Генерация Event-Driven архитектуры на Spring + Kafka

Классический REST не справляется с масштабом и скоростью реакции? Пора перейти к событийной архитектуре: Kafka + Spring Boot. Спросите AI — и получите продуманный шаблон микросервиса с продюсерами, консьюмерами, сериализацией, хэндлингом ошибок и даже dead-letter-топиками.

📝 Промпт:


Generate a production-grade Java Spring Boot microservice using Apache Kafka for event-driven architecture.
— Use Spring Boot 3 and Spring Kafka.
— Implement Kafka producers and consumers for a user.created event.
— Use Avro schema for message serialization and Schema Registry for compatibility.
— Include retry logic and Dead Letter Topic (DLT) support for failed messages.
— Handle message headers and custom error handling.
— Add integration tests using Embedded Kafka and Testcontainers.


💡 Расширения:

— Добавьте Implement the outbox pattern using a transactional Kafka producer and Debezium CDC, чтобы гарантировать доставку событий и избежать дублирования при сбоях в БД.
— Добавьте Integrate observability using Micrometer for Prometheus and OpenTelemetry for distributed tracing, чтобы отслеживать метрики и трассировать поток сообщений сквозь микросервисы.
— Добавьте Generate Kafka topic and consumer group configuration using Terraform, чтобы автоматизировать инфраструктуру и обеспечить консистентную настройку топиков в Dev/Stage/Prod.
— Добавьте Support dynamic partitioning and load balancing among consumers, чтобы масштабировать консьюмеров при увеличении нагрузки.

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1🥱1
Первый вебинар нашего курса по AI-агентам уже прошёл!

Запись уже выложили на обучающей платформе — можно влетать и догонять с комфортом.

Первые слушатели уже оставили фидбэки — и, кажется, мы попали в точку:
— «теперь наконец понял, как выбирать модели под задачу — раньше брал первую попавшуюся»
— «без лишнего, по делу, в лайве — кайф»
— «огонь, ожидания 100% оправданы лично у меня»

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

Ещё можно догнать и пройти всё вместе с потоком.

👉 Залетай на курс
3🌚1
📊 Работа с многопоточностью

Многопоточность в Java — это не просто задача синхронизации потоков, а целая экосистема инструментов для эффективного и безопасного параллельного выполнения кода. Правильная настройка многопоточных процессов позволяет значительно улучшить производительность, но требует внимательного подхода.

🔹 Основы многопоточности


▪️ Thread — создание потоков вручную с использованием конструктора Thread позволяет получить максимальный контроль, но снижает гибкость. Рекомендуется использовать ExecutorService для более управляемого подхода.
▪️ ExecutorService — интерфейс для управления пулом потоков, позволяет эффективно управлять жизненным циклом потоков и управлять задачами с различными приоритетами.
▪️ Callable vs Runnable — используйте Runnable для простых задач без возврата значений и Callable для задач с возвращаемыми результатами.
▪️ ForkJoinPool — специализированный пул потоков для задач, которые могут быть разбиты на более мелкие параллельные подзадачи, например, при решении рекурсивных задач.

🔹 Синхронизация

▪️ synchronized — это простой способ синхронизации, который подходит для мелких блоков кода. Однако может привести к блокировкам и снижению производительности при интенсивной нагрузке.
▪️ ReentrantLock — предпочтительнее в сценариях с большим количеством потоков и блокировок. Она дает больше контроля, например, возможность прерывания или проверки блокировки.
▪️ ReadWriteLock — используется, когда большая часть потоков только читает данные. Это повышает производительность, так как чтение может происходить параллельно.
▪️ CountDownLatch и CyclicBarrier — удобные инструменты для координации потоков в ситуации, когда несколько потоков должны дождаться выполнения определенных задач.

🔹 Состояния потоков и их управление

▪️ Thread.join() — блокирует вызывающий поток до тех пор, пока не завершится указанный поток. Полезно для синхронизации выполнения различных частей программы.
▪️ Thread.sleep() — приостановка потока на заданный интервал. Не стоит использовать ее для ожидания условий, используйте wait() и notify() для работы с мониторами.
▪️ Thread.interrupt() — сигнализирует потоку о том, что ему нужно завершиться. Это полезно при долгих операциях или ожидающих потоках, которые могут быть отменены.

🔹 Безопасность данных

▪️ ThreadLocal — позволяет каждому потоку иметь собственную копию переменной, что минимизирует проблемы с синхронизацией.
▪️ Atomic classes — обеспечивают атомарные операции с переменными, что повышает производительность, избегая блокировок.
▪️ volatile — используется для переменных, значения которых могут быть изменены несколькими потоками. Гарантирует видимость изменений между потоками, но не синхронизирует доступ к данным.

🔹 Производительность и оптимизация

▪️ Immutable Objects — неизменяемые объекты позволяют избежать проблем синхронизации, так как они безопасны для многопоточного доступа.
▪️ ForkJoinPool — при параллельных задачах, например, при работе с большими объемами данных, используйте ForkJoinPool для более эффективного распределения нагрузки между потоками.
▪️ ExecutorService.submit() — для более высокоуровневого контроля и получения результата используйте submit() с объектом Future вместо execute().

🔹 Дополнительно

▪️ CompletableFuture — для асинхронных операций и управления результатами выполнения в будущем. Это удобный способ для работы с неблокирующими асинхронными операциями.
▪️ Parallel Streams (Java 8+) — используйте параллельные потоки для упрощения многопоточных операций. Например, при обработке коллекций используйте stream().parallel() для распараллеливания задач.

💬 Какие методы синхронизации вы предпочитаете в своем проекте?

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥7👍5
👑 Магия IntelliJ IDEA

Забудьте про System.out.println() в логике — используйте Evaluate Expression прямо во время отладки, чтобы проверить любые значения на лету.

🔹 Что делает

— Позволяет выполнять произвольные выражения прямо во время паузы
— Работает с контекстом текущего стека: переменные, поля, this
— Поддерживает сложные конструкции: myList.stream().filter(...).collect(...)

🔹 Зачем это нужно

— Позволяет быстро проверять гипотезы при отладке
— Избавляет от лишних логов или временных переменных
— Помогает исследовать поведение без изменения кода

🔹 Как использовать


— Поставьте breakpoint и запустите Debug
— Когда выполнение остановится, нажмите Alt + F8
— Введите выражение и нажмите Evaluate

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
Повседневные инструменты

Наш подписчик спрашивает:

Какие инструменты вы используете ежедневно, чтобы сэкономить время и повысить продуктивность разработки?


🔹 Вопросы для обсуждения:

— Какие инструменты (IDE‑плагины, CLI‑утилиты, скрипты, расширения, шаблоны и пр.) вы используете каждый день, чтобы повысить продуктивность?
— Как они изменили ваш привычный рабочий процесс?
— Были ли ситуации, когда такие инструменты оказались ловушкой или привели к техническому долгу?

💬 Делитесь вашими инструментами и советами в комментариях

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥1
2025/07/11 21:30:36
Back to Top
HTML Embed Code: