На своём MacBook M4 я не замечал проблем. Два скрипта на Node.js 18 собирали информацию по проекту, обходили файлы, считали строки, агрегировали данные и отрабатывали за пару секунд. Жить можно.

А потом на созвоне коллега расшарил экран. У него удалённый рабочий стол, Intel Core i5-1035G1, 8 ГБ RAM. Он запустил тот же скрипт, и мы оба смотрели на терминал восемь секунд. В тишине. Восемь секунд это много, когда ты запускаешь скрипт десять раз в день.

Я переписал оба скрипта на Rust с помощью AI-ассистента (Claude Code). Получил 5-10x ускорение. Ниже то что сработало, что нет, и стоит ли вам делать то же самое.

Контекст

Два CLI-скрипта для внутренних нужд проекта:

  • Скрипт 1: рекурсивный обход директорий через glob, подсчёт строк в файлах по расширениям, вывод агрегированной статистики.

  • Скрипт 2: парсинг Markdown-файлов, извлечение front matter, построение индекса контента.

Оба на Node.js 18. На M4 работали незаметно. На железе коллеги тормозили ощутимо. Проект рос, файлов становилось больше, и разрыв в производительности между машинами только увеличивался.

Проблемы в коде были понятные: старый glob без оптимизации, промисы запускались последовательно вместо параллельного выполнения. Можно было исправить на Node.js. Но когда видишь, как коллега ждёт по 8 секунд на каждом запуске хочется решить проблему с запасом, а не впритык.

Почему Rust, а не оптимизация Node.js

Прагматичный ответ: скрипты делали ровно то, в чём Rust силён file traversal и CPU-bound агрегация. Это тот же класс задач, где ripgrep и fd показывают 10-20x ускорение по сравнению с системными grep/find.

Непрагматичный ответ: было интересно проверить, насколько реально использовать AI для генерации кода на незнакомом языке в production-сценарии.

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

Процесс

Отдал оба скрипта Claude Code с задачей переписать на Rust. Дальше произошло кое-что, что хорошо иллюстрирует, почему Rust + AI-генерация работает лучше, чем ожидаешь.

Компилятор Rust нашёл проблемы в сгенерированном коде. AI их исправил. Итеративно, без моего участия в отладке. Строгая система типов Rust создаёт tight feedback loop: ошибки конкретные, с указанием места и причины. Не размытые runtime-ошибки чёткий сигнал. Компилятор фактически выступает code reviewer для AI.

Что я делал: ревью финального кода (~20 минут). Читал, проверял логику, сравнивал с оригинальными скриптами. Код был понятный, Rust читается проще, чем пишется.

Чего я не делал: не отлаживал, не гуглил ошибки компилятора, не разбирался с lifetimes.

Распространение бинарников

Отдельная задача это как доставить Rust-бинарники в проект. Они platform-specific, хранить в git очень плохая идея.

Посмотрел на подход esbuild: npm-пакеты с platform-specific бинарниками. npm install и получаешь бинарник для своей ОС. Без исходников в репозитории, без тяжёлых файлов. Сделал так же вышло лучше чем ожидал.

Результаты

Машина

Node.js 18

Rust

Ускорение

i5-1035G1, 8 ГБ RAM

~8 сек

~1-1.5 сек

5-7x

MacBook M4

~2 сек

~0.3 сек

~6x

Результат предсказуемый для данного класса задач (file I/O + CPU-bound обработка). Не уникальный: ccusage показал до 1000x ускорения отдельных операций после миграции с Node.js на Rust.

Где это не сработает

Честность важнее хайпа. Вот ограничения:

По задаче:

  • Если узкое место сеть (API вызовы, база данных), выигрыш будет минимальный. Rust не ускорит ожидание ответа от сервера.

  • Если скрипт и так быстрый (< 1 сек) овчинка не стоит выделки.

  • Профилируйте перед тем, как переписывать. node --prof или просто time node script.js убедитесь, что bottleneck там, где думаете.

По подходу (AI-генерация):

  • Простые скрипты для меня ок. Сложная архитектура с десятками модулей, trait objects, async runtime совсем другая история.

  • Я не стал Rust-разработчиком. Я могу читать этот код и вносить мелкие правки через AI. Но если понадобится серьёзный рефакторинг для меня это будет проблема. Хотя всегда можно подучиться.

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

Итого

Для конкретного класса задач (CLI-утилиты, file traversal, CPU-bound обработка) переписывание Node.js → Rust через AI-ассистента дало предсказуемый результат: 5-10x ускорение при минимальных затратах времени.

Подход работает, когда:

  • Задача простая и изолированная

  • Bottleneck в CPU/I/O, а не в сети

  • Вы готовы к тому, что обслуживание кода будет через AI

Не работает, когда:

  • Сложная бизнес-логика с архитектурными решениями

  • Нужно глубокое понимание экосистемы (async Rust, unsafe, FFI)

  • Команда должна поддерживать код без AI


Оригинал статьи с дополнительными деталями: ifonin.ru/blog/nodejs-rust-claude-code