Как стать автором
Обновить

Таблетки от скуки — подборка для Java [и не только] разработчиков

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

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


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



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


Содержание статьи:



Apache Spark — большие данные и машинное обучение в одном фреймворке



Apache Spark — это open-source фреймворк для распределенной обработки больших объемов данных. Он поддерживает работу как с SQL, так и с NoSQL базами данных, потоковые данные (работу с Kafka, Akka и т.д.), а также содержит библиотеку для применения машинного обучения. API спарка доступно для Java, Scala, Python и R.


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


Почему стоит попробовать:


  • open-source проект
  • поддержка различных источников данных
  • можно поработать с машинным обучением
  • распределенная обработка больших данных (кстати, при запуске приложения спарк предоставляет простенький UI, где можно посмотреть разделение задачи между “исполнителями” и время работы запросов).

Что может помешать в изучении:


  • мало хороших примеров кода именно на Java
  • чтобы пользоваться всеми “плюшками” спарка придется повозиться с настройками и установкой нужных зависимостей.

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




Моя история

Когда я училась на 3 курсе университета, многие из моих одногруппников стали активно устраиваться на курсы для программистов, чтобы попасть на работу. Кто-то ушел в веб-разработку, кто-то в мобильную, а еще часть — в Data Science и Machine Learning. Я, минуя этап курсов, в это же время устроилась Java-разработчиком и казалось бы машинное обучение было мне интересно, но оно совсем не совпадало с моей работой, времени свободного почти не было, и эта тема была мной благополучно отложена на “когда-нибудь потом, но не сейчас”.



Но вот прошел год, работу я сменила, занятия в универе закончились и времени стало в разы больше. Да и желание изучать новое заметно выросло. Пришло время выбирать тему для диплома на ближайшие пару месяцев, и тут я вспомнила про машинное обучение. С одной стороны — машинное обучение, с другой — Java-разработка. Как говорится, кто гуглит ищет — тот найдет. И я нашла Apache Spark — тут и большие данные, и стриминг, и ML, — все, что душа пожелает.


Самой большой проблемой было то, что почти весь код, который я находила, был написан или на Scala, или на Python. Конечно, аналогичный код было не сложно и самой “натыкать” на джаве, но полноценный проект (везде почему-то был один и тот же маленький примерчик с обработкой текста) я найти не могла. В целом, с документацией и переносом примеров из Python в Java-код, написать свое приложение для решения задачи о пассажирах Титаника у меня получилось. В итоге мне показалось, что спарк хорош, если нужно обработать действительно большие объемы данных, а в рамках машинного обучения хорошо подходит, если для решения достаточно стандартных, хорошо известных моделей (а не какой-то супермногослойной нейронной сети).


От ненависти до любви к многопоточности один шаг — Akka



Akka — это toolkit (инструментарий, наверное, если по-русски, но как-то не звучит) для создания высоконагруженных, распределенных и отказоустойчивых реактивных систем для Java и Scala.


Акка поддерживает несколько моделей параллельного программирования, но в ее основе лежит параллелизм на основе акторов ("вдохновленный" моделью акторов из языка Erlang, который, кстати, если верить Википедии, используется в RabbitMQ, CouchDB и бэкенде для чата Facebook). Концепция очень простая — все есть Актор.


Весь мир — театр, а люди в нем — акторы.
философия Akka

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


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

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



Достаточно большое преимущество акки состоит в том, что вы программируете в обыкновенной однопоточной среде, не задумываясь о race condition, deadlock и прочих "прелестях" многопоточных приложений. Так что, если обычно упоминания многопоточности вселяют в вас чувство неуверенности и древнего ужаса страха, попробуйте написать небольшое приложение на основе акки — вдруг понравится. Смысла использовать акку в маленьких проектах, наверное, особо нет, ведь она предназначена именно для создания высоконагруженных приложений, но мне кажется, что акка — это хороший повод посмотреть на разработку многопоточных приложений под другим углом.


Кратко, почему может быть интересно:


  • хорошая официальная документация с подробными примерами
  • позволяет создавать высоконагруженные распределенные приложения
  • упрощает работу с многопоточностью
  • разные полезные модули — Akka Streaming, Akka Cluster, Akka HTTP, Akka gRPC.

