Меняю свой стек с понедельника
Приветствую, коллега!
Примерно за год до момента написания этой статьи мне начало казаться, что я начал выгорать. Работа, уже давно превратившаяся в ремесло, перестала приносить то студенческое чувство первооткрытия, знакомое каждому программисту, приносящее эйфорию. Ради этого чувства, ради новых знаний я когда-то просиживал за монитором по 18 часов в сутки. Это давно прошло… но недавно я испытал это чувство снова! Сначала оно было тихим, непривычным из-за длительного перерыва, но со временем оно разгорелось и заполыхало!
Если вы такой же, как и я, программист со стажем около от 12 лет, возрастом в районе 30 лет, задержавшийся в своем родном стойле стеке (особенно если это C# .Net MVC), то приглашаю под кат. Тем, кто моложе — думаю тоже будет полезно, чтобы заранее быть готовыми.
Предыстория начинается с того, что я давно занимаюсь разработкой на стеке C# .Net (ASP, MVC, windows services). Мне кажется, что меня можно назвать кем-то вроде full-stack разработчиком: базы данных, backend, frontend и даже олимпиадное программирование — всё это я через себя пропустил. Не скажу, что я профессионал, но удивить меня чем-то сложно, если речь идет о .Net. Нет, я не ходил на конференции .next и подобные, но я учился с их несколькими старожилами в университете, знаком с некоторыми из них лично, а число запущенных мною в ПЭ проектов среднего масштаба перевалило за 30.
Как было указано до ката, мне показалось, что я выгораю. Когда нам принесли новый проект для реализации (не слишком большой — это важно!), уже на первом совещании я знал, что и как именно мы будем делать — скукота.
Вы себя ещё не узнали? Если вы моложе, обязательно продолжайте читать, у вас всё впереди. Если вы ушли дальше меня, продолжайте читать, а в комментариях расскажите о своем опыте.
Итак, впереди у меня маячило примерно пол года неинтересной работы. Но мы сдали проект на несколько месяцев раньше, узнали кучу крутейших вещей, прокачались в смежных областях и получили массу удовольствия! Не буду долго тянуть… новый проект был сделан на полностью новом стеке: Node.js + React.
Коллеги, предвидя шапкозакидательство, сразу должен оговориться, что решение о смене стека пришло не спонтанно. Несколько месяцев я вынашивал мысль о том, что .Net MVC — не самый лучший выбор, если речь идет о небольших проектах. Подыскивал альтернативы, смотрел по сторонам. О связке Node.js и React я считал, что это инструменты, более заточенные под server-side и client-side, чем C#, но уже первый опыт превзошел все мои ожидания.
Оговорим правила
Во-первых, считаю нужным уточнить некоторые детали и условия, при которых можно считать ключевую мысль статьи — замена стека .Net MVC и Node.JS+React — верной. Я не склонен скатываться в крайности и утверждать, что во всех случаях такое мероприятие будет полезным, поэтому вот краткий перечень исходных ограничений:
- Проекты с привлечением до 3-5 программистов;
- Отсутствие существенных вычислений и сложной логики в backend;
- Наличие возможности и/или необходимости унифицировать backend и frontend;
Проекты с привлечением до 3-5 программистов
Такое ограничение возникло из-за предположения, что при участии в проекте большой команды от 5 человек, речь идет уже о серьезных корпоративных приложениях, которые тяжело будет реализовывать без преимуществ .Net (причем не только ASP.NET, но и Core). Про сами преимущества и недостатки поговорим ниже.
Отсутствие существенных вычислений и сложной логики в backend
Использовать JavaScript (или даже TypeScript, вас это не спасет), язык с динамической типизацией без многопоточности и без Linq, для реализации вычислений или более-менее сложной бизнес-логики, просто нельзя — язык просто для этого не предназначен. Чего не скажешь про C#. Важно учитывать специфику инструмента, чтобы не забивать гвозди микроскопом.
Наличие возможности и/или необходимости унифицировать backend и frontend
Унификация поможет снизить порог входа, бюджеты и сроки. Но у палки всегда есть два конца и необдуманный шаг со стороны «эффективных менеджеров» без реальной необходимости может привести к потерям.
Принимая во внимание перечисленные ограничения, предлагаю следующий чек-лист, пройдясь по которому вы сможете оценить применимость к вашей экосистеме проектов.
Чек-лист
Стоимость разработки и содержания
Требует ли ваш бюджет низкого порога входа специалистов и невысокой стоимости содержания?
Если у вас небольшая компания или команда программистов, то сложность инструментов разработки отнимает драгоценные ресурсы. Стек Node.js+React обладает рядом неоспоримых преимуществ по сравнению с .Net MVC или Core:
- Унификация backend'а и frontend'а — специалисты смогут работать как fullstack'и легче и проще, чем если бы это был стек C#;
- Меньшие требования к серверным ресурсам — Node.js не такой прожорливый, как .Net и по-настоящему кроссплатформенный;
- Скорость разработки выше — из-за отсутствия типизации существенно повышается скорость выхода первых версий продукта.
Запуск MVP (minimum viable product) и PoC (proof of concept)
Горят ли ваши сроки для запуска MVP или PoC?
С точки зрения скорости реализации MVP или PoC стек Node.js+React, несомненно, в более выигрышном положении по сравнению со стеком .Net. Принимая во внимание предыдущий пункт о стоимости разработки и содержания, для задачи запуска MVP появляется синергия: быстро, дешево, эффективно. Кроме того, стабильность работы Node.js находится на высоком уровне и не вызывает нареканий.
Среда разработки
Будет ли вам достаточно функциональности «легких» IDE?
Для Node.js в связке с React отлично подходят «легковесные» IDE. Например, VS Code — не требует больших мощностей при разработке, кроссплатформенный редактор, распространяется бесплатно, его функциональности вполне хватает, чтобы комфортно разрабатывать как backend, так и frontend.
Для проектов на C# можно использовать Visual Studio Community — тоже условно-бесплатную IDE, но она уже потребует ресурсов, будет не такой шустрой и не кроссплатформенной.
Типизация языка
Вы сможете обеспечить качественную разработку и поддержку своего проекта, учитывая отсутствие типизации?
Отсутствие типизации в языке — это палка о двух концах. С одной стороны, такой подход позволяет кратно увеличить скорость разработки, уменьшив объем кода. С другой стороны, кратно увеличивается объем тестирования. Кроме того, некоторые ошибки могут проявиться только во время эксплуатации, успешно преодолев все тесты. Крупные проекты делать без типизации становится затруднительно.
Производительность и масштабирование
Вы готовы отказаться от полноценной многопоточности из коробки? В вашем проекте отсутствуют сложные вычисления или бизнес-логика?
Как известно, в Node.js реализовано однопоточная событийно-ориентированная модель. Это отлично подходит для большого количества запросов, но совершенно не годится для распараллеливания вычислений или реализации сложной бизнес-логики. Таким образом, при выборе стека для backend'а на Node.js, надо отдавать себе отчет о нюансах его работы.
Кроссплатформенность
Вам требуется кроссплатформенность из коробки?
Да, под .Net существует .Net Core, который претендует на кроссплатформенность. Но это все-таки не .Net MVC. Если у вас собран большой объем готовых компонентов под .Net MVC, то переход на .Net Core не будет легким. Используя Node.js можно об этом не беспокоиться и использовать свои наработки под любую платформу, в зависимости от требований заказчика.
Заключение
Богатый мир модулей Node.js позволит вам эффективно и с минимальными затратами реализовать практически любую прикладную задачу от авторизаций в корпоративных системах и rest-api до чат-ботов мессенджеров.
Развертывание приложений Node.js в системах под управлением любой ОС — одно удовольствие и пару команд. А потребность в серверных мощностях могут быть снижены на порядок по сравнению с .Net, и вы можете спокойно выбирать «оплата за ресурсы» в нашем конфигураторе выделенного сервера.
А у вас были попытки смены стека?