Обновить
220.33

Java *

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

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

Трудности разработки Java-игр: каким был мобильный геймдев нулевых? [Длиннопост про разработку]

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

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

Читать далее

Новости

Garbage Collector: жизнь без иллюзий

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

Когда мы говорим о сборщике мусора, мы часто ограничиваемся фразой «он удаляет неиспользуемые объекты», однако в реальности GC — это сложнейшая система, которая взаимодействует с виртуальной памятью, потоками, стеком, регистрами и графом ссылок, и без понимания этих взаимодействий невозможно осознанно писать высоконагруженные приложения. В этом материале мы сосредоточимся именно на GC, рассматривая его не как магию runtime, а как конкретный набор алгоритмов и инженерных компромиссов. За каждой строкой new, за каждой локальной переменной и за каждым вызовом функции стоит конкретная архитектура процессора, виртуальная память операционной системы и довольно агрессивная инженерная математика сборщика мусора. Чтобы действительно понимать GC, необходимо начать не с него, а с того, на чём он стоит — с регистров, стека и кучи, поскольку именно они формируют корневую модель, на которую опирается любой современный runtime.

Перед тем как мы начнем давайте разберемся в типах хранилищ памяти и как они работают:

Читать далее

Ceylon и NULL: как сделать null нормальным

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

В одном и том же null часто прячут разные смыслы: “нет значения”, “неизвестно”, “неинициализировано”. Потом это всплывает в NPE и в кривой логике исполнения.

В Ceylon эту проблему решают через типовую систему, через Union типы. Подробнее, в переводе от Spring АйО.

Читать далее

Параллельная обработка Kafka сообщений с гарантией at-least-once в условиях медленного внешнего сервиса

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

В данной статье я хочу рассказать об подходе к организации параллельной обработки сообщений из Kafka, когда Kafka Topic используется как транспорт бизнес-событий, например транзакций или ордеров, которые необходимо отправить во внешнюю систему. При это важно обеспечить стабильную скорость обработки трафика и надёжность (отсутствие потерь) в условиях, когда downstream-система не на все запросы отвечает стабильно и быстро.

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

Для иллюстрации подходов далее будет использоваться код из демонстрационного проекта на Kotlin с использованием spring boot, webFlux, spring reactor и reactor-kafka. Код проекта не является production-ready: в нём, например, отсутствует обработка rebalance, а также ряд других моментов, обязательных для промышленной системы. Используется reactor-kafka, однако описываемые решения не зависят от конкретного фреймворка работы с Kafka и могут быть реализованы с использованием других.

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

Читать далее

Руководство по ArchUnit — как модульно тестировать архитектуру

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

Соблюдение определённой структуры пакетов или архитектуры крайне важно. Особенно в Java, где для корректной работы некоторые элементы должны быть public или действительно доступны за пределами своего пакета.

В новом переводе от команды Spring АйО рассмотрим библиотеку с открытым исходным кодом ArchUnit, которая помогает в тех случаях, когда одного компилятора недостаточно.

Читать далее

Универсальный сервис динамического шардирования

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

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

Проснуться

Разрыв в неизменяемости: почему Java Records нужны оптики (Lenses)

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

Records, pattern matching и sealed-типы сделали Java куда более «функциональной» — читать вложенные данные стало легко и красиво. Но как только вам нужно изменить что-то глубоко внутри неизменяемой структуры, начинается боль: каскад пересоздания records, копирование полей, десятки строк ради одного изменения.

В новом переводе от команды Spring АйО рассмотрим, почему у современной Java всё ещё есть пробел в истории неизменяемости — и как оптики закрывают его. Если pattern matching — это про элегантное чтение, то оптики дают то, чего так не хватает, — композиционную запись: определили путь один раз и дальше меняете вложенные поля одной строкой, без ручной реконструкции и без циклов.

Читать далее

Вытесняй и властвуй: еще раз про многозадачность

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

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

Примеры на Ruby, Go, Java.

Читать далее

Импортозамещение, которое мы заслужили: Большой разбор клиента «Телега»

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

Снова привет, Хабр!

разоблачение телеграм клиента Telega, что скрывается за оберткой обхода блокировок

Читать далее

Слоистая архитектура для людей

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

Для кого статья: для техлидов и системных аналитиков (SA), архитекторов ПО.
О чём статья: об использовании некоторых удобных, современных подходов к проектированию ПО на стеке Java-Spring в enterprise в условиях большого количества команд и большой неопределенности. 
Об авторе: лид стрима в облачном провайдере, в 2024-2025 гг. с коллегами разрабатывавший подходы к архитектуре микросервисов.

В условиях современной разработки, когда компании растут, а команды распределены по офисам и странам, классические подходы к проектированию часто становятся узким местом. Хаос в интеграциях, бесконечные согласования форматов данных и конфликты из-за изменений в API — это знакомые боли для многих архитекторов и тимлидов. Если вы тоже сталкивались с трудностями и конфликтами при разработке платформ с множеством микросервисов или хотите разрабатывать и не хотите сталкиваться – эта статья будет наверняка интересна.

Читать далее

Инструменты навигации в GIGA IDE

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

Добрый день! Меня зовут Андрей Слекеничс, я PO GigaIDE, и сегодня мы продолжаем наш экскурс по функциональности GigaIDE.

Первая и предыдущая статьи цикла доступны здесь и здесь. Сегодняшний материал — последний, затрагивающий функциональность GigaIDE Community, и первый, в котором мы переходим к возможностям уже только GigaIDE PRO.

Читать далее

