DOWNFALL.SYS
RAM 48 MBREC
$ npm install react
added 1247 packages in 38s
$ size dist/main.js
4.2 MB (gzipped: 1.1 MB)
warn: 'lodash' is 73 KB to capitalize a string
$ ps aux | grep electron
electron 487 MB 6.4% CPU Hello World.app
// TODO: investigate memory leak (2019)
import { useState } from 'react'
fatal: dependency tree exceeded depth 9
EST. 1945 — 2025A DIAGNOSIS
IN NINE PARTS
── CASE FILE / 001 ──

The
Downfall
of Programming

We were promised faster hardware.
Instead, we used it to hide slower software.
▼ SCROLL
to see where the performance went.
EST. RAM SPENT READING
~ 312 MB
1247 DEPENDENCIES TO PRINT 'HELLO WORLD'487 MB IDLE — MODERN HELLO WORLDDENNARD SCALING ENDED 2005WIRTH'S LAW STILL UNDEFEATEDELECTRON IS A BROWSER PRETENDING TO BE AN APPTHE LAYER COUNT IS THE BUG1247 DEPENDENCIES TO PRINT 'HELLO WORLD'487 MB IDLE — MODERN HELLO WORLDDENNARD SCALING ENDED 2005WIRTH'S LAW STILL UNDEFEATEDELECTRON IS A BROWSER PRETENDING TO BE AN APPTHE LAYER COUNT IS THE BUG
02THEN / NOW

Hello World, 487 MB later.

1998 / NATIVE C
$ ./hello
Hello, World!
$ time ./hello
real 0m0.004s
user 0m0.001s
  • Opens instantly
  • 1.5 MB resident memory
  • Single static executable
  • Six engineers, no PM
  • No telemetry
  • No Electron
  • No framework
2025 / "MODERN HELLO WORLD"
$ npm create hello-world@latest
├── react@19.2.0
├── react-dom@19.2.0
├── @types/react@19.0.0
├── webpack@5.100.0
├─┬ @babel/core@7.25.0
│ ├── @babel/runtime@7.25.0
│ └── (412 transitive deps)
├── electron@33.0.0
├── chromium@130.0.6723.0
├── eslint@9.10.0
└── ...1239 more packages
  • 487 MB resident memory
  • 1,247 dependencies
  • 4.8 second cold start
  • Bundled Chromium runtime
  • node_modules: 312 MB
  • Telemetry on by default
  • CPU fans audible
RAM
0MB
was 1.5MB in 1998
STARTUP
0s
was 0.04s in 1998
DEPENDENCIES
0
was 0 in 1998
BINARY
0MB
was 0.12MB in 1998
03WIRTH'S LAW / 1995
"Software gets slower faster than hardware gets faster."
— NIKLAUS WIRTH · A PLEA FOR LEAN SOFTWARE · 1995
FREQUENCY (GHz) vs MEMORY (GB)1990 → 2025
CPU GHz (single thread)Browser RAM usage~4 GHz ceiling, c. 2005DENNARD SCALING ENDS
DENNARD SCALING
For 30 years, transistors got smaller, faster, and cooler at the same time. Around 2005 the free lunch ended.
SINGLE-THREAD CEILING
Clocks plateaued near 4 GHz. Performance now hides inside cores you mostly don't use.
SOFTWARE INDUSTRY
Never got the memo. Continued to ship features as if Moore's Law was still paying the bill.
04THE ABSTRACTION TRAP

One button. Eight layers between you and the silicon.

01 · Operating System
02 · Browser
03 · JavaScript Engine
04 · Bundler Output
05 · Runtime
06 · State Manager
07 · Design System
08 · Component Library
Click me

We did not engineer this.
We accumulated it.

05THE MODERN ENGINEER

A generation that ships what it cannot explain.

01

The plumber economy.

Most engineers connect pipes between SaaS endpoints. The systems beneath them are sealed, opaque, and someone else's problem.

02

Framework first, problem second.

Stack picked before the requirements. Architecture written for the resume, not the user.

03

Microservice as theology.

Eight services to send an email. A distributed monolith with worse latency and a Slack channel.

04

Hire to ship, not to know.

Velocity rewarded. Comprehension optional. Nobody on the team can describe what happens after the curl.

