За последние пять лет TypeScript стал одним из самых популярных языков программирования для построения масштабируемых и надежных веб-приложений. Многие компании выбирают его за мощную типизацию, взаимодействие фронтенда и бэкенда, а также за опыт сообщества и богатую экосистему. Однако с ростом продукта и монорепозитория, содержащего порядка двух с половиной миллионов строк кода, опыт использования TypeScript не всегда бывает полностью позитивным. На примере компании Motion, которая на протяжении многих лет опиралась на TypeScript для разработки своих продуктов, можно понять, с какими трудностями сталкиваются крупные проекты и почему со временем возникает необходимость переосмыслить выбор технологий. Motion начал свой путь с большого монорепозитория, построенного на TypeScript, что позволяло им быстро проверять идеи и обеспечивать высокую степень взаимодействия между разработчиками фронтенда и бэкенда.
Использование React, React Native, Electron и инфраструктурного кода - все это было написано на одном языке, что значительно упрощало процессы разработки. Команда разработчиков могла легко делиться кодом между разными платформами, что в теории должно было повысить продуктивность. Однако на практике мечта универсального и беспроблемного код-шеринга оказалась иллюзией. Особенности экосистемы React Native и отличия в версиях ключевых библиотек, таких как React и Tailwind, приводили к тому, что многие общие библиотеки не сочетались без проблем на всех платформах. Из-за этого становилось обычным делом, что исправления, сделанные для веба, ломали мобильное приложение.
Подобные ситуации вызывали постоянный конфликт между разработчиками, приходилось проводить длительную диагностику и исправлять ошибки. Со временем некоторые критические экраны мобильного приложения были переписаны с отказом от React Native ради повышения производительности. Внушительный размер кодовой базы лишь усугублял проблемы поддержки и сборки. Серверы языка часто падали или работали очень медленно, а время выполнения CI/CD процессов зачастую превышало 20 минут, что негативно влияло на скорость внедрения изменений и общую разработческую культуру. Один из болевых моментов - отсутствие в TypeScript полноценной поддержки runtime-типов, что вынуждало использовать сторонние решения, например, популярную библиотеку Zod, которая, в свою очередь, порождала собственные ограничения и ошибки при компиляции.
Не менее проблемными были инструменты работы с базой данных. ORM Prisma изначально имела опасный дефект, который мог привести к удалению всей таблицы, если запрос был составлен неправильно. Хотя альтернатива в виде Drizzle казалась многообещающей, она не достигла стабильной версии 1.0, а судьба подобных проектов в ранней стадии всегда нестабильна. Крупные зрелые экосистемы, такие как Java и .
NET, на сегодняшний день обладают огромным преимуществом в виде зрелых инструментариев и проверенных практик работы с CRUD-операциями. Они обеспечивают быстрые компиляции, стабильное выполнение многопоточных задач, а также надежные, полнофункциональные ORM, что упрощает жизнь разработчиков, позволяя им сосредоточиться на решении новых бизнес-задач, а не на борьбе с инфраструктурными сложностями. Серьезным поворотным моментом для Motion стало развитие агентных workflow-систем, в которых понадобилось исполнять произвольный JavaScript-код в изолированной среде по соображениям безопасности. Поскольку TypeScript и экосистема Node.js не предоставляли приемлемых решений для этих задач, возникла необходимость внедрять совершенно новый язык для таких функций.
При выборе нового языка критерии были достаточно жесткими: требуется garbage-collected, статически типизированный, производительный язык, способный обеспечить максимальную продуктивность. Среди возможных вариантов были рассмотрены C# и Java - два богатых экосистемой и зрелых языка, которые смогли бы закрыть текущие потребности компании. В итоге выбор пал на C#, и одной из ключевых причин стал его ORM - Entity Framework Core. Этот инструмент вывел работу с базами данных на новый уровень за счет продвинутых возможностей глобальных фильтров запросов, удобного управления soft deletes, отслеживания изменений и транзакционной консистентности. Использование EF Core позволило избавиться от необходимости каждый раз вручную проксировать транзакционные контексты, как это было в Prisma или Drizzle, что значительно упростило код и повысило надежность.
Помимо удобства работы с базами данных, C# и TypeScript обладают схожим синтаксисом и парадигмами благодаря тому, что оба языка создавались связаны с Microsoft, что облегчило переход для разработчиков. Асинхронное программирование, nullable-типы и lambda-функции имеют очень похожий синтаксический стиль, что минимизировало время и ресурсы на адаптацию команды. Экосистема .NET достаточно обширна и сочетает в себе зрелые решения для массового применения, включая поддержку продвинутых архитектурных паттернов, таких как event sourcing и actor model, а также интеграцию с современными решениями для обмена сообщениями и построения распределенных систем. Кроме того, возможности C# в сочетании с продвинутыми методами статического анализа кода и инструментариями на базе компилятора Roslyn открывают более широкие перспективы для интеграции с AI-инструментами, генерирующими код.
Применение строгих правил написания кода, документации и проверок позволило значительно повысить качество создаваемого продукта за счет частичной автоматизации процессов ревью и тестирования через машинное обучение. Такой подход также стимулирует использование AI как помощника разработки, что положительно сказывается на скорости и надежности создания нового функционала. Не стоит забывать, что за многие годы .NET превратился из платформы, ориентированной исключительно на Windows, в современную кроссплатформенную технологию с открытым исходным кодом, поддерживающую Linux и облачные среды. Высокая производительность среды исполнения и стабильность рантайма делают платформу подходящей для проектов любого масштаба и с различными требованиями по нагрузке.
И хотя говорить о том, что C# и .NET - это модные технологии сегодняшнего дня, не приходится, важно понимать, что именно зрелость и надежность имеют решающее значение в разработке большого бизнеса и масштабируемых продуктов. Опыт Motion служит примером того, как выбор правильных инструментов занимает критическую роль для стартапов, стремящихся к быстрым итерациям, высокой производительности и адаптивности. В современном мире ощущается тенденция отхода от относительно молодых и не всегда стабильных решений к проверенным временем корпоративным платформам, которые обеспечивают комфорт и предсказуемость в работе. Motion приглашает разработчиков, которые смотрят на индустрию с открытым умом и готовы принять участие в создании инновационного программного обеспечения, которое меняет представление о том, как можно автоматизировать и интегрировать AI через естественный язык.
Их путь доказывает, что иногда возвращение к давно известным и надежным технологиям - это ключ к новым прорывам. .