Get AI summaries of any video or article — Sign up free
I built 10 web apps... with 10 different languages thumbnail

I built 10 web apps... with 10 different languages

Fireship·
5 min read

Based on Fireship's video on YouTube. If you like this content, support the original creators by watching, liking and subscribing to their content.

TL;DR

A full-stack framework is judged by database abstraction (ORM + migrations), routing from URL to server code, and dynamic HTML rendering—often organized as MVC.

Briefing

Building the same CRUD-style web app ten times across ten full-stack frameworks—each tied to a different programming language—ended with a blunt conclusion: Ruby on Rails is the best overall choice for most developers. The comparison wasn’t about raw performance or language popularity; it focused on the day-to-day developer experience: setup friction, routing and architecture patterns, database integration, and how much “magic” the framework hides to speed up common tasks.

The starting point was a practical definition of what a web framework must do. Most full-stack frameworks provide (1) an abstraction over relational databases, often via an object-relational mapper (ORM) that maps code-level models to SQL and supports migrations; (2) routing that connects browser URLs to server-side code; and (3) a way to render database-backed data into HTML, typically aligning with Model-View-Controller (MVC). That MVC framing became the yardstick for evaluating each ecosystem.

Ruby on Rails set the tone early. It’s “batteries included,” with a powerful CLI that scaffolds models, controllers, views, and migrations. Routes are defined in a routes file and map URL patterns to controller actions; Active Record handles the ORM layer and migrations; and views use embedded Ruby (ERB) to inject dynamic data into HTML. The workflow emphasizes separation of concerns and strong conventions, letting developers achieve a lot with relatively little code. Rails also leans into an opinionated approach, which can feel like magic—useful for speed, but potentially frustrating if the hidden behavior doesn’t match expectations.

Django offered a different balance: a similarly batteries-included setup, but with more explicit structure. Routing lives in urls.py, controllers are Python functions, and templates embed Python logic. Django’s built-in admin interface stood out as a major productivity win for managing data without building custom tooling.

Next.js flipped the default assumptions by being minimal about backend concerns. It integrates React directly and uses file-system routing, but it doesn’t ship with database integration. The workflow leans on adding Prisma for ORM/database access and using server-side data fetching (like getServerSideProps) to deliver data to React components. That tight coupling between server and client code can blur separation-of-concerns, but it also streamlines development.

