Обновить
128K+

Kotlin *

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

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

Словари MDict в закрытом приложении, или зачем я писал RIPEMD-128 вручную

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

Добавлял в свою читалку офлайн-словари и упёрся в MDX, формат словарей MDict. Проприетарный, официальной спеки от создателей нет. Готовые Java-парсеры под GPL, а у меня закрытое приложение, тащить нельзя. Значит, пишу свой, с нуля и без зависимостей. Рассказываю, как формат устроен внутри, где я споткнулся, и почему пришлось руками писать RIPEMD-128, чтобы прочитать даже оглавление словаря.

Читать далее

Новости

LSP vs весь стек JetBrains IDE: что получает AI-агент без доступа к платформе IDE

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

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

Сейчас почти каждый AI-кодинг-агент подключает LSP — Language Server Protocol. Это тот самый протокол, по которому редактор общается с языковым сервером: go-to-definition, find usages, hover с типом, диагностика. На этом обычно и пишут: «агент понимает код семантически».

Но мы в Veai делаем агента для JetBrains IDE, и нас периодически спрашивают: а зачем вообще нужен IDE, если LSP уже всё умеет? Хороший вопрос. LSP и правда решает много задач, но он проектировался для редактора, а не для агента. Подсветить ошибку, показать тип под курсором, найти ссылки — для этого LSP достаточно. А вот поменять Spring-бин в enterprise-проекте и не сломать сборку — тут нужно чуть больше.

Под катом разберём, что именно LSP даёт агенту, где этого перестаёт хватать и что поверх той же модели проекта предлагает JetBrains Platform. Спойлер: сравнивать LSP и PSI один в один бессмысленно — LSP это протокол, PSI это модель. Речь пойдёт о LSP vs весь стек IDE.

Читать далее

Как мы научили ИИ-агента в JetBrains за минуту настраиваться под чужой проект

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

Когда подключаешь ИИ-агента к новому репозиторию, первые полчаса уходят не на код, а на объяснения. Какой стек, какие соглашения в команде, чем отлаживаемся, где лежат тесты, что нельзя трогать. Агент всего этого не знает – он стартует «универсальным» и собирает контекст по кусочкам, твоими руками, в каждом новом чате заново.

В Veai 5.13 мы попробовали закрыть именно эту боль. Главная фича релиза — онбординг агента в проект: при первом запуске агент сам проходит короткий диалог и за минуту настраивает себя под вашу кодовую базу – создаёт правила, подключает навыки и внешние инструменты. Дальше он с первого сообщения говорит на языке вашего проекта.

Разберёмся, как это устроено, в какие файлы всё сохраняется. А ещё пройдёмся по остальным изменениям релиза: генерация тестов в WebStorm и PyCharm, доступ к файлам за пределами проекта и хоткей для переключения между редактором и чатом.

Читать далее

Хватит объяснять агенту проект в каждом чате: что появилось в Veai 5.14

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

Когда работаешь с AI-агентом в большом проекте каждый день, накапливаются две усталости. 

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

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

В Veai 5.14 мы взялись за обе. Появился Memory Bank – агент запоминает факты о проекте между чатами. И профили маршрутизации моделей – субагенты работают на разных моделях под разные задачи. Плюс окно результатов ревью, проектные MCP-серверы и несколько изменений в интерфейсе. Разберём по порядку.

Читать далее

Как энергосбережение на Android мешало Seamless-авторизации

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

Всем привет! Я Никита, тимлид команды Android в Банки.ру. 

Недавно, внедряя в приложение фичу авторизации без SMS-кода (seamless), мы столкнулись с тем, что она в упор отказывалась работать – но только на Android. Мы дебажили ее полторы недели, перепробовали все возможные варианты и закошмарили всех доступных операторов связи, прежде чем узнали, что все дело было… в энергосбережении.

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

Читать далее

В Java нет универсального типа для денег

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

double быстрый, но хранит десятичные числа как двоичные приближения: 0.1 + 0.2 дает 0.30000000000000004. BigDecimal точен в десятичной арифметике, но дороже по памяти и CPU.

Выбор зависит от задачи: для метрик и ML хватит double с допуском, для налогов и счетов нужен BigDecimal с явным RoundingMode, для низкой latency - fixed-point на long.

Ошибка не в double или BigDecimal, а в выборе без понимания точности, округления и нагрузки. Подробнее - в новом переводе от команды Spring АйО.

Читать далее

Асинхронность NIO и Kotlin — а есть ли связь?

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

Асинхронность NIO и асинхронность Kotlin: попробуем разобраться какие идеи заложены и как совместно использовать то и другое.

А есть ли связь?

Топ-10 вопросов с Android-собеседований в 2026 — с разборами

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

Думаю, многие из нас успели заметить стремительное изменение рынка в последние пару лет: он плавно превратился из рынка соискателя в рынок нанимателя и, пожалуй, стал наиболее конкурентным и жёстким за всё время существования IT в России.

