<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software-Engineering |</title><link>https://fehac.dev/en/tags/software-engineering/</link><atom:link href="https://fehac.dev/en/tags/software-engineering/index.xml" rel="self" type="application/rss+xml"/><description>Software-Engineering</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Mon, 17 Aug 2026 00:00:00 +0900</lastBuildDate><image><url>https://fehac.dev/media/icon.svg</url><title>Software-Engineering</title><link>https://fehac.dev/en/tags/software-engineering/</link></image><item><title>AI Already Stole the Developer’s Job</title><link>https://fehac.dev/en/blog/ai-already-changed-the-developer-job/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0900</pubDate><guid>https://fehac.dev/en/blog/ai-already-changed-the-developer-job/</guid><description>&lt;p&gt;Hard words to swallow: AI is not going to steal the developer&amp;rsquo;s job. It already
stole it.&lt;/p&gt;
&lt;p&gt;Every week another article asks whether AI will replace programmers. The premise
is wrong. It is not a question of when. It already did.&lt;/p&gt;
&lt;p&gt;The job that existed in 2022 does not exist anymore. What remains has another
name, another nature, and another skill set. The name is harness engineering.&lt;/p&gt;
&lt;p&gt;Anyone still debating whether to &amp;ldquo;adopt AI&amp;rdquo; is debating whether to board a train
that has already left.&lt;/p&gt;
&lt;p&gt;This is my opinion, formed by running this workflow every day, not a comfortable
prediction about some distant future.&lt;/p&gt;
&lt;h2 id="how-i-work-now"&gt;How I work now&lt;/h2&gt;
&lt;p&gt;I am a backend and infrastructure engineer. I alone own the AWS infrastructure
at my company, built from scratch with CDK and a lot of AI harnessing, and I
carry production on-call.&lt;/p&gt;
&lt;p&gt;When something breaks at 3 a.m., my phone rings. I am not theorising from the
outside. This is daily lived experience.&lt;/p&gt;
&lt;p&gt;I now barely write code. I make the strategic and high-level architectural
decisions, describe them in natural language, and AI agents implement.&lt;/p&gt;
&lt;p&gt;I almost never read diffs. I validate behaviour through unit and end-to-end
tests, which are also driven by AI.&lt;/p&gt;
&lt;p&gt;You may be thinking, &amp;ldquo;this guy no longer knows how to program.&amp;rdquo; Wrong. Reviewing
code stopped being the highest-leverage use of my attention.&lt;/p&gt;
&lt;p&gt;AI reviews the mechanical part better and faster than I do. Programming became a
commodity. It always was. The price tag has finally become visible.&lt;/p&gt;
&lt;p&gt;Human review still exists, but it moved to the expensive places: irreversible
changes, architecture, threat models, IAM, cost, and defining what a test proves.&lt;/p&gt;
&lt;p&gt;So if I do not write the system, what do I build? That is the right question. I
build the harness.&lt;/p&gt;
&lt;h2 id="building-and-fixing-became-too-cheap"&gt;Building and fixing became too cheap&lt;/h2&gt;
&lt;p&gt;The central thesis is simple: the cost of building and fixing software collapsed.&lt;/p&gt;
&lt;p&gt;When regenerating an implementation costs close to zero, reviewing every line of
that implementation becomes a micro-optimisation of a resource that is no
longer scarce.&lt;/p&gt;
&lt;p&gt;This resembles the transition away from reviewing compiler-generated assembly.
The comparison has a limit: compilers have stable semantics and decades of
maturity. Agents are probabilistic.&lt;/p&gt;
&lt;p&gt;That is why agents do not deserve blind trust. They deserve a system that proves,
limits, and reverses their output.&lt;/p&gt;
&lt;p&gt;Bugs, leaks, state corruption, and exploding cloud bills existed before LLMs.
The question was never how to prevent every error. It is how quickly we detect,
contain, and fix one.&lt;/p&gt;
&lt;p&gt;Answering that automatically, continuously, and cheaply is exactly the human job
that remains.&lt;/p&gt;
&lt;h2 id="harness-is-the-new-code"&gt;Harness is the new code&lt;/h2&gt;
&lt;p&gt;If code is disposable, all of your trust has to live somewhere else. That place
is the harness.&lt;/p&gt;
&lt;p&gt;The term comes from a test harness: the structure that holds a component in
place so you can stress it without letting it fly across the room.&lt;/p&gt;
&lt;p&gt;For agent-built systems, it means the entire apparatus that continually answers
one question: does this work inside the limits I accept?&lt;/p&gt;
&lt;p&gt;The first time I saw AI harness articulated clearly was in
.&lt;/p&gt;
&lt;p&gt;Their point is not to wrap the model in a larger prompt. It is to build a
planner, generator, and evaluator around contracts, state artifacts, and a
feedback loop.&lt;/p&gt;
&lt;p&gt;The important detail is separating the generator from the judge. An agent
reviewing its own work tends to approve itself. A sceptical evaluator with
criteria and access to the running system finds the fake feature the generator
calls done.&lt;/p&gt;
&lt;p&gt;In practice, my harness includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specifications decomposed into small tasks, behaviour contracts, and observable acceptance criteria&lt;/li&gt;
&lt;li&gt;Unit, integration, regression, and end-to-end tests that validate behaviour rather than implementation detail&lt;/li&gt;
&lt;li&gt;Human-written oracles, invariants, and adversarial examples, because AI-generated tests without an oracle are theatre&lt;/li&gt;
&lt;li&gt;A separate evaluator agent with access to environments and traces, able to test as a user and as an attacker&lt;/li&gt;
&lt;li&gt;Deterministic gates: linting, type checking, tests, builds, SAST, dependency policy, and infrastructure validation&lt;/li&gt;
&lt;li&gt;Structured logs, metrics, traces, actionable alerts, and correlation across deploys, agent runs, and changes&lt;/li&gt;
&lt;li&gt;Feature flags, canaries, disposable environments, cheap rollback, and an explicit blast-radius limit&lt;/li&gt;
&lt;li&gt;Cost caps, least-privilege policies, drift detection, and regular configuration audits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The harness separates vibe coding from shipping slop. Developers stopped
developing systems and started developing the harness that lets systems be
generated.&lt;/p&gt;
&lt;p&gt;Code became output. The harness became the product. That is AI harness
engineering, and it is the foundation of the profession from here on.&lt;/p&gt;
&lt;h2 id="the-failure-ledger-is-the-memory-that-is-missing"&gt;The failure ledger is the memory that is missing&lt;/h2&gt;
&lt;p&gt;The trick is making the harness feed itself. Every meaningful production failure
must become an artifact that changes the next round&amp;rsquo;s behaviour.&lt;/p&gt;
&lt;p&gt;I call that a failure ledger: a record of everything that broke and what was
done to prevent or detect its repetition.&lt;/p&gt;
&lt;p&gt;It is not a postmortem that dies in Notion. It is operational data. Each entry
links incident, hypothesis, signal, cause, correction, test, alert, version, and
owner.&lt;/p&gt;
&lt;p&gt;It is not RAG either. RAG stores facts about the world. A ledger stores what the
agent and the system did in the world, the context of that decision, and the
observed consequence.&lt;/p&gt;
&lt;p&gt;Daice Labs makes the core argument clearly.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;Without causal history, the next incident is inference rather than evidence.&lt;/p&gt;
&lt;p&gt;A useful entry has, at minimum, an incident ID, commit and deploy image, prompt
and model version, tool calls, sanitised inputs, broken assertions, trace,
metric, blast radius, and the countermeasure created.&lt;/p&gt;
&lt;p&gt;The countermeasure is not just &amp;ldquo;fixed the bug.&amp;rdquo; It can be a regression test, a
database invariant, an IAM policy, a cost alarm, a canary, or approval before an
irreversible state change.&lt;/p&gt;
&lt;p&gt;The ledger should be append-only. A correction is a new event, not an edit to
history. Without that, you cannot answer what the agent decided, why it decided,
or which earlier data contaminated the decision.&lt;/p&gt;
&lt;p&gt;My goal is simple: the same failure should not teach us the same lesson twice.
Dependencies change and tests remain incomplete. But forgetting what broke is a
choice, not fate.&lt;/p&gt;
&lt;p&gt;Real robustness does not come from theory badges. It comes from a system that
got hit by production and recorded every hit.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;Inject controlled failures into the agent and deploy before production injects
them for you.&lt;/p&gt;
&lt;p&gt;For agents, test tool timeouts, 429 responses, stale schemas, out-of-order
queues, denied IAM permissions, partial migrations, lying caches, and prompt
injection in tool output.&lt;/p&gt;
&lt;p&gt;Do not merely test whether the agent completes the happy path. It must survive
bad data, slow dependencies, revoked authorisation, and an external effect that
reports success without happening.&lt;/p&gt;
&lt;p&gt;The ledger only learns from failures that happen and are detected. It is blind to
silent corruption, excessive permissions nobody has abused yet, and slowly
leaking cost.&lt;/p&gt;
&lt;p&gt;The response is more harness: billing anomaly detection, data reconciliation,
schema-drift checks, secret scanning, regular permission audits, and blast-radius
limits.&lt;/p&gt;
&lt;h2 id="outsource-the-sensitive-parts-vibecode-the-rest"&gt;Outsource the sensitive parts, vibecode the rest&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;But what about critical parts? Auth, payments, identity?&amp;rdquo; You should not be
hand-writing those in 2026, with or without AI.&lt;/p&gt;
&lt;p&gt;Stripe, Okta, Clerk. Companies with whole teams dedicated to these concerns do
them better than you ever will. Outsourcing sensitive capabilities is good
engineering, full stop.&lt;/p&gt;
&lt;p&gt;What remains is integration, configuration, and your domain data. That is where
most failures I see live: a public S3 bucket, permissive IAM, an unsigned
webhook, or bad glue between components.&lt;/p&gt;
&lt;p&gt;The error surface moved from code to glue. In other words, it moved exactly into
harness territory.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buy the sensitive parts: auth, payments, and identity.&lt;/li&gt;
&lt;li&gt;Vibecode the disposable parts: almost everything else.&lt;/li&gt;
&lt;li&gt;Put the human brain into the harness: tests, observability, configuration, and risk decisions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That is not laziness. It is rational allocation of the system&amp;rsquo;s most expensive
resource: your attention.&lt;/p&gt;
&lt;h2 id="crud-developers-are-already-done"&gt;CRUD developers are already done&lt;/h2&gt;
&lt;p&gt;Rational allocation has a darker side: it reveals who was allocated in the
wrong place.&lt;/p&gt;
&lt;p&gt;Think of the old-school developer: receives a ticket, writes an endpoint, builds
CRUD on an ORM, maps request to query to response, and moves from sprint to
sprint.&lt;/p&gt;
&lt;p&gt;Internal backend, form to database, report to screen. Stable life.&lt;/p&gt;
&lt;p&gt;That work was first to become a commodity for a reason. It is the most
predictable, repetitive code and the best represented in training data.&lt;/p&gt;
&lt;p&gt;Near-zero ambiguity. An agent delivers it in minutes for cents, with tests. There
is no defensible scenario in which hand-typing it is a good use of an
engineer&amp;rsquo;s salary.&lt;/p&gt;
&lt;p&gt;The uncomfortable part is that this developer is not &amp;ldquo;going to be&amp;rdquo; replaced.
They already were. The badge still exists; the function does not.&lt;/p&gt;
&lt;p&gt;The role survives through organisational inertia, and inertia is a deadline, not
protection. When a company learns that one agent operator delivers the CRUD
backlog of N developers, headcount math resolves itself.&lt;/p&gt;
&lt;p&gt;This is extinction with delay, and the delay is getting shorter.&lt;/p&gt;
&lt;p&gt;Learning to write a CRUD does not automatically teach someone what to measure,
when to distrust a result, or how to design a test that proves something.&lt;/p&gt;
&lt;p&gt;The escape route exists, but it is not &amp;ldquo;learn prompting.&amp;rdquo; Prompting is trivial.
It is learning to build harnesses.&lt;/p&gt;
&lt;h2 id="the-developer-became-an-operator"&gt;The developer became an operator&lt;/h2&gt;
&lt;p&gt;Put all of this together and the picture is obvious. The developer using AI today
is no longer a developer in the 2022 sense. They are an operator.&lt;/p&gt;
&lt;p&gt;People who do not understand system design, product, security, and harnesses are
already behind, whether they know it or not.&lt;/p&gt;
&lt;p&gt;Typing code became the punch card of our era. What did not become legacy is the
foundation: knowing what to build, how to structure it, what to measure, and when
to distrust it.&lt;/p&gt;
&lt;p&gt;The value layer moved up. People clinging to the lower layer are competing with
an API.&lt;/p&gt;
&lt;p&gt;There is a side effect few people discuss: the pyramid flattened. Juniors who
only wrote code lost their function, yet the path toward architectural judgement
used to run through years of writing code.&lt;/p&gt;
&lt;p&gt;The industry has not solved where the next operators will come from. That makes
those already across the bridge scarcer, not less scarce.&lt;/p&gt;
&lt;h2 id="the-lag-nobody-tells-you-about"&gt;The lag nobody tells you about&lt;/h2&gt;
&lt;p&gt;The job changed, but the market did not. Most companies still hire, interview,
and pay for the old model: LeetCode, live diff review, system design without AI.&lt;/p&gt;
&lt;p&gt;There is a brutal lag between what the job became and what the hiring funnel
measures.&lt;/p&gt;
&lt;p&gt;The practical answer is two modes. Operate the new way every day, and keep
interview mode warm in parallel.&lt;/p&gt;
&lt;p&gt;Annoying? Yes. It is the toll for being ahead of the curve while the market
catches up.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The &amp;ldquo;will AI replace developers?&amp;rdquo; debate already died. Nobody told everyone.&lt;/p&gt;
&lt;p&gt;Replacement happened in the nature of the work, not in the job listings. Writing
code became orchestrating agents with judgement. Code review became harness
engineering. Knowing the codebase became knowing the system through its signals.&lt;/p&gt;
&lt;p&gt;The bet is not to defend the old skill. It is to become excellent at what remains
human in the loop: decision, architecture, harness, and final responsibility for
what runs.&lt;/p&gt;
&lt;p&gt;Building and fixing became cheap. Judgement is still expensive. Charge for it.&lt;/p&gt;</description></item></channel></rss>