Дисклеймер

Данный материал ни в коем случае не претендует на серьезное исследование, а является коротким видением того, почему мы выбираем (или нет) Kotlin для своих проектов. Выводы представлены на основе двухлетнего опыта работы команды ITSupportMe с этим языком программирования.

Из варяг в греки, или зачем нам Котлин

Немного истории

В 2011 году в океане информационных технологий стало на один остров больше. Российская компания JetBrains представила свою новую разработку – язык программирования Kotlin, по аналогии с Java названный в честь участка суши, на этот раз Финского залива. Через каких-то шесть лет этот довольно смелый и амбициозный проект достиг поразительных результатов. Так, на конференции Google I/O 2017 Kotlin стал одним из трех языков, по стандарту включенных в Android Studio 3.0 (первые два — Java и C++).

Whyyyyyyyyyy? (что в переводе с английского означает «немного оптимистичной теории»)

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

Причина номер раз: Java уже не та?

Kotlin был придуман командой, которая создала большое количество продуктов на Java и хорошо ориентируется в новейших технологиях разработки. Для них, как и для многих других специалистов, не секрет, что сегодня Java развивается очень медленно. Новый функционал добавляется в нее с большим скрипом. В некотором роде это связано с тем, что «большая» Java, также известная как Java EE, накапливает колоссальный объем проектов, и их важно сохранить при обновлении системы. Такая ситуация, а также ряд других причин, породила потребность в новом, JVM-адаптированном языке программирования, с одной стороны, не нуждающемся в обратной совместимости, а с другой – свободно взаимодействующем с обширным диапазоном инструментов, плагинов и библиотек Java. Таким языком программирования и стал Kotlin.

Причина номер два: это просто?

Два главных достоинства Kotlin, с точки зрения многих его сторонников, это простота работы поверх JVM. JetBrains задумали свое детище как статический типизированный объектно-ориентированный язык индустриального уровня, который лаконичнее и типобезопаснее, чем Java, проще чем Scala, и при этом свободно компилируется для Java и JavaScript, что позволяет постепенно перейти со старой платформы на новую. Одним из примеров простоты и гибкости Kotlin является специфика его интеграции с системой Android, куда он встраивается посредством Gradle. В дальнейшем это позволяет внедрять новый функционал для Kotlin без переписывания Android-приложения целиком.

Причина номер три: оно тебе надо?

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

И еще N-цать технических причин

Null-безопасность

Система типов в Kotlin направлена на искоренение проблемы, в Java известной как NullPointerException (NPE). Она возникает при попытке отсылки к null значению. Kotlin избегает такой ситуации, выдавая ошибку компиляции. Конечно, это не идеальное решение (а какие идеальные?), и все равно остаются лазейки для «ошибки на миллион»: этому могут способствовать как внутренние (прямое указание throw NullPointerException() или использование оператора !!), так и внешние (например, ошибки самого Java-кода) причины.

Гибкость и простота синтаксиса

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

Классы данных

Разработчики Kotlin добавили специальные классы для хранения данных и генерирования различных шаблонов: equals(), hashCode(), toString(), геттеров и сеттеров и др.

Функции-расширения

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

Умные преобразования типов

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

Функциональное программирование

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

Сравнение скорости Java и Kotlin

При чистой сборке Java превосходит Kotlin на 15–20%. Однако чаще разработчики прибегают к частичной сборке, где благодаря активному демону Gradle и включенной инкрементальной компиляции Kotlin даже немного быстрее Java. Таким образом, языки приблизительно равны по скорости компиляции.

А мы что?

Как вспоминает наш специалист Иван Брель, опыт работы ITSupportMe с Kotlin начался с любопытства. Затем ребята убедились, что это работает — и понеслось. На самом деле в компании не так много проектов, написанных на этом языке, во многом из-за бытующего в среде разработчиков скептицизма по поводу всего нового.

— Если стартует новый проект, то, мол, нужно использовать проверенные вещи, куда там Kotlin! Но как показывает время, в освоении он очень легок, а профитов больше, — замечает Иван.

Наш собеседник подчеркивает, что зачастую ошибки в использовании Kotlin связаны с тем, что разработчики пишут на нем как будто это Java, только кода меньше. Однако постепенно приходит понимание общей концепции — и тогда становится ясно, что это совсем другое. Хорошая иллюстрация такой эволюции — внутренний проект компании ITSM Portal, где при детальном осмотре можно найти и «первый блин комом», и примеры хорошего кода: «на этом проекте мы попробовали все», — поясняет Иван.

Разработчик добавляет, что его команда в своей работе использует как новые фичи и фреймворки, так и нативные вещи типа сертификатов от Sun — и ни с чем не было проблем:

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

Для Василия Писпанена текущий проект компании — первый опыт использования Kotlin с нуля с целью создания крупномасштабной и сложноархитектурной системы.

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

В таких условиях Kotlin видится нашему специалисту отличным решением: «в целом более функциональный стиль, крутые лямбды, компактный код и много мелких плюшек из коробки вроде extension functions или интерполяции строк».

Есть и неудобные для разработчика моменты. Например, не поддерживаются repeatable annotations из Java. Многие стандартные для Java вещи задуманы как самостоятельные библиотеки (serialization, coroutines), и не всегда можно безболезненно обновить их вслед за версией самого языка. Конечно, можно использовать котлинские библиотеки из Java, но декомпилированный Kotlin класс выглядит не лучше обфусцированного кода. Некоторые синтаксические конструкции, вроде разных видов конструкторов, выглядят для Василия очень странно.

— А ещё idea часто нещадно тупит в плане анализа кода и подсветки синтаксиса (JetBrains, алло, ну как так!), — эмоционально добавляет он.

Имеет свое веское мнение о Kotlin и Алексей Метлицкий. Еще со времен тренингов в ITSupportMe, которые посещал молодой специалист, прежде чем прочно обосноваться в штате компании, стало ясно, что Kotlin очень приятный в использовании язык, и при старте новых проектов, если заказчик не настаивает на Java, есть смысл отдать предпочтение именно ему.

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

— Создатели позаботились о том, чтобы максимально сократить количество букв в выражениях, которыми пользуются программисты, и добавили много «плюшек», позволяющих быстрее и читать, и писать код.

Главным плюсом Kotlin для нашего собеседника является его полная совместимость с библиотеками Java.

— А еще то, как язык работает «под капотом», мало чем отличается от Java. Это позволяет Java-разработчикам в очень краткие сроки добавить Kotlin в своё портфолио, — добавляет Алексей. — А тот факт, что язык гораздо моложе своего предшественника, означает, что можно начать его создание практически с чистого листа, не цепляясь за неудачные решения и ошибки, которые накопились в Java за  годы её существования.

Кроме того, в JetBrains поработали над вопросами безопасности кода в плане его защищенности от ошибок. Еще одно очевидное достоинство Kotlin — это более простой в чтении и написании, современный, продвинутый, развивающийся (а значит и перспективный), свободный от проприетарных лицензий язык программирования.

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

Перечисление достоинств Kotlin можно продолжать еще долго. Равно как бесконечно обсуждать плюсы и минусы (конечно же, фундаментальные :)) использования этого языка при разработке. Однако на сегодняшний день команде ITSupportMe ясно одно: пора бы уже перестать скептически относиться к любому новому продукту. Ведь главное в разработке не то, на каком языке вы пишете. Гораздо важнее ваши трудозатраты на решение той или иной задачи. Программисты пишут код. И если на этом этапе удастся сэкономить время, то быстрее пройдет стадия тестирования и больше останется для разработки бизнес логики продукта. Как достичь такой цели — решать вам.