Rust'a geçmek bir performans kararı değildi.

TypeScript'ten Rust'a geçerken beklediğim şey hızdı. Aldığım şey, bir sınıf hatanın derleme zamanında ölmesi oldu — ve asıl fark orada.

Xaron'un ilk sürümü Node.js üzerindeydi. Çalışıyordu. Sonra baştan yazdım ve bugün sunucu tarafı Axum, istemci tarafı WebAssembly'ye derlenen Leptos — yani uçtan uca Rust.

İnsanlar bu kararı duyunca hep aynı şeyi soruyor: ne kadar hızlandı? Dürüst cevap şu — hızlandı ama geçişin sebebi o değildi ve bugün geriye dönüp baktığımda kazandığım şeylerin listesinde performans ilk sırada bile değil.

Beklediğim şey hızdı

Bir gerçek zamanlı iletişim ürününde performans elbette önemli. Bağlantı sayısı arttıkça çöp toplayıcının duraklamaları gecikme grafiğinde kendini gösteriyor, bellek kullanımı doğrusal olmayan biçimde büyüyor, ve bir noktada sunucu eklemek çözüm olmaktan çıkıp maliyet olmaya başlıyor.

Rust bunların hepsini düzeltti. Ama şunu da söyleyeyim: iyi yazılmış bir Node servisi çoğu ürün için fazlasıyla yeterli. "Yavaş" olduğu için Rust'a geçiyorsan, önce profil çıkarman gerekiyor — çünkü büyük ihtimalle sorun dilinde değil, sorgularında.

Aldığım şey başkaydı

Gerçek fark, hata sınıflarının nereye taşındığıydı.

Rust'ta Option ve Result dilin merkezinde. Bir değerin olmayabileceğini veya bir işlemin başarısız olabileceğini görmezden gelemiyorsun — derleyici seni bırakmıyor. TypeScript'te strictNullChecks açıkken bile, bir any veya bir kütüphane tipi bu zinciri kırabiliyor.

Bunun pratik sonucu şu: üretimde beklenmedik yerde patlayan kod yazmak zorlaştı. Xaron'un kod tabanında test dışında unwrap() veya expect() kullanmıyoruz — bu bir stil tercihi değil, inceleme kuralı. Hatalar değer olarak taşınıyor, en tepeye kadar.

Bir dilin size verdiği asıl hediye, ne yazabildiğiniz değil — ne yazamadığınız.

İki dilin arasındaki sınırı silmek

Beklemediğim ikinci kazanç istemci ve sunucunun aynı dili konuşması oldu.

Mesaj tipleri, hata biçimleri, doğrulama kuralları — hepsi tek bir yerde tanımlı ve iki taraf da aynı tanımı derliyor. Sunucuda bir alanın adını değiştirdiğimde istemci derlenmiyor. Eskiden bu, üretimde fark edilen bir uyumsuzluktu; şimdi derleme hatası.

WebAssembly'nin bedeli var tabii: paket boyutu daha büyük, ilk yükleme daha ağır, ve tarayıcı ekosistemindeki hazır çözümlerin çoğunu kullanamıyorsun. Bir pazarlama sitesi yazıyor olsaydım bu takas saçma olurdu.

Ne zaman değmez

Rust'ı her işe önermiyorum ve bu yazının bir dönüşüm çağrısı olmasını istemiyorum.

Ürün henüz ne olacağını bilmiyorsa, haftada üç kez veri modelini değiştiriyorsan, Rust seni yavaşlatır. Ödünç denetleyicisiyle tartışmak, henüz doğru olduğundan emin olmadığın bir tasarımı savunmak demek. Sperare ve Teck bu yüzden TypeScript üzerinde — ikisinde de asıl zorluk ne bellek ne eşzamanlılık; asıl zorluk iş kurallarının doğru olması.

Rust'ın karşılığını verdiği yer, hatanın maliyetinin yüksek olduğu ve tasarımın oturduğu yer. Şifreleme durumu, canlı bağlantı yönetimi, uzun süre ayakta kalması gereken servisler. Orada derleyiciyle geçirdiğin fazladan yirmi dakika, üretimde geçirmeyeceğin bir geceye dönüşüyor.