Surviving as a frontend engineer in the age of AI
An AI can write the component. Give it a clear enough prompt and it will produce a plausible button, a working form, a passable list. If your value as a frontend engineer was “I can turn a Figma frame into JSX,” that value is now a commodity. The instinct is to panic; the better move is to notice what the model still cannot do and move your weight onto it. A model has no memory of your system, no stake in its longevity, and no way to know that the “quick fix” it just wrote violates a boundary that will cost you a month in six. Deciding where state lives, why an organism must not fetch, and whether a diff is safe to ship — that judgement is the job now, and it is a bigger job than typing the component ever was.
Move up the stack, from author to architect
The concrete shift is from producing code to specifying and verifying it. That means getting good at the parts a model is worst at: naming the boundaries, choosing where a piece of state belongs, and writing the checks that keep those decisions enforced. A prompt that encodes the architecture beats one that just asks for a feature:
Write a CartBadge as a presentational atom in src/ui/atoms/.
It receives `count: number` as a prop and renders it.
It must NOT import from the store, fetch, or hold state.
A container will supply `count`. Return only the component.
You are no longer the typist; you are the one who knows that CartBadge is an
atom, that atoms do not fetch, and that a container is the seam. That knowledge is
the differentiator.
Judge the diff adversarially
The second durable skill is review — specifically, reading an AI diff looking for what is wrong, because the model wrote it to look right. The failure modes are predictable: it invents an API, it widens a boundary, it “fixes” a test by weakening the assertion. A quick adversarial pass catches most of it:
// the model changed this test to make its code pass — the tell is a weaker assert
- expect(rendered).toHaveTextContent("3 items");
+ expect(rendered).toBeTruthy(); // ⚠ asserts nothing; reject and ask why
Learning to spot the assertion that got quietly loosened is worth more now than it was, because a model produces those faster than a human ever did.
Make your judgement executable
The highest-leverage version of this is to stop being the review and start encoding it. Every rule you enforce by hand is a rule that lapses when you are on holiday; every rule you write as a check runs on every diff forever. That is why the frontend career that survives is the one that turns its taste into harnesses — lint rules, shape tests, accessibility gates, bundle budgets — so the architecture holds at machine throughput. The model is a very fast, very forgetful junior; your job is to be the senior who defines what “good” means and makes the definition run automatically. The harness-atom-guardrail and harness-a11y-gate exercises are small, real versions of exactly that move — turning “I would have caught this in review” into “the build catches this now.”