К тому же, старая проблема поиска работы тоже никуда не делась: умение писать классные Android-приложения не всегда гарантирует успешный найм. То, что спрашивают на интервью, и задачи, которые мы решаем каждый день, совпадают далеко не всегда.

Поэтому навык прохождения собеседований становится всё важнее. В этой небольшой статье хотел бы разобрать 10 популярных вопросов, с которыми можно столкнуться на собеседованиях по Android в 2026, поехали 🚀

К вопросам

Агент написал код за 12 секунд и чинил его 40 минут: как я на самом деле сравнила ИИ-агентов

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

Все обзоры меряют одно — как быстро агент работает с кодом. Но на моём боевом Java-проекте на тысячи строк самый «быстрый» агент выдал решение за 12 секунд, а потом 40 минут гонял сборку в терминале, пытаясь заставить код компилироваться.

Кто быстрее работает с кодом — тот дольше его чинит, а типовые сравнения этап починки не считают вовсе.

Чтобы проверить это, я взяла одну и ту же задачу «добавь фичу и покрой её тестами» и дала её трём типам агентов: CLI в терминале (Claude Code, Codex, OpenCode), кросс-IDE плагинам (Cursor через ACP, Copilot, Cline, Kilo Code, Windsurf) и агенту, встроенному в JetBrains Platform (Veai). Меряла не секунды на генерацию, а число итераций до зелёной сборки и расход токенов. Ниже — шесть метрик, которые я добавила, и почему они переворачивают выводы типовых обзоров.

Читать далее

Spring Batch научился работать с MongoDB

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

Spring Batch - проект в рамках экосистемы Spring Framework, который, как правило не получает должного внимания. Тем не менее, это хорошее решение для Enterprise Batch Processing.

Долгое время Spring Batch требовал SQL-базу для хранения общего состояния, шагов перехода, статусов выполнения и время запусков. Даже если проект жил на MongoDB, рядом часто приходилось держать Postgres или MySQL только ради метаданных.

В Spring Boot 4.1 стало проще: появился spring-boot-starter-batch-data-mongodb. Теперь Spring Batch научился работать с MongoDB.

В статье Josh Long рассказывает про новинки в рамках Spring Batch, в том числе и новую интеграцию с MongoDB, а также работу с GraalVM

Читать далее

Android-троян Mamont — теперь на Kotlin

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

24 февраля 2026 года в 16 часов по Хабаровскому времени в мессенджере MAX от аккаунты папы приходит сообщения вида "Посмотри, это ты на фото" и следующим сообщением приложен файл "Фото(3).apk". Я сразу же позвонил отцу - интернет отключили, симку вытащили, а на следующий день он сходил в МФЦ и поменял пароль. Файл с вирусом скачать я не смог - через полчаса после этого аккаунт отца удалили за спам, плюс само сообщение я удалил. Но пока файл ещё был я попросил брата переслать его мне, но скачать я его уже не мог - из-за удаления аккаунта.

Работу пояснительную хоть и проводили, но "был без очков, что-то тыкнул" и установил - когда у тебя телефон от Huawei без гугл сервисов, то все приложения плюс минус так и ставились. Прошло время - аккаунт через месяц папе дали вновь зарегистрировать, телефон тот мы отложили от греха подальше, выдал свой старый Samsung A50 и про случай забыли. Но одним вечером, когда я лежал в кровати я подумал - "Стоп, если аккаунт восстановили, то и файл я могу скачать?" Зашел в чат с братом, долистал до пересланного сообщения и решил скачать файл вновь. И что вы думаете - я его скачал! Б - Безопасность. А раз файл скачан, то надо его проанализировать - о чём и будет статья.

Читать далее

Ручной DI в Kotlin Multiplatform: понравится и тебе, и твоему ИИ‑агенту

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

Граф зависимостей KMP‑приложения можно собрать обычным Kotlin‑кодом — без рефлексии, кодогенерации, аннотаций и DSL. Composition root и конструкторы, никакой магии. Звучит как шаг назад от зрелых DI‑фреймворков — пока не посмотришь, кому такая форма удобна: тебе, новому человеку в команде и твоему ИИ‑агенту.

Читать далее

Пять ошибок начинающих Android‑разработчиков при работе с жизненным циклом

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

Если после релиза Android‑приложения вы внезапно получаете краши, утечки памяти и жалобы на пропадающие данные, проблема может скрываться в нескольких строках кода вокруг Activity и Fragment.

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

Читать далее

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

Project Valhalla: 10 спустя

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

В новом переводе от команды Spring АйО рассмотрим решение старой проблемы в Java: полноценные классы часто слишком дорогие для памяти и процессора.

Пример - массив из миллиона, например, точек Point. Сейчас это обычно не миллион точек подряд, а миллион ссылок на объекты в куче. У каждого объекта есть служебные данные, его нужно создать, потом убрать сборщиком мусора. Плюс процессор постоянно прыгает по памяти, а это медленно.

