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

Комментарии 38

Джависты атаковали мою карму. Понимаю, тяжело признавать горькую правду, однако прогресс неумолим и надо идти вперед, а не держаться за устаревшие технологии :)

прогресс неумолим, но к Kotlin это не относится, имхо

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

Я бы привел примеры ? синтаксиса и let. Это по-настоящему крутые примеры работы с nullability, verbose Optional рядом не валялся.

По поводу синтаксиса is в Котлин против нового instanceof в Java, я честно говоря, не совсем пониманию какие кейсы для Java синтаксиса выигрышные. В чем смысл новой переменной, когда в Котлине существующая прекрасно справляется со своей задачей. По поводу records в Java. Котлин с 1.5 версии позволяет оптимизировать data классы с помощью аннотации JvmRecord

Плюс философия Котлина состоит как раз в том, что благодаря синтаксической базе, можно построить язык внутри язык Gradle KTS и coroutines яркие тому примеры.

Философия Явы - сделал раз, ранаем везде и всегда, к сожалению, не соответствует современным реалиям. Это ведёт к проблеме развития языка и является причиной, почему многие разработчики начинают просматривать в сторону других JVM языков.

Мои личные ощущения, что акцент развития Java сместился в сторону развития самой JVM, что напротив призывает к языковому многообразию в Java мире

НЛО прилетело и опубликовало эту надпись здесь
А что мешает вводить Котлин? Его радость в том что не надо переписывать все сразу, можно начать с мелких кусочков — к примеру, с тестов, с вспомогательных утилит и т.п. Котлин такая штука — как коллекционирование наркотиков в старом фильме с Джонни Деппом — единожды начав — очень сложно остановиться ;)
Вас заминусовали не за технический прогресс, а за гавно на вентиляторе, которое вы кинули своей статьей. И за желание на этом хайпануть, все люди уже высказались в комментариях под прошлой статьей «Почему Kotlin хуже, чем Java?», и ваша статья уже практически никому не интересна. Если вам действительно про это хотелось написать, то это лучше надо было сделать где-то через пол года, когда весь срач на тему котлин джава утихнет. И ценность вашей статьи не больше комментария под прошлой статьей. А поэтому теперь разгребайте то, что сами наложили… Вас не минусовал, у меня в принципе нет привычки обижаться на людей за их мнение и минусовать их.
Справеливости ради, исходная статья, на которую писался ответ — точно такое же «г… на вентиляторе»

Увидел вашу карму и, как раз, подумал - до статьи или после?)

Прямо сейчас хочу купить курс для андроид разработки. Подскажите пожалуйста, что лучше изучать Java или сразу Kotlin, до селе писал на 1С и Python.
Разработка преимущественно коммерческих enterprise- приложений.

Лучше книжку в интернете почитайте, это бесплатно, и знаний больше чем в любом курсе. Можно скачать сразу две или три, а там уже почитать и посмотреть что вам больше понравится. Гугл в помощь.
Что из книг посоветуете?

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

  • нельзя просто не взять из джавы новую асинхронность, так недолго и перестать быть better java, а котлину (пока) важна эта связь

  • нельзя взять джавовскую взамен своей - поломаешь весь старый котлин код

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

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

и котлин здесь не самый особенный, у тайпскрипта тут похожие проблемы хотя и менее выраженные.

Не в курсе, какая модель астнхронности сейчас в Java и Kotlin, но вроде это же частая проблема во всех языках, нет?

JS: колбэки -> промисы

C#: События, колбэки, BeginInvoke, Task

F#: всё что есть в C# + ещё свой Async

Rust: Футуры из tokio -> нативные футуры и async/await

И вроде каких-то больших проблем в этом нет - просто в определённый момент люди переходят на новый подход. А старый/альтернативный остаётся только для совместимости.

сейчас в котлине очень отдельная своя модель асинхронности через suspendable функции которая совместима со всеми promise-like фреймворками для java (включая java-8 futures). но сейчас в джаве хотят сделать какую-то свою асинхронность которая магически сделает уже написанный код асинхронным (думаю не совсем так, сам не слежу, но рекламировалось похоже).

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

