AI coding assistants now write a large share of the first draft of ordinary code. That has not made learning to program pointless; it has changed which parts are scarce. Typing out a CRUD handler is cheap. Knowing that the handler needs an index, an idempotency key and a timeout, and being able to prove that the generated version has them, is not.
This guide is for developers deciding what to study next, whether you have one year of experience or ten. It sets out a layered model of what to learn, explains why each layer matters when an assistant is doing some of the typing, shows how to study with an assistant without hollowing out your own skill, and ends with a worked 12-month plan and a checklist you can start this week. It is the umbrella page; the AI engineer and backend engineer roadmaps on this site go deeper on two of the tracks.
What changed, and what did not
Three things changed. First, generating plausible code became nearly free, so the bottleneck moved to specifying what should be built and checking that what was built is correct. Second, a new class of software component appeared: a probabilistic model called over an API, whose output must be evaluated statistically rather than asserted once. Third, the tools themselves became agents that read files, run commands and act with your permissions, which makes security and review part of daily work rather than a separate phase.
What did not change is the physics underneath. Networks still drop packets, disks still fsync slowly, two writers still race, and a query without an index still scans the table. Generated code fails in exactly the ways hand-written code fails, only faster and with more confidence. The engineers who get the most out of assistants are the ones who can read a diff and see the missing transaction boundary, and that skill comes from the fundamentals, not from the assistant.
Layer 1: foundations that still compound
Foundations are the knowledge that stays true across frameworks and model generations. They are also what you use to judge generated code, so they matter more with assistants, not less.
- One language, deeply. Not a tour of five. Learn its memory model, error handling, concurrency primitives, packaging and profiler. Depth in one transfers; shallow knowledge of many does not.
- Data structures and complexity. Enough to see that a nested loop over two 100,000-row lists is ten billion steps, and to reach for a hash map, heap or sorted index instead.
- SQL and the relational model. Joins, indexes, transactions and isolation levels. Most production bugs that assistants introduce in data code are isolation or indexing bugs.
- HTTP, TCP and TLS. Status codes, keep-alive, timeouts, retries and what a TLS handshake costs.
- Concurrency. Threads, async I/O, locks, and the idea of a data race.
- Git and testing. Small commits, bisect, unit and integration tests, and property-based tests, which are the best tool for checking generated code.
Useful reading on this site for this layer: thread pools, memory models, MVCC, Postgres indexes, TCP/IP and structured concurrency.
Layer 2: systems knowledge that lets you verify
Most software you will be paid to write is a small part of a larger system: a service that talks to a database, a queue, a cache and three other services, deployed to a cloud account and watched by an on-call rotation. Systems knowledge is what lets you predict how your change behaves in that environment.
Learn how a relational database stores and locks rows, how replication lag shows up as a user seeing stale data, why retries without idempotency create duplicate payments, how a load balancer health check can take a whole fleet out, and how to find the one slow span in a trace. None of this needs a distributed-systems degree; it needs a mental model and a few deliberate experiments.
Reading for this layer: quorums, the outbox pattern, idempotency, caching, distributed traces, burn-rate alerts and cloud IAM.
Layer 3: AI-era practice
This layer is new, and it is where most developers are under-invested. It has two halves. The first is working with AI tools: writing a clear specification, giving the assistant the right context, breaking work into verifiable steps, and reviewing generated diffs for the defects models characteristically produce, such as invented APIs, silently weakened tests and missing error paths. The second is building with AI: calling a model over an API, constraining its output to a schema, giving it tools, grounding it with retrieval, and measuring quality with an evaluation set instead of eyeballing three examples.
Security runs through both halves. An assistant with shell access runs with your credentials, and any model that reads untrusted text can be steered by it. Understanding prompt injection and least privilege is now a baseline developer skill.
Reading for this layer: context engineering, structured output, tool use, golden datasets, eval harnesses, prompt injection and agent sandboxing.
Learning with an assistant without outsourcing understanding
An assistant can make you learn faster or make you stop learning altogether. The difference is whether you do the part that builds the mental model: predicting, explaining and verifying. Asking for an answer and pasting it skips all three.
A loop that works: before running anything, write down what you expect to happen. Run it. If you were wrong, ask the assistant to explain the gap, then check the explanation against primary documentation, because assistants explain wrong things fluently. Finally, rebuild the thing yourself without the assistant. Keep a short learning log so that predictions and surprises accumulate into something you can review.
## 2026-10-14 Postgres row locking (45 min)
Prediction before running: two UPDATEs on the same row in two sessions -> second blocks.
Result: correct. SELECT ... FOR UPDATE SKIP LOCKED skipped the row instead of waiting.
Asked the assistant: why does SKIP LOCKED suit job queues? Checked its answer against the docs.
Wrote it myself: a 30-line job worker using SKIP LOCKED, no assistant.
Open question: what happens to a locked row if the worker crashes mid-transaction?The same instinct applies at work. When the assistant writes code you do not fully understand, do not merge it on the strength of passing tests it may also have written. Write properties the code must satisfy and let a property-based testing library search for counterexamples. This takes minutes and catches the edge cases generated code most often gets wrong: empty input, Unicode, repeated application and boundaries.
# The assistant wrote slugify(); you write the properties it must satisfy.
# pip install hypothesis pytest
from hypothesis import given, strategies as st
from myapp.text import slugify
@given(st.text())
def test_output_is_url_safe(s):
out = slugify(s)
assert all(c.isascii() and (c.isalnum() or c == "-") for c in out)
@given(st.text())
def test_idempotent(s):
assert slugify(slugify(s)) == slugify(s)
@given(st.text())
def test_no_leading_trailing_or_double_dashes(s):
out = slugify(s)
assert not out.startswith("-") and not out.endswith("-") and "--" not in outIf a property fails, you have found a real bug and learned something about the problem. If you cannot think of any properties, you do not yet understand what the function is for, and that is the thing to fix first.
Layer 4: choosing a track
Foundations and systems knowledge are shared. Above them, pick one track to go deep in for at least a year. Depth is what gets you trusted with harder problems; switching tracks later is cheap because the lower layers carry over.
| Track | Core question | Distinctive skills | Good fit if you enjoy |
|---|---|---|---|
| AI engineer | How do I build a reliable product on a model I do not control? | LLM APIs, retrieval, evals, agents, guardrails | product work, fast iteration, measurement |
| Backend engineer | How do I keep state correct under load and failure? | data modelling, transactions, queues, APIs, cloud | correctness, debugging, systems |
| ML systems engineer | How do I make training and inference fast and cheap? | GPUs, kernels, parallelism, serving, quantization | performance, hardware, numerics |
| Data engineer | How do I move and model data so others can trust it? | pipelines, streaming, lakehouse formats, quality | modelling, lineage, scale |
| Platform engineer | How do I make every other team faster and safer? | Kubernetes, CI/CD, IaC, developer experience | tooling, automation, enablement |
Starting points on this site: developer experience, agent deployment architecture, LLM serving with vLLM, quantization and Kafka Streams.
Worked example: a 12-month plan
Consider Priya, a developer with two years of frontend experience in TypeScript who wants to move into backend work with an AI focus. She has about six hours a week. The plan below is built around shipped artefacts rather than courses, because an artefact forces you to meet the problems a course skips.
| Quarter | Focus | Artefact | Evidence it worked |
|---|---|---|---|
| Q1 | One backend language (she picks Go), SQL, HTTP | A URL-shortener API on Postgres with tests and a load test | Explains every index and can show p99 latency before and after |
| Q2 | Transactions, queues, idempotency, observability | Add click events via an outbox and a worker; traces and metrics | Survives a killed worker and a duplicated message with no double count |
| Q3 | LLM APIs, structured output, evals | A feature that tags links by topic with a model, behind a schema and a 150-case eval set | Eval score tracked in CI; a prompt change that lowers it is blocked |
| Q4 | Tools, retrieval, production concerns | A "search my links" assistant with retrieval, per-user access control, timeouts and cost limits | Cannot return another user's links in an adversarial test; cost per query logged |
Each quarter reuses the previous one. The Q3 feature is only trustworthy because Q2 taught her to make background work idempotent and observable. She uses an assistant throughout, but follows two rules: write the prediction before running anything, and never merge code she could not rewrite from memory within a day. By month twelve she has four things to show in an interview, each with a story about a failure she found and fixed, which is worth more than any certificate.
Failure modes
- The tutorial treadmill. Finishing courses without building anything that has to survive real data and real failure. The fix is an artefact with an explicit acceptance test.
- Framework chasing. Learning a new agent framework every month while unable to write the loop underneath. Frameworks change yearly; the loop, the context window and the tool contract do not.
- Outsourced understanding. Merging assistant output that passes tests the assistant also wrote. You stop learning and your review becomes a rubber stamp.
- Skipping the boring layer. Jumping to agents without SQL or HTTP. The first production incident is always in the boring layer.
- Breadth without depth. Five tracks at beginner level. Nobody hands the hard problem to the person who has touched everything once.
- Collecting credentials. Certificates signal effort, not ability. A public repository with a design note and a postmortem signals ability.
Trade-offs
The main tension is between breadth and depth. The practical answer is a T-shape: broad enough across the four layers to hold a conversation with any specialist and to spot a problem outside your area, and deep in one track. A second tension is between learning the durable concept and learning the tool you will actually use on Monday. Do both, in that order: learn why connection pooling exists before learning your framework's pool settings, and the settings will make sense.
The third is time. Six focused hours a week, spent building, beats twenty hours of passive watching. If time is short, cut breadth first, never the build-and-verify loop.
What to do next
- Pick one language to learn deeply this year and write down the three features of it you do not yet understand.
- Choose one track from the table and read its first two linked articles this week.
- Define a first artefact with an explicit acceptance test, such as surviving a killed worker, and put it in a public repository.
- Start a learning log: prediction, result, explanation, rebuilt-by-hand.
- Add property-based tests to the next piece of assistant-written code you merge.
- Read about prompt injection and least privilege before giving any agent shell or credential access.
- Review the plan every quarter and replace the next artefact if the last one taught you something unexpected.