Other frameworks highlighted tradeoffs. Laravel (PHP) emphasized HTML-friendly templating and a rich ecosystem, including inertia for bridging front-end frameworks with backend routing. Spring (Java) felt robust but heavier, relying on metaprogramming and templating via Thymeleaf. ASP.NET (C#) delivered strong tooling and static typing with MVC conventions, though it comes with Microsoft-centric ecosystem gravity. Phoenix (Elixir) leaned into performance and a built-in live dashboard, while Go’s Gin prioritized low-level control with less MVC structure. Rocket (Rust) proved harder to assemble into a full working MVC-like experience, and Vapor (Swift) delivered a polished, concise, statically typed developer experience—especially on macOS.

After walking through all ten ecosystems—plus a brief mention of Kor—the final verdict landed on Rails. The “magic Jordan” framing wasn’t subtle: despite the variety of languages and architectures, Rails’ conventions, scaffolding, and integrated MVC workflow made it the most consistently effective full-stack framework across setup, routing, database work, and UI rendering.

Cornell Notes

The walkthrough compares ten full-stack frameworks built around ten different languages, using developer experience as the main metric: setup, routing, database integration, and how data flows into HTML. It defines the core job of a web framework as database abstraction (usually via an ORM and migrations), URL-to-server routing, and dynamic HTML rendering—commonly organized as MVC. Rails stands out for being “batteries included,” with a powerful CLI for scaffolding, Active Record for ORM/migrations, and ERB for templated views, all driven by strong conventions. Other frameworks show different tradeoffs: Django’s admin is a standout, Next.js is minimal and relies on Prisma plus server-side data fetching, and Phoenix emphasizes performance with a live dashboard. The final conclusion is that Rails is the best all-around choice for most developers.

What three capabilities do most full-stack frameworks need to deliver, and why do they matter for MVC?

Most frameworks provide (1) a database abstraction layer, typically an ORM that maps code models to SQL and supports migrations; (2) routing that maps browser URLs to server-side code; and (3) a way to render database-backed data into HTML dynamically. Together, these align naturally with Model-View-Controller (MVC): models represent data and business logic, controllers handle requests and orchestrate work, and views generate HTML using data from the model.

Why does Rails feel unusually fast for common CRUD work?

Rails is “batteries included” and opinionated. Its CLI can scaffold large chunks of an app automatically (including controllers, views, and migrations). Routing is defined in routes.rb to map URLs to controller actions. Active Record manages ORM behavior and migrations to sync model code with the database. Views use ERB (embedded Ruby) to inject data into HTML, so the full request-to-render loop is tightly integrated.

How does Django’s structure and tooling differ from Rails in day-to-day development?

Django’s project layout is less overwhelming than Rails, but it remains batteries included. Routing is defined in urls.py, and controllers are represented as Python functions. Templates embed Python logic. A major practical advantage is Django’s built-in admin: once models are defined and registered, data can be managed through a browser UI without building custom admin tooling.

What makes Next.js a different kind of full-stack framework compared with MVC-first systems?

Next.js is minimal about backend defaults. It integrates React into the framework and uses file-system routing where each file in the Pages directory maps to a URL (with dynamic routes via bracketed filenames). It doesn’t include database integration out of the box, so developers add Prisma. Data fetching can run on the server using functions like getServerSideProps, then pass results as props to React components—tight coupling that can blur separation-of-concerns but often speeds development.

Where does Go’s Gin approach land on the MVC spectrum?

Gin is described as minimal and not concerned with MVC conventions. There’s no built-in ORM, so a package like gorm is added. Instead of relying on framework conventions, developers write focused functions and interpolate values into templates directly. This yields a smaller codebase and more low-level control, but it can become harder to maintain as an app grows.

What tradeoff did the walkthrough highlight for Rust with Rocket?

Rocket can handle HTTP and routing, but the walkthrough pairs it with diesel for ORM and a templating layer (ascoma) to render HTML. Even with that assembly, building a basic working demo proved difficult, and the systems-level nature of Rust adds complexity that many web developers don’t need for typical application work.

Review Questions

  1. Which framework components correspond to models, controllers, and views in the walkthrough’s MVC definition?
  2. Compare Rails and Next.js on database integration and routing: what’s built-in vs what must be added?
  3. Pick one “high-performance” or “minimal” framework from the list and explain what you gain and what you risk as the app grows.

Key Points

  1. 1

    A full-stack framework is judged by database abstraction (ORM + migrations), routing from URL to server code, and dynamic HTML rendering—often organized as MVC.

  2. 2

    Rails’ developer workflow is powered by scaffolding via its CLI, Active Record for ORM/migrations, and ERB templates for injecting data into HTML.

  3. 3

    Django’s built-in admin is a major productivity lever because it lets developers manage registered models through a browser without extra tooling.

  4. 4

    Next.js prioritizes React integration and file-system routing, then relies on external database tooling like Prisma and server-side data fetching such as getServerSideProps.

  5. 5

    Some frameworks trade conventions for control: Gin avoids MVC conventions and requires more manual structure as projects scale.

  6. 6

    Performance-oriented ecosystems like Phoenix emphasize runtime characteristics and include built-in operational tooling such as a live dashboard.

  7. 7

    After comparing setup, architecture, and integration across languages, Rails is the final “best overall” choice in the walkthrough’s verdict.

Highlights

Rails combines scaffolding, Active Record migrations, and ERB templating into a tightly integrated MVC workflow that speeds up CRUD development.
Django’s admin feature stands out as a ready-made data management layer once models are registered.
Next.js is minimal by default—React and file-based routing are built in, but database integration typically requires adding Prisma.
Go’s Gin favors low-level control and minimal conventions, which can keep early projects small but complicate growth.

Topics