С .NET я познакомился на первом официальном
месте работы: небольшой IT-компании, сотрудничающей с нефтянкой.
Это продолжение истории, начало можно почитать
здесь.
Чем мне понравился .NET
.NET имеет обширную историю. Не такую как у Java, конечно, но тоже
интересную. Еще нужно разделять .NET Framework и .NET Core. Второе
ИМХО то, чем .NET должен был быть изначально. Давайте договоримся,
что когда я говорю просто .NET имею ввиду .NET Framework. Про .NET
Core буду писать с дополнением.
В самом .NET мне понравилось наличие экосистемы, худо-бедно, но,
зная один язык программирования, ты можешь без особых проблем
писать:
- серверные;
- десктопные;
- мобильные (Windows Mobile);
- веб (привет, Silverlight, LightSwitch, ASP.NET WebForms,
ASP.NET MVC);
- киоск приложения;
- игры.
Порог вхождения в .NET довольно низкий, чему всегда способствовали
обширные мероприятия и гайды от Майкрософт. Наличие экосистемы
позволяет разработчику не думать о том, какую библиотеку ему
выбрать, всё уже известно.
Хочешь веб? Бери ASP.NET. Мы, как большая компания (Microsoft),
пользуемся и тебе подойдёт. И так во всем.
С# это улучшенная Java, тут тебе и легкая жизнь с auto-property, и
легкая модель асинхронного программирования, LINQ который вдобавок
можно расширять реализацией провайдеров. Например, LINQ to SQL,
LINQ to XML и так далее.
EntityFramework, который поддерживается Майкрософт, и, понятно, во
многих аспектах работает как часы. Нельзя промолчать и о миграциях
в EntityFramework. Поменял модель, миграция сгенерировалась и не
нужно постоянно писать их руками.
Nuget стал центром всего .NET-сообщества: обширное количество
библиотек от Microsoft и комьюнити.
.NET Core можно считать работой над ошибками Microsoft. Все
изменения произошли, в том числе благодаря CEO Microsoft Сатья
Наделле, который показал всему миру, что MS loves Linux. Мы
получили конкурента Java.
Возможно кто-то скажет: А просто .NET Framework?
Я отвечу так: Java обрела популярность именно из-за
OpenSource-нацеленности. Бизнес не боялся, что завтра придут
какие-то чудаки из Sun или Oracle и начнут качать свои права. .NET
Framework изначально проприетарная платформа, о благодаря
адекватному менеджменту MS, они исправили этот недостаток.
Самый важный аргумент в сравнении двух платформ это, конечно же,
возраст Java и его стабильность. Под стабильностью я имею ввиду
стандарты внутри комьюнити, больший процент опытных разработчиков и
большое количество крупных компаний, использующих Java. И еще Java
это compile once run everywhere.
Я рассматриваю .NET Core как полноценного конкурента Java. Язык и
инструментарий доступен на GitHub под лицензией MIT.
Что ещё добавилось с момента выхода .NET Core:
- появилась поддержка OS Linux, macOS;
- была улучшена работа в средах контейнеризации (.NET Core
подбирает подходящие параметры в рантайме в зависимости от среды
запуска);
- началось активное развитие Xamarin. Разработчики получили
возможность писать шустрые приложения на iOS и Android;
- начало развиваться направление IoT;
- WPF стал опенсорс проектом и появилась большая надежда на его
кроссплатформенность;
- WEB разработка стала еще доступнее благодаря Blazor (можно как
WebAssembly, так и рендерить все на стороне сервера).
В сухом остатке имеем следующее: в 2020 году, зная язык
программирования C#, можно написать все, что хочешь и без костылей
как, например, браузер под капотом электрона :)
Что мне не понравилось в .NET?
Честно? Понимание того, что Microsoft нагло скопировал Java по
многим фронтам :) Напомню, что до .NET товарищи из MS пытались
реализовать свое представление Java: J++ в последствии J#.
Казалось бы, намерения благие. Хотели, чтобы у джавистов был выбор.
Но, MS в то время ничего не делал во благо разработчиков.
Достаточно почитать
эту статью на Википедии (Поддержать, надстроить и
уничтожить).
В .NET Framework на момент моего первого опыта работы, не
понравилось:
- сложная структура файлов проектов;
- вечные проблемы с биндингом зависимостей в рантайме;
- VisualStudio она реально медленная и тормознутая :D;
- только Windows, на тот момент я уже вовсю интересовался OS
GNU/Linux;
- Windows Mobile разработка: она ужасна во всем.
Знакомство с Java
Согласны?)
В феврале 2015 года я устроился на работу Java-разработчиком. Опыта
разработки приложений на Java у меня не было, но я был в теме,
потому что много читал про язык. Писали на Java 7, а первый день
программирования показался не очень сложным. Это как C#, только
неудобный, подумал я.
Мой проект был реализован в JavaEE (запускались под TomEE),
фронтенд на Vaadin. В целом я не испытывал особых проблем
взаимодействия с новой для меня технологией, скорее местами был в
шоке.
Поражало обилие конфигурационных XML-файлов, настройки Maven'a на
300 строк. Пугало наличие большого количества аннотаций. Здесь же
нельзя не сказать о любви джавистов к аспектно-ориентированному
программированию.
Параллельно в этой же компании велась разработка на JavaSE, в
качестве фреймворка использовался Spring 4. Я так до конца и не
понял, почему всем не нравился проект на Spring, но тимлид
постоянно ругался с разработчиком на Spring. По моим наблюдениям
там было слишком много кодогенерации, а из-за этого сложным был сам
UI.
Сборка проекта (JavaEE) в Maven первый раз у меня заняла минут 20.
Было ощущение, что я скачиваю все библиотеки мира. За это можно
сказать спасибо Maven, как самому родному сборщику. На самом деле,
просто в то время я не знал о существовании Gradle.
Проект, на который меня посадили, реализовывал CRM с уклоном в
сторону туристических компаний. MVP удалось поднять достаточно
быстро, но к сожалению, проект закрылся из-за нехватки
финансирования.
Чем мне понравилась Java 7
- Java стабильна;
- Java это обратная совместимость;
- есть много реализаций различного инструментария. У разработчика
есть выбор, на чем собирать проект: maven, Gradle или вообще
`javac` :);
- в интернете много статей и знаний о решении проблем, с которыми
может столкнуться разработчик;
- Java имеет опенсорсную реализацию в лице OpenJDK;
- Java активно используется при разработке финансовых систем;
Порог вхождения в Java, особенно после опыта в .NET, показался мне
не слишком высоким;
- Конечно же IDE: IntelliJ IDEA она прекрасна во всем.
Что не понравилось в Java 7
на момент моего первого опыта в 2015 году
- отсутствие экосистемы: разработчику приходится искать
подходящую библиотеку среди сотни;
- комьюнити зачастую сильно расходятся во мнениях;
- бардак в API при работе с датами и временем;
- Maven: почему так медленно и многословно?
- JavaEE: идея супер, реализация плохая. Кто придумал столько
декларативной настройки в XML?
- медленно развивающееся API;
- отсутствие функций высшего порядка и альтернативы
LINQ;
- сама Java 7 очень многословна.
Поэтому я вернулся в .NET
Не совсем поэтому, конечно, но когда я устраивался на работу
Java-разработчиком на проект, мне обещали highload, интересные
задачи и кучу сложностей. По факту: уныло, недостартапно, никакого
highload и в помине нет.
Когда мне предложили вернуться на старый проект, написанный на
.NET, с повышением, я охотно согласился. Задачи знакомые, работа в
штате, финансирование нормальное отличная возможность проявить себя
в долгосрочной перспективе.
Что изменилось в .NET
Я перешел обратно на .NET в 2016. Ровно в тот момент, когда мои
коллеги с нового старого места работы начали с нуля писать
бизнес-платформу. Замысел был следующий: разработать систему
оперативного учета и контроля, которая могла бы расширятся с
помощью модулей. То есть что-то типа SAP PM, только в бюджетной
категории. Почитать про SAP PM можно
тут.
Стек был такой: .NET 4.5,
ASP.NET MVC 5 (Owin), EF
Core, MS SQL Server. Фронтенд на SAP UI5 это такой опенсорс
JS-фреймворк, который позволял строить бизнес приложения, используя
готовые контролы.
Параллельно активно развивался .NET Core, поэтому передо мной
встала задача по переносу проекта с .NET Framework 4.5 на .NET Core
2.1. Это было очень увлекательно и сопровождалось немалым
количеством рефакторинга. Параллельно мы распиливали монолит на
какие-никакие, но отдельные сервисы.
Собственно, пока я занимался рефакторингом и собирал пожелания моих
коллег, в стенах компании родился небольшой web-фреймворк. Я назвал
его NextApi.
Почему NextApi? Когда в прошлой версии системы мы с
синьор-программистом разрабатывали новое API, назвали его следующий
Next. И название нового фреймворка это небольшая дань уважения
совместной работе. Ссылка на проект
тут.
На этом моя миссия была выполнена: компания получила сервисы,
работающие на едином инструментарии. Нам удалось переиспользовать
бизнес-логику на мобильных клиентах и десктопах, Offline first.
Также получилось полностью уйти от Windows Server. Пришлось
оставить небольшую виртуалку, чтобы билдить WPF приложение, но это
мелочи.
Пришло время идти дальше
После того, как я перенёс проект на .NET Core и распилил его на
сервисы, мне перестало хватать чего-то нового в разработческой
жизни. Я был в должности тимлида, мы успешно запустили продукт у
нескольких крупных заказчиков, задач хватало, проблемы решались, но
хотелось челленджа и возможности раскрыть себя.
Параллельно в голове была мысль о востребованности
.NET-разработчиков. В Казахстане, в отличии от стран запада, не
такой высокий спрос на эту технологию. Чего нельзя сказать о а
Java-разработчиках.
Так я вышел из проекта и договорился о выводе разработанного
фреймворка в OpenSource. Сделать это было очень тяжело, как
говориться, пришлось выйти из зоны комфорта. Но я твердо решил
нужно двигаться вперед.
Мой выбор пал на Beeline Казахстан мне хотелось поработать над
популярными сервисами. К тому же я понимал, какие здесь задачи и
клиентская база, а Java была мне довольно близка. Также, было
интересно иметь возможность посмотреть на всю разработку со стороны
.NET-разработчика, дополнительно изучить аспекты проектирования
highload-систем и оставить хороший след в истории компании.
Учитывая предыдущий опыт, я понимал, что новое погружение в Java
скорее всего будет проще, чем в прошлый раз. Так и получилось. Чем
больше ты работаешь программистом, чем больше фундаментальных
знаний приобретаешь, тем легче осваивать новые технологии.
Что сейчас
Было и такое)
В Beeline мы в основном на Java 8, но уже начали смотреть на Java
11, используем Spring Boot, начали активно писать на Kotlin. Я
вижу, что Java реально стала двигаться вперед, релизы каждые
полгода. Скажи Java-разработчику об этом в начале 2010, он бы
покрутил пальцем у виска. На мой взгляд, Java меняется в лучшую
сторону.
В Java 8 появились функциональные интерфейсы, которые позволяют
сделать код красивее и реализовывать функции высшего порядка. Также
подъехал Stream API, который немного облегчил жизнь. Хотя до LINQ
далековато, но и это уже радует.
Это я ещё не описал фишки которые появились в более свежих вервиях
Java :)
Мне удалось познакомиться с системой сборки Gradle. Она настолько
мне понравилась, что я начал писать переиспользуемые скрипты для
сборки, чтобы реализовать нечто похожее на файлы проектов в .NET
Core.
В Java более прозрачная работа с асинхронностью: когда пишешь код
действительно приходится о многом думать. Это и хорошо, и плохо.
Мне этот момент нравится, потому что, имея любовь к ОС и железу,
приятно иметь возможность влиять на JVM как хочешь.
Что касается личных планов, мне интересна тема highload-приложений.
Пока она не раскрыта для меня до конца, но я активно её изучаю.
Стараюсь не фанатеть от DRY, но по возможности делаю все, чтобы
переиспользовать знания.
И, конечно, я хочу подтянуть знания в Kotlin, чтобы начать писать
крутые сервисы на корутинах. Сам Kotlin это то, чем должна была
быть Java. Андрей Бреслав и Ко проделали отличную работу.
Разница между Java и .NET по большей части компенсируется
появлением в моей жизни Kotlin. Но я скучаю по многому из .NET.
Основные моменты:
- скучаю по консольному тулсету dotnet. Там можно и проект
сбилдить, и создать новый из шаблона, и много чего
другого;
- мне не хватает нормальной альтернативы для EntityFramework с
LINQ;
- Java действительно кажется более прожорливой по ресурсам, чем
.NET. Компьютер иногда просто уходит в себя.
Но, в реальной жизни Java, пожалуй, самое интересное, что случалось
со мной в последнее время.
Выводы и напутствие
Смена чего-то в жизни зачастую нарушение зоны комфорта и какая-то
неопределенность. Можно смотреть на ситуацию пессимистично, но меня
это наоборот подстегивает. Мне хочется всегда быть актуальным.
Прекрасно понимаю, что всех знаний не получить, но можно
попытаться.
Конкретно я из смены рабочего языка программирования понял
следующее: большинство проблем везде одинаковые. Различие лишь в
том, что они решаются разными подходами.
.NET показал мне красивый С# с большим количеством сахара, а также
сохранился в моей памяти как самый мощный набор инструментов, без
необходимости бегать и собирать стек с миру по нитке.
Java погрузил меня в бесконечный мир OpenSource-библиотек, а также
показал, что есть много способов решать ту или иную проблему. Сам
язык Java очень простой и, мне кажется, очень дружелюбен к
программистам-новичкам.
Моё мнение, что перед тем как вступать в споры о крутости
технологии, нужно попробовать альтернативную. Например, в Beeline
Казахстан у меня была возможность использовать .NET 5 для
реализации одного микросервиса. То есть использовать его в
компании, где основным языком для серверного ПО является Java.
Микросервис вписался в весь ландшафт без проблем. Моим коллегам
было интересно делать код-ревью, мы даже обсуждали принципиальные
различия. В общем ребятам тоже стало интересно расширить свой
кругозор.
В моем мире настоящий программист не тот, кто топит за один язык
программирования или кричит направо и налево, что используемая им
технология лучшая. Настоящий программист тот, кто может решить
задачу быстро, эффективно и недорого, а главное, в долгосрочной
перспективе. Таким людям не важно, на каком языке программирования
разрабатывать, они выбирают инструмент, исходя из задачи.
Поэтому я рекомендую всем попробовать сменить технологический стек,
а, может, и роль в команде. Все изменения в конечном счете приводят
к обогащению знаниями. Возможно какие-то знания тебе не нужны прямо
сейчас, но они могут пригодиться позже.
Менять стек несложно нужно представить момент, когда ты впервые
начал писать код и попробовать погрузиться в новую технологию,
включив дурочка. Конечно, со временем никуда не деться от
сравнений, но важно помнить, что каждая технология и язык
программирования зачастую проповедует свой стиль и принципы.
Это не значит, что нужно везде писать спагетти-код и трехэтажные
конструкции. Всегда нужно придерживаться подходов разделения
ответственности и писать простой код. Но, при желании, можно и
костыли позволить. Мы все грешны :)
Бросайте себе вызов и всегда будьте на вершине!
P.S. Если вы пришли в статью, чтобы узнать какой язык и платформа
лучшие или написать своё мнение об этом, давайте холиварить.