Обновить
128K+

Java *

Объектно-ориентированный язык программирования

129,25
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Прагматичная преждевременная оптимизация

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели5.7K

Все знают фразу Дональда Кнута:

«Преждевременная оптимизация — корень всех зол».

Но обычно цитату обрывают слишком рано. Кнут предлагал забыть о небольшом выигрыше в 97% случаев, но не упускать возможности в оставшихся критически важных 3%.

Иногда для них не нужны профилировщик и чёрная магия. Достаточно не компилировать регулярку при каждом вызове, не искать постоянно по List, когда нужен Set, и не создавать новые строки ради сравнения без учёта регистра.

Читать далее

Новости

ИИ‑агент захватил штурвал моего пет‑проекта. Возвращаю его с помощью интерактивных объяснений и двух промптов

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели4.1K

Всем привет! Меня зовут Дина, я Java‑разработчик, около шести лет в энтерпрайзе. С апреля начала делать пет‑проект вместе с ИИ‑агентом: он писал код, я ставила задачи и смотрела на тесты. Всё шло хорошо: тесты были зелёными, сценарии закрывались, а потом я открыла проект и поняла, что чётко не осознаю, как в нём устроен главный сценарий: от запроса до готового видео. Эта статья о том, как я возвращала себе понимание собственного кода.

Читать далее

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели4.9K

Привет хабровчане! Обычно только читаю, а тут решил поделиться своей небольшой историей, может даже кому‑то будет полезной.

Немного о себе - Senior Java Developer, работаю на удаленке и постоянно мигрирую между деревней и городом (эта часть будет важна позже). В свободное время под настроение бывает пишу простенькие программки или игры в надежде что что‑то из этого однажды выстрелит и я проснусь богатым человеком, которому больше не придется никогда работать.

Теперь к сути - на работе дали мне проект по переписи китайского реакт монолита на наш спринговый с thymeleaf. Таймлиф выб выбран для простоты, и оттого что в проекте только одна страница (а нам не нужен отдельный микросервис фронта на одну страницу). Вот только эта единственная страница должна распознавать руку и работать не только с пк, но и с телефонов.

На пк то всё понятно, для проверки достаточно перейти на localhost:8080 и проверяй что хочешь. Но вот для телефона не всё так просто. Вернее просто, но муторно.

Покажу пошагово как это делаю я на примере одного из своих пет проектов.

1) Сперва..

Читать далее

Шлюз увидел «user», сервис увидел «admin», а JSON был один и тот же

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.4K

Шлюз проверил JSON и пропустил запрос, а сервис за ним выдал пользователю права администратора. Оба компонента отработали корректно, но по-разному интерпретировали одни и те же данные. Разбираемся, почему JSON-парсеры расходятся в обработке ключей и чисел, к каким ошибкам это приводит и как защитить от них API.

Разобрать уязвимости

Как мы заставили Redis кэшировать POST‑запросы к OpenAI/DeepSeek и выжали 4 900 RPS на Java 21

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели8.6K

В 2026 году интеграция LLM-моделей (OpenAI, DeepSeek) и тяжелой гео-инфраструктуры (Google Maps, Яндекс.Карты, DaData) есть практически в каждом Enterprise-продукте. И всё бы хорошо, но счета за токены и лимиты API растут нелинейно. Когда наш проект столкнулся с тем, что корпоративный чат-бот и аналитические модули начали «проедать» шестизначные суммы в месяц, мы сели анализировать логи.

Выяснилась классическая вещь: до 40% запросов от пользователей или внутренних сервисов — это чистой воды дубли. Люди по десять раз переспрашивают у модели схожие аналитические промты, а фронтенд-модули тоннами гоняют идентичные запросы к гео-кодерам. Первая мысль — давайте закроемся кэшем. Но тут мы упёрлись в архитектурный тупик.

Почему Nginx и классические прокси здесь не помощники

Обычно для кэширования трафика берут Nginx, Varnish или HAProxy. Но все они создавались для классического веба, где правит бал GET-запрос, а уникальным ключом кэширования выступает URL.

Современные ИИ-модели и гео-сервисы работают строго через POST. Внутри тела (payload) лежит тяжелый JSON. И этот JSON постоянно мутирует:

Читать далее

Переход с Java 21 на Java 25: что действительно перестаёт работать

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели14K

Просто поменять версию в pom.xml может быть недостаточно.

На JDK 25 могут перестать запускаться процессоры аннотаций, сломаться старые параметры JVM и измениться разбор дат. Иногда приложение упадёт сразу. Иногда проблема всплывёт позже, что даже веселее.

В новом переводе от команды Spring АйО собрали реальные несовместимости и проверки, которые стоит выполнить до переезда.

Читать далее

jpackage от А до Я: как правильно упаковать Java‑приложение в десктопный дистрибутив

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели4.6K

Привет, Хабр!

