Недавно у нас в блоге вышел весьма специфичный пост про Котлин: не очень серьезный, довольно поверхностный и неожиданно бодрый. Но мы прекрасно понимаем, что критиковать технологию, потратив на её изучение несколько дней, — это моветон. И поэтому в этот раз мы решили поговорить о Котлине с человеком, который пишет на нем на проде с версии 1.0.
Сегодня названием Kotlin уже сложно кого-то удивить, особенно в Android-разработке. То ли дело в начале 2016-го: востребованность была на порядок ниже, об официальной поддержке Google ещё и речи не шло, и писать на Kotlin было уделом смелых духом. Одним из таких смельчаков стал Антон Кекс, и впоследствии он тоже уделял Kotlin много внимания (например, дважды выступал на KotlinConf). Поэтому мы решили расспросить его о том, как жизнь Kotlin-разработчика менялась со временем.
А чтобы два раза не вставать, охватили и другую тему. Антон — сооснователь эстонской компании Codeborne, практикующей extreme programming, поэтому заодно узнали, что в Эстонии с IT и каково создавать там собственную компанию.
— Как вы начали писать на Kotlin, и как используете его теперь?
— Стал использовать в начале 2016-го, с версии 1.0. Первый проект на Котлине у меня был самый безопасный: плагин для IntelliJ IDEA, который я делал для японского заказчика. После этого начал и переводить свои личные проекты с Java на Kotlin, и пытаться использовать его для бэкенда.
В последний год мы используем язык на бэкенде в банковской среде, постепенно переводим большой Java-проект на Kotlin. А ещё пишем на нём микросервисы, и там чистый Kotlin. Когда проект у тебя только на Kotlin, всё становится ещё приятнее: не нужно думать про interoperability с Java.
— Раз вы видели язык с версии 1.0 и до сегодняшней 1.3 — как он изменялся с точки зрения пишущего на нём разработчика?
— В начале я думал, раз релизная версия, то всё уже офигенно и будет работать без проблем. Оказалось, не совсем так, и первый промежуток, между 1.0 и 1.1 — это во многом исправление косяков, улучшение перформанса и так далее. А вот версии 1.2 и 1.3 — это про новые фичи.
Например, корутины, ставшие стабильными в 1.3, могут многое поменять. Я поигрался с ними и очень доволен. Правда, в продакшне мы их ещё не пробовали: там всё пока упирается в сложности, связанные с JDBC-драйверами. А вот в разработке под Android построить асинхронную модель проще, поэтому Android-разработчики использовали корутины и до 1.3.
И вот что ещё очень интересно: в версии 1.2 появилась экспериментальная поддержка мультиплатформенных проектов, стало можно компилировать и в JavaScript с Kotlin/JS, и в нативный код с Kotlin/Native. Но пока что компилировать в JavaScript мне страшновато, а с Native основная проблема в том, что у Kotlin очень маленькая стандартная библиотека. В случае с JVM Kotlin очень зависит от стандартной библиотеки Java. А в Kotlin/Native, по идее, можешь использовать любые нативные библиотеки, но тогда лишаешься «полной кроссплатформенности», всё становится отдельно. Однако сейчас в JetBrains над этим работают, и у кроссплатформенности может быть большое будущее. Кроссплатформенные iOS/Android-приложения — то, чего многим бы хотелось.
— Их нам уже пытались дать и Xamarin, и React Native…
— У них всех есть проблема, с которой Kotlin не сталкивается. В случае с React Native, Xamarin и им подобными нужно, чтобы фреймворк не отставал от релизов ОС. Постоянно что-то ломается, и все эти фреймворки не поспевают. Находишься в непонятном состоянии, когда новая версия ОС уже вышла, а твой фреймворк ещё не работает, и тебе всё равно надо что-то сделать. Это самый неприятный момент. А с Kotlin в этом смысле всё иначе — они напрямую используют из языка все стандартные API и библиотеки.
— Зачастую фича в Kotlin появляется как «экспериментальная», и до стабильной версии успевает измениться. Нравится ли вам этот подход? Если использовать экспериментальные фичи, насколько они изменяются и много ли приходится переделывать?
— Да, нравится. Потому что в бета-версиях и релиз-кандидатах 1.3 было реально много багов (я даже для своего доклада с паззлерами нашёл парочку паззлеров на эту тему), а в финальном релизе они их исправили, и это очень хорошо.
В корутинах некоторые вещи стали чуть-чуть сложнее, зато стало понятнее, что происходит: например, стало необходимо более явно передавать в корутины контекст. И в итоге код с корутинами, написанный под Kotlin 1.2, теперь просто не скомпилируется. Но в то же время эти изменения не настолько большие, чтобы было сложно смигрировать.
— Если говорить не о самом языке, а, например, про IDE, там как шло развитие? Как дела обстояли раньше, и что теперь?
— Поскольку JetBrains производят и язык, и компилятор, и инструментарий, то с точки зрения поддержки в IDE тут была беспрецедентная ситуация. Очень часто, когда рождается язык, early adopters поначалу на нём пишут в текстовом редакторе без подсветки, и тому подобное. А с Kotlin этого не было даже до версии 1.0, поддержка в IDE была сразу.
Однако она не была идеальной, и со временем она постоянно улучшается, с каждой минорной версией добавляют инспекции. И то, что сейчас, гораздо лучше, чем было. Например, один из таких багов, починки которых я ждал: в Kotlin есть template strings, и я хотел в своих проектах попытаться использовать их вместо другого templating-языка, но из-за бага в IDE подсветка ломалась, как только начиналась переменная внутри template string в Kotlin. И сейчас это наконец-то исправлено, поэтому я начал это использовать. На данный момент у меня уже не осталось конкретных вещей, которые бы не устраивали.
— А что с развитием экосистемы в целом — сообщества, ответов на Stack Overflow, фреймворков?
— Насколько вижу, сообщество очень активное, много активности в Slack. На Stack Overflow тоже уже написано вполне достаточно. Может быть, единственная проблема в том, что при гуглении иногда находятся какие-то посты, которые были написаны до версии 1.0, когда какие-то фичи были совсем другие. За актуальностью приходится следить.
Появляются фреймворки, которые сразу сделаны именно для Kotlin. Например, отличный фреймворк для юнит-тестов MockK, он заточен под Kotlin, там гораздо более красивые API. Кроме того, многие Java-фреймворки сейчас тоже специально занимаются поддержкой Kotlin, не то что бы это строго необходимо с его interoperability, но добавляют какие-то фишки или делают использование ещё более удобным.
— Взрыва популярности в Android-мире не привёл к перекосу в сообществе, когда всех волнует только Android, а остальные платформы отошли на второй план?
— Я как-то вообще не ощущаю перекоса. Конечно, решение Google сделать Kotlin официальным языком для Android резко повлияло на увеличение интереса к языку, но мне кажется, что выстрелил не только Android, а интерес к языку вообще. На KotlinConf было достаточно много андроид-разработчиков, но много и тех, кто пишет серверные приложения, десктопные, даже JS: я встречал людей, которые реально используют написание кода и для client-side, и для server-side. И там нет ощущения, что это «язык для андроида». Хотя Android стал драйвером интереса, это всё-таки язык общего назначения.
— С новыми технологиями есть вечное опасение «интересно, но в продакшн пока не затащишь», и в Android такой проблемы уже нет, а вот за пределами Android ещё вопрос. Если для Codeborne такие опасения актуальны, то за время, что вы используете Kotlin, что изменилось?
— Мы преимущественно сами выбираем технологии, но частенько бывает так, что клиент тоже хочет поучаствовать в принятии решений. И на данный момент, когда мы Kotlin привносим в разные проекты, нет никаких возражений. Что изменилось: раньше клиенты не слышали про Kotlin вообще ничего, а теперь он уже на слуху. И сейчас, если мы говорим «начинаем переходить на Котлин», уже нет опасения, например, что он пропадёт. Есть Kotlin Foundation, там JetBrains и другие компании в хорошем финансовом состоянии. И поддержка комьюнити большая. В общем, уже абсолютно есть уверенность, что Kotlin никуда не денется.
— Многие приходят в Kotlin сейчас, пропустив описанные этапы становления языка. Таким можно только позавидовать, потому что им досталась уже более зрелая технология, или без опыта early adopter они теряют что-то важное?
— Это зависит от человека, что ему интереснее. Подключившись раньше, можно было лично поучаствовать в развитии, повлиять на становление. Особенно до версии 1.0 было время, когда можно было разговаривать с командой JetBrains, влиять на их решения, помогать им. А сейчас команда по-прежнему обращается к сообществу и учитывает его мнение, но при этом многие базовые решения уже приняты и меняться не будут. Поэтому всё зависит от личного интереса к подобному.
На мой взгляд, начинать использовать для разработки технологию, когда она уже не сырая, очень помогает: ты тратишь время на свои задачи, а не на недоработки. И твой инструмент для тебя просто работает. Думаю, теперь пришло время, когда те, кто не пробуют Kotlin — вот они уже действительно сильно опаздывают и многое теряют.
— Сейчас, когда всё в целом хорошо, чего в случае с Kotlin вам лично не хватает?
— Пожалуй, двух небольших вещей. Совсем минорная — тернарный оператор. Понятно, что поскольку if — это выражение, можно просто использовать его, но хочется писать более привычно.
А немного масштабнее — package-local доступ. Мне кажется, что internal в Kotlin — скорее ошибка. Пытались улучшить то, что есть в Java, но, на мой взгляд, зря так сделали. В Java это более-менее хорошо работало, и а internal полезен, только если ты пишешь библиотеку, а не обычное приложение. И мне не хватает такого fine-grain разграничения доступа, который есть в Java есть.
Ну и развития кроссплатформенности хочется, о котором уже говорил. Там надо работать над стандартной библиотекой. Но есть ещё фреймворк Ktor, и он сейчас такой testbed, чтобы писать на Котлине всё, и из этого проекта сейчас зарождаются некоторые библиотеки
— Перейдём ко второй части вопросов: Эстония, Codeborne, предпринимательство. Для начала неайтишный вопрос: каково вообще жить в Таллине?
— Я, может быть, не совсем правильный человек для этого вопроса, потому что я фанат Таллина, мне кажется, что это лучшее место на Земле. С одной стороны, у нас здесь Евросоюз, европейская валюта, европейский порядок и европейская чистота. А с другой, достаточно широко можно использовать русский язык (треть населения на нём точно говорит), и географически мы рядом. К нам сейчас приезжает очень много айтишников из России, Украины, Белоруссии — думаю, что именно по этим причинам.
Город не такой большой, как Москва или Питер, поэтому не тратишь кучу времени на транспорт, и зачастую удобно добраться пешком. В то же время, если хочется разнообразия, легко съездить за границу. А в плане цен Таллин дешевле Англии и других европейских стран, поэтому уровень жизни, который себе можно позволить на ту же зарплату в Таллине, гораздо выше.
Из минусов только климат. Летом очень хорошо, и зимой со снегом красиво, но вот ноябрь — очень депрессивный месяц.
— Ну, к последнему петербуржцам/москвичам не привыкать. А что в стране с IT?
— У нас очень высокий уровень развития технологий. Активно развивается всё, что связано с «электронным государством» — вплоть до программы электронной резиденции, когда можно стать резидентом страны онлайн, вообще не находясь в ней. Многие онлайн-услуги, которые в других странах сейчас в новинку, у нас воспринимаются как само собой разумеющеися. Появляются стартапы — например, Skype изначально был эстонским. Вакансии тоже в изобилии. Поэтому я бы сказал, что интересного для айтишников тут много.
— Это звучит внезапно: интуитивно кажется, что такие IT-центры будут в местах вроде Долины, а не в стране с населением меньше, чем у Новосибирска.
— Ну, в Долине как раз айтишнику может быть хуже, там нереальные цены на недвижимость и вообще стоимость жизни.
И, возможно, в российских источниках про Эстонию мало пишут, но если смотреть на международную прессу, то очень много текстов в духе «электронное государство, первое в мире» (вот отличный пример). Когда я езжу на IT-конференции по всему миру, мне говорят: «Эстония? О, у вас там такое IT!»
А кроме того, рядом с Таллином есть Хельсинки, между ними полтора часа по воде или 15 минут на вертолёте. И есть переговоры о том, чтобы Таллин-Хельсинки объединить в один европейский IT-хаб. Возможен туннель между двумя городами, тогда это будет самый длинный туннель в мире.
— Когда в стране с маленьким населением большое IT, вероятно, оно работает в первую очередь на зарубежных заказчиков?
— Да, любая зарождающаяся тут компания хочет как можно быстрее выбраться на международный рынок. Внутренний маленький по количеству людей. Но благодаря тому, что мы в Евросоюзе, рынок Евросоюза у нас есть сразу. А кроме того, маленький внутренний рынок позволяет IT тестировать какие-то вещи до мирового релиза.
— У многих россиян в сознании Прибалтика сливается воедино, поэтому уточним: а насколько сказанное об Эстонии применимо к Латвии и Литве?
— Не очень применимо, на самом деле. Какие-то пересечения есть, но менталитет разный, у латышей и литовцев он ближе к Восточной Европе. История у стран тоже абсолютно разная, за исключением XX века, когда все попали в СССР и оказались вместе в первый раз. Поэтому если приехать и погулять по Таллину, по Риге и по Вильнюсу, то будет ощущаться, что они разные, а если пожить подольше, то ещё больше различий будет.
Когда-то я по работе взаимодействовал и с латышами, и с литовцами — тогда эстонцы оказывались в IT самыми прогрессивными, потом латыши перенимали, а литовцы ещё позже.
— Вы один из сооснователей эстонской компании Codeborne — для начала расскажите о ней.
— Мы маленькие, нас 32 человека. Все разработчики, называем их не «разработчик», а «software craftsman» — это очень важное отличие, потому что у нас нет ни аналитиков, ни тестировщиков, ни продакт-менеджеров. У нас универсальные fullstack-люди, которые, кроме fullstack-разработки, занимаются ещё и общением с клиентом напрямую без всяких посредников, которые сами себе могут поставить задачи. Благодаря этому эффективность получается в разы выше, чем у многих других айтишных компаний. Мы можем двумя-четырьмя людьми построить вещи, для которых условному Сбербанку потребуются тысячи человек. Я, кстати, не шучу, мы общались со Сбербанком на эту тему, они были заинтересованы взаимодействовать. Но мне кажется, при больших масштабах такая эффективность, как при наших маленьких, невозможна. Как раз поэтому мы не хотим слишком сильно расти. Company culture — действовать быстро, маленьким количеством людей делать суперэффективно, решать большие проблемы, чтобы заказчик не ждал по полгода. Для этого мы используем, например, extreme programming и парное программирование.
— А весь этот экстрим — это особенность конкретно Codeborne, или для Эстонии вообще подобное типично? В другой стране вы бы так смогли?
— Скажем так, аджайл в Эстонии типичен, маленькие команды — это достаточно типично. Но я думаю, что мы отличаемся и пошли ещё дальше. Вряд ли здесь много компаний, которые делают парное программирование в таком количестве и которые настолько developer-centric.
Я думаю, что такое можно сделать в любой стране, мы модель не с нуля придумывали — ориентировались на несколько компаний, одна из которых в Чикаго. Мы читали некоторые блоги, и в основном в Америке я видел подход, который ближе всего к нашему.
Думаю, изначально помогал подход заказчиков. В Эстонии распространена почасовая оплата, можешь сказать, что видишь столько-то человекочасов, и давайте вместе придумаем, как сделать максимально хорошо с имеющимся бюджетом. В Эстонии эту идею не нужно продавать. А, например, в России большинство компаний-заказчиков не готовы к такому, хотят платить за проект, хотя в итоге для заказчика, как правило, получается дороже.
— В начале интервью упоминали японского заказчика — это типично? Когда заказчики зарубежные, да ещё и такие, с какими языками приходится сталкиваться в работе?
— Про Японию — да, типично, Эстония много работает с японцами, они сюда приезжают целыми делегациями.
Почти со всеми клиентами общаемся на английском, только с российскими на русском. Они вообще ни в какую не согласны на английский переходить — может быть, многие бы могли, но стесняются. Из-за этого мы поняли, что у нас особо ценны разработчики, которые говорят на русском.
А с остальными странами работаем по-английски — хотя японцы английский обычно не очень, но те, которые доезжают до Эстонии для переговоров, обычно говорят. И даже внутри Эстонии часто общаемся по-английски, потому что она в последние лет десять очень космополитная, особенно IT. Приехало много специалистов со всего мира, поэтому почти всегда получается так, что не все участвующие в диалоге говорят по-эстонски. Я думаю, это тоже причина, почему в Эстонию достаточно легко переехать — главное знать английский, эстонский не требуется.
— Думаю, многие разработчики теоретически хотели бы создать собственную компанию, но боятся, что тогда им станет вообще не до программирования, и перемена будет к худшему. А ваш опыт создания компании в Эстонии что показывает?
— Я бы сказал так. Codeborne — скоро девять лет, и за это время, когда кто-то уходил из компании, чаще всего для того, чтобы создать собственную. С одной стороны, это обидно, потому что мы людей выращивали и обучали, а с другой — льстит, что люди считают, что следующий шаг после Codeborne может быть уже только такой.
И я бы сказал, что создавать компанию — классный вариант, но действительно будьте готовы к тому, что у вас большую часть времени (особенно поначалу) будут задачи, не связанные с IT. И это даже не то «бесконечные обсуждения», а продажи, найти первых клиентов — это достаточно большая работа.
Это не всем подходит, поэтому я бы посоветовал какое-то время пофрилансить. В случае с фрилансом есть та же проблема — надо не только разрабатывать, но и находить подходящих заказчиков.
— Ещё один страх разработчиков — «вместо кода надо управлять людьми». Правильно ли понимаю, что ваш случай показывает «можно найти самоуправляемых и куда меньше отвлекаться на управление»?
— Да, у нас абсолютно flat-структура. Мы изначально решили избавиться от всех вещей вроде «ежегодичных собеседований», поэтому специально искали людей, которые сложились не просто как разработчики, но и как личности — их не надо «водить за ручку». Но я бы сказал, что сейчас заниматься подобным приходится чуть больше, чем в начале, потому что изначально в нашей core team было 10 человек и все всех понимали, а с 30 всё-таки иначе. Но пока что на это тратим достаточно мало усилий и скорее стараемся делать открытую организацию.
— Возвращаясь к «электронному государству»: а насколько оно упростило жизнь в создании компанию? Вещи вроде бухгалтерии делаются легко?
— В Эстонии поставлен рекорд Гиннесса по времени созданию компании: порядка трёх минут. Если ты являешься резидентом Эстонии (либо электронным резидентом), то создать компанию — дело нескольких минут онлайн. В этом вообще нет проблем. И с бухгалтерией тоже: у нас нет своего бухгалтера, мы покупаем этот сервис, и так как в Эстонии достаточно простая система налогообложения, то это обходится достаточно дёшево.
— Всё так хорошо звучит, что напоследок хочется найти какую-то боль по сравнению с обычной наёмной работой. Есть такая?
— У меня лично боли точно нет. Ну, естественно, когда ты наёмный сотрудник и занимаешься только одним проектом, то можешь гораздо больше расслабиться. Особенно в Codeborne, потому что у нас нерабочее время — действительно нерабочее, мы очень строго объясняем заказчикам, что не будем делать что-то по ночам и вечерам. Естественно, основатели (в том числе я) тратят время и силы на вопросы, которые у других сотрудников не стоят — например, чтобы люди всегда были заняты в каком-то проекте. Но это тоже интересно. Поэтому лично я ни о чём не жалею и меня всё устраивает.
На ближайших выходных Антон представил второй набор Kotlin-паззлеров в Москве на конференции Mobius. Помимо него, в программе — ещё много интересного для мобильных разработчиков (например, доклад «Kotlin для написания общего кода под Android и iOS»).
Автор: phillennium