Обновить
171.8

Java *

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

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

Дикая Java

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров21K

«Безопасный язык» говорили они, «четкая спецификация» говорили они, «Java не даст вам выстрелить себе в ногу» и прочее и прочее. Реальность же оказалась куда веселее официальной документации.

«Ибо JVM темна и полна ужасов». (ц)

Погрузиться

Поиск утекающих ресурсов в Java приложении

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

Привет, сообщество! Меня зовут Данила, я ведущий разработчик в БФТ-Холдинге.
Я расскажу вам о нашем опыте борьбы с утечкой памяти в сервисе авторизации. Как наша команда столкнулась с критической проблемой, которая приводила к сбоям сервиса, и нам пришлось провести исследование, чтобы найти и устранить причину утечки ресурсов.

Как все начиналось: из бэклога прилетела задача с формулировкой – при эксплуатации authz-server на контуре PROD наблюдается активная утечка памяти, которая приводит к прекращению работы сервиса по причине достижения лимитов по RAM.

Контур PROD уже звучит грозно, приоритет критический, надо разбираться. После недолгого анализа исходников выяснено: обычный Spring Boot сервис c gRPC библиотекой, который выполняет 2 функции – поход в базу за данными пользователей (ФИО и роли) и проверку наличия доступа к конкретному ресурсу для конкретного пользователя. Первая функция тривиальная – «дай по id такого-то пользователя, если нет, то скажи, что его нет». Вторая функция немного сложнее: нужно вызвать метод сторонней библиотеки и передать в него 5 параметров. И всё, но на PROD график использования heap вот такой:

Читать далее

ООП: худшее, что случалось с программированием

Уровень сложностиСложный
Время на прочтение20 мин
Количество просмотров109K

В этой статье попробуем разобраться, почему ООП — худшее, что было придумано в программировании, как оно стало таким популярным, почему опытные программисты Java (C#, C++ и т.п.) в принципе не могут считаться крутыми инженерами, а код на Java - хорошим.

Читать далее

Стримы в Java: Как перестать бояться и полюбить filter-map-reduce (Часть 2)

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров4.5K

В первой части мы поговорили про основы Stream API и убедились, как элегантно можно обрабатывать данные, используя цепочки операций. Но возможности на этом не ограничиваются. Пришло время подняться на новый уровень и посмотреть, что случается, когда добавляется параллельность. Как работают параллельные стримы под капотом? Чем они отличаются от ручного управления потоками? А как же всемогущий Spring и необычная RxJava? Именно об этом и пойдёт речь во второй части.

Читать далее

Пишем свой Config Provider для Kafka Connect с поддержкой значений по умолчанию

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров819

Для инжекции значений из различных источников в конфигурации тасок Kafka Connect используются различные реализации интерфейса org.apache.kafka.common.config.provider.ConfigProvider. Это специализированный интерфейс, реализации которого отвечают за то, чтобы подставить значения используя различные источники.

Читать далее

Model Context Protocol от Spring AI в Java SDK – новый стандарт для интеграции ИИ в экосистеме Java

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров3.2K

Новый перевод от команды Spring АйО расскажет вам, что такое Model Context Protocol (MCP) и как его внедрение в экосистему Java упрощает жизнь разработчикам систем, в работе которых используется искусственный интеллект и LLM, а также передача большого количества данных между различными компонентами.

Читать далее

Рейтинги языков программирования: что за ними скрывается?

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров17K

Написать эту статью меня побудил один забавный случай. Он хорошо демонстрирует, что не стоит слепо доверять одному источнику, каким бы авторитетным он ни был. Впрочем, обо всём по порядку. 

Когда только начинаешь карьеру разработчика, часто гложет сомнение: верно ли я выбрал язык программирования? Может, он уже устарел, или наоборот — слишком новый и не факт, что перспективный? Легко ли будет найти по нему актуальные книги и уроки? Много ли таких неофитов будет вместе со мной обивать пороги ИТ-компаний через год-два? 

Опытным разработчикам тоже порой не хватает знания единственного языка программирования. В какой-то момент появляются специфические заказы и интересные вакансии, где крайне желательно владеть вторым (а то и третьим) языком. 

Помочь с выбором языка программирования призваны рейтинги их популярности. Однако тут легко обмануться. Каждый рейтинг составляется по своей методике и даёт разные результаты (порой — весьма неожиданные). В этой статье я постарался сделать более взвешенную оценку популярности языков программирования (далее — ЯП) по нескольким источникам. Подробнее о них и почему это важно — рассказываю ниже.

Индексы популярности

Всё началось с того, что мне попался на глаза свежий рейтинг актуальности ЯП, где в TOP 10 внезапно ворвался Delphi. Пытаясь разобраться в причинах его внезапной популярности в 2025 году, я стал искать методики составления таких списков и нашёл много любопытного. Как обычно, дьявол кроется в деталях. 

Индекс TIOBE — известный инструмент мониторинга, показывающий динамику интереса к разным ЯП. Он учитывает частоту поисковых запросов, связанных с ЯП. Для этого каждый месяц в Google, Bing, Yahoo! и Baidu отправляются запросы по определённому шаблону, чтобы отсеивать из выдачи мусор и корректно сравнивать статистические данные. Дополнительно в рейтинге учитывается число образовательных материалов о ЯП: количество видеоуроков на YouTube, книг на Amazon и упоминаний на Wikipedia. 

Читать далее

Поиск потенциальных уязвимостей в коде, часть 2: практика

Уровень сложностиСложный
Время на прочтение11 мин
Количество просмотров2K

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

Читать далее

Как сделать Telegram-бота умнее: пошаговый гайд на Spring AI и Kotlin

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров7.1K

Перед вами ещё один гайд о том, как написать свой telegram-бот, который взаимодействует с нейросетью. Мы напишем его таким образом, чтобы с нейросетью можно было вести диалог, т.е. рассмотрим, как сохранять контекст между сообщениями. Но таких гайдов, особенно для Python, уже написано немало. Поэтому напишем его на новом фреймворке Spring AI из эксосистемы Spring. А чтобы совсем было интересно - писать будем на Kotlin)

