Why Do Developers Leave Rust? Real-World Experience and Alternatives
The Problem
I recently read a Reddit post titled “Farewell Rust” by skwee357 (Dmitry Kudryavtsev). This caught my attention because the same author had written “One year of Rust in production” just six months earlier, praising Rust’s benefits. Now he was leaving Rust.
I see this pattern repeatedly. Developers get excited about Rust’s safety and performance, try it in production, then eventually switch back to Go, TypeScript, or C++. Why?
Developers leave Rust primarily due to slow compilation times that kill iteration speed, steep learning curve (67% need 2+ months vs 2 weeks for Go), and async complexity with ecosystem fragmentation (Tokio vs async-std vs smol). While Rust delivers memory safety and performance, many teams find the productivity cost too high for web services, CRUD apps, and time-sensitive projects.
Why I Investigated This Topic
I’ve been following Rust for years. I love the technical achievements - the borrow checker, zero-cost abstractions, memory safety without garbage collection. But I kept seeing experienced engineers abandon Rust despite its merits.
When I saw Dmitry’s post - someone who had written a detailed “one year later” success story now saying “farewell” - I needed to understand what changed. I dug into Reddit discussions, Google’s Rust developer survey, and real-world migration stories.
The patterns were clear.
Slow Compilation Times: The #1 Killer
When I change one line of code in a medium-sized Rust project, run cargo build, and wait 30-60 seconds for incremental compilation, I lose my flow state. For clean builds, it’s often 2-5 minutes - “long enough to brew coffee” becomes a real productivity drag.
Here’s a comparison I’ve experienced:
| Language | Clean Build | Incremental Build | Iteration Speed |
|---|---|---|---|
| Rust | 2-5 min | 30-60s | Slow |
| Go | 10-30s | < 1s | Very Fast |
| C++ | 1-3 min | 10-20s | Moderate |
I tried cargo check for faster feedback, but it doesn’t catch all errors. I tried splitting crates to parallelize builds, but that added complexity. I tried skipping link-time optimization in dev, but that creates divergence between development and production behavior.
The core issue: Rust’s compiler performs extensive type checking, borrow checking, and monomorphization of generics. This generates lots of code. While incremental compilation helps, it doesn’t solve the fundamental problem.
Real-world impact: One tech company achieved 30% performance improvement with Rust but doubled their development cycle. Product timeline pressure forced them to switch back to Go. The performance gains weren’t worth the slower iteration speed.
Steep Learning Curve: The #2 Barrier
I remember my first encounter with lifetime annotations. I spent hours fighting with the borrow checker over shared vs mutable references. My mental model, shaped by years of garbage-collected languages, didn’t translate.
Here’s what I learned about the timeline to proficiency:
- 2-4 weeks intensive learning for complex programs
- 3 months to fully internalize the ownership mental model
- 67% need 2+ months (Google survey)
- Compare to Go: 2 weeks for most developers
The specific pain points I hit repeatedly:
Lifetimes: Explicit lifetime annotations in function signatures
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y }}I spent days understanding why the compiler demanded these annotations.
Borrow checker: Fighting with shared vs mutable references
let mut vec = vec![1, 2, 3];let first = &vec[0];vec.push(4); // Error: cannot borrow `vec` as mutableprintln!("{}", first);Trait bounds: Complex generic constraints
fn process<T: Send + Sync + 'static>(data: T) { // ...}I couldn’t survive without AI assistance. I’m not alone - 33% of developers admit they couldn’t survive the “compiler beating period” without ChatGPT or Copilot. JetBrains RustRover with AI improves efficiency by 40%, but this reliance suggests the language complexity is too high.
The quote that resonates with me: “After 6 months with Rust, I finally felt productive. After 6 months with Go, I’d shipped three features.”
Async Complexity: The #3 Headache
When I need to build a simple web service, I face async complexity immediately. Three major runtimes compete: Tokio (70% market share), async-std (discontinued March 2025), and smol (minimalist). I cannot mix runtimes in the same project. Different spawn mechanisms, incompatible IO types.
I pick Tokio as the de facto standard, but it’s overkill for simple use cases. Most ecosystem libraries (hyper, tonic, axum) are built on Tokio, creating lock-in.
The concepts pile up: Future, Runtime, Poll, Waker, Pin. Debugging async code is painful with unclear stack traces. The “function color” problem means async functions infect everything they call.
Here’s a simple HTTP server in Rust:
use axum::{routing::get, Router};use tokio::net::TcpListener;
#[tokio::main]async fn main() -> anyhow::Result<()> { let app = Router::new().route("/", get(|| async { "Hello, World!" })); let listener = TcpListener::bind("0.0.0.0:3000").await?; axum::serve(listener, app).await?; Ok(())}I fight with: async lifetimes, the ? operator, Result types, Tokio runtime configuration.
Compare this to Go:
package main
import "net/http"
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) }) http.ListenAndServe(":3000", nil)}This works first time, zero compiler fights. go func() for concurrency - done.
Ecosystem Maturity Gaps: The #4 Issue
I reached for an ORM for a database project and found fewer mature options than SQLAlchemy (Python) or TypeORM (TypeScript). I needed database migration tools, API clients, testing utilities - the Rust ecosystem had them, but fewer examples and smaller communities.
Web development frameworks like Axum and Actix-web are good but have smaller communities compared to Express.js or Django. I find less middleware, fewer tutorials, more time reading source code instead of documentation.
The language evolves rapidly. Rust editions help, but I still encounter code rot. Async await was unstable for years. Pattern matching improvements are ongoing. This instability creates maintenance overhead.
Real-World Examples: Why Teams Leave Rust
Dmitry’s Experience: From Praise to “Farewell”
Dmitry Kudryavtsev (skwee357) wrote “One year of Rust in production” in September 2024, highlighting Rust’s benefits. Six months later, he posted “Farewell Rust.”
His likely journey: Initial excitement about Rust’s safety and performance, followed by production reality of compiler fights and slow iteration. Team productivity suffered. Business pressure to ship features faster mounted. The decision to migrate to an alternative (probably Go or TypeScript) became inevitable.
If someone who wrote a positive “one year later” post is now leaving Rust, the pain points must be significant.
TypeScript Team Chooses Go Over Rust
When Microsoft’s TypeScript team rewrote their compiler, they chose Go - achieving 10x performance improvement. The Rust community was shocked. Why not Rust?
The team explained:
- Portability: Easier one-to-one migration from TypeScript (both are GC languages)
- Similar structure: No ownership system meant matching existing algorithms directly
- Team ramp-up: TypeScript devs could learn Go in days, not months
The TypeScript team “barely made it past lunch” with Rust before deciding. This shows pragmatism wins over theoretical benefits when shipping real products.
Performance vs Productivity Trade-off
I’ve seen this pattern repeatedly:
- Startup chooses Rust for web service
- Achieves 30% better performance vs Go
- But development cycle doubles
- Product timeline pressure mounts
- Team morale declines from compiler fights
- Rewrite in Go
- Performance is “good enough”
- Development velocity 2x faster
- Team happier, product ships faster
Lesson: Developer time > machine time for most applications.
Alternatives Developers Choose
Go: The #1 Alternative
I see developers switching to Go for three reasons:
- Fast compilation: Build in seconds, not minutes
- Simple: 2-week learning curve vs 2+ months for Rust
- Productivity: Ship features faster
Go is better for:
- Web services and APIs
- Microservices
- CLI tools (when performance isn’t critical)
- Teams new to systems programming
- Rapid prototyping
Trade-offs:
- No memory safety at compile time
- GC overhead (usually negligible)
- Less expressive type system
- Slower raw performance than Rust (but often “good enough”)
TypeScript/Node.js: The #2 Alternative
Developers choose TypeScript for:
- Familiarity: JavaScript developers already know it
- Ecosystem: npm has everything
- Iteration speed: No compilation, instant feedback
- Web development: Natural fit for frontend + fullstack
- Hiring: Easier to find TypeScript devs
TypeScript is better for:
- Fullstack web development
- Rapid prototyping
- Startups needing speed over performance
- Teams already using JavaScript
- API development (with Express, Fastify)
Trade-offs:
- Runtime errors that Rust would catch at compile time
- Slower performance (but V8 is fast)
- No true multithreading
- Type system less powerful than Rust
C++: The #3 Alternative
Developers stick with or return to C++ because:
- Faster compilation: Even with templates, faster than Rust
- Mature ecosystem: Decades of libraries
- Familiar: Many engineers already know C++
- Industry standard: Gaming, embedded, HPC
C++ is better for:
- Game development
- Embedded systems (where Rust ecosystem is weak)
- HPC and scientific computing
- Legacy codebases
- Teams with deep C++ expertise
Trade-offs:
- Memory safety issues (use sanitizers)
- Undefined behavior pitfalls
- More complex syntax than Rust
- Modern C++ (C++20/23) learning curve is also steep
When Rust IS Worth It
Despite the pain points, Rust excels in specific domains:
Use Rust when:
- Memory safety is critical: Security-sensitive code, parsers, crypto
- Performance is paramount: Game engines, HPC, real-time systems
- No GC acceptable: Embedded, OS development, WebAssembly
- Long-term maintenance: Borrow checker prevents entire classes of bugs
- Resource-constrained: No GC overhead, deterministic memory usage
Success stories demonstrate this:
- Firefox: Quantum project - 40% performance improvement
- AWS: Firecracker microVMs - fast, secure
- Discord: Reads from billions of messages per second
- Microsoft: Rewriting core Windows components
- Linux kernel: Second language after C (historic)
The sweet spot:
- Systems programming
- CLI tools where performance matters (ripgrep, fd)
- WebAssembly (wasm-bindgen)
- Network services (when team has Rust expertise)
Lesson: Rust is a specialized tool, not a general-purpose replacement for every language.
Decision Framework: Should You Use Rust?
Ask these questions before choosing Rust:
Team Capability:
- Does anyone have Rust experience?
- Are you willing to invest 2-6 months in learning?
- Can you handle slower initial development?
Project Requirements:
- Is memory safety critical?
- Is performance a bottleneck?
- Do you need zero-runtime (no GC)?
- Will codebase be maintained long-term?
Business Constraints:
- Can you afford slower iteration speed?
- Is hiring Rust developers feasible?
- What’s the opportunity cost of delayed features?
Decision matrix:
| Scenario | Choose Rust | Choose Go | Choose TypeScript |
|---|---|---|---|
| Web API | ❌ | ✅ | ✅ |
| CLI tool (performance-critical) | ✅ | ⚠️ | ❌ |
| Embedded systems | ✅ | ❌ | ❌ |
| Microservices | ⚠️ | ✅ | ✅ |
| Game engine | ✅ | ❌ | ❌ |
| Fullstack web | ❌ | ❌ | ✅ |
| Parser/codec | ✅ | ⚠️ | ❌ |
| Prototyping | ❌ | ✅ | ✅ |
Summary
In this post, I explored why developers leave Rust despite its technical merits. The key reasons are slow compilation times that kill iteration speed, steep learning curve (67% need 2+ months), async complexity with ecosystem fragmentation, and ecosystem maturity gaps in web development.
I showed real-world examples of teams switching from Rust to Go and TypeScript, achieving better productivity despite giving up some performance. I also covered scenarios where Rust IS worth it: systems programming, embedded development, performance-critical applications where memory safety is paramount.
The key point is pragmatism over ideology. Rust is an amazing technical achievement, but it’s not the right tool for every job. The best language is the one that lets you ship. For many teams, that’s not Rust - and that’s okay. Use Rust where it shines, use Go/TypeScript/C++ where they shine.
Final Words + More Resources
My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me
Here are also the most important links from this article along with some further resources that will help you in this scope:
- 👨💻 Farewell Rust - Reddit Discussion
- 👨💻 One year of Rust in production
- 👨💻 Google Rust Developer Survey
- 👨💻 TypeScript Compiler Rewrite in Go
- 👨💻 Rust 2024 Roadmap
Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!
Comments