28 дней со Spring AI: от простого чата до полноценного инструмента

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

Если дедлайн плавающий или его нет, обучение и пет-проекты превращаются в вечный "черновик": сегодня читаешь доки, завтра переписываешь пример, послезавтра думаешь про идеальную архитектуру. Это нормальный творческий процесс - пока не заметишь, что за месяц у тебя так и нет ничего, что можно запустить и показать.

Когда я проходил AI Advent Challenge этот режим прокрастинации сломался: 28 дней подряд у тебя есть ровно сутки. В 10:00 приходит задание, а в 10:00 следующего дня - дедлайн. Поэтому каждый день заканчивается одной из двух вещей: либо у тебя есть работающий кусок, либо ты точно понимаешь, где решение не выдержало и почему.

Читать далее

OWASP Top 10 2025 — от кода к цепочке поставок: расширение границ безопасности

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

Разбираем изменения в OWASP Top 10 версии 2025 года на примерах и рассматриваем, как SAST может помочь избежать уязвимостей.

Читать далее

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

ИИ-ассистенты не ломают поддерживаемость кода. Но есть нюансы (выжимка из исследования Echoes of AI)

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

Первое крупное контролируемое исследование влияния ИИ-ассистентов на поддерживаемость кода: код, написанный с GitHub Copilot и Cursor, не стал сложнее в эволюции для других разработчиков. В двухфазном эксперименте с 151 участником (95% — практикующие специалисты) одни разработчики создавали фичи с ИИ и без, а другие — развивали чужой код, не зная его происхождения.

Результат: нет значимых различий по времени, качеству кода (CodeHealth) или покрытию тестами. При этом в первой фазе ИИ дал типичное ускорение на 31–56%. Авторы предупреждают о двух невидимых рисках — раздувании кода и когнитивном долге — которые краткосрочные метрики не захватывают.

Прочесть об исследовании

Java Rock Stars Meetup к нам приходит

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

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

Вот мы уже полтора месяца в новом году, пора бы встретиться и обсудить насущные вопросы, что думаете?

Это мы приглашаем вас на наш первый в 2026 году Java Rock Stars Meetup. Надеемся, вы соскучились по нам и нашим митапам так же сильно, как и мы по вам!

Регистрация открыта, но количество мест ограничено.

Читать далее

Гибкость технического интервью

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

Для кого статья: для собеседующих в первую очередь, и для кандидатов.
О чём статья: о задачах, разработанных мною для технических интервью бэкенд-разработчиков уровня middle и выше.
Об авторе: лид стрима в облачном провайдере, набирал большую часть команды в 2024-2025, пришлось скорректировать процесс проведения интервью.

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

Читать далее

Паттерн Transactional Outbox — обеспечиваем консистентность между микросервисами на примере Java

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

Разбираем на практике, как гарантировать доставку сообщений в Kafka/RabbitMQ без распределенных транзакций, используя паттерн Transactional Outbox.

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

Читать далее

Программирование, ориентированное на данные, для Java: за пределами record-классов

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

Record-классы удобны, пока класс = «состояние, всё состояние и ничего кроме». Любое отклонение (API канонического конутруктора не равно внутреннему представлению, нужно наследование) ломает «автогенерацию» и паттерн-деструктурирование (destructuring).

В новом переводе от команды Spring АйО статьи Brian`а Goetz`а, архитектора Java Language, предлагается следующий шаг в направлении data-oriented programming in Java: классы-носители и интерфейсы-носители (они же Carrier classes & interfaces). Концептуально, carrier классы родились из record-ов путем ослабления части их ограничений.

Комментарий от Михаила Поливаха: Друзья, помните, пожалуйста, что данная статья по сути является суммированием обсуждения Carrier классов из JDK Project Amber Mailing List. Я это к тому, что пока непонятно, в какой версии языка carrier классы появятся, и появятся ли они в том виде, в котором представлены в статье. Статью стоит рассматривать как пищу для размышления.

Читать далее

Реальные задачи с собеседований в Яндекс, VK, Ozon и Сбер — Go, Java, Python, React

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

Я сделал сервис, который помогает проходить технические собеседования. Побочный эффект - у меня есть транскрипции 9 247 интервью. В первой части я показал общую аналитику: кто собеседуется, куда, на какие позиции, какие вопросы задают на теории. Эта часть про конкретные задачи на секции live-coding.

Энигма не сохраняет скриншоты экрана - приватность. Зато vision-модель описывает то, что видит кандидат: "код на Go, функция принимает слайс, цикл с горутинами...". По этим слепкам и транскрипциям я восстановил условия самых частых задач. Это было похоже на сборку пазла из 2 000 фрагментов, где половина кусочков одного цвета.

17 задач. 10 компаний. 5 стеков. Go, Java, Python, React, C#. С кодом, статистикой ошибок и выводами, на чём фокусироваться.

Читать далее

HotSpot AOT-кэш: стартуем быстрее, греемся меньше

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

В новом переводе от команды Spring АйО рассмотрим, как можно ускорить Java-приложения без переписываний: в свежих JDK появились Ahead-of-Time оптимизации кэша, которые выносят «дорогие» этапы загрузки/линковки классов (и даже частично профилирование методов) из рантайма в заранее подготовленный артефакт.

Рассмотрим как устроен AOT-кэш в JDK 24–26, какие есть workflow (3 шага vs 2 шага/в один прогон), где прячутся подводные камни вроде удвоения требований по памяти при -XX:AOTCacheOutput, и какие практики обучения помогут реально сократить время старта и быстрее выйти на пик производительности.

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