
С момента появления версии 1.0 прошло всего несколько лет, а язык приняли на вооружение многие крупные компании и разработчики. Всё благодаря тому, что создателям языка удалось добиться целей, поставленных в начале пути — разработать инструмент, который был бы удобнее и безопаснее Java, но менее сложен, чем Scala.
В программу факультета Android-разработки GeekUniversity мы недавно добавили курс по изучению Kotlin. Сегодня предлагаем обсудить его возможности и то, почему этот язык можно считать одним из столпов будущего разработки приложений на Android. Кстати, 14 марта мы проводили вебинар «Перспективы и потенциал Kotlin в Android-разработке», так что если тема вам интересна, ознакомьтесь с ним. Ну а пока — давайте разбираться с возможностями и перспективами Kotlin.
Итак, сам язык представляет собой удобный как для начинающих программистов, так и для разработчиков с опытом инструмент. Он очень лаконичный, компактный и понятный (по большей части — даже интуитивно). С течением времени язык совершенствуется.
Последняя версия — 1.3, с поддержкой корутин, что дало возможность читать и писать неблокирующий асинхронный код без всяких проблем. Стала доступна и масштабируемость, а еще появилась бета версия Kotlin/Native, которая дает возможность компилировать код Kotlin сразу в машинный. Это позволяет, к примеру, писать бизнес-логику кроссплатформенно.
Kotlin актуален сегодня как никогда, во-первых, благодаря всему, что говорилось выше. Во-вторых, благодаря тому, что Google еще в 2017 году взял Kotlin «в семью», признав его официальным языком для разработки Android-приложений. После признания Kotlin корпорацией Google многие приложения, изначально написанные на Java, были переписаны на Kotlin, не говоря уже о тоннах приложений, изначально писавшихся на нем.
Почему многие разработчики считают, что за Kotlin будущее Android-разработки?
Лаконичность
Это один из факторов, который стимулирует разработчиков как можно быстрее переходить на Kotlin. Та же Java, несмотря на ее универсальность выглядит весьма многословной по сравнению с этим языком. Ну а чем меньше нужно писать, тем меньше и вероятность допустить ошибку. Это также означает повышение скорости работы. Конечно, зависимость далеко не всегда прямая, есть и другие факторы, но часто одна и та же задача на Kotlin решается быстрее, чем на Java.
Open-source
Да, c 2012 года язык является открытым. А это означает обширное сообщество разработчиков, которые помогают совершенствовать язык. Сообщество связано с сотрудниками Kotlin, обратная связь весьма надежная. Во многом это обусловлено помощью со стороны команды Kotlin Slack. Представители Kotlin прислушиваются к мнению сторонних разработчиков и часто реализуют внесенные предложения, если те позволяют улучшить язык.
Kotlin давно «созрел»
В том смысле, что большинство проблем, характерных для нового языка программирования были исправлены. Сейчас это надежный инструмент, от которого можно не ожидать подвоха в виде странного поведения компилятора или самого приложения, написанного по всем правилам. Кроме того, у Kotlin отличная поддержка IDE. Без шуток, реально отличная. IDE-плагин работает без всяких проблем, добавляя некоторые полезные фишки, характерные для Java.
В последнем случае рекомендуем использовать IntelliJ, он идет в комплекте поставки Kotlin. На Хабре, кстати, уже хвалили IntelliJ, во многом потому, что разработчики подошли к его созданию весьма грамотно. IntelliJ, к примеру, «понимает», если в файл Kotlin вставляется Java-код и предлагает транслировать его на Kotlin.
В целом, Kotlin — очень надежный язык программирования с массой функций и возможностей. При этом он постоянно совершенствуется.