Что может помешать:


  • сложно найти хорошие примеры использования в реальных приложениях.


Моя история

С аккой я познакомилась, когда пошла на курсы по изучению Scala несколько месяцев назад. У нас было несколько занятий об основах акки, об Akka Http и Akka Persistence. Сначала было все очень просто и понятно, потом чуть-чуть непонятно, а потом вообще непонятно.


В домашке надо было реализовать бинарные деревья из акторов: это было не сложно, но очень интересно, потому что бинарные деревья во время университета я реализовывала и на C++, и на C#, и на Java и даже на Haskell, но это всегда было очень однотипно и просто. А тут это выглядело совсем по-другому и сначала было сложно понять, к чему тут вообще эти акторы и как из них вырастить дерево? Так что акка была интересным опытом и, как я поняла, разработчики на Scala часто используют ее в приложениях, хоть на смену и приходят более новые функциональные подходы.


Kafka — превращение в журнал



Apache Kafkaраспределенная платформа передачи и обработки потоков данных. Проект стал невероятно популярным во многом благодаря своим неоспоримым преимуществам: легкость настройки, масштабируемость, высокая пропускная способность и надежность.


Kafka запускается как кластер на одном или нескольких серверах. И для того чтобы координировать работу всех своих брокеров в кластере, Kafka использует дополнительный сервис — ZooKeeper.


Сообщения публикуются в топиках (topic), подписчиков на определенный топик можно объединять в группы. Одним из преимуществ кафки является возможность хранить сообщения заданное время после их успешной доставки, а не удалять их. Kafka очень часто сравнивают с RabbitMQ (статья об этом), основное отличие в том, что RabbitMQ хранит сообщения в очереди, а Kafka по факту представляет собой журнал сообщений.



В Spring Boot достаточно удобная поддержка работы с Kafka (Maven-зависимости: stream-kafka, stream-binder-kafka). Вам потребуется только описать конфигурацию в application.yaml, добавить классы-модели сообщений и их обработчики. К тому же, есть еще модуль spring-kafka-test для удобного тестирования приложений с использованием Kafka.


Почему интересно:


  • удобная интеграция с микросервисами и другими системами
  • концепция журнала сообщений и возможность хранить их определенное время
  • масштабируемость

Что может помешать:





Моя история

С кафкой я столкнулась во время работы над проектом по разработке микросервисов для мобильного банкинга. Планировалась работа с потоком сообщений из Kafka. Изначально требования к проекту были не готовы и описания сообщений у меня не было. Поэтому было решено "набросать" схему работы, проверить на тестовых сообщениях любого вида и потом просто заменить на новые по готовому описанию.



Для этого я установила ZooKeeper, Kafka и запустила producer-а сообщений. Оставалось только подключить зависимости для SpringBoot в проект и создать consumer для обработки сообщений. Это оказалось достаточно быстро и просто, все отлично работало и, когда требования уже были готовы, поменять под них решение было делом 5 минут.


В целом работать с кафкой уже при реальном запуске было интересно, но как-то обнаружился один очень забавный "баг". Во время просмотров логов приложения обнаружилось, что одно и то же сообщение почему-то приходит 3 раза. Такое происходило каждый раз. Ребята из поддержки убеждали, что сообщение точно приходит один раз, и мы все ломали голову. В итоге проблема оказалась вот в чем: когда при обработке сообщения выбрасывалось исключение, срабатывал механизм повторной отправки сообщения, а по дефолту количество попыток равно трем. Поправить это можно либо оборачиванием всего метода обработки сообщений в try-catch, чтобы обрабатывать все выбрасываемые исключения, либо настройкой количества попыток в конфигурации приложения.


Say "No" to SQL — MongoDB, Redis, Cassandra



Традиционными реляционными СУБД уже никого не удивить. Наверняка вам приходилось работать с Oracle, MySQL, PostgreSQL или SQL Server. Но в некоторых приложениях гораздо удобнее использовать другой подход — без жесткой структурированной схемы базы данных. В таких случаях говорят о NoSQL.


