# How to Choose

Here's where guides usually fail you: they either crown a winner ("learn Python, trust me") or drown you in
"it depends" and leave. Let's do neither - you now have the map from Phases 1 and 2, and this phase turns it
into a decision you can make today and feel good about, releasing you from the fear that you'll pick wrong.

A note on what follows: the table is fact. The recommendations are *judgment* - reasonable, but mine, and
flagged as such. Your situation can override any of them.

## The side-by-side

```text
                Python        JavaScript/Node   Go             Rust
  ----------------------------------------------------------------------------
  Typing        dynamic       dynamic           static         static
                              (TS adds static)
  Memory        garbage       garbage           garbage        ownership
                collected     collected         collected      (no GC)
  Runs as       interpreted   interpreted/JIT   compiled       compiled
                              (everywhere)      (one binary)   (one binary)
  Learning      gentle        gentle            gentle-ish     steep
  Speed         modest        good              fast           very fast
  Best for      data, AI,     web (front +      servers, APIs, systems, perf-
                scripting,    back), async      cloud tooling, critical, safety
                glue          I/O               CLIs           -critical work
```

Read across a row to compare one trait; read down a column to get a feel for one language. Notice there's no
"score" row - because the right choice depends on what's *below*, not on a number.

## Choose by what you're building (the strongest signal)

*Judgment, but well-worn:* the single most reliable way to pick is to start from the thing you want to make.

| If you want to build… | A natural fit | Why |
|---|---|---|
| Anything in the web browser (interactive pages, front-end apps) | **JavaScript** (likely TypeScript) | It's the only language that runs natively in the browser - there's no real contest here |
| Data analysis, machine learning, AI, scientific work | **Python** | The entire data/AI ecosystem is Python-first; you'd be swimming upstream elsewhere |
| Quick scripts to automate annoying tasks | **Python** | Readable, batteries-included, fast to write - perfect for "just make this go away" jobs |
| A web backend / API, especially with a JS front end | **JavaScript/Node** or **Go** | Node lets you share one language across the stack; Go gives you a fast, simple, single-binary server |
| Cloud infrastructure, DevOps tools, CLIs | **Go** | Fast compiles, single deployable binary, great concurrency - it's what much of the cloud is written in |
| Operating systems, game engines, embedded devices, anything where speed and safety are the whole point | **Rust** | Its reason for existing; nothing else gives you C-level speed with memory safety and no GC |

If your goal is in this table, you have your answer. Everything below is for when it isn't clear-cut.

## Choose by the people around you (the underrated signal)

*Judgment, and I'll defend it hard:* the language your team, mentor, course, or local job market already uses
is a genuinely excellent reason to pick it - often better than any property in the table.

Code is a team sport. A language where someone can answer your questions, review your work, and hand you a
working setup will carry you further in your first year than a "technically superior" language you're learning
alone in the dark. If everyone around you writes Python, learning Python means help is everywhere - don't
discount this. "What can I get help with?" is a real engineering criterion, not a cop-out.

## Choose by how it'll feel (a quieter signal)

Languages have personalities, and yours matters a little:

- If you want to *feel productive fast* and see results quickly, the dynamic, gentle ones - **Python**,
  **JavaScript** - reward you early.
- If you like the **compiler catching your mistakes** and don't mind a bit more structure, the static ones -
  **Go**, **Rust** - will feel reassuring rather than restrictive.
- If you're drawn to understanding **how machines really work** down to the metal, **Rust** is a phenomenal
  (if demanding) teacher - but it's a hard *first* language.

This is the weakest signal of the three. Use it to break ties, not to overrule "what I'm building" or "who can
help me."

## The reassurance you actually came for

Now the part the hype machine never tells you, and the most important thing in this guide:

💡 **Your first language matters far less than the internet makes you believe.** The hard part of programming
isn't the language - it's learning to think in problems and solutions: breaking a task into steps, naming
things well, debugging when reality disagrees with you, structuring code so it doesn't collapse under its own
weight. Those skills are **portable**. They transfer to every language you'll ever touch.

The axes from [Phase 1](01-what-makes-languages-different.md) make this concrete. Once you've internalized
what a *type* is, what *compiled vs interpreted* means, and how *memory* gets managed, you've learned the deep
structure that every language is just a different arrangement of. Learning your *second* language is
dramatically easier than your first, because you're only learning new spelling for ideas you already own - and
your *third* is easier still.

Two specific ideas pay off no matter which language you pick:

- How a language *thinks* about organizing code - objects and behavior versus functions and data - is a choice
  most languages let you lean either way on. That whole landscape is its own guide:
  [OOP vs Functional](/guides/oop-vs-functional).
- How a language *handles memory* is the axis that most separates the "easy" languages from the "fast" ones -
  and understanding it makes the Python-vs-Rust difference click. The full picture is in
  [Memory & Garbage Collection](/guides/memory-and-garbage-collection).

🪖 **From the trenches.** Plenty of working engineers started with a language they no longer use, picked
because a friend knew it or a course required it. It didn't hold them back one bit - the thinking carried over,
and switching languages later took weeks, not years. The people who *do* get stuck are usually the ones who
spend six months agonizing over the "perfect" choice instead of writing six months of code. Pick a reasonable
one. Start building. You can change your mind later, and you'll be better at choosing because you'll have real
experience instead of opinions.

## Recap

1. **Start from what you're building** - it's the strongest, clearest signal, and it usually decides for you.
2. **Weigh the people around you** - help, review, and a job market beat abstract language merits, especially
   early on.
3. **Let feel break ties** - gentle and dynamic for fast results, static for compiler safety, Rust if you want
   to learn the machine (but not as a first language).
4. **Relax about the choice** - the real skills are portable; your first language is a starting point, not a
   life sentence. Concepts transfer, and the second language is far easier than the first.

You came in facing a wall of equally-loud options. You leave with a map, four clear profiles, and a way to
choose on purpose. The best next step isn't more comparing - it's writing your first real program in whichever
one you picked. Go build something.
