HASSAN.
EngineeringJuly 2026

AI Can Build. It Can't Own It.

Software EngineeringAI EngineeringFintechSoftware Architecture5 min read
AI Can Build. It Can't Own It.

Scroll through any tech feed right now and you'll find someone confidently declaring that software engineers are becoming optional. Cursor writes the code. Agents test it. The loop keeps improving itself. Just prompt harder and step aside.

I want to hand you a receipt instead of an opinion. I spent three weeks leading the migration of a live fintech platform, and reality interrupted the narrative.

AI can build. It can't own it.

That's not a conclusion I reached from keynote demos, benchmarks, or LinkedIn debates. It came from migrating a production system that moved real money, where every deployment carried real consequences and every mistake had someone accountable for it.

Over three weeks, I transformed a platform built around a single card provider into a provider-agnostic architecture without breaking a single existing API or disrupting more than 500 active cardholders.

If there's such a thing as a real-world experiment on whether AI can replace software engineers, this was about as close as I've experienced.

Here's what actually happened.

The Ask That Sounded Simple

It landed as one line in a chat: "We've partnered with a new card provider. Need to onboard it on the platform."

Translated into what actually lay beneath that sentence: Change the engine of a flying plane, mid-flight, and make sure not a single passenger feels the turbulence.The plane was a live fintech platform. The passengers were 500+ people whose cards needed to keep working exactly as they always had, down to the API response.

Why the Old Design Wasn't a Mistake

Here's a part of this story that's easy to rush past, but shouldn't be: the platform being tightly built around one provider wasn't sloppy engineering. It was the correct call, made under the only reality that existed at the time.

Fintech development leans on a pattern for good reason: prioritize security and reliability by building tightly, deliberately, around a single well-understood integration. You don't leave hooks for a hypothetical second provider "just in case." That's speculative complexity in a domain where every extra branch is a new place for money to quietly go wrong. So the system was coupled. Intentionally. Correctly.

Until the business needed a second reality to exist.

The Real Ask Was Hiding Behind the Obvious One

The easy read of the assignment goes like this: the new provider handles a few things differently, so drop in some conditional branches, route the traffic accordingly, and ship it.

That read is wrong. It took me a minute of sitting with the requirement to see why. The new reality wasn't "there is a second provider now." The new reality was "this platform is now the kind of architecture where multiple providers exist." One of those is a patch. The other is a structural shift. The system had to become provider-agnostic as a standing capability, not a one-time accommodation.

Heart transplant on a person who's still walking around, still going to work, except it's not even a transplant into a body built to receive one. It's rebuilding the heart itself to accept whatever shows up next.

The Blueprint That Told Me the Truth

Before touching a single line of code, I mapped the entire integration, legacy provider and new provider, side by side, end to end. That blueprint did two things: gave me direction, and gave me a reality check I wasn't fully expecting.

The new provider didn't just use different field names or a different auth handshake. It had a fundamentally different mental model of how a card lives: issuance, funding, freezing, disputes, closure. Different states, different transitions, different assumptions about what happens the moment something goes wrong.

Layered on top of that were the business requirements that mutated our workflows entirely independent of either provider. Take something that sounds trivially simple: a user sends the amount to recharge their card, and we fund it. In an ideal world, that’s one synchronous step. In our reality, business logic turned it into a complex, multi-stage asynchronous flow. Handling those varying states, failure conditions, and provider webhooks had nothing to do with API syntax. It was a deeply structural engineering problem. Both the provider migration and the business logic were live, concurrent challenges.

Note

Engineering Deep Dive: If you're interested in the actual system architecture, state machines, and how I handled multi-provider integration, I wrote a dedicated technical breakdown of this migration here.

Here's Where I Put "AI Replaces Engineers" on Trial

It's mid-2026. The models are genuinely better than they were even a year ago. Tools like Cursor can sit inside a codebase, take a pile of context, and start writing across a project on their own loop. So the obvious question, basically internet consensus at this point — is whether I could've just opened the project, handed it an MD file stuffed with context on both providers, and let it run the migration.

