25698
Все самое полезное для Java-разработчика в одном канале. Список наших каналов: https://t.me/proglibrary/9197 Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising
❓ Когда и как использовать var?
var добавили ещё в Java 10, чтобы облегчить жизнь. Но когда его лучше использовать, а когда стоит быть осторожнее?
Когда использовать:
🔵 Когда всё понятно с контекста: если тип переменной очевиден, то можно не писать лишнее
var list = new ArrayList<String>(); // Это список, и это сразу видно
var map = new HashMap<String, List<Integer>>(); // Чисто и просто
var result = process(); // И что за процесс тут?
☕️ Как работает @Slf4j
Если пишешь @Slf4j над классом, вызываешь log.info(...) и не задумываешься, а как это работает, то пост для тебя. Разберём, что стоит за аннотацией, и как не напороться на неочевидные грабли.
🔹 Что делает аннотация
@Slf4j аннотация Lombok'а. При компиляции он через annotation processor генерирует в классе поле:
private static final org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(YourClass.class);
log4j-slf4j2-implslf4j-jdk14log.info("User {} logged in from {}", username, ip);log.debug("Heavy result: {}", calculateSomethingExpensive());if (log.isDebugEnabled()) {
log.debug("Heavy result: {}", calculateSomethingExpensive());
}log.atDebug()
.setMessage("Heavy result: {}")
.addArgument(() -> calculateSomethingExpensive())
.log();
log.error("Payment failed for order {}", orderId, exception);
🐸 Библиотека джависта
#DevLife
😎 Знакомьтесь с экспертом Proglib.academy: AI-архитектор Андрей Носов
Андрей — один из ключевых спикеров нашего курса AgentOps. Он выстраивает архитектуру, которая выживает в суровом проде и активно делится своим опытом.
За что его ценит IT-комьюнити:
🟣 Топ-спикер AI Conf 2026
Его доклад про мифы семантического поиска и провалы Naive RAG стал одним из самых рейтинговых на конференции.
Андрей внедряет инженерный подход в сложные системы, заменяя «слепую веру» в эмбеддинги строгой логикой графов.
Разработал уникальный набор из 14 unit-тестов, на которых ломается стандартный векторный поиск (от слепоты к отрицаниям до конфликта версий).
Регулярно выступает на крупнейших хайлоад-площадках, разбирая архитектуру отказоустойчивых ИИ-сервисов.
🐸 Библиотека джависта
#DevLife
🔧 javalin — 8.2k ⭐️
Поднимал REST API на Spring Boot ради трёх эндпоинтов? Подключал стартеры, автоконфигурацию, ждал 8 секунд на старте — и всё ради GET /health?
Javalin не тяжелее самого сервиса.
Лёгкий веб-фреймворк поверх Jetty. Никаких аннотаций, никакой магии, никакого classpath-сканирования. Просто код:
var app = Javalin.create(config -> {
config.useVirtualThreads = true;
config.routes.apiBuilder(() -> {
path("/users", () -> {
get(UserController::getAll);
post(UserController::create);
path("/{id}", () -> {
get(UserController::getOne);
delete(UserController::delete);
});
});
});
}).start(7070);
🐸 Библиотека джависта
#DevLife
❌ ThreadLocal + Virtual Threads = утечка памяти
Если вы перешли на virtual threads, но продолжаете использовать ThreadLocal, то у вас проблема, которая пока просто не выстрелила.
ThreadLocal хранит данные в ThreadLocalMap — по одной map на каждый тред. Когда тредов было 200 в пуле, это было терпимо. Когда виртуальных тредов сотни тысяч, каждый несёт свою map, и heap начинает гореть. Плюс мутабельность: ThreadLocal.set() в глубоком call stack — это неявное состояние, которое легко забыть почистить через .remove(). В try-finally это работает до первого необработанного исключения.
Java 21 предлагает замену — ScopedValue.
🔹 Ключевые отличия
ScopedValue.where(TENANT_ID, tenant).run(() -> { ... }) — значение привязано к scope, а не к треду. Вышли из блока и значение автоматически недоступно. Никакого .remove(), никакого «забыл почистить».
Иммутабельность по дизайну. Нельзя сделать .set(). Если нужно другое значение, создаёте вложенный scope. Это убирает целый класс багов с «протеканием» контекста между запросами.
Легковесность. Внутри массив вместо HashMap. При масштабе в 100k+ тредов разница в потреблении памяти ощутимая.
Работает в связке со StructuredTaskScope: дочерние виртуальные треды автоматически наследуют scoped values родителя. Не нужно вручную пробрасывать контекст.
Практический вывод: если вы мигрируете на virtual threads, аудит ThreadLocal — обязательный шаг. ScopedValue пока preview, но API стабилизируется, и направление очевидно. Как минимум стоит уже сейчас заменить ThreadLocal на ReentrantLock-protected shared state или ScopedValue там, где передаёте tenant ID, request context, trace ID и подобные per-request данные.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava
🐸 Библиотека джависта
#DevLife
🔥 Знакомьтесь с экспертом Proglib.academy: Эмиль Сатаев
Эмиль — эксперт с 8-летним опытом в разработке, который специализируется на внедрении LLM и агентных подходов в реальные коммерческие сервисы. Он точно знает, как проектировать архитектуру так, чтобы ИИ-функции работали стабильно в связке с внешними системами.
🏃♀️ Уже 14 мая Эмиль проведет открытый вебинар!
Обсудим самую «больную» тему: «Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало».
🗓 Когда: 14 мая в 19:00 (Мск)
Почему Эмиля стоит послушать:
🟣 8+ лет в разработке (Backend и Frontend)
Прошел путь от фулстека до Backend Platform Developer в SMIT.Studio.
Работал исследователем в Институте ИИ НИУ ВШЭ и в Национальном университете Сингапура (NUS).
Ведет семинары в НИУ ВШЭ, в том числе по проектированию и разработке агентских систем.
Его главная суперсила — умение правильно встраивать LLM через API, выстраивать workflow и агентную логику в сложных распределенных системах.
🔴 Завтра тестовое собеседование с Java-разработчиком
13 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
🔼 Virtual Threads: где спасают, а где нет
С Java 21 virtual threads стали stable (JEP 444). Вместо тяжёлых OS-тредов — легковесные потоки, которыми управляет JVM. Код остаётся синхронным и читаемым, а рантайм под капотом делает M:N scheduling: когда виртуальный тред блокируется на I/O, он паркуется и отпускает carrier thread другому.
На практике это значит одно: Executors.newFixedThreadPool(200) с танцами вокруг размера пула заменяется на Executors.newVirtualThreadPerTaskExecutor(). Блокирующий вызов больше не сжигает OS-тред, пока ждёт ответа от базы.
🔹 Где работает
— веб-сервисы с большим числом конкурентных запросов;
— I/O-heavy бэкенды (база, сеть, файлы);
— замена реактивщины там, где она была вынужденной, а не осознанной.
🔹 Где не работает и не должно
— connection pool базы всё ещё bottleneck.
— CPU-bound задачи не получают выигрыша, т.к. carrier threads и так заняты вычислениями.
— synchronized блоки пинят виртуальный тред к carrier thread (починили в JDK 24). Если у вас hot path с synchronized, переходите на ReentrantLock.
— Внешние API с rate limit'ами никуда не денутся.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava
⚡️ Магия curl
Сервис отвечает 500-кой, а вы не понимаете — проблема в сети, DNS, SSL или бэкенд лёг? Прежде чем лезть в логи и разворачивать Wireshark, попробуйте curl -w и получите полный таймлайн запроса за секунду.
🔹 Зачем это нужно
— Разбивает запрос на фазы: DNS, TCP-коннект, TLS-хендшейк, ожидание первого байта, передача данных.
— Моментально показывает, где именно bottleneck — на уровне сети или приложения.
— Работает везде: на проде, в контейнере, на CI-раннере.
🔹 Как использовать
— Полный таймлайн запроса:
curl -o /dev/null -s -w "\n DNS: %{time_namelookup}s\n TCP: %{time_connect}s\n TLS: %{time_appconnect}s\n TTFB: %{time_starttransfer}s\n Total: %{time_total}s\n" https://your-api.com/health
🗓 14 мая в 19:00 (Мск) встречаемся в онлайне.
Тема: Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало.
В кружке выше Эмиль Сатаев рассказал, какие именно проблемы с LLM в проде будем разбирать.
Что в программе:
- Разберем реальные кейсы стартапов и ограничения LLM.
- Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества.
- Ответим на ваши вопросы и разберем кейсы участников.
🕵️ P6Spy — видишь реальный SQL, который уходит в базу
Включаешь show_sql=true у Hibernate, а в логах всё равно:
where user0_.id=?
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
spring:
datasource:
url: jdbc:p6spy:postgresql://localhost/mydb
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
select * from users
where id = 42
and status = 'ACTIVE'
-- took 3 ms
📌 Зачем дата-сайентисту матанализ?
Основная компетенция специалиста по Data Science – способность анализировать и интерпретировать данные, а математика является фундаментом для начала работы.
В карточках мы разбираем основные разделы математики, с которых стоит начать изучение специалисту по анализу данных.
Хотите подготовиться к офферу или подтянуть знания? Оставляйте заявку на наш курс по математике для Data Science 💙
P.S. Только до 31 мая на курс (и вообще на все программы Академии) действует СКИДКА 40%
А как у вас дела с высшей математикой?
❤️ — Помню всё
🔥 — Знаю основы
🌚 — Ничего не знаю
🏃♀️ Proglib Academy
🔥 База по экономике токенов и кэшированию от AI Platform Lead из Bitrix24
Знакомьтесь, Сергей Нотевский. AI Platform Lead в Bitrix24.
Он один из ключевых экспертов нашего курса AgentOps. На своих лекциях он детально разбирает экономику AI-агентов, кэширование токенов, LLM-инфраструктуру и вывод генеративных систем в стабильный прод.
Мы попросили Сергея поделиться материалами для тех, кто хочет оптимизировать косты на LLM в проде. Сохраняйте методичку по prefix cache метрике, которая напрямую влияет на ваши деньги.
Как говорят создатели Manus:
“KV-cache hit rate is the single most important metric for a production-stage AI agent.”
Экономика кэширования — особенности провайдеров и как правильно считать затраты.
Частые анти-паттерны — почему ваш кэш постоянно сбрасывается и вы платите больше.
Кэш в AI-агентах — специфика работы с памятью в автономных системах.
🤖 AI пишет код. А баги за ним чинишь всё равно ты
Copilot сгенерил код, тесты зелёные, diff чистый. Мержим 👍
Через неделю в проде баг. Причём такой, который ни один ревьюер не поймал — потому что код стилистически идеальный, а ошибка размазана по всей цепочке.
Знакомо?
Проблема не в том, что модель тупая. Проблема в том, что мы натянули AI-генерацию на старый процесс, где единственная защита — «сеньор посмотрит diff». А сеньор теперь смотрит diff на 3000 строк, где каждая строчка *по отдельности* выглядит разумно.
Один агент не должен одновременно писать код, тесты и ревьюить сам себя.
Лечится это не магическим промптом, а пайплайном: спецификация → TDD → линтеры → SAST/SCA → AI-review → triage → человек.
🔗 Подробный разбор в статье
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise
🔧 Магия kubectl
Под завис в Pending, а вы не знаете почему. Нет ресурсов, не тот nodeSelector или PVC не биндится? kubectl describe pod покажет секцию Events — там Kubernetes прямым текстом пишет причину.
🔹 Зачем это нужно
— Events содержат сообщения от scheduler, kubelet и controller manager.
— Показывает FailedScheduling с причиной: Insufficient cpu, node affinity mismatch, и т.д.
— Видны ошибки pull-а образов, mount томов, readiness/liveness probe failures.
🔹 Как использовать
— Полное описание пода: kubectl describe pod my-pod
— Смотреть только Events (хак): kubectl describe pod my-pod | grep -A 20 "Events:"
— События всего неймспейса: kubectl get events --sort-by='.lastTimestamp'
— Только warning-и: kubectl get events --field-selector type=Warning
— Следить за новыми: kubectl get events -w
💡 Events живут только 1 час по умолчанию. Если под висит в Pending давно и Events пустые, посмотрите kubectl get events -A --sort-by='.lastTimestamp', возможно, событие уже из другого неймспейса.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise
✔️ Java-тест: объект в HashSet есть, но contains() возвращает false
Добавили объект в Set. Он там. Но найти его невозможно. Утечка памяти в проде. Почему?
📦 Задание — code review
Команда хранит активные сессии в HashSet. После смены роли пользователя сессия «пропадает» из множества — contains() возвращает false, remove() не удаляет. Set растёт, память течёт.
public class UserSession {
private Long userId;
private String role;
public UserSession(Long userId, String role) {
this.userId = userId;
this.role = role;
}
// getters, setters
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserSession that = (UserSession) o;
return Objects.equals(userId, that.userId)
&& Objects.equals(role, that.role);
}
@Override
public int hashCode() {
return Objects.hash(userId, role);
}
}
@Service
public class SessionManager {
private final Set<UserSession> activeSessions = new HashSet<>();
public void addSession(UserSession session) {
activeSessions.add(session);
}
public void promoteToAdmin(Long userId) {
activeSessions.stream()
.filter(s -> s.getUserId().equals(userId))
.findFirst()
.ifPresent(s -> s.setRole("ADMIN"));
}
public boolean isActive(UserSession session) {
return activeSessions.contains(session);
}
public void removeSession(UserSession session) {
activeSessions.remove(session);
}
}// Сценарий бага:
sessionManager.addSession(new UserSession(1L, "USER")); // ОК
sessionManager.promoteToAdmin(1L); // меняем роль
sessionManager.isActive(new UserSession(1L, "ADMIN")); // false ?!
// объект внутри Set есть, но достать его нельзя
🆕 Java Digest: Spring Boot 4, AI-дебаг и AppSec
Топ-3 статьи о Java и смежных технологиях за неделю по версии нашего канала.
1️⃣ Команда Spring о Spring Framework 7 и Spring Boot 4
Интервью InfoQ с core-командой Spring.
Главное: модульная автоконфигурация в Boot 4 (меньше classpath-проверок → быстрее старт, компактнее uber-jar), встроенный retry и @ConcurrencyLimit в ядре Framework 7 без доп. зависимостей, first-class версионирование HTTP API через путь/заголовок/query/media type.
2️⃣ Почему AI-агент чинит симптом, а не баг
Stack trace отвечает «где упало», но не «почему». Авторы показывают на трёх реальных кейсах, как сжатый трейс выполнения (дерево вызовов + аргументы + исключения) меняет ответ агента. Особенно мощный кейс — многопоточный баг, где исключение вообще в другом потоке.
3️⃣ AppSec-слой для Java через Gradle convention plugin
Практический кейс: вместо копирования security YAML между репозиториями — один Gradle-плагин, который стандартизирует SonarQube, OWASP Dependency-Check, CycloneDX SBOM и JaCoCo/Kover. Одна команда ./gradlew securityAnalyze работает и локально, и в CI. Особенно актуально для enterprise с внутренним GitLab, прокси и закрытым контуром, где каждый сервис иначе изобретает security-интеграцию заново.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#News
Talanto.work - сайт для всех, кто ищет работу в IT.
Мы спарсили за вас все возможные телеграм каналы и сайты с вакансиями исключительно из сферы IT.
Вам не нужно следить за тем, когда выходит вакансия и где, всё это уже сделано за вас.
Просто настройте фильтры у нас на сайте и получайте уведомления в телегу, как только вакансия вышла.
Например: все вакансии Java
На talanto.work собрано 28.000+ вакансий из разных .ru и иностранных сайтов: разработка, QA, аналитика, DevOps, продакт, дизайн, менеджмент и другие IT/Digital-направления.
Более 1700 вакансий за последний месяц из телеграм каналов.
Что еще есть на сайте:
🟠 Фильтры для нормального поиска
Можно искать по стеку, грейду, зарплате, стране, формату работы, релокации и типу занятости.
🟠 Разбор резюме
Загружаете CV и получаете конкретные рекомендации: что улучшить, какие навыки добавить, где слабая структура и что может мешать пройти ATS.
🟠Проверка соответствия вакансии и резюме
Рядом с вакансией всегда есть кнопочка узнать соответствие, насколько ваш профиль ей подходит. Сервис покажет процент совпадения, сильные стороны и пробелы в резюме
🟠Сопроводительное письмо за 10 секунд
Вставляете вакансию и получаете персональное письмо под конкретную компанию и роль, а не шаблон “прошу рассмотреть мою кандидатуру”.
🟠Уведомления в Telegram
Задаёте фильтры один раз и бот присылает новые подходящие вакансии прямо в Telegram.
Поиск работы в IT сейчас и так сложный. Мы хотим, чтобы вы тратили меньше времени на листание сайтов и больше на точные отклики туда, где у вас реально есть шанс.
✈️ 28.000+ вакансий
🟢Бот с уведомлениями о ваших вакансиях: @TalantoWorkBot
🟢Написать сопровод
🟢Разобрать резюме
🟢Проверить соответствие резюме вакансиям
Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqvCuox3
🔐 SAP NetWeaver + Keycloak: SAML за два клика, а потом начинается боль
Включить SAML в SAP NetWeaver AS Java дело двух кликов. Отключить возможность обойти Keycloak и зайти напрямую через SAP — уже интереснее. А когда у пользователей два аккаунта с одним email и федерация по Email type, то уже совсем весело.
Ребята из «Инфосистемы Джет» коротко и по делу разобрали:
— как прикрутить Keycloak как IdP к SAP через SAML;
— почему обязательно нужно поднять SAML2LoginModule наверх и сделать его обязательным;
— что делать, когда Keycloak лёг, а configtool.sh ваш единственный друг;
— зачем менять federation type с Email на Logon ID и как это выглядит на стороне Keycloak.
Без воды, со скриншотами каждого шага. Пригодится тем, кто работает с SAP-стеком и не хочет оставлять ключи под ковриком.
🔗 Подробнее
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise
😮 Топ-вакансий для джавистов за неделю
Middle Java разработчик — Гибрид (Нижний Новгород) — Nexign
Java-разработчик (YaIoT-платформа) — 330 000 — 550 000 ₽ — удалёнка/гибрид (Москва, Санкт-Петербург)
Разработчик Java — 330 000 — 550 000 ₽ — гибрид (Москва)
➡️ Еще больше топовых вакансий — в нашем канале Java jobs
🧠 Профдеформация: симптомы, которые точно узнаешь
Жена тыкает «дождь» в Яндекс Погоде, а ты: «Зачем ты повышаешь цены на такси?!».
Знакомо?
Бэкенд-разработчик из ОТП собрал свои симптомы в одну статью. На курсах «войти в айти» о таком не рассказывают.
Пишите, какие симптомы замечали за собой? 👇
📖 Полная статья на Хабре
🐸 Библиотека джависта
#DevLife
⌛ backup PostgreSQL с минимальной нагрузкой на прод
Разберём эффективный способ бэкапа PostgreSQL с помощью pg_basebackup + реплики.
Сценарий: есть продовый PostgreSQL и настроенная горячая реплика (streaming replication). Зачем использовать реплику для бэкапа?
🔵 Причины
— На проде бэкап может замедлить отклик приложения.
— Реплика отличный способ разгрузить основной сервер.
— Бэкап с pg_basebackup возможен только на стопнутой БД или через репликацию.
🔵 Как сделать
pg_basebackup -h replica.host -U repl_user -D /backup/pg -F tar -z -P
🐸 Библиотека джависта
#DevLife
🧹 Git-команда, которая спасёт ваш репозиторий от мусора
Проблема: вы удалили ветки, сделали git reset, отменили мёржи, но репозиторий почему-то весит всё больше. git clone на новом месте занимает вечность. Куда уходит место?
Дело в том, что Git — барахольщик. Он хранит все объекты: старые блобы, недостижимые коммиты, забытые stash'ы. Даже то, что вам давно не нужно.
💡 Решение: git gc и его старший брат git gc --aggressive
Рассмотрим все все возможности git gc.
1️⃣ Сколько мусора накопилось
git count-objects -vH
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '/^blob/ {print $3, $4}' \
| sort -rn \
| head -10
git gc --aggressive --prune=now
git count-objects -vH
🐸 Библиотека джависта
#DevLife
🤔 Ты уверен, что твой HikariCP настроен правильно?
Если все настройки — это maximumPoolSize = 32 и в прод, не проходи мимо.
А то потом реплики × 12, PostgreSQL орёт too many connections, p95 ползёт вверх, и база упадёт именно тогда, когда нельзя.
Свежая статья на Хабре про то, как считать размер пула по-настоящему: формула из PostgreSQL wiki, Little's Law, Kubernetes, PgBouncer и 10+ типовых ошибок, которые тихо живут в продовых конфигах.
Плюс чеклист перед релизом и пример конфига, в котором видно зачем выбрано каждое значение.
🔗 Читать на Хабре
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise