Андрей Бреслав почти не говорит про Kotlin в последнее время. Два раза я звал его на интервью, и оба раза он просил не обсуждать технические вопросы.
С одной стороны — мне досадно. Я понимаю, что их задавали все остальные — но я же не задавал. Я, наверное, последний чисто гуманитарный журналист в России, которому хочется рассказывать людям об инженерной стороне индустрии, а не только о поднятых миллионах успешных бизнесменов; и который не будет задавать вот это жалкое “ну объясни моим слушателям на пальцах, как это работает, чтобы они поняли”.
С другой стороны — характеры людей понятны и интересны лично мне больше, чем технологии, и я рад, когда крутой разработчик, готов рассказывать о себе, как о человеке, а не рабочей единице.
Первое интервью я взял у Бреслава год назад, но так его и не выпустил. На второе позвали в подкаст вместе с fillpackart. Он порефлексировал об успехах и ошибках в Kotlin, поборолся с нашими стереотипами о полиамории, выслушал жалобы на жизнь и приложил мощной лекцией с оправданием динамической типизации.
Несколько цитат из подкаста
Почему больше не интересно говорить про разработку
Я десять лет делаю Котлин, и последние лет шесть все хотят со мной говорить только про него. Вопросы про Котлин у всех одинаковые, мне жутко надоело на них отвечать. Без обид — просто очень сложно найти вопрос, который кто-то не задал за эти шесть лет. Кажется, это уже просто бесполезно — я же уже ответил, все материалы можно найти и почитать. Мне надоело жутко, просто жутко.
У меня есть потребность разговаривать о другом. Мне сейчас больше интересны гуманитарные темы — про психотерапию, полиаморию, гендерный баланс. Мне очень хочется реализовывать эти стороны своей личности. Инженерные стороны я реализовал — хочу и другие тоже.
Меня часто заносит говорить про области, в которых я плохо разбираюсь. Сразу начинаю делать выводы — есть у меня такое свойство. Мне не хватает терпения аккуратно разобраться, почитать литературу, убедиться, что это не я первый придумал. Но говоря о вещах за пределами разработки, у меня не возникает ощущения, что я совсем не на своем месте. Наоборот — кажется, я могу принести новый взгляд.
Об отношении к успеху Kotlin
Да, я думаю это достижение, которое многим кажется крутым. После этого я немного успокоился.
Я всегда был самоуверенным — это и сильная сторона, и недостаток. Ведь надо было еще вписаться делать такой проект, уговорить себя, что ты можешь. И меня не пришлось уговаривать вообще. Я был уверен, что да, конечно, пойдем и сделаем. Было ощущение, что он может не взлететь. Но что сделаем — вопроса вообще не стояло.
Моя самоуверенность раньше была более тревожная. Я думал так — “вот, я же крутой, вдруг все остальные этого не поймут”. Сейчас у меня меньше тревоги, и я даже не уверен, что это связано с самим успехом Котлина. Это кумулятивный эффект из разных вещей.
Я походил на психотерапию — это тоже сняло некоторые виды тревоги. Я очень много раз облажался в разных вещах и узнал реальные последствия ошибок. Казалось, они будут катастрофические, но оказались далеко не такими, как я боялся. И вообще они не такие, как я ждал — последствия сработали совсем в других местах.
Появилось спокойствие от понимания реальных масштабов рисков.
Мучают ли ошибки в дизайне Kotlin, которые уже нельзя исправить
Таких ошибок, чтобы я не спал ночами, нет. Но есть вещи, которые всплывают, и каждый раз это такой укольчик. Есть очень много мест, где надо было либо мелочь какую-нибудь сделать по другому, либо что-то важное повернуть в другую сторону. Но я понимаю, что так у всех.
Такие мысли есть у любого человека, сделавшего большую сложную систему, которую нельзя переделать, потому что ей пользуются другие люди. Особенно как в моем случае — если эта система была первой в их жизни.
Есть люди, которые сделали один язык, компилятор, виртуальную машину, базу данных — любую сложную систему, и она не получила популярности. Потом другую, третью и только с четвертой попытки взлетело. И когда попытка четвертая, уже есть понимание, куда смотреть; что важно, а что неважно. Не только в вещах, которые можно понять математически — скорее с точки зрения восприятия другими.
Таким людям проще в том смысле, что они уже многое знают заранее. А я не знал, как и очень многие, у кого успешные системы были первыми. Они не знали, где мины разложены. Просто набивали шишки.
Мне кажется пользователь любой популярной системы смотрит и думает — “Господи, почему тут сделано так!?” Да потому что тот, от кого это все зависело, когда-то давно просто не угадал. Ну так бывает — не угадал человек.
Какую бы ошибку исправил в первую очередь, если бы вернулся в прошлое
Самая главная лажа — я не стал набирать команду в самом начале.
Нужно было набирать команду. От этого зависит куча всего. Котлин зарелизился в 16-ом году, и это было очень поздно. Он вышел уже после Java 8. Многие очень важные вещей с точки зрения продвижения языка пошли бы совсем по-другому, если бы я в первые годы не тупил и набирал команду.
Другой ответ еще лучше — надо было искать ментора по управлению проектом. Тогда мне было 26 лет, писать код я худо-бедно умел, про языки программирования я понимал лучше многих, а вот управлять людьми не умел совсем. Надо было искать человека, который умеет, и просить его мне подксказывать.
Вот это было бы лучшее, что я мог сделать, и тогда Котлин был бы гораздо круче, чем он есть сейчас.
bm13kk
Очень сильно хотел увидеть недостатки Котлина. А не процесса его разработки.
По недостаткам о технологии можно понять гораздо больше, чем по достоинствам.
koperagen
Из другого интервью
bm13kk
Спасибо за доклад. Он как раз был очень интересен.
Nihiroz
Однажды я писал примерно вот такой код:
handler.post(Runnable)
добавляет Runnable в очередь на выполнение, аhandler.removeCallbacks(Runnable)
удаляет Runnable из этой очереди. Судя по коду, строкаHello world!!!
не будет напечатана, но она печатается. В чем же дело?Оказывается лямбда имеет тип
Function0<Unit>
, аhandler.post(Runnable)
иhandler.removeCallbacks(Runnable)
принимают в качестве аргументаRunnable
, и котлин для удобства и бесшовной интегреции с Java оборачивает лямбду вRunnable
и получается, что в очередь добавляется одинRunnable
, а удаляется другой.Для того, что бы исправить ситуацию, нужно добавить
Runnable
перед лямбдой, вот так:val action = Runnable { println("Hello world!!!") }
. Теперьaction
имеет типRunnable
и ничего не оборачивается и корректно работает.Получается, что в данном случае проблема в том, что компилятор много на себя берет и скрывает часть своей работы от программиста с расчетом на то, что этот сахар ничего не сломает.
richman5
Да, кликбейт, к сожалению.
mad_nazgul
В самом конце самое интересное :-)
pnovikov
У меня, честно говоря, в голове не очень укладывается: если я вот прямо сейчас начну делать язык программирования, да ещё и "наберу команду" — моих сбережений хватит в лучшем случае месяца на 3 работы. Откуда у Бреслава такие ресурсы?
moscas
Те ресурсы, о которых вы спрашиваете — ресурсы JetBrains.
UbuRus
КДПВ почему не с Kotlin? ;)
UbuRus
Nihiroz
О, удачный код для обсуждения Котлина.
myself
в данной функции имеет типPerson?
. Хотя скорее всего подразумевается, что Я уж точно существую. Как идеоматичнее быть в данном случае? Не хотелось бы использовать оператор!!
, т.к. его использование расслабляет и плявляется соблазн использовать его повсеместно, что сводит на нет все плюсы котлина с точки зрения null безопасности. Можно написать?: return
, но это так же плохо как и пустой блокcatch
при обработке исключений. Наверное правильнее было бы бросить исключение:?: throw IllegalStateException("Myself is not exists?!")
, но не слишком ли много писанины ради ситуации, которая никогда должна случиться?Кстати, если не менять код, то
we
будет иметь типList<Person?>
, что выглядит так же странно.UbuRus
Все так, если бы не слишком важен был бы эксепшен — я бы просто использовал
first
.Return может иметь смысл в зависимости от контекста.
Ну и самый общий случай это кидать после элвиса свой "бизнес" exception.
Делать методы которые принимают
Person?
в данном случае конечно не стоилоNihiroz
А, про
first
я забыл. В данной ситуации, на мой взгляд, похоже лучше всего подходит.koperagen
throw IllegalStateException(...) можно записать короче — error(...). Функция именно это исключение и бросает
feivur
Kotlin прекрасен, какие ещё недостатки?
Разве что после Java не хватает тернарного оператора.
Nihiroz
if/else
не сильно длиннее.pnp2000
Я думаю что если человек смог оправдать динамическую типизацию, то ему надо идти в адвокаты, ибо он может оправдать кого угодно.
Nihiroz
В Котлине статическая типизация.
var
в Java иauto
в C++ не делают же их динамически типизированными.mad_nazgul
Конец посмотрите. Где Андрей Бреслав, оправдывает существование ЯП с динамической типизацией, теоремой о неполноте Гёделя. :-)