Как я переходил с .NET на Java
А потом обратно на .NET, и снова на Java
Зачем мы здесь собрались?
Привет! Меня зовут Бинали, я старший Java-разработчик в Beeline Казахстан.

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

Статья пригодится как джуниорам, которые сейчас выбирают технологию для развития, так и тем коллегам, которые хотят изменить технологический стек или уйти в другое направление разработки.
История становления. Или 6 298 знаков о том как я стал разработчиком в Beeline Казахстан
Решил, что рассказ будет неполным без моей истории. Поэтому посвятил целую часть статьи исторической справке о том, как я стал разработчиком. Если хочется приступить к основной теме статьи, читайте отсюда.
С раннего детства мне были интересны аудио- и видеокассеты и калькуляторы. Магией для меня было вставлять пластмассовую деталь в магнитофон и слышать как играет музыка. Правда кассеты долго в нашем доме не жили: слыша звуки, которые доносятся из деки магнитофона, мне хотелось попробовать вызвать эти звуки из кассеты без магнитофона. Поэтому я вооружался карандашом, вставлял его в отверстие кассеты и прокручивал до упора в одну сторону, а потом — обратно. Звуки извлечь не удавалось, плёнка рвалась, а кассета благополучно ломалась мною на части.

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

Считаю, что эти моменты красноречиво показывают, откуда во мне интерес к технике :)
В 2007 года, когда я был семиклассником, у меня появился первый собственный мобильный телефон. Это была Nokia 6151 — неплохой аппарат по тем временам. До этого я видел только телефоны моих родственников: в основном с монохромным экраном, без возможности кастомизации интерфейса.

В новенькой Nokia 6151 мое внимание привлекла возможность создания своих тем для S40 (так называлась ОС большинства устройств от Nokia). По сути каждая тема — это архив с файлом манифеста и набором картинок. Создание тем мне очень понравилось, и я даже начал зарабатывать на жвачки и конфеты, промышляя этим.

Через пару месяцев владения телефоном, мне уже хотелось сделать какой-то аналог сайтика tegos.ru. На телефоне был только WAP (олды, думаю, вспомнили), а компьютера с интернетом у меня не было. Но я все равно искал варианты реализации идеи. Мне попался конструктор wap-сайтов wen.ru — максимально примитивный, но в этом и была его особенность. Так мне пришлось осваивать разметку WML — расширение XML для WAP. Да, в то время был уже xHTML, но я ещё ничего не понимал.
Нашлось в Архиве :)
Я сделал сайт, на котором в основном хостил полезные ссылки для владельцев Nokia, а еще нашел сервис для организации чата. Так и началась мини-тусовка фанатов Nokia на сайте, который содержал всего пару десятков страниц. Здесь я познакомился со множеством своих единомышленников из Беларуси, Азербайджана и России.

Разметку писал прямо с мобильного телефона. Интернета у меня не было, стоил он недешево, поэтому на помощь приходила симка, папы которую я вынимал по ночам из его телефона (жаль, сейчас так долго не протянуть: привязка по IMEI и так далее) На утро я, конечно, получал по попе от отца.
Следующий этап моей технической эволюции — сайты с формой регистрации, гостевые книги и формы обратной связи. Главный интерес в них — обилие цветов и фоновых картинок. Тут произошло знакомство с xHTML и PHP4.

К этому моменту у меня появился компьютер — пекарня на базе процессора AMD Athlon XP, 2Гб ОЗУ, 128Гб HDD. Его купила руководительница моей мамы, которая заметила мое рвение к технологиям. В 2008 году б/у комп обошелся 18 000 тенге (сейчас это около $ 40). Началось мое путешествие в мир настоящего программирования с прочтения кучи статей о PHP, а писать код я начал чтобы найти решение разных проблем.

Например, одной моей задачей было организовать динамический каталог сайтов. Я предположил что отличным хранилищем данных о сайтах будут файлы. Лучше, конечно, один файлик = один сайт.
Сначала я учился получать запрос с xHTML формы, затем сохранять данные формы в файл, после чего итерировать по данным файлам и выводить их информацию в виде xHTML-страницы. Разумеется, тогда и понимания не было, что такое реляционные БД :). Параллельно в школе началась программа по обучению (конспектированию) языку Turbo Pascal и Delphi. Возможность создавать графические программы свела меня с ума, на этой волне я даже умудрился реализовать симулятор светофора и игру крестики-нолики.

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

После школы случился перерыв в программировании: меня заинтересовали ОС на базе ядра Linux. Сколько же данных я потерял, благодаря своим попыткам поставить тот или иной дистрибутив.

На втором курсе университета у меня появилась первая официальная работа: я успешно прошёл собеседование в небольшую IT-компанию, занимавшуюся разработкой продуктов, программировать нужно было на С#. Чтобы пройти собеседование я сам для себя создал и выполнил тестовое задание: описание тут, код тут. Реализовано оно было на PHP, спасибо сеньорам которые в тот момент просто хотели поменять, умею ли я писать хоть на чем-то :)

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

Может такой переход — это не очень красиво, но условия работодателя были лучше, а задачи интереснее. Именно на этой работе я попробовал разработку CRM на базе Java EE + Vaadin. Параллельно смог погрузиться в геймдев и начал свой проект на базе существующей игры MMORPG, тогда это было на пике популярности. Серверная часть была на Java, где я и прокачал свой уровень в разборе обфусцированного кода.

