LINUX.ORG.RU

Go vs Kotlin

 , ,


1

4

Прошу помощи зрительного зала в оценке перспективности смены карьеры с Java Backend разработчика на Go или Kotlin Backend. Да, я знаю, что Kotlin - это больше Android, но вот прямо сейчас наклёвывается новая работа именно на Kotling и именно в Backend. Причём компания - вовсе не стартап переросток с тремя разрабами. Что бы вы выбрали?

  1. Отказались бы от Kotlin backend и продолжили искать Go backend
  2. Согласились бы на Kotlin backend
  3. Остались бы на теряющей популярность, но всё ещё жирной Java backend
  4. Попробовали бы что-то другое (в комментах укажите что)

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

Недавно узнал, что Kotlin не привязан к JVM так сильно, как я до сих пор думал. Речь идёт о Kotlin Multiplatform.

В мире Go существует уникальная возможность перехода, которая закроется через 3 - 4 года. В подавляющем числе Go ориентированных компаний нет требования какого либо прошлого опыта разработки на Go и достаточно лишь опыта разработки на других ЯП, в числе которых обычно упоминают и Java. Если сейчас не запрыгнуть на этот поезд, можно опоздать и не запрыгнуть уже никогда. Уже сейчас начали появляться компании, где требуют хотя бы 2 - 3 года опыта на Go. Их пока мало, но будет больше. 2 - 3 года назад таких компаний не было вообще.



Последнее исправление: zg (всего исправлений: 1)

Ответ на: комментарий от WatchCat

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

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

Что касается старого кода на Java, его там вообще нет, поскольку проект изначально начали на Kotlin несколько лет назад.

zg
() автор топика
Ответ на: комментарий от anonymous

Мне серверное программирование более-менее понравилось на скале.

Были какие-то разговоры, что Scala всё. И хотя кое кто всё ещё утверждает, что далеко не все, тот же TIOBE говорит, что по популярности Kotlin находится на 19-м месте (год назад на 33-м), а Scala на 32-м.

Дальше ты сравниваешь эти языки, что конечно же интересно. Но помимо этого есть ещё и реальный рынок труда. Если Скалу перестали использовать в новых проектах, но почему-то начали использовать Котлин (о чём говорит резкий скачёк его популярности, пусти и не дошедший до первой десятки), то скорее всего Котлин более перспективен. Как думаешь?

zg
() автор топика
Ответ на: комментарий от hateyoufeel

JDK8 Optional удовлетворяет трем законам Монад.

демонстрация этого.

Если нечто выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка. (с)

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

Если нечто выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка. (с)

Ты не понял. В Java нельзя писать код для некой абстрактной монады, как например вот это:

f :: Monad m => m Int -> m Int -> m Int
f ma mb = do
  i <- ma
  j <- mb
  if i + j > 100
    then 100
    else i + j
hateyoufeel ★★★★★
()
Ответ на: комментарий от DumLemming

Не получится. Научно-технический прогресс характеризуется расширением разделения труда. Не может один человек заниматься всем достаточно качественно и эффективно. Всякого рода Fullstack живёт лишь там, где уже всё написали и остаётся лишь формошлёпство или кастомизация давно написанного.

zg
() автор топика
Ответ на: комментарий от hateyoufeel

это полный эквивалент того но с перламутровыми пуговицами


    public static int f(Integer ma, Integer mb) {
        // Assuming ma and mb are nullable integers to mimic the Maybe monad in Haskell
        if (ma == null || mb == null) {
            throw new IllegalArgumentException("Both inputs must be non-null");
        }
        
        int i = ma;
        int j = mb;
        
        if (i + j > 100) {
            return 100; // Early return if the sum exceeds 100
        } else {
            return i + j; // Return the sum otherwise
        }
    }

ну и зойчем мне эти академические изыски?

а так да, прикольно, хаскель веселый

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

Круто, а где тут монады? И зачем тут эксепшен кидается? Лулз в том, что в хачкелле это будет работать, например, для списков и вообще для всего подряд.

