Тернист путь техноавтора: потенциальная аудитория технохардкора никогда не будет такой же широкой, как у научпопа. Но мы попытаемся.
С 1 июля по 15 августа мы объявляем сезон Java (количество джавистов в комментариях увеличилось вдвое). Сезон — это конкурс технических статей, который Хабр проводит вместе с разными компаниями, на этот раз — со Сбером. Там, кстати, работает немало джавистов и открыты вакансии для Java-разработчиков.
Победителя сезона ждут призы, а всех участников — повышенные охваты постов. Судьба Java-хардкора в ваших руках: исход соревнования решат читатели.
Джавистов и всех сочувствующих приглашаю под кат — там я подробно рассказал, как устроены эти наши сезоны.
UPD: приём заявок завершён. Участников набралось гораздо больше, чем мы ожидали, поэтому понадобится ещё немного времени, чтобы анонсировать все посты в соцсетях Хабра.
UPD 2: победителем сезона стал Олег Чирухин (@olegchir). Его пост набрал рейтинг +79 (проверили 23 августа в 10:00 по мск).
Олег, поздравляю с победой! Чтобы забрать призы, ответьте мне в личке на Хабре.
Я (@apoltavcev) работаю продюсером спецпроектов в Хабре. У нас айтишники говорят с айтишниками об айтишечке — в основном в образовательных целях. По опросам выходит, что 54 % читателей посещают Хабр, чтобы учиться.
При всём уважении к развесёлым пятничным постам, суть Хабра — в хардкорных технических текстах. Без живительного технохардкора Хабр превратился бы в тыкву в обычный развлекательный сайт.
Но технический контент на деревьях не растёт, хардкорных авторов нужно поддерживать. Для этого мы и придумали сезоны — регулярные конкурсы по узким техническим тематикам.
Вспомните онлайн-игры: там тоже есть сезоны. За участие игроки получают скины, ачивки, голду и прочие ништяки. Как только заканчивается один сезон, начинается другой — с новой темой и новыми заданиями. Мы переложили этот концепт на реалии Хабра, и если сезоны вам понравятся, они станут постоянным развлечением.
На этот раз повезло джавистам. Тематические скины для Хабра мы пока не выдаём, но ачивки и крутые призы будут (спойлер: можно выиграть ноутбук).
Чем сезоны отличаются от Технотекста
Технотекст — грандиозное событие, но оно случается один раз в год, а мы хотим чаще поддерживать авторов. Особенно по узким направлениям.
В рамках Технотекста обеспечивать такую поддержку сложно — там нет узких номинаций. Возьмём «Программирование» — туда валятся все статьи вне зависимости от стека. Собрать специалистов по всем направлениям в конкурсную комиссию невозможно, поэтому в Технотексте побеждают статьи, которые более-менее понятны всем разрабам. В случае с сезонами мы намеренно сужаем тему, чтобы поддержать авторов, которые работают на узкую техническую аудиторию.
Все тексты, прошедшие через модераторов конкурса, получат гарантированную поддержку от Хабра — анонсы в наших соцсетях, место в списке в конце этого поста и специальную отметку участника сезона.
Что с этого авторам
Всеобщая любовь, уважение и куча бонусов от Хабра и Сбера.
Приз от Сбера, который пригодится для программирования на Java: ноутбук Lenovo IdeaPad 5 Pro Gen 6.
Грант от Сбера на подготовку ещё одной статьи про Java. Тему поста победитель выберет сам, согласовывать её не нужно.
Продвижение поста в общем анонсе сезона, а также в соцсетях Хабра для всех участников. Так будет проще набрать рейтинг.
Значки в профиле. Для участников — «Участник сезона Java», а для победителя — «Победитель сезона Java». В следующих сезонах будут другие ачивки — кто знает, может когда-нибудь на Хабре и платину выбить получится :)
Дополнительный инвайт для победителя. Инвайтов много не бывает.
Победителя мы пригласим на онлайн-трансляцию с подведением итогов. Но это по желанию — если стесняетесь, можно не ходить.
Ноутбук гарантированно привезём в любую точку России. Если окажется, что победитель живёт в другой стране — будем действовать по ситуации и поищем варианты международной доставки.
Как подать заявку
Добавьте к публикации тег «сезон Java». Пост должен быть размещен в хабе «Java» в промежутке с 15 июня по 15 августа 2022 года.
Модераторы конкурса проверят статью и, если она подходит под критерии сезона, мы включим её в список и отметим специальной плашкой под заголовком.
Правила сезона Java
Побеждает пост с наибольшим рейтингом. Если вам нравится технический контент вокруг Java, плюсуйте соответствующие посты. Таймаут по голосованию: до 10:00 по мск 16 августа.
UPD: мы получили так много постов, что не успели анонсировать все. Чтобы все участники были в равных условиях, мы продлили сроки голосования до 10:00 по мск 23 августа. Но новые заявки не принимались с 15 августа.Один автор — неограниченное количество заявок. Хотите прислать два, пять, да хоть десять постов — пожалуйста. Участвовать могут не только новые посты, но и все статьи, опубликованные не ранее 15 июня 2022 года.
Участвовать могут все — даже авторы из Песочницы. Если вы дружите с крутым джавистом, но на Хабр он пока не писал — зовите его к нам, сейчас самое время делиться экспертизой.
Только технохардкор. Побольше про кодинг, поменьше про эмоции. Да, пост про сложности смены профессии не подойдёт, но вы можете отправить его на следующий Технотекст. На сезон попадут только технические посты с примерами кода.
Что мы считаем технохардкором
Чтобы понять, подходит ли статья для сезона, проверьте её на соответствие критериям:
1. Java в центре внимания. Лично мне нравятся посты про организацию процессов разработки, но в этом конкурсе им нет места. Пост должен быть именно про применение Java, а не про всё остальное вокруг.
2. Технологии важнее эмоций. Проверьте, чего в посте больше: эмоций или технических подробностей. Сможет ли Java-разработчик узнать что-то полезное? Если «да», поздравляю — у вас технохардкор.
3. Без лишней рекламы или антирекламы. Дополнительное анонсирование, которое мы обещаем постам про Java, потенциально могло бы стать инструментом в PR-войнах. Чтобы этого не случилось, мы ввели ограничение на упоминание компаний в конкурсных постах. Можно упомянуть компанию, в которой вы работаете, но не более того. Если текст рекламирует продукт или набрасывает говно на вентилятор — на сезон он не попадёт.
Идеи для постов
Я поговорил с джавистами, которым доверяю: спросил у них, что им интересно. Ответы в описаниях к картинкам.
Примеры хороших постов: про оптимизацию, про Java и Arduino, про Java Generics от Сбера (400+ добавлений в закладки — тема жива). Напоминаю, что сейчас в Сбере открыты вакансии для Java-разработчиков.
Посты-участники
Список обновляется, орфография и пунктуация авторские.
Статический анализатор, который изменит вашу архитектуру. Статический анализатор обычно помогает поддерживать выбранный стиль кода. Иногда он находит нетривиальные шаблонные проблемы. Но сегодня посмотрим на то, как статический анализатор заставляет менять всю архитектуру…
История одного OOM. В далекой-далекой галактике были времена стабильности и процветания. Сервис с шестнадцатью инстансами работал на благо человечества. Через Hibernate он ходил в PostgreSQL-базу, доставал необходимые данные и отдавал другим по REST-интерфейсу…
Server side Form. Управление веб-формами на стороне сервера. Как человек, побывавший по ту (фронт) и по эту (бэк) стороны разработки, я хочу рассказать о Server Side Form - «Управлении веб-формой на стороне сервера»...
Микросервисы: плюсы, минусы, когда и зачем внедрять. Вместе с Дмитрием Горчаковым, руководителем отдела разработки РЕД-СОФТ, мы разобрали плюсы и минусы микросервисов, а ещё рассмотрели сценарии, как компании приходят к их внедрению...
Проксируйте всё. Если ты опытный разработчик, то ты это уже давно знаешь и используешь. Если же нет… то самое время узнать, чтобы иметь основания считать себя хорошим разработчиком...
Обзор Spring-компонентов. Часть 1 – Spring Boot и фреймворк интеграции. Принцип «искать нужно там где потерял, а не там где светло» кажется очевидным. И все же приходилось видеть, как участники смежного проекта два года бились в аналитическом параличе, выбрав неподходящие инструменты...
AssertJ как способ значительно улучшить код ваших тестов. В 2019-2020 годах на одном из проектов я был идейным вдохновителем перехода на JUnit 5. Для проверок мы использовали стандартные ассерты и Hamcrest. Тогда мне казалось, что этого более чем достаточно. Один из наших lead-инженеров предлагал AssertJ как более «модное и молодёжное» решение, но поддержки эта идея не получила. Я был одним из тех, кто выступал против AssertJ. Каюсь, был грешен...
Обзор Spring-компонентов. Часть 2 – Spring Cloud. В обзоре собраны краткие описания каждого компонента экосистемы, чтобы дать понимание – как выглядит мир Spring, и ориентиры – что из этого стоит изучить глубже и применять в проекте...
Сравнение виртуальных и обычных потоков в Java. Я люблю стректрейсы и понятный линейный код. И соответственно не люблю реактивщину. Все примеры будут нереактивными с последовательным понятным кодом...
Как я реализовывал switch exhaustiveness checker для Java 8. В последние время многие промышленные языки вроде C#, Kotlin и Java стали реализовывать switch exhaustiveness проверки для разных языковых элементов: sealed classes, records и enums. Я могу предположить, что это связано с популяризацией Data Oriented Programming. К сожалению, я пока привязан к Java 11, где эта функциональность компилятором не реализована. Поэтому, я решил сделать что-нибудь, что будет проверять switch exhaustiveness для Enums и будет работать на Java 8 и выше.
Разработка собственного плагина для сервера Minecraft. Еще с детства я начал покорять бесконечные просторы Minecraft. Естественно о разработке в то время никакой речи не шло. Но с недавних пор загорелся идеей создать о свой проект серверов...
Практическое использование JCStress. Цель данной статьи — показать читателям что JCStress можно и нужно использовать не только в лабораторных работах для демонстрации эффектов связанных с моделью памяти, но и для доказательства правильности преобразований кода...
Пишем свой Validation API для Spring Boot приложения. Меня зовут Вартанян Артур и я работаю в компании Reksoft Java-разработчиком. В данной статье мы напишем свой собственный вариант реализации валидации для объектов и его полей, используя Java Reflection Api и Spring AOP...
Обработка исключений в Java в функциональном стиле. В Java начиная с версии 8 появились новые возможности в виде функциональных интерфейсов и потоков (Stream API). Эти возможности позволяют писать код в новом функциональном стиле без явных циклов, временных переменных, условий ветвления и...
Что общего у нуля, -1 и большого простого числа: Psychic Signatures в мире Java. Уязвимость CVE-2022-21449 или “Psychic Signatures”, которая была обнаружена в Java 15-18, позволяет обойти механизм проверки ECDSA-подписи и подделать исходное сообщение. Если приложение использует уязвимую версию Java для валидации JWT-токенов на базе алгоритма ES256, злоумышленник может получить доступ к приложению от лица любого пользователя...
Получение generic-типа в runtime. В Java 5 появились generic-типы, а вместе с ним и концепция type erasure, которая буквально означает стирание информации о generic-типе после компиляции. Действительно, во многих случаях это просто синтаксический сахар, помогающий писать типо-безопасный код на уровне компиляции, и в runtime с такими типами работать нельзя...
Производительность: нюансы против очевидностей. JDK edition. Это продолжение статьи, в которой я разбирал разные неочевидные вещи из мира производительности. В этот раз будем копать ещё глубже, хоть и начнём с относительно простых примеров. И да, в этой статье будет много интересного про строки...
Как войти в блокчейн-разработку через Java и Kotlin: представляем JVM SDK смарт-контрактов. В этом посте я хочу рассказать о нашем SDK для JVM-языков программирования, с помощью которого каждый Java/Kotlin-разработчик сможет попробовать себя в создании блокчейн-приложений...
Нормализуем логи OpenFeign. Стандартный логгер OpenFeign предоставляет весьма неудобный подход в логировании коммуникаций — он записывает запрос отдельно от ответа, причём каждый заголовок и тело — это отдельная строка логов...
Считаем уникальные IPv4 адреса. Эта задача была предложена мне на одном из курсов по Java. В статье излагаю своё решение, а также анализ его эффективности. Обработка IP адресов необходима для многих проектов, и я надеюсь, что алгоритмы, описанные в этой статье, могут быть полезны...
Варианты использования Java ML библиотек совместно с Spring, Docker, Spark, Rapids, CUDA. В данной статье рассматривается способ использования GPU nVidia с технологией CUDA в Docker-контейнерах для распределенной тренировки моделей машинного обучения на нескольких машинах...
К микросервисам через reverse engineering и кодогенерацию. Разрабатывая информационную систему с нуля, мы можем выбрать практически любой вариант технологии и архитектуры в целом, в том числе — принцип взаимодействия частей системы. Но что делать, если система уже есть и у неё довольно богатая история?
Hibernate Best Practices для начинающих. В данной статье я не ставлю цель подробно описать Hibernate, такого материала полно в сети. Это скорее справочник, в который можно заглянуть и увидеть возможные проблемные места и их решение, который позволит вам не допустить грубых ошибок при использовании Hibernate...
Vector API в Java: краткий обзор и тестирование. Некоторое время назад попалась на глаза статья про Vector API в Java. Прочитал, заинтересовался. Наконец, недавно дошли руки посмотреть, что же это такое и как работает. Результаты немного неоднозначные...
Java, реактивное программирование, Reactor, Spring Cloud Function, Streams, etc… Статья является кратким обзором компонентов Spring Framework, позволяющих реализовывать программы в терминах функций асинхронной обработки сообщений. И ориентирована на разработчиков, уже знакомых со Spring Framework, но ещё не имеющих опыта построения реактивных приложений с декларативным управлением функциями-компонентами.
Статический анализ кода в современной Java-разработке. Сегодня я хочу затронуть тему, которая будет полезна как Java-разработчикам, так и начинающим тех- и тимлидам. Я расскажу о том, как добиться высокого качества кода на вашем Java проекте и перестать волноваться о стилях кодирования...
Дюк, вынеси мусор! — Часть 4. Мы уже успели рассмотреть четыре различных сборщика мусора, разработанных для разных целей, разных профилей нагрузки, разного железа. Что же такого особенного хотели предложить разработчики ZGC, чего мы еще не встречали?
Быстро сжимаем, быстро пишем и читаем! На Java. В ходе разработки IDE 1С:Enterprise Development Tools у нас возникла необходимость быстро оперировать с довольно большими (несколько гигабайтов) объемами данных. Что касается Java, то задача выглядит так: быстро сохранить несколько гигабайт информации на диск и быстро считать несколько гигабайт информации с диска...
Пишем тесты производительности под Webflux. Сегодня я хочу рассказать вам о том, как написать карманный тест производительности на неблокирующий код Webflux. Статья рассчитана на разработчиков, которые разрабатывают API или выполняют оптимизационный рефакторинг медленного кода.
Spring Test Containers как бины. Разбирать будем на простом примере тестовый контекст + тестконтейнер + определение параметров для подключения к БД в тестовом контексте.
Дюк, вынеси мусор! — 6. Shenandoah GC. Несмотря на то, что мы уже успели достаточно подробно рассмотреть целых шесть сборщиков мусора (Serial, Parallel, CMS, G1, ZGC, Epsilon), у OpenJDK еще есть, что нам предложить. Эта статья посвящена Shenandoah, тому самому сборщику, "который смог" (с таким слоганом он обычно подается)...
Как красиво избавиться от switch-case посредством перечисления. Применение switch-case в коде - давняя тема холиваров на форумах на предмет чистоты кода. Лично я склоняюсь к простому мнению: инструмент необходимо использовать по назначению...
Юнга, стоп, у нас кончились ресурсы. Или как мы оптимизировали наши микросервисы. Как вы все знаете, после определенных событий у нас случился ресурсный кризис. И появился запрос на оптимизацию потребляемых ресурсов. Темой и станет оптимизация потребления ресурсов микросервисов и уменьшение времени выполнения наших запросов.
Чувак, где моя черепаха? Как написать программу, чтобы победить на конкурсе плохого кода? Этот вопрос я задал сам себе, когда прочёл о необычном челлендже на форуме reddit. Да, вы правильно поняли. Это статья не о чистом коде и правильных тестах. Но здесь не будет и речи о плохом, заурядно плохом коде, том коде, который мы очень часто видим в наших проектах. Я расскажу об экстремальном, невообразимом, гениально плохом коде, коде, который использует те возможности джавы, о которых вы, скорее всего, и не догадывались, и те приёмы, которые вы никогда не встретите в обычных проектах.
Управление временем в Java приложениях. В реальном коде часто требуется сохранять дату и время в базу данных. Это может быть фиксация времени создания\последней модификации какого-либо объекта или указание срока действия документа, билета и т.п. Думаю, многие из вас решали эту задачу в своих проектах: сама по себе она несложная. Трудности возникают, когда мы хотим подобную систему протестировать и оценить, как она будет вести себя, скажем, через полгода или год...
Загрузка ленивых полей. Сегодняшняя статья навеяна довольно стандартной ситуацией – существует некий «большой» объект, но для работы приложения далеко не всегда требуется загружать его полностью в память. Для решения такой проблемы существует ленивая загрузка полей. Суть её состоит в том, что загрузка поля объекта откладывается до того момента, как оно [поле] понадобится...
Сравнение Quartz, kagkarlsson и кастомной реализации для запланированного задания в реактивном Spring Boot приложении. Часто Java-разработчикам требуется реализовать запланированные задания. Современные реалии диктуют нам, что система должна быть масштабируемой, то есть вне зависимости от количества реплик и распределения нагрузки мы ожидаем выполнения задания по условиям, которые были определены на входе...
Холостые циклы в Java. Сегодня поговорим о тонкостях реализации холостых циклов (холостого ожидания) в Java. Эта задача встречается нечасто: за девять с небольшим лет работы я столкнулся с ней лишь пару раз. Тем не менее, тема видится интересной и по ней есть что сказать, так что добро пожаловать...
It is Wednesday, my java dudes, или насколько сложно сделать свою JVM. Что делать, если накануне переезда повысилась тревожность, а привычные методы не приносят успокоения. Конечно же вырабатывать дофамин через решение упоротых инженерных задач. Мне стало интересно - насколько тяжко было бы сделать свой интерпретатор байт-кода Java? И насколько сложно было бы научить его “новым трюкам”?
Обзор GraphQL-фреймворков на Java. В предыдущей статье мы поговорили о том, что такое graphQL, почему решили на него переходить, какие у него есть достоинства и недостатки. Но что делать дальше, если вы всё-таки решились внедрить graphQL в java-проект? Какие на данный момент есть фреймворки, чем они отличаются и какой вообще выбрать?
Выходим за пределы JVM. Объясняем на крестиках-ноликах чем хорош Kotlin Multiplatform. Какой есть общий недостаток у мобильной, front-end и back-end разработки и иногда распила микросервисов? Дублирование логики. Очень часто я видел статьи или новости, где одна команда мобильных разработчиков ждет другую, чтобы выкатить релиз. И если с мобильными версиями более-менее все понятно и есть решения, то что делать с браузером?
Ошибка в stacktrace из продакшена. В этой статье я расскажу про исключительную ситуацию, которая произошла с одним исключением в продакшене нашего Android приложения...
Атака на String.hashCode: прообразы и коллизии. Как-то раз мне понадобилось несколько наборов строк с коллизией по хеш-коду. То есть таких, чтобы значение String::hashCode() совпадало для всех строк в наборе...
Сквозное и интеграционное тестирование просто, как юнит-тесты. Когда изменения затрагивают несколько микросервисов, возникает вопрос, как протестировать их в связке. Можно покрыть границы сервисов юнит тестами, а интеграцию проверить, развернув измененный код на тестовом окружении. У такого подхода две главные проблемы: цикл изменения-тестирование-исправления становится достаточно долгим и нужно много полноценных окружений, чтобы обеспечить параллельную работу нескольких разработчиков. Давайте попробуем решить проблему иначе...
Кастомный отчет для Jira или как приключение затянулось. Представим ситуацию – вам надо сделать небольшой отчет на основе данных из другой системы. Звучит обыденно и вы сразу в голове представляете, что надо будет делать: узнать какие будут входные данные и в каком виде они к нам поступят, какая будет логика отчета (что на что надо умножить и т.д.) и в каком виде отчет должен быть представлен (график, диаграмма, таблица и т.д.), реализовать. Но что, если я вам скажу, что это должна быть не какая-то новая система, а плагин для Jira...
Большой гайд. Пишем микросервисы на Java и Spring Boot, заворачиваем в Docker, запускаем на EKS, мониторим на Grafana. Туториалы делятся на две больших категории: либо "как нарисовать сову", либо подробно расписанные тысячи шагов в формате "напиши туториал для дурака - и только дурак захочет его читать". К какой из двух категорий относится эта статья — решать вам...