Learning to Be a Software Engineer Again in the AI Era

10 September 2025
Reflection

There’s a strange feeling many of us didn’t expect as software engineers in 2025.

It’s not fear. It’s not excitement either.

It’s the quiet realization that code is no longer the hard part.

LLMs can now generate working code in seconds (APIs, UI components, tests, and even refactors). That forces us to ask an uncomfortable question:

If code is cheap now, what exactly is our value as software engineers?

This post is an attempt to unpack that, and a reminder for all of us as we move forward.


Code Used to Be the Skill. Now It’s the Tool.

Earlier in our careers, being a good engineer meant knowing frameworks deeply, writing clean code, and shipping features quickly. Those skills still matter, but they’re no longer scarce.

LLMs can scaffold entire services, translate requirements into code, and refactor legacy systems without complaining. What they can’t do is own a system. They don’t get paged at 2am. They don’t sit in postmortems. They don’t feel the pain of technical debt compounding over years.

Our value was never the code. It was the responsibility we take for the system.


From Code Producer to System Owner

LLMs are very good at answering “how do we build this?” They’re terrible at answering:

  • “Is this worth building?”
  • “What happens when this fails?”
  • “How will this age in 3 years?”
  • “Who pays the cost of this abstraction?”

Those are human questions. Those are engineering questions.

Our job is no longer just implementing features. It’s deciding what should exist, what shouldn’t, and where complexity is allowed to live.


Treating LLMs Like Junior Engineers (With Infinite Energy)

The mental model that helps us most:

LLMs are junior engineers with infinite stamina and zero context.

They work fast, sound confident, sometimes hallucinate, and often miss edge cases. So we don’t need to feel “replaced” by AI; we can delegate to it. Our job becomes defining clear constraints, providing good specs, reviewing outputs aggressively, and catching conceptual mistakes early.

If we can’t tell whether AI-generated code is good or bad, that’s the real problem, not the AI.


Constraints Are the New Superpower

In the AI era, writing solutions is cheap. Designing constraints is expensive.

Instead of asking “How do we implement this?”, we now need to ask “What must never break?”

Good constraints like clear service boundaries, explicit data ownership, performance budgets, failure modes, and security models give AI something meaningful to work inside of. Once constraints are clear, AI becomes incredibly powerful because it’s operating inside a box we designed.


Judgment > Syntax. Interfaces > Internals.

Syntax used to be the barrier to entry. Now judgment is.

Judgment is knowing when to add abstraction and when to avoid it. It’s knowing when to ship now and when to slow down. When not to build anything at all. It comes from production incidents, bad decisions you can’t undo, and systems that aged poorly. AI has no scar tissue. Engineers do.

High-impact engineers don’t live inside codebases. They live at interfaces, between teams, services, humans, and systems. AI can generate internals. Humans still design interfaces.


Measuring Impact and Redefining Seniority

We used to measure ourselves by features shipped and tickets closed. Now we should measure: systems simplified, incidents avoided, teams unblocked, and cognitive load reduced.

If AI helps us ship 10x more code but leaves behind a system no one understands, we failed.

The further up you go, the less AI can substitute for you. A junior can ship code with AI help. But no AI can prevent a bad architecture from being chosen in the first place, or shape how multiple teams build things together. That’s still a human job.


What We Can Do

Rather than obsessing over a specific language, framework, tool, or prompt trick, here are practical things we can focus on:

  • Own systems end-to-end: Take responsibility for the full lifecycle and reliability of what you build, not just closing tickets.
  • Make good decisions under uncertainty: Practice weighing trade-offs and choosing directions even when there’s no obvious right answer.
  • Design constraints that scale: Establish clear boundaries, contracts, and guardrails so systems (and AI) can operate safely.
  • Reduce complexity for others: Simplify architecture, untangle dependencies, and lower cognitive load for your teammates.
  • Turn ambiguous problems into clear directions: Translate messy requirements into structured, actionable technical solutions.

AI makes code cheap, which means bad decisions compound faster. Engineers who survive and grow are the ones who move closer to decision-making, architecture, impact, and responsibility.


The Line We Need to Remember

Software engineering is not about writing code. It’s about making good decisions under uncertainty, using code as a tool.

LLMs don’t replace engineers. They expose which engineers were only writing code.


Notes for All of Us

  • Don’t compete with AI on speed; compete on judgment
  • Let AI write code, but never let it decide direction
  • Optimize for leverage, not output
  • Stay close to real systems and real failures