Coding vs Engineering in the LLM Era
7 min readLLMs can crank out code, but lasting software still demands architecture, tests, and human judgment, forcing developers to redefine their role.
Code Is Just the Artifact
When we talk about "writing software," we often slip into saying we "write code." But code is only the most visible output of a far larger effort. Architecture, data modeling, observability, security, deployment pipelines, performance budgets, these are the invisible scaffolds that make a product reliable and valuable.
What do LLMs Actually Automate? Large language models excel at pattern replication. Feed them enough source files and they can synthesize boilerplate, stub out CRUD endpoints, or translate snippets across languages in seconds. That is genuinely useful, but it is also the easiest, most mechanical slice of software work.
LLMs do not on their own:
They cannot validate a threat model against compliance targets, nor can they prove a concurrency design under production load. Similarly, they struggle to pick a logging taxonomy that keeps storage costs sane, and they certainly cannot negotiate trade-offs with stakeholders when business rules change.
Each of those tasks requires context, judgment, and trade‑off awareness that today’s models can only approximate when guided by an experienced engineer.
Example: LLM‑generated API stub
POST /orders
↳ validate(request.json, OrderSchema)
↳ db.orders.insert(request.json)
↳ return 201
In the example above, it compiles, but where are retries, idempotency keys, metrics, or rollback hooks?
From Coder to System Designer
For decades, many engineers built careers on being highly productive coders, translating requirements into syntax quickly and accurately. If that translation is suddenly cheap, the scarce skill becomes designing the right thing to translate in the first place. That shift feels existential: "If the IDE can autocomplete whole functions, what am I for?" The answer is that you are the person who ensures the whole system, people, processes, runtime, and code, works together.
Engineering Core Responsibilities
Engineering core responsibilities include systems thinking to model how data, services, and users interact under change, as well as risk management to quantify failure modes and design mitigations early. Engineers must also define quality strategy by choosing the effective mix of tests, practice model stewardship to verify AI alignment with governance, and provide change leadership to coach teams through transitions.
Practical Guidance for Teams
Treat LLMs like junior developers with infinite stamina but zero domain context. Give them small, well‑scoped tasks, review everything, and gradually expand trust.
Start with noncritical paths like internal tools or migration scripts. Automate the review pipeline using static analysis and load tests as gatekeepers. Capture decisions in architecture ADRs to preserve context for future humans or models. Invest in observability, using high-resolution metrics to expose hidden coupling in autogenerated code. Finally, reward design outcomes rather than lines of code by updating performance reviews to reflect this shift.
Coping with the Identity Shift
It is normal to grieve the diminishment of a skill you once prized. Reframe "coding" as one tool among many and celebrate the larger influence you can now wield.
Apprentice in architecture by pairing with platform or infra teams and reading real post-mortems. Teach others, as mentoring juniors on design principles solidifies your own understanding. Despite the AI assistance, stay hands-on with prototypes and spikes to keep your intuition sharp.
The future belongs to engineers who orchestrate both humans and machines in service of durable, humane systems.
LLMs commoditize syntax, not software engineering. The industry still needs architects, testers, SREs, and product‑oriented thinkers to guide that commoditized labor toward dependable systems. If you embrace the broader craft, decision‑making under uncertainty, you will find your relevance increasing, not shrinking, in the age of machine‑generated code.
The Engineer's New Mandate
If code is now abundant and cheap, then trust is the new scarce resource. Your value as an engineer is no longer defined by how fast you can type func main(), but by how effectively you can guarantee that func main() does what the business needs, securely and reliably.
Shift from Author to Editor
You are moving from being the primary author of every line to being the Editor-in-Chief of a codebase that is engaged in a constant dialogue with AI models. This requires a shift in mindset: being skeptical of every output, validating rigorously, and focusing on the higher-order structural integrity of the system. You are not losing your craft; you are elevating it.
Practical Mentorship
When mentoring junior engineers in this era, stop obsessing over syntax memorization. Instead, focus on "System Design" and "Failure Mode Analysis" from day one. Teach them to ask: "What happens if this AI-generated block fails?" "How do we debug this if the model is wrong?" "Is this secure?" These are the questions that no model can answer for itself.
Signs of adaptation
You know your team is navigating this shift well when code reviews focus less on "nitpicks" about variable names and more on architectural constraints and edge cases. When a junior engineer catches a subtle logic error in an AI suggestion because they understood the system better than the syntax, you have successfully future-proofed your team.