Читать далее

SpringBoot Starter Telegram Mapping для вашего бота

Время на прочтение3 мин
Количество просмотров1.5K

В этой статье рассмотрим создание простого SpringBoot стартера для маппинга Телеграм запросов в стиле Spring MVC.

Читать далее

Стримы в Java: Как перестать бояться и полюбить filter-map-reduce

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

Когда-то я считал, что священный грааль итераций — это старый добрый цикл for. Да, тот самый, с индексами, который шагал по массивам как бравый солдат по полю. Я обожал мои циклы и охотно избегал всего, что могло их заменить. Но потом появился он — Stream API. Новомодный, загадочный, пугающий, словно неведомый зверь из функционального леса. И вот я, стоя по колено в коде, задумался: "Как перестать бояться и полюбить filter-map-reduce?"

Читать далее

Задача о рюкзаке. Простое решение, но где-то должен быть подвох

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров4.4K

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

Читать далее

Фидбэк vs токсичность: как давать обратную связь коллегам и начальству

Время на прочтение5 мин
Количество просмотров3.8K

Фидбэк vs токсичность: как давать обратную связь коллегам и начальству

«Давай честно: это не твой уровень» — такая обратная связь скорее вызывает желание обновить резюме, чем помогает расти. В этой статье разберём на примерах, как давать фидбэк без токсичности даже своему руководителю и почему привычная модель «Бутерброд» с похвалой в начале и в конце не работает (и почему «спасибо, но…» — не лучший способ).

Читать далее

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

Valhalla — эпичный рефакторинг Java. Часть 3: наши первые результаты

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

Команда Spring АйО перевела и адаптировала доклад Брайана Гоетца «Valhalla — эпичный рефакторинг Java», и сегодня мы публикуем третью, финальную, часть.

В первой части серии было рассказано об истории и причинах появления проекта Valhalla.

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

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

Читать далее

Правильный API конфигурации библиотеки на примере TrueSql || причина бросить Spring Data

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров892

Сегодня немного поговорим о здравом смысле. Правильном и неправильном API конфигурации java-библиотеки. В качестве примера будем использовать TrueSql.