возможно именно это место в итоге не создаст проблем, ну так потом что-то другое создаст.

Речь, очевидно, идет про Project Loom — что является еще одним способом реализации асинхронного неблокирующего программирования наряду с CompletableFuture, Project Reactor и RxJava.
В котлине же есть корутины — это просто языковая абстракция, позволяющая формально задекларировать асинхронные неблокирующего взаимодействия. Корутины сейчас работают как поверх собственных инструментов Котлина так и поверх CompletableFuture, Project Reactor и RxJava. С появлением Project Loom у Котлина просто появится пятый способ имплементации корутин. Более того, старый код на корутинах, если это будет выгодно, можно будет прозрачно переключить на имплементацию поверх Project Loom. Это как интерфейс и реализация интерфейса — не более того.
Rust: Футуры из tokio -> нативные футуры и async/await

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

Из интервью с Елизаровым здесь же на хабре:

— Во-первых, надо понимать, что Project Loom — это библиотечная фича JVM-платформы, а не языковая. Поэтому с ней интеграция намного проще, не нужно вносить изменения в язык.

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

Полностью можно прочитать по ссылке, но суть в том, что это действительно другая асинхронность, которая при этом и для других целей. https://habr.com/ru/company/jugru/blog/547138/

да, спасибо, неудачный пример))

Что вы называете «своей» моделью асинхронности в Kotlin? Корутины? Они могут исполняться в самых разных контекстах, и к Thread никак не привязаны, если что.
Kotlin не просто лучше, он страхует от старых ошибок на этапе компиляции, дает думать в другой парадигме, открыт для новых возможностей.

Очень точно. Я бы добавил что он позволяет быть разработчику быть более продуктивным. То что в джаве выглядит как проект на десяток классов и пару тысяч строк кода на котлине один файл с набором функций и классов в 100-200 строк. Прототипировать и играться с решениями куда проще. А когда есть рабочее решение можно и заняться созданием "архитектуры" из пакетов и файлов.


Вывод типов позволяет не заниматься "документированием" кода upfront, а решать проблему изменяя подходы на лету. Потом уже можно попросить IDEA вписать типы в сложных конструкциях.


Удобный Collection API и Coroutines делают сложные задачи на Java простыми.


Пишу на Kotlin с майлстоун релизов и продолжаю получать удовольствие от работы. А от работы с Java теперь одни негативные эмоции.

Вот кстати конкретно вывод типов ЛИЧНО МНЕ показался фичером сильно переоцененным. Ну т.е. да, оно наверное удобно не повторяться — но когда ты работаешь в IDE где она сама следит и подсказывает в процессе написания кода у кого какой тип — оно не шибко-то важно. И меняешь тип обычно тоже через рефакторинги IDE — тут тоже большой радости от меньшего количества изменений тоже нет. Зато страдает читаемость — когда у тебя

val x = something
val y = something.prop1
val z = something.fun2()


то для того чтобы понять типы переменных — надо возить мышкой. Так что частенько прописываешь тип даже если он не особо тут нужен — чтобы было за что глазу зацепиться.

А вот корутины это да, мне скоро Джетбрейнс стипендию назначит за то что я их нахваливаю, так что на Джаву теперь ни-ни, я за год ни одного листенера не написал и больше не собираюсь ;)

А зачем понимать типы переменных? В 99% случаев достаточно знать, что тип будет такой же, как у выражения справа от присваивания. Объем и сложность рефакторингов падает радикально. При этом на границах абстракции типы спокойно прописываются явно

НЛО прилетело и опубликовало эту надпись здесь
На котлин легче писать, но его сложнее читать!