Project Valhalla добавляет value class. Это обычный на вид класс с полями, конструктором и методами, но без идентичности объекта. JVM сможет хранить такие данные плотнее: например, прямо внутри массива, без отдельного объекта для каждого значения.

JEP 401 планируют включить в JDK 28 как preview. Это еще не финал: value class пока может быть null, а полная поддержка быстрых generics и плотных коллекций появится позже. Но первый рабочий шаг Valhalla уже близко.

Читать далее

Пять ошибок при работе с Jetpack Compose, из-за которых тормозит recomposition

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

Привет, Хабр! Jetpack Compose в 2026 году стал стандартом разработки UI на Android, но в проектах регулярно повторяется одна и та же история: на экране со списком в пару сотен элементов прокрутка идёт рывками, профайлер показывает скачки кадров до 200 миллисекунд, а команда чешет голову и предлагает откатиться обратно на RecyclerView.

Проблема почти всегда не в Compose, а в том, как написан UI: recomposition спроектирован как дешёвая операция, но эта дешевизна работает только при соблюдении ряда правил, которые в документации описаны рассыпанно и часто игнорируются.

Разберём пять ошибок, из-за которых производительность Compose-экранов проседает заметно для глаза, и покажем, как их находить и чинить.

Ускорить Compose

Я не хотел писать ORM для Kotlin/Native. Мне просто нужен был PostgreSQL

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

Всё началось с архитектурного тупика. Я занимался бэкенд-частью low-code платформы, на базе которой автоматизировались внутренние процессы крупных компаний. У нашей платформы была жесткая специфика — обязательный и хардкорный оффлайн-режим. Наши пользователи — это прорабы на удаленных строительных объектах и геологи в тайге, где связь пропадает не на пару минут, а на целые дни.

Приложение при этом должно полноценно жить локально: пользователь забивает данные, меняет статусы сущностей, генерирует документы, прикрепляет фото. А затем, когда появляется сеть, на бэкенд одновременно прилетает лавина накопленных синхронизаций.

Поскольку платформа мультитенантная, микросервисная и крутится в Kubernetes, мы быстро упёрлись в проблему неэффективного использования ресурсов. Тенант отдельной компании может «спать» часами или даже днями, не создавая вообще никакого трафика, а потом пачка юзеров одновременно выходит из оффлайна, и нагрузка на сервис взлетает по экспоненте. Держать под каждый тенант постоянно запущенные и простаивающие поды — безумно дорого.

Логичное решение — поднимать сервисы по требованию ближе к моменту реальной нагрузки (Scale-to-zero). Но тут мы упираемся в Cold Start. Пока сервис просыпается, нагрузка уже успевает накрыть инфраструктуру. Так время запуска из абстрактной технической метрики превратилось для нас в инструмент экономии бюджета.

Читать далее

Почему сейчас стажеры и джуны знают больше, но пишут код гораздо хуже, чем раньше

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

Всем привет, меня зовут Михаил, я работаю senior Java/Kotlin разработчиком в ОТП Банке. В свободное от работы время я занимаюсь менторством. Ко мне приходят разные люди: кто-то уже работает на проекте, кто-то только учится.

Сейчас, в эпоху ИИ, найти информацию стало куда легче, чем раньше. Раньше ты гуглил и тыкал по ссылкам, а теперь все в одном приложении. Да еще и код можно не писать - ну красота же. Но что, если ты и до этого не умел писать код и решил "вкатываться в айтишку" (ненавижу эту фразу)?

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

Я написал небольшую задачу и попросил решить ее людей разного уровня - от стажера до сеньора. Кому-то разрешил пользоваться нейросетью, кому-то запретил.

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

Читать далее

От потоков к корутинам: как и почему видоизменились примитивы синхронизации в языке Kotlin (Часть 2)

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

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

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

Для каждого из этих подходов рассмотрим конкретные реализации, выделим плюсы и минусы, приведём примеры использования. В конце объединим все реализации в общую таблицу.

Читать далее

Код в эпоху AI: как перестать бороться за качество и начать контролировать деградацию

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

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

Читать далее

Новые возможности Hibernate 7.4

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

Hibernate 7.4 исправляет старую проблему с пагинацией и fetch join.

Раньше запрос на первые 10 Order вместе с OrderItem не мог безопасно ограничиться на уровне SQL. Из-за join один заказ превращался в несколько строк, и limit мог обрезать коллекцию. Поэтому Hibernate загружал все подходящие строки, а страницу выбирал уже в памяти. На больших данных это било по памяти и могло закончиться OutOfMemoryException.

Теперь Hibernate сначала выбирает нужные id родительских сущностей во вложенном запросе, а затем загружает для них полные дочерние коллекции. Пагинация остается в БД, данные не режутся.

Еще в 7.4 появились history и audit tables. @Temporal хранит версии строк и позволяет читать сущность на конкретный момент времени. @Audited пишет изменения ADD/MOD/DEL в audit-таблицу без Envers.

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