ghci> let f ma mb = do { i <- ma; j <- mb; return (i + j) }
ghci> f (Just 1) (Just 2)
Just 3
ghci> f [1,2,3] [4,5,6]
[5,6,7,6,7,8,7,8,9]

Жаба тут близко не валялась. Но зато исключениями кидаться можно, да. И высирать стектрейс. Жаба – это такой язык для превращения XML в километровые стектрейсы.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 4)
Ответ на: комментарий от hateyoufeel

Попросил ChatGPT-4o сгенерировать аналог твоего кода и вот что он выдал:

Here is the translation of the given Haskell monad code to Java using the CompletableFuture class, which is one way to work with monadic-like structures in Java:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class MonadExample {
    public static void main(String[] args) {
        CompletableFuture<Integer> ma = CompletableFuture.completedFuture(60);
        CompletableFuture<Integer> mb = CompletableFuture.completedFuture(50);

        CompletableFuture<Integer> result = f(ma, mb);
        
        try {
            System.out.println(result.get()); // Outputs: 100
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    public static CompletableFuture<Integer> f(CompletableFuture<Integer> ma, CompletableFuture<Integer> mb) {
        return ma.thenCompose(i -> 
            mb.thenApply(j -> 
                (i + j > 100) ? 100 : i + j
            )
        );
    }
}

This code does the following:

  • ma and mb are CompletableFuture instances that hold Integer values.
  • The f method takes two CompletableFuture<Integer> instances as arguments.
  • Inside f, the thenCompose method is used to chain the asynchronous computations.
  • The thenApply method is used to process the second CompletableFuture.
  • The conditional logic checks if the sum of the integers is greater than 100, and if so, returns 100; otherwise, it returns the sum.

This Java code effectively captures the monadic behavior of the original Haskell code.

zg
() автор топика
Ответ на: комментарий от hateyoufeel

Да, в Java используется концепция checked/unchecked exceptions, которая сейчас считается устаревшей. Но избавиться от неё невозможно, ввиду нарушения обратной совместимости. В Go с этим гораздо лучше. В Go, Kotlin и вродебы в Scala checked exceptions нет, а в Go вообще никаких исключений нет, что не может не радовать.

zg
() автор топика
Ответ на: комментарий от zg

В моём примере i и j числа.

Более общий ответ о монадах в Java https://www.baeldung.com/java-monads

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

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Мнение одного прикольного российского программиста c Твича о «brainwash Haskell propaganda» https://www.youtube.com/watch?v=SPwnfSmyAGI

Таки и там не всё хорошо. Напоминает ситуацию с русскими физиками и их любимым дистрибутивом.

И догадайся, на чём он решил переписать тот свой код? На Go!

zg
() автор топика
Ответ на: комментарий от anonymous

скала кажется более надежной и простой

И тебя вылечат.

делегаты - так вообще какая-то непонятная хрень.

Делегаты, nullable types, extensions и много чего ещё — приехало в котлин прямиком из сишарпа. А у сишарпа неплохая документация. (Впрочем, она и у котлина вполне на уровне.)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

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

Всмыслий? Объявляешь нужные абстракции (интерфейсы), пишешь кот в терминах этих абстракций — вуаля, твой кот абстрактный (работает с любой говной, реализующей указанные абстракции).

А эти ваши монады с эндофункторами — это баловство для учёных мужей. Простому рабочему парню они ни к чему. (По крайней мере, напрямую и в исходном виде. Мы же не жарим яичницу в ускорителе частиц?)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от Shushundr

отвечу на риторический вопрос

произошло становление интернета и распространение веб-приложений. это помогло яве не скатиться.

произошло размытие десктопного рынка из-за того же интернета и мобильных телефонов. это притормозило «победное шествие» дотнета

zendrz ★★
()
Ответ на: комментарий от Nervous

А эти ваши монады с эндофункторами — это баловство для учёных мужей. Простому рабочему парню они ни к чему. (По крайней мере, напрямую и в исходном виде. Мы же не жарим яичницу в ускорителе частиц?)

Это от твоего незнания предметной области. Мы Каррирование любим за то, что кода на порядок меньше, оно работает, оно читабельно, оно реализует всё,а не только формошлёпство. И после Хаскела не нужны паттерны и best practice.

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

anonymous
()
Ответ на: комментарий от zg

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

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

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

anonymous
()

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

anonymous
()

Посоветую вам, как сейчас модно говорить, «лайфхак». Ищите такую работу, где инструменты будете выбирать вы, а не такую, где за вас все уже придумали и вы выступаете в качестве винтика.

Кстати, у kotlin спецификации открыты? И есть альтернативные реализации кроме JetBrains?

PhD
()
Последнее исправление: PhD (всего исправлений: 1)
Ответ на: комментарий от PhD

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

PhD
()
Ответ на: комментарий от Nervous

Всмыслий? Объявляешь нужные абстракции (интерфейсы), пишешь кот в терминах этих абстракций — вуаля, твой кот абстрактный (работает с любой говной, реализующей указанные абстракции).

Ну вот выше никто не смог это сделать. В основном, потому что в жабе нет higher-kinded types. Вот такой код в жабе просто не соберётся:

public class Foo<T> {
    public T<String> bar() { return null; }
}

А эти ваши монады с эндофункторами — это баловство для учёных мужей.

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

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Круто, а где тут монады?

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

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

olelookoe ★★★
()
Ответ на: комментарий от zg

Современный JS мало чем отличается от любого другого промышленного языка. А Typescript близок к C#.

Но дело даже не в этом. Java Backend вполне не плохо переносится на Node. При работе с JSON вы получите производительность больше, нежели на Go (все же это родной формат данных для платформы). Хотите типы и классическое ООП — пожалуйста, Typescript. Хотите hight load - пожалуйста, Moleculer. Или альтернативный рантайм в виде Bun.

Хотите ФП? Пожалуйста - purescript, Fable, reasonml. С полной интеграцией в экосистему самой платформы.

Хотите что-то еще производительнее? Пожалуйста, куча языков с WASM. Будет быстро, аж волосы сдует.

Нужна мобилка? Тоже есть. Ionic, ReactNative, AndroidJS, Framework7, Cordova. Что хотите, то берите.

Как и все java-разработчики вы имеете очень отдаленное и предвзятое отношение к миру JS и Node. Когда-то страдал тем же. Был юн, глуп и наивен.

Ну а раз цель свитч с хорошей ЗП, то Node выбор очень хороший. Грамотных node-разработчиков с руками отрывают.

entropy-ronin
()
Ответ на: комментарий от olelookoe

их там нет, потому что а нафига они в этом примитивном кейсе?

Напомню, наш диалог начался с того, что я написал, что в жабе нет монад. И выяснилось, что их там и правда нет!

hateyoufeel ★★★★★
()
Ответ на: комментарий от entropy-ronin

Современный JS мало чем отличается от любого другого промышленного языка.

Кроме того что он полное говно, написанное сексистом-гомофобом за три дня, пока он был бухим в дупель.

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

hateyoufeel ★★★★★
()
Ответ на: комментарий от olelookoe

покури Vavr и его Try

Я в курсе, но концепция checked/unchecked exceptions никуда не делась. Не пихать же этот Vavr везде и всюду. Иногда хочется прочто в стриминге что-то вызвать, а око исключение кидает.

zg
() автор топика
Ответ на: комментарий от Nervous

Делегаты, nullable types, extensions и много чего ещё — приехало в котлин прямиком из сишарпа.

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

zg
() автор топика
Ответ на: комментарий от PhD

Посоветую вам, как сейчас модно говорить, «лайфхак». Ищите такую работу, где инструменты будете выбирать вы, а не такую, где за вас все уже придумали и вы выступаете в качестве винтика.

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

zg
() автор топика

сейчас всех уродцев, этих страшных подружек, которых фошисты продвигали последние 3-5лет они, как и предсказывалось, будут везде щемить и чморить предъявляя за все дефекты относительно нинаглядного с#. Вот, например, на чупакабре уже налили сериал из 4х лонгридов про то как плох друст и прекрасен шарп:

https://habr.com/ru/articles/811163/

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

Syncro ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ну вот выше никто не смог это сделать. В основном, потому что в жабе нет higher-kinded types. Вот такой код в жабе просто не соберётся:

public class Foo<T> {
    public T<String> bar() { return null; }
}

А если бы собирался, как бы он работал? Допустим, что T - это тоже String, но нет типа String<String>.

zg
() автор топика
Ответ на: комментарий от zg

Не пихать же этот Vavr везде и всюду.

нет конечно.
Vavr, на мой взгляд, это фигня для слегка фанатеющих.

реализаций Try не одна, потому что эта штука очень удобна в тех же стримах
тут важен подход, сам принцип
а реализацию и свою запилить можно, если никакие другие почему-то не нравятся, будет еще один 115-й java Try

olelookoe ★★★
()
Ответ на: комментарий от entropy-ronin

Современный JS мало чем отличается от любого другого промышленного языка.

Не люблю динимаческую типизацию. Не люблю неочевидное поведение. Например следующий код отсортирует числа текстуально, то есть в [ 1, 11, 2, 3 ]

console.log([3, 2, 11, 1].sort())

А Typescript близок к C#.

На сколько я знаю Typescript это просто препроцессорная обёртка строгой типизации поверх JS. Код всё равно преобразуется в JS, со всеми его странностями, как в примере выше.

Но дело даже не в этом. Java Backend вполне не плохо переносится на Node.

Вы пробовали переносить нетривиальный Spring Boot проект на Node? Сколько времени это заняло? Очень сомневаюсь в целесообразности такого переноса в принципе. Легче просто переписать.

При работе с JSON вы получите производительность больше, нежели на Go (все же это родной формат данных для платформы).

JSON-ы каких размеров используются в ваших проектах и является ли скорость работы с ними критичной? По моим наблюдениям батлнек вообще не в JSON. Единственное преимущество JS по сравнению с Java, в работе с JSON, заключается в том, что JSON так же динамически типизирован и в Java с этим могут быть проблемы. Всякого рода кодогенераторы обычно не поддерживают композицию схем (вещи типа oneOf) из JSON Schema.

Хотите что-то еще производительнее? Пожалуйста, куча языков с WASM. Будет быстро, аж волосы сдует.

Почему же нет массового перехода с JVM на WASM? Большие бизнесы разучились считать деньги?

zg
() автор топика
Ответ на: комментарий от olelookoe

реализаций Try не одна, потому что эта штука очень удобна в тех же стримах

Если она на столько удобна, почему её нет в самих стримах из коробки? Стримы появились ещё в Java 8, а проблема их совместимости с нефункциональным наследием не решена до сих пор, хотя уже сделали Java 22. И таких недоделок там ещё много. Например модули без версионирования (которыми так никто и не пользуется) или type erasure в дженериках.

а реализацию и свою запилить можно, если никакие другие почему-то не нравятся, будет еще один 115-й java Try

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

zg
() автор топика
Ответ на: комментарий от zg

Если она на столько удобна, почему её нет в самих стримах из коробки?

видимо потому что отсутствие Try никого не парит.
всегда можно заюзать runtime exception и тем самым решить вопрос.

И таких недоделок там ещё много.

java сообщество очень консервативно. мейнстрим - java 8, но на нее тоже еще не все переехали
нет веских поводов.

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

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

Если она на столько удобна, почему её нет в самих стримах из коробки?

видимо потому что отсутствие Try никого не парит. всегда можно заюзать runtime exception и тем самым решить вопрос.

Вызываемый код может быть чужим, да и что толку от runtime exception в стримах? От них стримы просто падают, не имея возможности хоть как-то обработать исключение. Именно эту проблему и решает Try из Vavr. А в Go такой проблемы нет в принципе.

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

Ты пробовал хотя бы один свой JEP пропихнуть?

zg
() автор топика