Rust Is Not a General-Purpose Language (And That’s Okay): A candid discussion of Rust’s niche in the tech world
This is not a takedown. It’s a map. Rust excels in a handful of high-leverage places, and pretending it should be everywhere helps no one — not you, not your team, not your users. How to read this (format) We’ll use a Thesis → Anti-thesis → Synthesis format for each point:
- Thesis: a commonly held belief about Rust
- Anti-thesis: where that belief breaks
- Synthesis: the practical guidance you can actually ship
1) Safety & Control Thesis Rust is the best way today to get C/C++-class control with strong memory safety. Anti-thesis Safety is not free. Ownership, lifetimes, and borrow rules impose a design tax up front. You can’t “yak shave later” the way you might in a GC’d language. Synthesis Use Rust when memory discipline is the problem (embeddeds, kernels, parsers, perf-critical libs). If “most bugs” on your team are product logic and integration glue, the safety dividend shrinks. 2) Performance & Tail Latency Thesis Zero-cost abstractions, predictable allocations, and explicit async yield tight p95/p99. Anti-thesis Most web apps are I/O bound, not CPU bound. The bottleneck is the DB, cache, or network — and Rust won’t make Postgres faster. Synthesis Pick Rust when your hot path is CPU/alloc-dominated (serialization, compression, crypto, vector math). Otherwise, solve the queue depth, indexes, chatty calls, and retry storms first. 3) Async & Concurrency Thesis async/await + executors give powerful, explicit concurrency without runtime surprises. Anti-thesis It’s sharp. Pinning, lifetimes in async contexts, and manual backpressure are a steep ramp. Teams new to Rust often rebuild a bespoke runtime by accident. Synthesis If you need bounded, predictable concurrency for a small surface area, Rust is excellent. For broad API surfaces with lots of I/O, languages with simpler concurrency ergonomics often ship faster. 4) Developer Velocity & Onboarding Thesis Once you “get” Rust, you write fewer classes of bugs and refactor bravely. Anti-thesis The time-to-first-merge is longer. The borrow checker is a mentor, but it’s a tough one. Hiring and on-call coverage can become bottlenecks. Synthesis Adopt Rust incrementally: a library, a sidecar, or a single hot function behind FFI — not a platform rewrite. Budget training and template repos. Give on-call a single operational shape (logs, errors, traces). 5) Ecosystem & Tooling Thesis Cargo is a joy; the compiler messages are best-in-class. Anti-thesis Bread-and-butter “product plumbing” (RBAC, payments, admin consoles, BI integrations) has shallower grooves than Java/Go/JS ecosystems. You’ll write glue. Synthesis Reach for Rust where the library surface is mature (systems, CLI, WASM modules, networking primitives, data engines). Reach for mature ecosystems when you need compliance-heavy or integration-heavy delivery. 6) Team Topology Thesis A single language across the stack reduces cognitive load. Anti-thesis Forcing Rust everywhere increases cognitive load for most teams right now. You’ll trade one kind of complexity (polyglot) for another (onboarding depth). Synthesis Be bilingual with intent: Rust for the few critical miles, another stack for the many everyday miles. Standardize observability so ops stays uniform. 7) Long-Term Maintainability Thesis Rust’s type system and ownership model resist whole classes of decay. Anti-thesis Ergonomic friction can push teams to “work around the type system” (over-generic code, gratuitous unsafe, megastructs). Then you lose the benefits. Synthesis Codify house rules: keep APIs flat, prefer composition over deep generics, isolate unsafe, and enforce perf budgets in CI (allocations, binary size). 8) Where Rust Is a Terrific Fit (today)
- Hot paths: parsers, encoders/decoders, crypto, compression, vectorized compute
- Infra & runtimes: proxies, schedulers, DB/storage engines, message clients
- Edge & embedded: tight memory/CPU envelopes, safety critical paths
- FFI modules: drop-in acceleration for Python/Node/Java/Go stacks
- WASM: safe high-perf modules for plugins and in-browser compute
9) Where Rust Is Usually Not the Best First Choice
- CRUD-heavy SaaS where iteration speed, dashboards, and integrations dominate
- Large enterprise surfaces with heavy policy/compliance where existing platforms shine
- Teams with high rotation that need shortest time-to-contribution
(Could you build these in Rust? Yes. Should you? Only if a profiler — not a preference — says the hot path will pay the bill.) 10) A Small, Honest Architecture Pattern One service, two lanes:
- Everything-Else Lane (Java/Go/Kotlin/Node): HTTP, auth, workflows, DB, messaging
- Hot-Path Lane (Rust): a single function (or small set) behind a stable FFI or RPC contract
- Feature flag to flip lanes in a minute; unified logs/metrics/traces so ops stays boring
This respects Rust’s strengths without making the whole org learn lifetimes tomorrow. 11) The Budget You Must Approve (before writing Rust at work)
- Learning: workshops + pair programming (weeks, not hours)
- Templates: lint rules, crate scaffolds, CI, security scans
- Observability: shared error taxonomy, trace propagation, panic hooks
- Runbooks: crash loops, backpressure, upgrade steps
- Exit plan: how to delete/rollback the Rust component fast
No budget? Don’t start. It’s not fair to your future on-call. 12) The “Three Yes” Rule (adoption test) Adopt Rust for a component only if you can answer yes to all three:
- Hotspot proven: CPU/alloc profile shows a clear win if optimized
- Isolation: the boundary can be flat and versioned (no object graphs crossing)
- Operations: rollback in one minute; observability is uniform
If any answer is no, improve your current stack first. 13) Rust’s Brand of Honesty Rust doesn’t hide cost. It makes you pay upfront — in design, in lifetimes, in ownership. That’s not a flaw; it’s the point. When your problem needs that kind of honesty, Rust feels like cheating. When your problem needs feature velocity and integrations, pick something that optimizes for that instead. Closing (Commitments, Not Claims)
- I commit to using Rust where performance changes the business, not where it merely wins a benchmark.
- I commit to boundaries I can explain on a whiteboard: flat DTOs, versioned, testable, and easy to roll back.
- I commit to making my team faster, not just my code faster — picking the tool that gets both users and on-call a better night’s sleep.
Rust isn’t a general-purpose hammer. It’s a precision tool. Use it like one — and your system, your schedule, and your pager will thank you.
Read the full article here: https://medium.com/@noahblogwriter2025/rust-is-not-a-general-purpose-language-and-thats-okay-a-candid-discussion-of-rust-s-niche-in-4851d9afeb68