Java – один из самых популярных и востребованных языков программирования в мире. Он используется в веб-разработке, разработке мобильных приложений, научных вычислениях и многих других областях. Несмотря на свою долгую историю, Java продолжает развиваться и оставаться актуальным инструментом для разработчиков. В этой статье в блоге ЛАНИТ мы собрали мнения ведущих экспертов в области Java из Artezio, Booking.com, Axiom JDK и др. Они обсуждают актуальные вопросы, связанные с использованием Java в современной разработке, дают советы новичкам и делятся своими мыслями о будущем этого языка программирования.  Недавно состоялся релиз Java 20, последней версии популярного языка программирования и виртуальной машины. В Java 20 представлено семь Java Enhancement Proposals (JEPs), в которых есть ключевые обновления и улучшения. Но количество новых функций в каждом релизе Java может казаться не таким значительным. Об этом сказал Олег Чирухин, Head of Developer Advocacy в команде Axiom JDK: «Java 20 на самом деле не содержит совершенно новых функций, а в основном развивает уже имеющиеся и делает их лучше. Если взглянуть на список функций, то можно заметить, что каждая из них была в том или ином виде реализована в предыдущих версиях. В некотором смысле это хорошо, потому что означает, что старые функции не уходят в небытие, а продолжают улучшаться».  По словам эксперта, Java 20 продолжает свое победное шествие и включает в себя Records, которые работают вместе с pattern matching. «В 20-й версии Java они находятся уже во втором превью-релизе. Если вам необходимо анализировать сложные структуры данных, например, при работе с бизнес-автоматизацией или разработке шаблонов, Records в сочетании с Pattern Matching позволяют быстро выделять нужные части данных. Даже внутри конструкции switch можно использовать Pattern Matching», – отмечает Чирухин. Говоря об интересных фичах всех версий Java, я бы тогда выделил records, рассказывает Сергей Дзебоев, Java Developer, DrSmile. «Потому что records – это шаг вперед. Я  думаю, каждый из нас знает, что такое lombok, и никому никогда не хотелось писать getter и setter, toString и т. да. Поэтому, когда сделали records, это было мощным шагом вперед и сократило количество кода, которое разработчик на Java писал для классов».  Это подтверждает Тимур Мухитдинов, Senior Software Development Engineer, Booking.com: «Рекорды – это прекрасная функция. Заметное изменение – это расширенная информация о NullPointerException, не помню в какой версии это появилось, я с 8-й сразу на 17-ю перешел. Не могу сказать, что часто сталкиваюсь с null pointer exception, но если и встречаю их, теперь не испытываю из-за этого страданий». Дмитрий Бахтин, директор по разработке, «Дм-тех» (дочернее предприятие ПАО «Детский мир»), назвал еще одну особенность 20-й версии Java – понятие scoped values и вторую версию виртуальных потоков. «С каждым годом программы на Java становятся всё более мощными и производительными, требуя создания большого количества потоков для обработки множества клиентских запросов. Создание платформенных потоков – достаточно ресурсоемкая операция для операционной системы, поэтому были введены виртуальные потоки. Scoped values решает проблему увеличения потребления памяти при большом количестве потоков, обрабатывающих клиентские запросы. Они в будущем станут предпочтительнее thread-local переменных, особенно когда будет использоваться огромное количество виртуальных потоков в Java-программах. Это приводит к неконтролируемому росту памяти», – отметил эксперт. По его словам, разработчики Java предложили концепцию scoped values, когда появляются переменные с ограниченным сроком жизни в потоке. Это потенциально решает проблему с перерасходом памяти, используемой в приложениях. Несмотря на то, что релиз «двадцатки» – далеко не самое громкое событие в истории развития Java, эксперты уверены, что он доказывает постоянное развитие языка. А значит, на него следует ориентироваться всем, кто хочет быть в курсе актуальных тенденций. «Если вы хотите оставаться в тренде и быть востребованным на рынке, то необходимо постоянно учиться и изучать новые технологии, в том числе и новые функции в Java. Однако не стоит забывать, что использование таких preview-функций, как виртуальные потоки, в production-приложениях не рекомендуется без должной осторожности и тестирования», – отмечает Олег Чирухин. «Если вы решите использовать виртуальные потоки, то вам не нужно будет самостоятельно создавать и управлять ими, так как стандартная библиотека должна автоматически адаптироваться к этому. По крайней мере, такова идея. Если вы переписываете свой код на Reactive, то вам придется переписать его с нуля. И это важное конкурентное преимущество Loom как next-gen проекта», – говорит эксперт.  Константин Тельной, Senior Backend Developer, Simple, указывает на то, что 20-я версия не является LTS, и это полугодовой релиз. Поэтому в нем нет суперкрутых функций. Но в предыдущих версиях Java было много интересных функций, которые сохраняют свою актуальность. «Из интересных функций, которые мне понравились, это, наверное, дефолтный HTTP-клиент, который появился в Java 11. Это было здорово, получить возможность не искать постоянно подходящий клиент, если в проекте нет Spring и нет дефолтного клиента Spring. Это то, что мы использовали, по крайней мере, из функций предыдущих версий», – говорит Константин Тельной. Говоря о важности предыдущих версий Java Дмитрий Раковец, Senior Java Developer, Artezio, выделяет Java 9 как переломный момент, когда изменился релизный цикл Java. «Благодаря этому мы можем сейчас обсуждать Java 20 preview-функции, то, что находится в инкубаторе и т. д. Если говорить о конкретных функциях, то, возможно, для разработчиков это не так заметно, но с точки зрения эксплуатации системы, это Alpine Linux Port и Garbage Collector, которые позволяют Java конкурировать с более легковесными инструментами в рамках контейнеризации. Java идет вперед, считает Олег Чирухин. И не только в нумерации версий.  «Например, раньше были проблемы со сборкой мусора, а теперь их стало сильно меньше. Сборка мусора является важным аспектом в разработке Java-приложений, и свежие версии Java предоставляют разработчикам современные инструменты для решения этой проблемы. Сборщики мусора (Shenandoah и ZGC) позволяют делать меньше пауз, что в свою очередь позволяет приложению работать более плавно и эффективно. Более того, существуют инструменты, вроде Java Flight Recorder, которые помогают разработчикам мониторить работу сборщика мусора и устранять проблемы в производительности своих приложений», – отмечает специалист.  Вопрос оптимизации до сих пор остается ключевым при разговоре о Java, полагает Анатолий Углов, технический директор, «Цифроматика». «Требования к оптимизации есть, они так или иначе появляются. Часто оптимизация – это вопрос поиска бутылочного горлышка. Зачастую тормозит не само приложение, а что-то снаружи, и оптимизировать приходится на уровне архитектуры решения, которая не так сильно зависит от технологии. Например, сколько раз ты сходил в какой-то внешний источник, сколько раз почитал что-то с диска, читаешь ли ты не слишком много того, что тебе нужно в данный момент. Чаще сталкиваешься на самом деле с таким, чем упираешься в сборщик мусора. Хотя, когда начнешь упираться в сборщик мусора, там уже придется заниматься оптимизацией», – отметил он.  На проблему оптимизации Олег Чирухин предлагает смотреть шире. «Условно говоря, если у тебя есть дата-центр, который тратит 10 миллионов рублей в месяц, и ты оптимизируешь приложение на 10%, т. е. это лишний миллион рублей в месяц. Довольно приятно. Этот миллион можно потратить на зарплаты разработчиков, например», – отмечает он.  Увы, оптимизации небесплатны, считает Тимур Мухитдинов, они требуют времени от программиста. «А это означает, что программисты в это время не будут развивать твой бизнес и потенциально ты можешь не приобрести новый доход. Поэтому оптимизации должны исходить из практики. Реальные бизнесы оптимизируют только то, что требуется, либо то, где оптимизация стоит дешево. На Java не пишут низкоуровневые компоненты, требующие жесткой оптимизации. Но с новыми версиями Java становится более гибкой, в том числе и для написания высокопроизводительных компонентов, которые можно оптимизировать, сделать не только хорошо и красиво написанными, но еще и быстрыми, и которые могут обрабатывать огромные объемы данных. И для этого не обязательно использовать C++», – говорит он.  Разработка проектов обычно достаточно сильно отстает от релизов новых версий Java. На это указывает Константин Тельной. «Что касается версионности Java, это может быть сложно, особенно при миграции между версиями. Однако обычно разработчики используют LTS-версии для стабильности и поддержки. Новые проекты могут быть написаны на более свежих версиях, в то время как production-решения обычно используют следующую стабильную версию после тестирования и обновления фреймворков. В реальности разработка обычно отстает от актуальной версии Java», – отмечает он.  По словам Дмитрия Раковца разработчики еще активно используют Java 8. «Часто новые проекты начинаются с Java 11. Например, на нашем проекте мы недавно перешли с 11-й версии на 17-ю без проблем с переписыванием кода. Совместимость поддерживается, но некоторые API могут быть помечены как устаревшие и со временем удалены. Проблемы могут возникнуть с фреймворками или инструментами, связанными со старыми версиями Java при переходе на новую версию», – говорит Дмитрий.  Что касается изучения Java для начинающих, то Анатолий Углов советует начать с фундаментальной литературы и актуальной документации: «Могу рассказать о своем опыте в начале 2000-х, когда изучал Java, читая толстую книгу о языке, и составлял представление о его возможностях. Этого достаточно для создания первых промышленных приложений. После первого опыта разработки становится легче, и с течением времени накапливается опыт, как слои луковицы. Следует начать с изучения фундаментальных аспектов Java, а затем со временем перейти к актуальным версиям и современным возможностям языка». Стоит ли сегодня становиться Java-разработчиком? Ответ на этот вопрос Тимур Мухитдинов советует искать в самих себе. «Все зависит от ваших интересов и мотивации. Программирование стоит выбирать не из-за выгоды, а потому что это вам нравится. В противном случае, когда вы станете опытным программистом, у вас может возникнуть выгорание и потеря интереса к профессии. Сначала нужно определиться, хотите ли вы заниматься программированием, нравится ли вам это. Сидеть 15-16 часов за ноутбуком захочет не каждый. Готовьтесь к тому, что обучение потребует много времени и усилий. Если вы решите стать программистом, пробуйте различные курсы, читайте книги и изучайте видеоуроки – это взаимодополняющие источники. Но стоит помнить, что программирование - это практика, так что важно активно писать код», – говорит эксперт.  По его словам, помимо умения программировать, нужно также уметь получить работу. «Это два разных навыка. Чтобы найти работу, вам необходимо продемонстрировать свои навыки и уметь рассказать о своих достижениях. Развивайте свои коммуникативные навыки и используйте разнообразные источники обучения, чтобы составить максимально полную картину», – уверен Тимур Мухитдинов. «По специальности я преподаватель математики и информатики. У нас в вузе изучалась достаточно плотно математика, а именно функциональный анализ и математический анализ, которые погружали нас глубоко в предмет», — говорит Дмитрий Раковец. «Однако, когда я начал преподавать, я осознал отсутствие вызовов и перешел в разработку. Это наполняет меня энтузиазмом, и я получаю удовольствие от этого. Согласен, что существуют люди, которые приходят в основном за деньгами. В таком случае вероятность выгорания у них высока». «Важный момент, который я начал замечать у учащихся, заключается в умении человека работать, то есть, грубо говоря, пахать. На практике те ребята, которые, несмотря на все, приходят после работы и до трех часов ночи практикуются, становятся действительно хорошими разработчиками. Однако чтобы вырасти до инженера, необходимо не стоять на месте, а развиваться и поднимать базу знаний, которую дают специализированные университеты и которая требуется на работе. Также стоит отметить, что найти работу и быть хорошим в своей профессии – это совершенно разные навыки. Их необходимо развивать параллельно, чтобы вообще найти работу, где можно продемонстрировать свои умения», – считает Дмитрий Раковец. Если раньше компании буквально сражались за разработчиков, конкурируя друг с другом на рынке труда, то теперь ситуация изменилась. Дмитрий Бахтин говорит, что рынок программистов становится очень конкурентным. «Мы все слышали о массовых сокращениях в топовых мировых IT-компаниях. Важны не только технические навыки, но и такие soft skills, как умение себя продавать и презентационные навыки.  Хороший программист – это прежде всего инженер. База, как правило, закладывается в технических вузах России. Базовые знания алгоритмов и хорошие навыки решения проблем являются важными качествами для классного разработчика», – отмечает эксперт.  С ним согласен и Константин Тельной. Он говорит, что нужно много работать и изучать основы, но на данный момент, Java имеет довольно высокий порог входа. «Помимо Java, у разработчиков на Java обычно спрашивают множество других знаний, начиная от баз данных и заканчивая фреймворками, используемыми в проекте. Кроме того, необходимо разбираться в работе сборщика мусора и concurrency. Если человек просто заинтересован в программировании и любит решать задачи, возможно, не лучшая идея сразу начинать с Java, так как это инструмент для решения более сложных задач, чем, например, JavaScript. Согласен, что для изучения требуется год или полтора. У меня была подобная ситуация, когда я переключался с физики на программирование, мне потребовалось полтора года. Люди приходят, им просто интересно заниматься программированием, и когда ты можешь посоветовать им, например, Node.js или JavaScript, в которых нет сборки мусора и результаты видны сразу, это может быть более выгодно для них. Они быстрее освоят профессию и смогут дальше развиваться и углублять свои знания», – отмечает он. Сергей Дзебоев говорит, что Java может выполнить огромный спектр задач. В том числе можно написать AI-инструмент на Java. Это язык программирования, на котором можно создать любой алгоритм. «На данный момент, как мне кажется, для создания AI-инструментов и искусственного интеллекта выбираются языки, которые проще в использовании, имеют больше библиотек и инструментов для расчетов. Python выбирается из-за мощных библиотек, позволяющих проводить различные вычисления и применять формулы. Java развивалась в другом направлении: это был бэкенд для фронтенда, веб-разработка и инфраструктура для построения сложной бизнес-логики. Разные языки выполняют разные задачи», – отмечает он. «Если бы я выбирал другой язык, я бы, возможно, ушел на Go, так как считаю себя бэкенд-разработчиком. Вероятно, я бы не перешел на Kotlin, хотя считаю его достаточно развитым языком программирования, играющим свою роль в развитии Java. Kotlin демонстрирует, как мог бы выглядеть язык Java с новым синтаксисом. Однако Java вряд ли уйдет на второй план, так как сейчас активно развивается. Если раньше был резон использовать Kotlin из-за новых возможностей и синтаксических конструкций, то Java в последнее время стала развиваться невероятно быстро, уже обсуждаем 20-ю версию, хотя недавно мы помнили 8-ю версию. С учетом обратной совместимости, хотя и в Kotlin она тоже есть, Java, по-моему мнению, не уйдет на второй план. Поэтому я не жалею, что я Java-разработчик, мне нравится быть Java-разработчиком», – отмечает Сергей Дзебоев.  «На самом деле, в Java происходит много инноваций. Просто они касаются не классических вещей, таких как написание CRUD с веб-интерфейсом. Например, в проекте GraalVM. Если мы говорим про нейронные сети, можно запускать Python на Java-платформе, а также модели, созданные с помощью TensorFlow, с использованием GraalVM. Уже существуют библиотеки, работающие с нейронными сетями (например, DJL (Deep Java Library), которая запускает модели TensorFlow на Java-машине). GraalVM как инструмент, позволяющий на Java-платформе запускать множество разных языков является идеальной платформой для создания светлого будущего, где все языки и платформы работают вместе - в тех областях, где они наиболее применимы. Виртуальная машина может работать, например, в режиме Node.js. Это позволяет делать интерфейс на JS, а бизнес-логику продолжать писать на Java, и иметь между ними удобный интероп», – отмечает Олег Чирухин. По его словам, прогресс в Java никуда не делся. Просто, как и любой прогресс в сфере технологий, он доступен не широким массам, а инноваторам. Поэтому в продуктивной среде его сложно заметить. «Просто погуглите, и информация будет у вас на кончиках пальцев», – резюмирует эксперт.  Тем кто приходит в профессию, эксперты советуют изучать базу.  «Для тех, кто хочет быстро начать работать в должности, стоит освоить базовые конструкции Java и изучить фреймворк. Олег упоминал фреймворк Spring, который, я думаю, новички должны знать. Научитесь создавать репозитории, работать с JSON и передавать данные из бэкэнда на веб-интерфейс, а также создавать API. Освоив базовые конструкции и фреймворк, вы сможете быстро влиться в профессию. Если вы освоите основные аспекты такого фреймворка, как Spring, который используется повсеместно, особенно в компаниях с веб-сайтами и интерфейсами, то вас точно возьмут на работу», – говорит Сергей Дзебоев. «Да, мы все фанаты Java и говорим о развитии систем искусственного интеллекта. Новичкам, желающим присоединиться к этой области, я бы посоветовал изучать библиотеки для работы с фреймворками (TensorFlow и Deep Learning 4G). Ведь джавистам тоже доступно разрабатывать системы искусственного интеллекта», – советует Дмитрий Бахтин.  «Касательно технологий для изучения новичками, я уже упоминал, но повторю: есть понятие T-shaped person, которое подразумевает широкий кругозор и базовые знания по множеству тем, а также глубокие знания в одной избранной области. Именно так стоит изучать технологии. Сначала надо понять чем ты хочешь заниматься, а без широкого кругозора это сделать невозможно. Также важно выбирать технологии для изучения, исходя из собственных предпочтений и целей. Если главная цель – заработать деньги, то выбирайте самые востребованные технологии на рынке. Изучайте вакансии на агрегаторах, выбирайте те, где много предложений и высокая оплата. Таким образом, вы сможете определить свое направление для изучения», – говорит Тимур Мухитдинов. Совет новичкам от Олега Чирухина – обратить внимание на умные дома и умную инфраструктуру.  «Начать можно с сайта Eclipse IoT. Например, там есть интересный проект под названием Ditto, который позволяет создавать цифровые двойники реальных устройств. Он на 98% написан на Java. Это хорошая отправная точка», – отмечает он. Согласны ли вы с мнениями экспертов? Напишите в комментариях, как вы видите развитие Java и какие советы вы бы дали тем, кто выбирает этот язык для работы. Если у вас есть вопросы к спикерам дискуссии, напишите их в комментариях под видео на Youtube.  Полную запись беседы экспертов, включая практические советы и ответы на вопросы зрителей, можно посмотреть на Youtube. https://www.youtube.com/embed/3OWrkkqLTlw   Чтобы не пропускать новые дискуссии, подпишитесь на канал Artezio. Мы проводим экспертные стримы регулярно.  А ещё мы в постоянном поиске талантливых разработчиков. Актуальные вакансии можно посмотреть тут. Приглашаем в нашу команду. IT-журналист