Why Rust Is Eating the World (and Where It Won't)

TL;DR

Rust excels in systems programming, WebAssembly, and infrastructure tools, but struggles with rapid prototyping, data science, and mobile development.

I've been watching Rust's rise for the past few years, and honestly, it's been wild. What started as "Mozilla's experimental language" is now powering everything from Windows kernel components to blockchain networks to the tools I use daily.

But here's the thing - every time someone declares Rust will "replace everything," I cringe a little. Because I've actually used Rust in production, and while it's incredible for certain problems, it's absolutely terrible for others.

Let me break down where Rust is genuinely taking over and where it's still struggling, based on real experience building stuff.

Where Rust Is Actually Winning

Systems Programming: Finally, a C Replacement That Doesn't Suck

I spent years writing C code and constantly worrying about buffer overflows, use-after-free bugs, and memory leaks. Rust solves this stuff at compile time, which is genuinely magical.

// This is actual kernel-level Rust code running in Linux
use kernel::prelude::*;

struct SafeDriver {
    device: Device,
    buffer: Box<[u8]>,  // Memory managed automatically
}

impl SafeDriver {
    fn read_data(&mut self, offset: usize, len: usize) -> KernelResult<&[u8]> {
        // This would be a buffer overflow in C
        // In Rust, it's a compile-time error
        self.buffer
            .get(offset..offset + len)
            .ok_or(EINVAL)
    }
}

The Linux kernel now has official Rust support. Microsoft is rewriting Windows components in Rust. That's not hype - that's production systems serving billions of users.

WebAssembly: The Perfect Marriage

Remember when I said WebAssembly was getting real? Rust is a huge reason why. The two technologies work together so seamlessly it feels like they were designed for each other.

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub struct ImageProcessor {
    pixels: Vec<u8>,
}

#[wasm_bindgen]
impl ImageProcessor {
    // This compiles to WASM that runs 10-15x faster than JavaScript
    pub fn apply_blur(&mut self, radius: f32) {
        gaussian_blur(&mut self.pixels, radius);
    }
}

Figma's entire rendering engine is Rust compiled to WebAssembly. Adobe Photoshop on the web? Rust + WASM. These aren't experiments - they're shipping products.

CLI Tools: Replacing Unix Utilities

The command-line tools I use daily are increasingly written in Rust:

  • ripgrep instead of grep (stupidly fast text search)
  • fd instead of find (sane syntax, better performance)
  • exa instead of ls (better colors and formatting)
  • bat instead of cat (syntax highlighting built-in)
// This is why ripgrep is so fast
use rayon::prelude::*;

pub fn search_files_parallel(pattern: &Regex, files: &[PathBuf]) -> Vec<Match> {
    files
        .par_iter()  // Parallel processing with zero data races
        .filter_map(|file| search_single_file(pattern, file))
        .flatten()
        .collect()
}

The performance difference is real. ripgrep consistently beats grep by 2-5x on large codebases.

Infrastructure and DevOps

This is where Rust really shines. Building reliable, performant infrastructure tools:

// Discord switched from Go to Rust for their message cache
use dashmap::DashMap;  // Concurrent HashMap
use tokio::sync::RwLock;

pub struct MessageCache {
    channels: DashMap<u64, RwLock<Vec<Message>>>,
}

impl MessageCache {
    pub async fn add_message(&self, channel_id: u64, message: Message) {
        // Thread-safe operations without data races
        let channel = self.channels
            .entry(channel_id)
            .or_insert_with(|| RwLock::new(Vec::new()));
        
        channel.write().await.push(message);
    }
}

Discord's switch from Go to Rust for their message handling reduced latency and improved reliability. When you're handling millions of concurrent users, that matters.

Where Rust Still Struggles (And Why)

Rapid Prototyping: The Borrow Checker Is Not Your Friend

I love Rust for production code, but when I need to quickly test an idea or build a throwaway script, I reach for Python every time.

# Python: Quick data analysis
import pandas as pd
df = pd.read_csv('sales.csv')
print(df.groupby('region').sales.sum().sort_values(ascending=False))

# 3 lines, runs immediately
// Rust: Same thing, but...
use polars::prelude::*;

fn main() -> PolarsResult<()> {
    let df = LazyFrame::scan_csv("sales.csv", ScanArgsCSV::default())?
        .groupby([col("region")])
        .agg([col("sales").sum()])
        .sort("sales", SortOptions::default().with_order_descending(true))
        .collect()?;
    
    println!("{}", df);
    Ok(())
}

Plus compilation time, plus fighting the borrow checker for 20 minutes because you're trying to mutate something while iterating over it. For exploration and quick scripts, Python wins by a landslide.

Data Science: The Ecosystem Just Isn't There

I've tried building ML pipelines in Rust. The libraries exist (candle, linfa, ndarray), but the ecosystem is years behind Python.

# Python ML pipeline - established and mature
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pandas as pd

df = pd.read_csv('data.csv')
X = df.drop('target', axis=1)
y = df['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
print(f"Accuracy: {model.score(X_test, y_test)}")

The Rust equivalent requires significantly more code, has fewer algorithm implementations, and lacks the rich ecosystem of visualization and data manipulation tools that Python offers.

Plus, data science is inherently exploratory. Jupyter notebooks, interactive REPLs, and quick iteration matter more than compile-time safety.

Web Development: Mixed Results

I've built web services in both Node.js and Rust. Rust can be blazingly fast, but the development experience is still rough compared to more mature ecosystems.

// Express.js: Quick API
const express = require('express');
const app = express();

app.get('/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json(user);
});

app.listen(3000);
// Deploy to production in minutes
// Rust equivalent with Axum
use axum::{
    extract::Path,
    response::Json,
    routing::get,
    Router,
};

async fn get_user(Path(id): Path<u32>) -> Json<User> {
    // Database query with proper error handling...
    Json(User { id, name: "John".to_string() })
}

#[tokio::main]
async fn main() {
    let app = Router::new()
        .route("/users/:id", get(get_user));
    
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000")
        .await
        .unwrap();
        
    axum::serve(listener, app).await.unwrap();
}

The Rust version is more verbose, takes longer to write, and requires deeper understanding of async programming and error handling. For most web APIs, the performance benefits don't justify the complexity.

The Learning Curve Is Real

Here's what nobody tells you about Rust adoption:

Developer Productivity
     ^
     |    Python/JS
     |   /
     |  /
     | /
     |/
     |      Rust starts here
     |       \
     |        \____
     |             \______
     |                   \_____ The borrow checker valley of despair
     +--------------------------------> Time
     0   1w   1m   3m   6m   1y

Weeks 1-4: "Why won't this compile?" Fighting basic ownership concepts. Months 1-3: Understanding the borrow checker, learning to think in Rust patterns. Months 3-6: Finally becoming productive, appreciating the safety guarantees. 6+ months: Rust productivity matches other languages, plus you get the safety benefits.

Most developers give up in the first month. The ones who stick with it tend to become evangelists because they finally "get it."

When to Actually Choose Rust

After building multiple projects in Rust, here's my honest assessment:

Choose Rust when:

  • Performance is genuinely critical (not just "nice to have")
  • Memory safety matters (systems programming, security-sensitive code)
  • You're building long-term infrastructure that needs to be reliable
  • You have time to invest in the learning curve
  • You're replacing C/C++ code

Don't choose Rust when:

  • You need to prototype quickly
  • Your team is unfamiliar with systems programming concepts
  • The ecosystem is immature for your domain
  • Development speed matters more than runtime performance
  • You're building typical web apps or business logic

The Real Industry Picture

Big Tech Adoption:

  • Microsoft: Windows components, Azure services
  • Meta: Build tools, storage systems
  • Google: Fuchsia OS, Chrome components
  • Amazon: Firecracker, Lambda runtime components

Startup Success Stories:

  • Discord: Switched from Go to Rust for performance
  • Dropbox: Rewrote storage engine in Rust
  • 1Password: Security-critical components in Rust

But notice what they're NOT rewriting in Rust: web frontends, business logic, data pipelines, machine learning models. They're using Rust for the performance-critical, safety-sensitive foundation layers.

My Prediction

Rust will continue eating the systems programming world - operating systems, browsers, databases, infrastructure tools, embedded systems. It's genuinely better than C/C++ for these use cases.

But it won't replace Python for data science, JavaScript for web development, or Swift/Kotlin for mobile apps. Those languages excel in their domains for good reasons.

The future isn't "Rust everywhere" - it's "Rust where it makes sense." And that's actually a lot of places, just not all places.

If you're thinking about learning Rust, ask yourself: Do I work on performance-critical systems? Do I value long-term maintainability over rapid iteration? Am I willing to invest months in learning a fundamentally different way of thinking about memory and ownership?

If yes, Rust might change how you think about programming. If no, stick with what you know and use Rust tools built by others.