Сравнение Java и C# в 2022 году

Привет, ребята. Давно не писал сюда. В основном, главная причина — смена работы. Случайно получил предложение попробовать себя на позиции C# разработчика. В результате, кручусь уже около 2 месяцев в .NET экосистеме. В этом посте решил написать про первые впечатления об C# и .NET.

Сразу нужно дать дисклеймер. Пока я ничего не знаю про внутрянку C# и .NET. Все выводы основаны на первых впечатлениях. У меня даже пока нет production опыта сопровождения систем на C#, когда в 3 часа ночи надо что-то срочно чинить, а не понятно что не работает.

Про мой прошлый бэграунд — много лет крутился (надеюсь, что и кручусь, хотя и не поработе) в JVM-экосистеме. Конференции, последние работы, хобби, подкасты — всё вокруг этого. Немного знаю как что-то работает внутри. Также в последнее время пописывал на Kotlin, который обычно и сравнивают с C#.

Окей, погнали. Вот мои поинты:

  • .NET мир отсатет от JVM мира на несколько лет. Это чувствуется прямо во всём. Developer Experience, Observability, какой-то тулинг вокруг разработки. Если в Java-мире люди спорят, как правильно запускать Testcontainers (в клауде, или локально), то в C# всё еще идут дебаты про выбор фреймворков для Unit-тестирования.
  • ООП — это священный столб. Кажется, такое ушло из джавы с выходом Java 8. Тут же люди свято верят в объекты, и их принципы, которые были описаны в книжке про ООП 30 лет назад. По ощущениям, про функциональную парадигму пока не говорят. Хотя есть F#, в котором есть куча крутого для ФП, но F# и C# мира, вроде бы, особо не пересекаются.
  • Visual Studio — для меня, отстает по комфорту от JetBrains Rider. Хотя вроде бы ежегодно на конференциях говорят, что они почти равны. Возможно, у меня bias, так как я много лет жил в IntelliJ IDEA, и тупо привык к хоткиям и другим пользовательским возможностям.
  • Не думай — просто пиши бизнес логику. Рантайм умный — сам разбирется. Эти фразы я слышу постоянно. Тут не принято говорить о том, как что-то работает внутри. Я даже не уверен, можно ли тут тюнить сборщик мусора, и есть ли альтернативы стоковому GC.
  • Про многопоточность и асинхронность тоже думать не надо — просто раставляй async await. Опять же, популярная фраза. Про многопоточку особо не говорят. Возможностей управлять асинхронностью и особенно потоками не так много. Как я понимаю, на всё приложение доступен один единственный thread pool. Создать свои пулы, как обычно мы это делаем в джаве, нельзя (если конечно вы не подключите сторонную либу для этого, но даже в таком кейсе я не до конца уверен, можно ли будет воспользовать этим пулом во всех возможных местах).
  • Internet Information Services (IIS) теперь имеет альтернативы. Если раньше, кажется, вы были обязаны деплоить ваши бэкенд приложения на IIS, то теперь есть аж 2 альтернативы Kestrel server (и на винде, и на линуксе — дефолт), и HTTP.sys server — ток винда). Зачем разрабатываются сразу две альтернативы для IIS я не знаю, но хорошо, что теперь есть привычный embedded server, и мы можем просто запускать наше приложение, как это бывает в каком-нибудь Golang, или Java.
  • Профайлеры и траблшутинг — ОЙ ОЙ ОЙ, КАК ВСЕ НЕ ОЧЕНЬ. Если в джава мире мы привыкли, что есть JFR, есть YourKit, есть Идейка с встроенным async profiler, есть всякие jcmd итд, то тут я чувствую себя просто потерянным. Чтобы хотя бы понять количество используемых потоков в рантайме — мне потрабовалось какое-то время, пока я нашел dotnet-counters. Возможно, мне надо посмотреть пару докладов, как анализировать перф программ, или траблшутить их в рантайме, но пока я, как без рук.
  • Столько сахара, что скоро диабет будет. Я особо не пишу про непосредственно сам язык, но кратко упомину. Если вы думали, что в Kotlin много всего по отношению к Java — то тут будет еще хуже. Уж очень много синтаксических конструкций, которые делают примерно одно и тоже. Понятно, что у меня мало опыта с C#, но первые впечатления — too much.
  • Компьюнити. Я в .NET-экосистеме пока не долго, но, к сожалению, пока не нашел себе людей тут. Тренды гитхаба забиты демками по текущему стеку технологий. Какие-то интересные подкасты на глаза тоже не попадались. В твиттере особо никого из этого мира тоже я пока не встречал. Возможно, всё будет, но я делюсь текущим положением вещей.

Как говорят, чтобы понять, что любишь, надо потерять. Пока это очень описываем мой опыт с Java vs C#. Надеюсь, что через полгода или год дам апдейт с более положительным настроем. Наверное, не даром C# такой популярный во всех рейтингах. Вероятно, я просто его ещё не распробовал. Хотя я и не сладкоежка.

Категории: Программирование