Обновляемость и развитие
Совершенству действительно нет предела. JetBrains ведет очень хорошую работу по улучшению и расширению возможностей Kotlin. В последней на момент написания статьи версии (1.3.21) сделано много улучшений в плагине для Gradle, в том числе тех, что касаются мультиплатформенных проектов.
Кстати, Kotlin предоставляет возможности, аналогичные поздним версиям Java, для ранних версий Android API. Из пожеланий — было бы отлично, если бы веб-фреймворк ktor вышел из альфы и оброс большим сообществом, чтобы Kotlin стал еще ближе к fullstack-инструменту.
Null-безопасность
Это более технический пункт, чем все предыдущие, но не упомянуть о нем нельзя. Дело в том, что та же Java не может гарантировать, что переменная типа String содержит строку, а не null. Да, разработчики давно адаптировались и это по большей части не проблема, но безопасность, которая обеспечивается статической типизацией, это снижает. В результате Java-разработчикам приходится быть наготове и думать о Null Pointer Exceptions.
В Kotlin такой проблемы нет, здесь типы разделяются на non-null (значение этих типов не может быть null) и nullable (может быть null).
Писать на Kotlin легко
При прочих равных условиях писать на Kotlin проще, чем на Java или Scala. Библиотеки, требуемые для Android-приложений в Kotlin невелики и не усложняют жизнь разработчику.
Кроме того, Kotlin и Android Studio — чудесное сочетание, которое ускоряет процесс разработки. Построение проекта выполняется всего за несколько минут, хотя иногда система и может выдавать предупреждения о необходимости доустановки отсутствующего компонента.
В любой момент можно выполнять поиск по коду, БД, командам, элементам пользовательского интерфейса и прочим местам. Во многих случаях это весьма полезно. К примеру, тогда, когда забыта какая-та команда IDE. Отладка тоже выполняется без всяких проблем.
Kotlin прост в изучении
Это логичный язык, изучать который — одно удовольствие. При этом написанный код легко читаем не только автором приложения, но и сторонними программистами, которые могут быть даже не знакомы с Kotlin.
Все это стало возможным благодаря тому, что компания JetBrains, разработчик Kotlin, изначально задумывала язык как альтернативу Java, на которую легко перейти. Kotlin дает возможность программистам решать проблемы по-разному, что делает интересным не только обучение, но и работу.
Для разработчика важным может оказаться еще и то, что с Kotlin постепенно начинают работать крупнейшие компании мира. В числе прочих это Prezi, Basecamp, Amazon Web Services, Pinterest, Coursera, Netflix, Uber и многие другие компании. То есть программист, который знает Kotlin, может рассчитывать на отличное рабочее место и интересные задачи, в которые он будет погружен с первого дня. А поскольку с течением времени число компаний, которые используют Kotlin расширяется, то и востребованность специалистов по Kotlin увеличивается.
В целом, Kotlin — язык, дружественный к разработчику, он позволяет выполнять ну очень широкий спектр задач. Принимая во внимание скорость роста сообщества, и тот факт, что сам Google постепенно переводит примеры в своей документации на Kotlin, в перспективности языка с точки зрения разработки под Android сомневаться не приходится вовсе. Перспективы у него есть и в других отраслях разработки.
Статья готовилась совместно с преподавателем курса Kotlin Станиславом Хижняком, за что ему огромное спасибо!
Комментарии (36)
njc
14.03.2019 23:50+2Мы у себя в компании начинаем использовать Котлин на бэкенде. Показывает он себя очень хорошо. Котлин настолько хорош, что даже, если вы будете писать на нем Java-style код (а вы будете это делать по-началу), то он будет все равно читабельнее и безопаснее :)
MEJIOMAH
15.03.2019 20:17Вы пегу как то подкручиваете котлином?
njc
16.03.2019 18:47Ну во-первых, у нас есть уже не только Pega :) мы еще разработчики девопс инструментов и улучшенной IDE pegadevops.com, правда там пока пишем на Java. У нас сейчас есть ряд проектов, один из которых внутренний, где мы используем Kotlin. pegadevops также в планах переводить на него.
alatushkin
15.03.2019 06:56"Kotlin как будущее..."?
По моим ощущениям он уже продолжительное время "настоящее"
navrocky
15.03.2019 07:24А я бы сказал, что он уже, возможно, прошлое. С учётом появления Flutter с Dart, на которую судя по всему рано или поздно придется перейти, когда Андроид будет заменён Фуксией. К сожалению сейчас писать под Flutter нельзя на котлине..
Neikist
15.03.2019 07:43Собственно на мой взгляд это единственный недостаток флаттера. Если бы использовался для него kotlin native — было бы просто отлично. Не скажу что дарт плохой язык, но котлину на мой взгляд он все же уступает.
xfaetas
15.03.2019 08:38Зато под Flutter можно писать на Swift
Neikist
15.03.2019 08:43О_о Что я пропустил? Я вроде за флаттером слежу и такого не заметил. Вы не путаете случайно с фуксией? Под нее да, и на свифте вроде как планируется возможность, и на Java + kotlin, и на rust, и еще на чем то вроде… Другое дело что подозреваю это все равно с флаттером придется интегрировать. Либо рисовать свой UI.
piconst
15.03.2019 11:02Вы ведь понимаете, да, что когда состоится релиз фуксии(если вообще будет да и будет ли под мобилки), то ни один заказчик в здравом уме не будет переписывать с нуля приложение на flutter, возможно, он будет писать новое приложение на flutter, но тут нужно искать разработчиков, которых толком пока нет, а нет их из-за молодости flutter.
Не забывайте: выпуск фуксии не означает мгновенный закат Android. Вспомните, сколько устройств на Android сейчас существует? И что с ними делать, а сколько ещё будет выпущено и т.д, и т.п.
И фуксия поддерживает Android приложения, а значит ничего не изменится для разработчиков.saag
15.03.2019 16:53Вспомните, сколько устройств на Android сейчас существует?
Вспомните сколько устройств существовало на Symbian, и где этот Symbian сейчас (он кстати тоже поддерживал приложения на Java хоть и ME). Закат очень вероятен, к примеру Фуксия еще не вышла, но китайцы один аппарат уже тестируют.
saag
15.03.2019 07:29А потом Гугл выпускает свой телефона на Фуксии и весь мир замирает в напряжении…
mikaakim
15.03.2019 07:47Kotlin? Null-safety? Да бросьте…
Neikist
15.03.2019 07:56И это, уверен, было где нибудь на интеропе с java.
konsoletyper
15.03.2019 19:37Есть масса сценариев, где котлиновская null safety не работает. Например, мы вот только что положили в мапу элемент, примерно так:
val map = mutableMapOf<String, String>() map["foo"] = "bar"
А потом (мамой клянёмся, что "foo" есть в мапе):
println(map["foo"]!!.length)
если не поставить !!, компилятор ругается. К сожалению, null safety не всесилен. Он помогает устранить часть ошибок с NPE, которые возможны в Java, но ото всех ошибок такого рода избавиться невозможно. Справедливости ради стоит так же сказать, что для Java есть статические анализаторы кода и наборы аннотаций, которые позволяют добиться примерно аналогичного поведения (Checker Framework, инспекции IntelliJ IDEA).
Neikist
15.03.2019 20:07Так правильно ругается, если вы ставите
— то это вы должны гарантировать что значение не null. Вы также можете написать свою реализацию которая будет возвращать не T? а T, либо бросать например эксепшн если уж никак найти значение не может а дефолтное отсутствует.!!
Ну и в вами описанном варианте котлин поможет хотя бы конструкцией видаprintln(map["foo"]?.length ?: 0)
В таком случае NullPointer вы не словите и вернете дефолтное значение. Можно конечно и на java написать
но сами понимаете. Плюс в котлине можно написать иmap.get("foo") == null ? 0 : map.get("foo")
если это ваша реализация где вы гарантируете Tprintln(map["foo"].length)
konsoletyper
15.03.2019 23:42Я прекрасно знаю, что значит !!.. Иногда?.. не спасает, т.к. для ключа, которого нет в мапе, всё равно нет валидного значения (можно вернуть что-то бессмысленное, но тогда что-то всё равно упадёт в будущем). Ситуации бывают разные, я написал не один десяток тысяч строк на Котлине, и всякого повидал. Мой комментарий ставил целью опровергнуть заявление, что KNPE был брошен где-то в "интеропе с Java". Отнюдь. Котлин не всесилен, и есть куча способов упасть в чистом котлине. Можно даже NPE словить, если пошаманить со статическими инициализаторами или с lateinit.
Neikist
16.03.2019 00:15Ну в общем да, KNPE действительно не только в интеропе может быть брошен, но лично я !!.. применяю только ну уж в совсем крайних случаях. На мой взгляд слишком опасный оператор.
З.Ы. С форматированием!!! у хабра конечно…
alatushkin
15.03.2019 20:07println(map[«foo»]!!.length)
А чего хочется получить таким кодом?
Почему не?
println(map[«foo»]?.length?:0)
Просто немного странно удивляться, если пишешь
throw NullPointerException()
konsoletyper
15.03.2019 23:45А почему я должен выводить 0 для случая, если ключа нету в мапе? Как я уже ответил другому комментатору, ситуации разные бывают, я просто привёл простейший пример. Могу специально покопаться и поискать места в самом kotlinc, где используются !!, и это вполне уместно.
Beshere
15.03.2019 10:13Ух ты как хорошо, какая наглядная картинка!
А почему тогда tiobe index показывает, что Java занимает 1 место среди языков, а Kotlin проигрывает даже таким артефактам как Ada и Lisp, занимая 39 место?Neikist
15.03.2019 10:20Вот кому кому — а tiobe я не очень верю. Правда кому верить — тоже неясно. Tiobe если не ошибаюсь завязан на гуглеж по теме, а лично я гуглю либо по android sdk, либо по java, по фану еще иногда по разным языкам, а по котлину хорошо если несколько раз искал что то. java, python, js и еще многие языки однозначно популярнее котлина, но если говорить об андроид разработке — то исходя из требований котлин как бы не уже популярнее java.
FSA
15.03.2019 14:38Статистика. Она зависит от того, что и каким образом собирать. Если у меня есть 9 проектов на Java и один новый на Kotlin. При этом Java проекты правлю только когда ошибки возникают, а Kotlin активно разрабатываю, то по статистике у меня Java занимает 90%, а Kotlin — 10%. А вот если собрать статистику по числу новых строчек кода, всё может оказаться совсем наоборот. При этом в первом и втором случае будут одни и те же проекты.
Yoooriii
15.03.2019 11:02Интересно, чувствуется прогресс в разработке. А интересно, можно ли писать бэкэнд на котлине и насколько это оправдано, а то весь акцент на Андроиде.
TheOnex
15.03.2019 13:07Писать бэкэнд можно, пока с небольшой болью, но можно. Надеюсь в скором времени все устаканится, обрастет поддержкой всех фреймверков, а то терпеть Java уже не хватает сил.
osipovaleks
15.03.2019 12:24Из пожеланий — было бы отлично, если бы веб-фреймворк ktor вышел из альфы и оброс большим сообществом, чтобы Kotlin стал еще ближе к fullstack-инструменту.
Извините, я может что-то упускаю, но ведь разве ktor уже не в релизе (ссылка на maven)? Или есть еще какой-то другой ktor?
DEADMC
15.03.2019 12:51С подключением!
А если серьезно, то мне очень нравятся такие статьи в стиле ретро в 2019. Скажите планируются ли статьи по реализации MVP/MVVM и плюсах Clean Architecture?Nexus7
15.03.2019 15:22Про MVVM уже давно написано: antonioleiva.com/mvvm-vs-mvp
и снято, там есть видео от автора.DEADMC
15.03.2019 15:54+1Я несерьезно же. Вся статья это по факту копипаста JetBrain презентаций 2х-3хлетней давности. Только без конкретики, опыта, без чего-то нового. Просто вода с целью хоть кого-то сподвигнуть на соответствующие вполне конкретные курсы.
HawkeyePierce89
Здравствуйте. А при разработке Android приложений на Kotlin есть такая штука как Hot Reload? Или надо постоянно делать полную компиляцию приложения?
Я из мира фронтенда, не пинайте сильно, если вопрос очень нубский.
lgorSL
Есть Instant Run — он при некоторых условиях может ограничиться дозагрузкой кода в работающее приложение. Подробностей не могу сказать, так как сам им практически не пользуюсь.
web_alex
Instant Run до сих пор работает криво. Как и hot reload (поправьте, если ошибся с название) под Flutter.
Задумка классная, но реализация пока ещё сыровата… имхо
tuxi
Для общего случая есть вот такие решения