Rewrite It in Rails
A real-world account of attempting to rewrite a Ruby on Rails app in Rust and SvelteKit has reignited debate over when it makes sense to abandon a mature web framework. Many argue that Rails, Django and similar “batteries-included” stacks still maximize productivity and product focus for typical CRUD applications, while lower-level or younger ecosystems (Rust, Go, TypeScript backends) often slow teams down with missing tooling and architectural decisions. Others counter that static typing, performance, and energy efficiency justify moving away from Ruby, but most agree the trade-offs depend heavily on scale, team expertise, and whether developer time or raw efficiency is the primary constraint.
Rails as a Pragmatic Choice
- Many see Rails as uniquely productive for CRUD / business web apps, letting teams ship features fast and focus on users rather than plumbing.
- Others argue its “magic” and lack of strong typing make large apps harder to refactor and maintain, especially compared to typed stacks.
- Some note that pain often comes from team discipline and architecture, not Rails itself; with care, large Rails apps can be fast and maintainable.
Frameworks vs. Languages
- Strong theme: don’t compare Rails to bare languages (Go, Rust, TypeScript) but to full stacks (Django, Laravel, Spring, ASP.NET, AdonisJS).
- Batteries‑included frameworks are praised for eliminating decision fatigue and giving common patterns for auth, ORM, jobs, migrations, etc.
- Lightweight stacks (Flask, FastAPI, Node+Express, minimal Go/Rust frameworks) are seen as fun and flexible but prone to ad‑hoc, messy architectures.
Rust, Go, and “Systems” Languages for Web Apps
- Several say Rust (and sometimes Go) is a poor fit for typical CRUD apps due to ecosystem immaturity, async complexity, long compile times, and slower iteration.
- Others report good experiences with Rust backends, emphasizing safety, reliability, and good fit for small services or FaaS/containers.
- Consensus: Rust shines when you truly need its performance and memory guarantees; otherwise the tradeoff in productivity is questionable.
Static Typing vs. Dynamic Typing
- Many find it hard to “downgrade” from TypeScript/C#/Kotlin to Ruby, citing the value of static types for refactoring and reducing trivial bugs.
- Ruby’s typing efforts (Sorbet, RBS, rbs‑inline) are viewed as promising but still clunky compared to Python or TypeScript annotation syntax.
- Others argue optional/static typing in dynamic languages can be ecosystem‑disruptive and that tests plus discipline are sufficient.
Performance, Scaling, and Energy
- Some claim Rails is inherently slow and wasteful, even invoking climate concerns; others strongly dispute “100x” energy or server‑cost differences as exaggerated or unmeasured.
- Counterexamples like large Rails deployments are cited; argument: early productivity and “fast enough” performance usually matter more than theoretical peak RPS.
- Database design and caching are repeatedly highlighted as more critical bottlenecks than framework choice.
Alternatives and Ecosystems
- Django and Laravel are frequently mentioned as Rails‑class options; Django especially praised for docs and admin; Laravel for Filament/Livewire.
- Java/Kotlin stacks (Spring, Ktor, Quarkus), ASP.NET Core, and AdonisJS are noted as high‑productivity, typed alternatives.
- Some complain modern TypeScript/Node stacks become convoluted, with deep indirection and many small decisions.
Frontend, Admin, and Architecture
- Rails plus Hotwire or React is liked by some; others feel Rails lags Next.js‑style frontend ergonomics (e.g., images, asset pipeline integration).
- Built‑in or easy admin interfaces (Rails admin gems, Django admin, Laravel+Filament) are seen as major productivity wins.
- Mixed‑language architectures (e.g., Rails/Django core plus Rust services or DB sprocs) are described as powerful but more complex to operate.
Rewrites and Familiarity
- Strong thread: full rewrites often waste time; users rarely benefit from language churn.
- Many argue the best choice is usually the ecosystem the team already knows well, unless there’s a clear, concrete reason to switch.