Pull to refresh

Comments 38

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

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

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

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

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

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

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

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

UFO just landed and posted this here
А что мешает вводить Котлин? Его радость в том что не надо переписывать все сразу, можно начать с мелких кусочков — к примеру, с тестов, с вспомогательных утилит и т.п. Котлин такая штука — как коллекционирование наркотиков в старом фильме с Джонни Деппом — единожды начав — очень сложно остановиться ;)
Вас заминусовали не за технический прогресс, а за гавно на вентиляторе, которое вы кинули своей статьей. И за желание на этом хайпануть, все люди уже высказались в комментариях под прошлой статьей «Почему 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% случаев достаточно знать, что тип будет такой же, как у выражения справа от присваивания. Объем и сложность рефакторингов падает радикально. При этом на границах абстракции типы спокойно прописываются явно

UFO just landed and posted this here
На котлин легче писать, но его сложнее читать!

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

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

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

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

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

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

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

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

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

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

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

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

Articles