Описание схемы данных в NoSQL СУБД можно построить на основе различных структур. Соответственно выделяют 4 типа таких систем: ключ-значение, семейство столбцов, документоориентированная и графовая. Давайте посмотрим на популярные СУБД в рамках этих типов.


MongoDBдокументоориентированная СУБД, которая хранит данные в виде JSON-подобных документов с различной структурой. Если точнее, то для хранения в MongoDB применяется формат, который называется BSON, или binary JSON. BSON позволяет работать с данными быстрее: быстрее выполняется поиск и обработка.


Вместо традиционных таблиц в мире SQL в MongoDB используются коллекции. И если в реляционных БД таблицы хранят однотипные жестко структурированные объекты, то в коллекции могут содержать самые разные объекты, имеющие различную структуру и набор свойств.


Из интересного:


  • полезные инструменты — визуализация данных (MongoDB Charts), GUI для работы и запросов (MongoDB Compass)
  • есть официальные драйверы для многих языков программирования
  • удобный язык запросов
  • кроссплатформенность


Redis — это хранилище данных с открытым исходным кодом для структур данных вида «ключ-значение». Используется как для баз данных, так и для реализации кэшей, брокеров сообщений. Хранит базу данных в оперативной памяти, что позволяет достигать высокой скорости обработки.


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



Cassandraраспределённая NoSQL СУБД, рассчитанная на создание высокомасштабируемых и надёжных хранилищ огромных массивов данных, представленных в виде хэша. Использует модель хранения данных на базе семейства столбцов, что позволяет организовать хранение хэшей с несколькими уровнями вложенности. Cassandra используется для сервисов Apple, GitHub, Netflix, Reddit.


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



Интересное в NoSQL системах:


  • подход, отличный от традиционных реляционных СУБД
  • другие языки или способы построения запросов (например, CQL — язык запросов для Cassandra)
  • различные способы хранения данных

Я не работала с такими системами, поэтому информация выше не очень подробная. Но мне давно интересна эта тема, поэтому решила упомянуть ее в списке.


F[u]n with Scala



Scala — мультипарадигменный язык программирования, сочетающий возможности объектно-ориентированного и функционального программирования. Основной "фишкой" этого языка является типобезопасность и возможность обнаруживать большое количество ошибок на этапе компиляции.


Еще одной удобной особенностью является наличие REPL (Read Evaluate Print and Loop), что позволяет быстро запускать и проверять выражения или кусочки кода. Скалисты очень любят говорить о том, что они побороли главную проблему Java-программ — обработку null и соответственно отсутствие непредвиденных NPE.


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


Интересное:


  • принципы функционального программирования
  • совместимость с Java
  • во многих случаях конструкции проще, чем в Java
  • язык набирает популярность и многие разработчики переходят с Java на Scala
  • хорошее коммьюнити

Из минусов:


  • Intellij Idea все еще не идеально работает с Scala, часто возникают проблемы с import и implicit
  • иногда не хватает хорошей документации и примеров (для библиотек)
  • достаточно сложен для понимания


Моя история

Свое знакомство с функциональным программированием я начала с изучения Haskell в университете. Сначала было сложно реализовать на нем даже простые вещи типа циклов, но потом как-то втянулась и стало получаться достаточно неплохо.


Чуть позже подвернулась возможность пойти на курсы по изучению Scala, которые я успешно закончила, реализовала свой небольшой проект и устроилась в эту же компанию в качестве Junior Scala Engineer (это произошло совсем недавно, кстати).


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


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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Статья на какую тему была бы Вам интересна?
24.62% Telegram-бот на Scala16
9.23% Торговля с помощью протокола FIX. Часть третья: характеристики инструментов в заявках6
58.46% Топ-N идей для pet-проектов на Java38
24.62% Топ-5 полезностей для улучшения вашего веб-приложения16
16.92% Как связаны Kubernetes и Star Trek, или происхождение названий11
15.38% Ничего не интересно, лучше вообще ничего не пишите10
Проголосовали 65 пользователей. Воздержались 12 пользователей.
Теги:
Хабы:
Всего голосов 10: ↑7 и ↓3+4
Комментарии8

Публикации