Это вечный трейд-офф между вербозными и лаконичными языками. Чем больше сахара тем сложнее читать незнакомому с языком человеку. Я бы скорее сформулировал по-другому: сахар котлина не приносит проблем, если ты его знаешь, а вербозность джавы не приносит проблем потому, что как сказано выше 90% времени мы думаем и только 10% времени пишем.
P.S. На хабре не принято просить карму.
P.P.S. Сколько кармы не проси пока не напишешь статью голосовать все-равно не сможешь.
НЛО прилетело и опубликовало эту надпись здесь
Вы вообще не о том спорите, и те кто ругает Котлин и те кто хвалит. Да, у Котлина приятный синтаксис и куча современных языковых фич — но это все красивые завитушки на чеке в миллион долларов. Господа, в Котлине есть корутины, и есть прямо сейчас, даже для древней джавы 1.6. И это его главный на данный момент фичер, все остальное — bells and whistles. Вам больше не нужно писать стейтмашины (чепчики в воздух!). Вам больше не нужно писать лесенки из. thenApply к CompletableFuture. А самое главное — вам больше не нужно это читать ломая глаза. Вам больше не нужны listener-ы к которым надо подписываться и потом не забывать отписаться. Ребят, это новая парадигма которая будет с нами следующее десятилетие (как минимум) — а вы тут спорите о том какой синтаксис для проверки типа переменной более правильный.
соглашусь, кульбиты вверх ногами в rxJava и корутины очень наглядный пример.

Начинал с Java, сейчас перешел на Kotlin, на что ушло пару дней раскуривания и через недельку уже более-менее мог писать на котлине в обнимку с гуглом. Хотя первая неделя вызывала отторжение. А потом ничего так, привык и даже фишки понравились (работа с null-ами там все таки вещь хорошая, объявления фильдов в конструкторе и пр).

А если что, можно снова перейти на джаву.

Я вот не помню кто — Бреслау или Елизаров (скорее, первый) говорили что делали в Котлине полноценный паттерн матчинг — но релизить не стали по одной простой причине — кода там очень много а он оказался очень мало кому нужен. Говорят, если вы не пишете компилятор — то и паттерн матчинг вам ни к чему. Но как бы — радует что работа эта проведена, и если вдруг окажется что люди жить не могут без паттерн матчинга — то он довольно быстро в Котлине появится.

Андрей Бреслав говорил, что посмотрят на то, как сделает Java и какие проблемы встретят. И если эта фича хорошо зайдет то тоже добавят в Kotlin аналогичное решение.

полноценный паттерн матчинг

Я так понимаю, что далее по тексту, говоря «паттерн матчинг» вы имеете ввиду «полноценный паттерн матчинг» с деструктуризацией объектов и блекджеком.
Говорят, если вы не пишете компилятор — то и паттерн матчинг вам ни к чему.

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

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

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

фича нужна паре человек

Здесь 2 аргумента, и не факт, что оба верны. По поводу первого спорить не буду, а вот второй аргумент слишком часто ошибочен или используется для манипуляции, а по сему нуждается в пруфах.
Ну я все ж склонен верить людям, поскольку — это они этот язык налабали, там была куча разных очень сложных фич, так что в их квалификации сомневаться не приходится — с огромной долей вероятности и паттерн матчинг они наверняка осилили. А раз осилили — то чтобы не включить его в релиз нужны были веские причины. «Мало кому нужно» — причина весьма веская.
Бреслав как-то говорил что он не понимает многих возможностей Scala, скорее всего, он не очень любит и не использует на полную катушку ФП. Как и другие в его команде, наверно. Но они очень субъективны, когда говорят что это «Мало кому нужно». Они говорят про себя, про свой уровень. В Scala и Rust есть расширенный паттерн матчинг с деструктуризацией, уж наверно люди что его включили в эти языки, не худшие специалисты чем Бреслав с командой. Ну а Kotlin язык приятный, но выглядит как калька со Scala, во многом урезанная, ну и многое добавлено, конечно.
Странно, вроде одни и те же люди так по-разному проголосовали здесь и в соседней статье свежей, где C# сравняли (не сравнили, а именно сравняли) с Kotlin. Там пока навалились шарписты на новые проекты))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации