За последние несколько лет язык программирования TypeScript завоевал огромную популярность и стал основой для множества крупных проектов благодаря своей типизации и возможности использовать его и на фронтенде, и на бэкенде. Один из таких проектов - крупный стартап Motion, который в течение почти пяти лет вел разработку в одном монорепозитории, содержащем около 2.5 миллионов строк кода. Несмотря на очевидные преимущества TypeScript, команда проекта столкнулась с рядом ограничений и вызовов, которые в итоге привели к решению отказаться от этого языка и перейти на C#. TypeScript стал ключевым фактором выживания Motion на ранних этапах.
Возможность быстро создавать прототипы, единая кодовая база для фронтенда и бэкенда, богатая экосистема и высокая скорость работы разработчиков сыграли большую роль в том, что компания смогла быстро валидировать гипотезы и несколько раз трансформировать свой продукт. Использование современных библиотек, таких как React для веба, React Native для мобильных приложений и Electron для десктопа, позволило обеспечить единообразный стек технологий. Для инфраструктурного кода также использовали TypeScript, что стало довольно необычным, но сработало в целом хорошо. Однако спустя время мечта о действительно полном обмене кодом между всеми платформами не оправдалась. Существовали проблемы с совместимостью React Native, из-за которых использовались другие версии React и TailwindCSS, что приводило к множеству конфликтов и проблем с синхронизацией разработки.
Часто при изменении общих библиотек мобильные разработки забывались, что провоцировало баги и массу времени тратилось на выявление виновников "кто сломал мобильное приложение". В итоге некоторые экраны на мобильных устройствах вообще пришлось переписывать, отказавшись от React Native из-за критичных требований к производительности. Возникли и технические ограничения самого TypeScript при работе с столь крупным кодом. Язык постепенно усложняется: Language Server часто аварийно завершал работу, а процесс CI занимал больше 20 минут, несмотря на оптимизации и использование масштабируемой системы сборки Turborepo от Vercel. Команда понимала, что решение многих проблем остается за разработчиками компилятора TypeScript и командами, работающими над такими инструментами, как Biome - проектом для статического анализа кода.
Одним из ключевых болевых мест стали ограничения в системе типов. Отсутствие нативной поддержки временных типов, необходимость в сторонних библиотеках вроде Zod, вызвали сложности и ложную иллюзию безопасности типов. Повышение версии Zod стало обязательным для успешной компиляции всего монорепозитория из-за ограничений компилятора - такой опыт демонстрирует, как некоторые фундаментальные аспекты экосистемы еще недостаточно зрелы для проектов огромного масштаба. Что касается работы с базами данных и ORM, с TypeScript было множество вызовов. Известные инструменты, такие как Prisma, порой ведут себя непредсказуемо и могут удалять целые таблицы по ошибке, если запрос составлен неверно.
Другие решения вроде Drizzle выглядели перспективно, но не имели стабильного API и достаточной зрелости. Для больших корпоративных решений подобная нестабильность неприемлема, ведь критически важна надежность и предсказуемость операций с данными. Сложившаяся ситуация заставила руководство задуматься о смене основы для разработки. В корпоративном мире давно доминируют языки с полным набором runtime-типов, надежными и быстрыми компиляторами, а также зрелыми инструментами для работы с базами. Яркими примерами служат Java и .
NET, которые проверены десятилетиями и обеспечивают стабильность и высокую производительность проектов с миллионами строк кода. Выбор языка для будущих разработок стал ключевым вопросом. Так как потребовалась поддержка кода, который мог бы выполнять произвольные JavaScript-блоки в изолированной среде по соображениям безопасности, руководство решило начать новый этап разработки на другом языке. Рассматривались варианты с требованием сбалансированности между производительностью, статической типизацией, сборкой мусора и общей продуктивностью практического использования. После анализа нескольких перспективных языков решающим стал выбор между C# и Java.
Критериями выступали зрелость экосистемы, богатство инструментальных средств и сходство синтаксиса с TypeScript. Несмотря на то, что у команды не было профессионального опыта с C#, именно этот язык был выбран из-за высокой продуктивности, выразительности и передовых возможностей, которые предоставляет платформа .NET. Одним из главных преимуществ стала надёжная и мощная ORM - Entity Framework Core. В отличии от трудозатратных и хрупких решений на TypeScript, EF Core позволял обрабатывать сложные сценарии, такие как soft delete, навигационные свойства и обработка конкурентных изменений практически без лишних усилий.
Автоматическое отслеживание изменений контекста значительно упрощало процесс работы с базой и минимизировало риски ошибок при транзакциях. Языковое сходство C# с TypeScript сыграло немаловажную роль. Оба разрабатывались с учетом современных парадигм программирования, имея схожий синтаксис с поддержкой async/await, лямбда-функций и nullable типов. Это облегчило адаптацию разработчиков и ускорило переход команды, сводя к минимуму время простоя и необходимость переподготовки. Экосистема C# и .
NET настолько обширна и разнообразна, что обеспечивает набор инструментов для любой задачи - от event sourcing и поддержки акторной модели до интеграции с продвинутыми системами обмена сообщениями. Несмотря на то что размер экосистемы не столь огромен, как у JavaScript, ее качество и зрелость обеспечивают комплексные решения с высокой надежностью в долгосрочной перспективе. Еще одним важным преимуществом стала тесная интеграция с современными инструментами искусственного интеллекта для автоматизации написания и проверки кода. Строгость компилятора C# и мощные API Roslyn дают возможность создавать и использовать сотни правил линтинга и проверок, которые способствуют написанию более качественного и поддерживаемого кода. Такие условия помогают AI-моделям безошибочно выполнять сложные задачи и конструировать бизнес-логику, что увеличивает общий темп разработки и улучшает качество конечного продукта.
Возвращаясь к экосистеме, важно отметить, что .NET перестал быть Windows-ориентированным решением. Современный .NET Core предлагает открытые, кроссплатформенные возможности, позволяя запускать приложения на Linux и MacOS с производительностью на уровне нативных решений. Это кардинально изменило восприятие технологии и сделало ее серьезным конкурентом в мире высоконагруженных и масштабируемых систем.
Отказ от TypeScript в пользу C# - не шаг назад, а логичный эволюционный этап для компании, столкнувшейся с ограничениями старой платформы при масштабировании. Возможности для эффективного управления большим объемом кода, стабильной работы с базами данных, качество инструментов и перспективы AI-инструментов обеспечивают новый уровень контроля и производительности. Переход такой крупной кодовой базы - сложный процесс, требующий тщательного планирования и вовлечения команды, но результаты показывают, что выбор более зрелых технологий для больших проектов позволяет сосредоточиться не на борьбе с внутренними ограничениями платформы, а на решении действительно бизнес-значимых задач. В итоге опыт компании Motion служит важным сигналом для разработчиков и технических лидеров: при росте и усложнении проектов настает момент, когда стоит пересмотреть технологический стэк и инвестировать в более устойчивые и продуктивные решения. TypeScript остается отличным инструментом, однако для проектов с огромными объемами кода современные "старые" языки с проверенными экосистемами и зрелыми инструментами оказываются более надежным выбором для долгосрочного успеха.
.