Читать далее

Explyt Spring plugin. Поддержка *.http файлов в IntelliJ IDEA Community

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров1.1K

Всем привет. В предыдущей статье мы рассказывали о нашей версии HTTP клиента, которая основана на генерации OpenAPI файлов по Spring-контроллерам и Swagger UI в качестве готового интерфейса пользователя для работы с запросами. В комментариях к ней писали, что поддержка http файлов весьма актуальна, так как они используются во многих существующих проектах. Мы решили изучить этот вопрос подробнее и вот что из этого вышло…

Читать далее

B-Tree — сбалансированный куст поиска

Уровень сложностиСложный
Время на прочтение22 мин
Количество просмотров4K

В реляционных СУБД есть дефолтный тип индекса — B‑Tree: Tree в названии однозначно указывает на дерево, ну а В это, наверно, Binary? Или Balanced? Или Balanced Binary? Почему‑то долгое время я полагал, что это Balanced Binary, и эта версия даже «работала». На деле всё куда интереснее, предлагаю проследовать под кат, чтобы посмотреть на этот на самом деле скорее низкорослый куст и сравнить его с Red‑Black Tree на Java.

Точно куст?

Передаём данные с мобильных устройств в сервисы через каналы радиосвязи

Время на прочтение11 мин
Количество просмотров1.6K

Привет, Хабр! На связи Рафис Гатауллин, ведущий эксперт отдела фронт-энд, и Рамис Закиев, ведущий эксперт отдела аналитики в «Татнефть Цифровые Технологии». В этой статье по мотивам нашего доклада на Industrial++ расскажем, об опыте внедрения мобильного решения, которое позволило оптимизировать процессы в цехах нефтедобычи, где нет условий для работы обычных сетей связи.

Поговорим о том, как мы реализовали передачу данных с мобильных устройств к сервисам по каналу радиосвязи стандарта TETRA. Об опыте подключения и взаимодействия с SDK, написанном на Java, в мобильном приложении на Xamarin. И о подходах, которые использовали для оптимизации трафика при передаче данных приложения и данных геопозиционирования.

Читать далее

Spring Reactor. Эволюция сервисов. На пути к реактивности

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров5K

Это статья описывает опыт миграции традиционного приложения java spring на Spring reactor стек. О специфике разрабатываемой информационной системы, уже подробно рассказывал. Кратко о системе - смешанная сервисно-микросервисная архитектура. Чтобы получить бизнес результат, требуется вызвать микросервис, который вызывает сервис, который вызывает набор микросервисов для формирования ценностного набора данных. Получается цепочка вызовов. Сервисы и микросервисы разрабатывались на традиционном технологическом стеке, без использования реактивного подхода.

Мое знакомство с реактивным подходом произошло в 2022 году. Плюсы и минусы я осознавал, как мог. В рамках разрабатываемой системы мне было сложно найти ему точку применения. Тогда сложилось понимание, что в существующих рамках реактивный подход не даст возможности эволюционных изменений. Если его применять, то применять ко всему и сразу, как постулирует реактивный манифест.  Даешь революцию! Это было заблуждение. Его я не смог разрушить, даже изучая документацию и статьи. Чего-то релевантного моей ситуации в открытых источниках я найти не мог. Этой статьей постараюсь предложить путь и убедить сомневающихся, что долго раздумывать не стоит. Делайте смелый шаг на пути к реактивному стеку.

Читать далее

Кофе и крабы. Вызов Rust-кода из Java

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

Java — один из наиболее часто используемых языков программирования, который мы еще не обсуждали в нашем Rust Interop Guide. В этой статье мы рассмотрим три различных метода вызова кода Rust из Java: JNI, JNR-FFI и Project Panama. Мы покажем различия между этими методами и проведем базовый бенчмаркинг для сравнения их производительности. Эти методы работают не только для Java, но и для других языков JVM, таких как Kotlin. Здесь мы в основном сосредоточимся на Java, но примеры Kotlin доступны в ветке Kotlin нашего репозитория GitHub.

Эта статья является частью нашего Rust Interop Guide.

Читать далее

Вклад авторов