~/project $ npm install
├── @aws-sdk/client-s3@3.654.0 ├── lodash.isequal@4.5.0 ├── @babel/core@7.25.7 ├── micromatch@4.0.8 ├── @babel/preset-env@7.25.7 ├── nanoid@5.0.7 ├── @emotion/react@11.13.3 ├── ora@8.1.0 ├── @emotion/styled@11.13.0 ├── postcss@8.4.47 ├── @floating-ui/react@0.26.24 ├── prettier@3.3.3 ├── @hookform/resolvers@3.9.0 ├── prop-types@15.8.1 ├── @next/font@14.2.13 ├── react@19.0.0 ├── @opentelemetry/api@1.9.0 ├── react-dom@19.0.0 ├── @prisma/client@5.20.0 ├── react-helmet@6.1.0 ├── @radix-ui/react-* (37 packages) ├── react-hook-form@7.53.0 ├── @sentry/nextjs@8.30.0 ├── react-i18next@15.0.2 ├── @stripe/stripe-js@4.5.0 ├── react-query@3.39.3 ├── @swc/core@1.7.26 ├── recoil@0.7.7 ├── @tanstack/react-query@5.56.2 ├── redux-toolkit@2.2.7 ├── @types/* (84 packages) ├── rxjs@7.8.1 ├── @vercel/analytics@1.3.1 ├── sharp@0.33.5 ├── axios@1.7.7 ├── socket.io-client@4.8.0 ├── chalk@5.3.0 ├── styled-components@6.1.13 ├── chokidar@3.6.0 ├── tailwindcss@3.4.13 ├── classnames@2.5.1 ├── three@0.168.0 ├── core-js@3.38.1 ├── tslib@2.7.0 ├── d3@7.9.0 ├── typescript@5.6.2 ├── date-fns@3.6.0 ├── uuid@10.0.0 ├── dotenv@16.4.5 ├── webpack@5.94.0 ├── eslint@9.11.1 ├── workbox-webpack-plugin@7.1.0 ├── ... and 1,189 more packages. └── zod@3.23.8 added 1247 packages, audited 23,841 in 47s 38 vulnerabilities (12 moderate, 19 high, 7 critical)
06BENCHMARK / OPENING ONE LOG FILE

You can argue with opinions.
You cannot argue with a stopwatch.

TEST
Open one 1 MB log file.
A — Native editor (Rust, ~6 MB binary)
B — Popular Electron editor (~312 MB)
CPU: M-class · 16 GB RAM · cold boot
COLD STARTLOWER IS BETTER
A
0.04s
B
4.8s
RAM AT IDLELOWER IS BETTER
A
12 MB
B
487 MB
CPU OPENINGLOWER IS BETTER
A
3%
B
78%
BINARY SIZELOWER IS BETTER
A
6 MB
B
312 MB
07THE SIX-LAYER CATHEDRAL

Indirection became a virtue.

// EnterpriseHelloWorld.java
public class HelloWorldFactoryProvider {
private final HelloWorldFactory factory;
public HelloWorldFactoryProvider(
HelloWorldFactoryConfig config,
AbstractStringRendererStrategy strategy,
SubjectExtractorBuilder builder,
@Inject(name="HW") Logger log,
) { /* 412 lines of wiring */ }
 
public Optional<HelloWorldResponse>
getHelloWorldGreetingAsync(
HelloWorldRequestContext ctx
) { return factory.create(ctx)
.pipe(strategy)
.pipe(builder)
.render(); }
}
OVERENGINEERING

Patterns applied to problems that don't exist yet, in case they someday might.

INDIRECTION

Every concrete thing wrapped in an interface, then a factory, then a config, then a builder.

THE PYRAMID

A six-layer cathedral guarding a function that returns a string.

THE PRINCIPLE

Rules that override common sense and a stopwatch are not principles. They are superstition.

08THE DEBLOATING

The layer count is the bug.

A quiet counter-movement. Static binaries. Fast cold starts. Memory you can hold in your head. Tools that don't ship a browser to render a button.

STACK / PEEL
Electron— removed
Chromium— removed
Node.js— removed
Webpack— removed
Babel— removed
TypeScript— removed
React— removed
your_program6 MB · 0 deps
ZIG
comptime, no hidden allocs
RUST
ownership, zero-cost abstractions
GO
static binary, fast compile
BUN
all-in-one, no node_modules torture
MOJO
Python ergonomics, native speed
LOW-LEVEL
knowing what your code costs
STATIC BINARIES
One file. No runtime to install. It just runs.
LOW MEMORY
Megabytes, not gigabytes. Your laptop fan stays quiet.
COLD STARTS
Milliseconds. The cloud bill notices.
09THE BILL
CLOUD BILL
$184k
/mo
BATTERY DRAIN
47%
/hr
RAM USAGE
12.4 GB
idle
COLD START
4.8s
p99
DEPENDENCIES
1,247
direct + transitive

The future of software is not adding more abstractions. It is removing the ones we never needed.

Peel back the layers.

If you cannot explain what your framework does underneath,

your stack owns you.

Debloating is not nostalgia.

It is economics.