По этой же причине меня уволили с работы — game-dev перерос из хобби в работу. Поэтому с апреля 2015 по август 2016 я ушёл в свободное плаванье.
Или какой там актуальный мем про гениальность? :)
Случайно 20 августа 2016 я проходил мимо офиса моего первого работодателя и... снова устроился туда работать на более высокую позицию. Моими новыми задачами на «старой работе» была разработка новой версии продукта, того, который я делал ранее. Мне предложили эту должность, так как я хорошо знал предметную область. Это была система менеджмента обслуживания (ТОиР или MMS) с активным использованием RFID-технологий. Как раз в это время совместно с коллегами мне удалось разработать простой веб-фреймворк для бизнес-приложений, впоследствии удалось вынести его в OpenSource. Код тут.

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

1 июня 2020 года стал частью дружной команды Beeline, где мы пишем на Java. И понял, что готов рассказать всю историю моих переходов с языка на язык. Надеюсь, она будет вам полезна.
Мой первый проект на .NET
У нас есть проект который работает, но мы не можем его собрать.
С .NET я столкнулся на первом официальном месте работы: небольшой IT-компании, сотрудничающей с нефтянкой. Мой первый проект был про расчёт наработки труб в нефтяных скважинах. Я получил рабочий образец реализации этой идеи, написанный на ASP.NET, .NET 4.1. Честно, тогда я вообще не понимал, как работают эти технологии.

Так я целую неделю безуспешно собирал проект, после чего решил обратиться к старшему разработчику за помощью по сборке. Действительно, было нелегко, сейчас можно вспомнить это как огромную проблему классического ASP.NET про запутанную систему привязи зависимостей.

После сборки меня ожидал ещё один сюрприз: проект предоставлял интерфейс для загрузки excel-файла. Для чтения он запускал полноценный MS Office и бегал по ячейкам, считывая значения в память. После чтения в память и проведения расчётов, приложение снова открывало Office и записывала данные по клеткам. Да да, прямо графическое приложение через interoperability.

Я был в шоке, ведь мне сказали, что проект уже работает и нужно просто развернуть его на IIS под Windows Server. Тут-то и началось мое настоящее знакомство с миром .NET.

На сервере, естественно, ничего не работало. Причина очевидна — сервер IIS не имеет доступа к графической подсистеме, поэтому и не может что-либо запускать, в том числе и взаимодействовать с рабочим столом.

Засучив рукава, я начал искать решение как вызывать графический Office и научиться разбирать excel-файл вручную.Так я освоил библиотечку OpenXML, которая далась мне нелегко, но быстро решила все вопросы. Теперь файл разбирался с помощью OpenXML, после чего данные сохранялись в БД. Выходные данные можно было получать в виде отчета с нужными фильтрами.

Я был очень рад, что смог будучи джуном убрать костыль!
Чем мне понравился .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. По моим наблюдениям там было слишком много кодогенерации, а из-за этого сложным был сам интерфейс.

Сборка проекта (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 и используем Spring Boot, активно начали писать тесты на Kotlin. Я вижу, что Java реально стала двигаться вперед, релизы каждые полгода. Скажи Java-разработчику об этом в начале 2010, он бы покрутил пальцем у виска. На мой взгляд Java меняется в лучшую сторону.

В Java 8 появились функциональные интерфейсы, которые позволяют делать код красивее и реализовывать функции высшего порядка. Также подъехал Stream API, который немного облегчил жизнь. Хотя до LINQ далековато, но и это уже радует.

Мне удалось познакомиться с системой сборки Gradle. Она настолько мне понравилась, что я начал писать переиспользуемые скрипты для сборки, чтобы реализовать нечто похожее на файлы проектов в .NET Core.

В Java более прозрачная работа с асинхронностью, когда пишешь код действительно приходится о многом думать. Это и хорошо, и плохо. Мне этот момент нравится, так имея любовь к ОС и железу, приятно иметь возможность влиять на JVM как хочешь.

Что касается личных планов, мне интересна тема highload-приложений. Пока она не раскрыта для меня до конца, но я активно её изучаю.

Стараюсь не фанатеть от DRY, но по возможности делаю все, чтобы переиспользовать знания.

И, конечно, я хочу подтянуть знания в Kotlin, чтобы начать писать крутые сервисы на корутинах. Сам Kotlin — это то, чем должна была быть Java сейчас. Андрей Бреслав проделал отличную работу проработав инженером в Microsoft и внес много классных идей из C# в Kotlin.

Разница между Java и .NET по большей части компенсируется появлением в моей жизни Kotlin. Но я скучаю по многому из .NET.

Основные моменты:
  • Скучаю по консольному тулсету dotnet. Там можно и проект сбилдить, и создать новый из шаблона, и много чего другого.
  • Мне не хватает нормальной альтернативы для EntityFramework с LINQ.
  • Java действительно кажется более прожорливой по ресурсам, чем .NET. Компьютер иногда просто уходит в себя.
Но, в реальной жизни Java, пожалуй, самое интересное, что случалось со мной в последнее время.
Выводы и напутствие
Смена чего-то в жизни — зачастую нарушение зоны комфорта и какая-то неизвестность. Можно смотреть на ситуацию пессимистично, но меня это наоборот подстегивает. Мне хочется всегда быть актуальным. Прекрасно понимаю, что всех знаний не получить, но можно попытаться.

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

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

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

Это не значит, что нужно везде писать спагетти-код и трехэтажные конструкции. Всегда нужно придерживаться подходов разделения ответственности и писать простой код. Но при желании можно и костылей позволить. Тут мы все грешны :)

Бросайте себе вызов и всегда будьте на вершине!
Java Developer в Beeline Казахстан
Тоже хотите написать статью? Расскажите об этом Свете Друзь или Свете Данильченко, и они помогут!
Или пишите на beetech@beeline.kz.