Here's the part people skip past: even in the best possible case where that worked flawlessly, I still wouldn't have been "replaced." Replacement isn't "an engineer uses AI to move faster." Replacement is "the client skips the engineer entirely and prompts the changes themselves." Those are different events wearing the same outfit.

Important

An engineer using AI as leverage and a client using AI instead of an engineer are not the same story, no matter how similar the demo looks. One still requires someone who understands the system end to end. The other is a bet that nobody needs to.

And in this case, the best-possible-case scenario didn't even hold. The context wasn't sitting neatly in one repo waiting to be summarized, it was scattered across four to five live codebases, each carrying its own assumptions. Provider documentation wasn't cleanly crawlable. The business requirements mutating our workflows lived nowhere but my head and a handful of Slack threads. Feed a model that much scatter and hallucination isn't a risk, it's close to a guarantee.

So no, you don't need to pull your hair out over this one yet.

The Influencers Selling This Have Never Shipped to Production

There's a version of "AI replaces engineers" being sold hard right now by people who've clearly never carried production responsibility or even don't have any tech background. The pitch is always the same: one prompt, done, engineer optional.

Note

The ability to go into production before understanding production isn't a feature; it's an incident waiting to happen. AI carries none of the liability when it goes wrong. Production doesn't forgive "the agent did it."

No capable model, agent, or tool I used could have run this migration on its own. Every one of them still needed an engineer in the loop, not typing every character, but deciding, checking, and owning the outcome. That's not a temporary gap waiting for the next model. That's the actual shape of the job right now.

What AI Actually Did, and Why That's Still a Big Deal

None of this is an anti-AI take. Thinking "I'll write every line by hand because AI isn't good enough" would be a genuinely bad take to hold in 2026, almost as bad as the opposite extreme.

What AI actually bought me was compression. Once I'd made a call, how a state maps, what "equivalent behavior" means for a given endpoint, AI could turn that into contracts, tests, and documentation fast enough that finishing the migration in just three weeks became realistic. Without it, this realistically becomes a multi-month project. And if someone had tried to run it in reverse, replace the engineering judgment entirely and just prompt their way through a live financial migration, the outcome isn't "faster." It's an outage with a bigger token bill attached.

Here's how the actual work broke down:

CategoryResponsibilityOwner
JudgmentMapping the new provider's lifecycle to our business logicMe
JudgmentDefining what "backward compatibility" meant for every APIMe
JudgmentDesigning the provider abstraction and migration strategyMe
JudgmentSequencing the rollout across five codebases without downtimeMe
ExecutionDrafting API contracts from the design decisionsAI-assisted
ExecutionWriting and updating technical documentationAI-assisted
ExecutionGenerating edge-case test scenarios I definedAI-assisted
ExecutionImplementing the code based on the agreed designMe + AI-assisted

Notice the shape of it. The top half is judgment, reading what a provider's documentation actually means for our users, not just what it says. The bottom half is execution, once that judgment had already been made. AI never touched the top half. It couldn't, because it doesn't carry the business context, and honestly, it shouldn't be trusted with the kind of context where the failure mode is someone's money.

The Uncomfortable Truth for 2026

The industry conversation keeps leaning toward "agents will just run your migrations soon." Maybe, someday, for systems where a mistake costs nothing but a rerun. But for anything touching real financial infrastructure, real user trust, real regulatory exposure, the bottleneck was never typing speed. It was always judgment, context, and accountability. Three things that don't get outsourced just because the loop got better.

After three weeks, five codebases, two providers, hundreds of active cards, and zero downtime, I walked away with a different view of AI than the one dominating my feed.

  • AI made me dramatically faster.
  • It removed hours of repetitive work.
  • It improved the quality of my implementation.
  • It helped me ship in three weeks instead of three months.

But every architectural decision, every compatibility guarantee, every production risk, and every consequence still belonged to one person.

That's the distinction that gets lost in the hype.

AI can build.

It can't own it.

Share
Helpful?

Continue reading