Начну с небольшой предыстории. Я начинал свой путь в IT с базового курса «Разработка программного обеспечения» в одной из профильных академий. Этого фундамента хватило для уверенного старта, но реальные коммерческие задачи часто выходят за рамки учебных программ.

Одной из таких «болей» стала дистрибуция Java‑приложений конечному пользователю. Сколько раз мы слышали от клиентов: «А у меня не запускается, наверное, Java не та»? Чтобы раз и навсегда избавиться от необходимости писать в README фразу «сначала установите JRE», я решил глубоко погрузиться в тему нативной упаковки.

В этой статье я систематизировал весь свой опыт работы с jpackage: от создания портативных версий до сборки полноценных инсталляторов для Windows, Linux и macOS, а также разобрал подводные камни при работе с JavaFX и Spring Boot.

jpackage— это мощный инструмент, встроенный в JDK (начиная с версии 14, JEP 343/392), который предназначен для упаковки Java-приложений в нативные образы для конкретных платформ. Он автоматически создает нативный лаунчер (запускатор) и включает в себя урезанную версию JRE (созданную черезjlink`), чтобы пользователю не нужно было устанавливать Java.

Далее так как я не знал изначально что умеет jpackage я для себя выделил два приоритета:
1. Создание Portable (портативных) приложений
2. Создание установочных пакетов (Installers)
Далее я расскажу о каждом из приоритетов и не только чтобы у каждого получилось поделиться своим приложением на Java без последующих лишних вопросов.

Читать далее

Сколько символов в нике «Аня»? Шесть языков, три ответа, и ни одного правильного

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели5.8K

Пять видимых символов в нике могут превратиться в 10, 15 или 32 — смотря какой язык программирования их считает. Из‑за этой разницы пользователь получает ошибку валидации, теряет часть эмодзи или сталкивается с проблемой при сохранении данных. Разбираемся, почему JavaScript, Python, Go и другие языки по‑разному измеряют длину строк и как правильно задавать ограничения, чтобы данные не терялись.

Узнать подробности

Как Netflix повысила эффективность ИИ‑агентов для программирования с помощью JetBrains IDE

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели13K

Netflix подключила Claude Code и Codex к движку анализа кода JetBrains и теперь агенты могут работать с индексом проекта и зависимостей вместо раскопок в JAR-файлах через декомпиляцию и grep.

На реальных Java и Kotlin проектах расход времени и токенов снизился в среднем на 20–30%, а лучший результат достиг 65%.

Читать далее

Реализация MVP DSL движка с AST, кодогенерацией и динамической компиляцией

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели6K

Реализация MVP движка динамических вычислений выражений на Scala 3.
Архитектура решения: от описания компонентов через пользовательские спецификации до кодогенерации Scala и его компиляции во время выполнения и загрузки полученного класса в JVM.

Цикл от некого выражения до готовой лямбды:
expression -> AST -> ScalaCode → Class Loading -> lambda.

Читать далее

Как убрать пароли из XML‑конфигов Hadoop: Credential Provider API и JCEKS на практике

Уровень сложностиСложный
Время на прочтение14 мин
Охват и читатели9.1K

Привет, Хабр! Меня зовут Егор Ившин, я аналитик по безопасности в Arenadata. Я отвечаю за безопасность продукта ADH: моя ключевая задача – выявлять уязвимости и оперативно передавать информацию о них команде разработки, при этом я не только фиксирую проблему, но и помогаю с её устранением. В своей работе я применяю различные виды анализа: SCA, SAST, ручное тестирование.

В этой статье разберём, как работает Hadoop Credential Provider API, где и как хранить JCEKS и какие подводные камни во всём этом есть. А в конце посмотрим, как этот механизм автоматизируется в продуктах Arenadata – чтобы не делать всё вручную.

Читать далее

Giga IDE Pro больше не будет. Но это хорошая новость

Время на прочтение6 мин
Охват и читатели14K

Pro-сборка была важным этапом в развитии GigaIDE: она позволила быстрее развивать профессиональные инструменты, собирать обратную связь от корпоративных пользователей и проверять сценарии, которые выходят за рамки Community-версии. Но у отдельного дистрибутива есть и обратная сторона: пользователю нужно выбирать сборку, командам — отдельно управлять установками, а продукту — поддерживать лишнюю развилку там, где её уже можно убрать.

Читать далее

Локальная ИИшница: рецепт приготовления

Время на прочтение10 мин
Охват и читатели6.3K

Статья для тех, кто уже имеет опыт работы с облачными ИИ, но в силу причин вынужден перейти на локальную ИИшку.

Здесь я опишу несколько неожиданных проблем с выбором железа и софта, которые мне пришлось решить, имея на старте несколько противоречивых требований.

Спойлер: я прошел путь от «лучше, чем ничего» до «гораздо лучше, чем ничего!».

Читать далее

Ближайшие события

Сломанный Ctrl+C — сначала гасла VM, а потом не прерывался sleep: Java, KVM и Linux

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели9.3K

Обычный Ctrl+C оказался для моей Java VM неожиданной проблемой: сначала он завершал саму виртуальную машину, а после исправления перестал останавливать команды внутри Linux. Чтобы разобраться, пришлось пройти весь путь от host terminal через UART и KVM до гостевого TTY и Unix-сигналов. В статье разберём не только причину, но и метод диагностики, который пригодится далеко за пределами виртуализации.

Разбираемся, куда пропал Ctrl+C

Java 24 убрала пиннинг synchronized. Почему виртуальные потоки всё ещё тормозят?

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели6.8K

После перехода на Java 24 виртуальные потоки перестали блокировать носители внутри synchronized. Казалось бы, одним тормозом меньше. Но производительность по‑прежнему упирается в ограничения ресурсов, а старые способы диагностики уже не помогают. Разбираемся, где теперь искать причины задержек и какие настройки стоит пересмотреть.

Найти причину тормозов

Закрыл вкладку — ушёл, обновил страницу — остался: присутствие в комнате на WebSocket

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели6K

Когда человек закрыл вкладку, обновил страницу или потерял сеть, сервер получает один и тот же SessionDisconnectEvent, а реагировать должен по-разному. Рассказываю, как в своём Planning Poker научил комнату различать эти случаи и не терять текущие данные при обновлении: маркер закрытия на pagehide, атомарные обновления MongoDB, порядок кадров в Spring, обходы для Firefox и zone.js и живые тесты в Chrome, Firefox и Safari. Восемь граблей и что с ними делать.

Читать далее

Реактивная Java: когда она ускоряет систему, а когда просто усложняет жизнь (часть 1)

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели8.6K

Часть моей работы — помогать джунам разбираться с архитектурными решениями.

Иногда у нас возникают обсуждения на тему: «Зачем заморачиваться с WebFlux, если можно продолжать писать на Spring MVC?». Чтобы предметно обсуждать эту тему, мы с командой провели внутренний бенчмарк, написали методичку и решили поделиться некоторыми соображениями в этом цикле статей.

В этой — первой — статье я расскажу, как устроены три основные модели обработки запросов в Java, покажу их сильные и слабые стороны и дам критерии, которые помогут выбрать подходящий вариант для вашего проекта. 

Дисклеймер: для Java-сеньоров в этой статье скорее всего ничего нового не будет.

Читать далее

Неожиданный антивайб разработки через ИИ-агентов

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели9.1K

Менеджеры считают, что ИИ-агенты ускорят разработку в десять раз. Математика говорит, что ускорится только написание. Проверять смысл по-прежнему будут люди, с конечной скоростью, и очередь выстроится к самым опытным. PostgreSQL 19 не вышел в срок. Не потому, что ИИ нашёл много багов, а потому что ИИ научился генерировать правдоподобные отчёты быстрее, чем люди успевают их читать. В статье разбираю, почему так, где настоящий предел и что меняется.

Читать далее

У нас есть MCP дома

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели14K

Всем привет! Меня зовут Петрович и я работаю техлидом java команды в небольшом международном финтехе. В прошлый раз я рассказывал, как мы меняли Redis на Hazelcast, а сегодня расскажу как мы делали свой MCP‑сервер для Jira, Confluence и GitLab (все self‑hosted). От пустого репозитория до прода прошло две недели, а сейчас у сервера уже почти 100 инструментов. Расскажу, почему не взяли готовое с GitHub, как все устроено внутри и на какие грабли мы наступили (спойлер: почти все грабли назывались null).

Читать далее

Оптимизация генерации ресурсов в Java, три Ryzen и 225 замеров

Уровень сложностиПростой
Время на прочтение18 мин
Охват и читатели7.6K

Почему ручное разбиение задач оказалось быстрее parallel().collect() в большинстве наших тестов.

Привет, Хабр!

Меня зовут Юрий, и уже десять лет я разрабатываю The Great Tribes — пошаговую 4X-стратегию, в которой игроку предстоит провести свою цивилизацию от первобытных племён до космической эпохи.

Игра создаётся на Java с использованием LWJGL и собственного игрового движка. Мы не используем Unity или Unreal Engine: за годы разработки у проекта сформировались собственная архитектура, система процедурной генерации мира и довольно специфические требования к обработке больших карт.

Сегодня хочу рассказать об одной небольшой, но интересной оптимизации.

Мы решили ускорить генерацию природных ресурсов, написали три реализации одного алгоритма и протестировали их на трёх компьютерах с процессорами AMD Ryzen.

Результаты оказались любопытными: более компактный вариант с parallel().collect() в большинстве измерений уступил реализации с ручным разбиением массива на части.

Но обо всём по порядку.

Читать далее
1
23 ...