Is this vibe coding?

On using AI to write code, and saying so plainly.

No. But it is a fair question, and I would rather answer it in the first paragraph than have you wonder about it later.

I use AI to write code. Most of the lines in the systems described on this site were typed by a model. I am telling you that up front because you would find out eventually, and finding out later feels like discovering something that was hidden.

I left this once already

I started at Georgia Tech as a Computer Engineering major and finished in Electrical Engineering.

It was not that I disliked software. I have worked for software companies since, and I still like the thing itself — the part where a problem is shapeless and then it is not, where you decide what the data actually means and what the system is permitted to do with it. I liked database design. I liked security work, which is mostly the discipline of asking what happens when somebody does the thing you did not plan for. I liked writing code that had a point.

What I did not like was the ratio. The thinking was the part I was good at, and it was perhaps a fifth of the hours. The rest was transcription: remembering which library spells it one way and which spells it another, fixing an indent that changed what a block meant, rewriting a loop a third time because the first two were wrong syntactically rather than wrong conceptually.

That is a real cost and I was honest with myself about it at the time. The part of the work I wanted was gated behind a part I found tedious, so I went where more of my hours would be spent on the part I wanted.

That constraint does not exist anymore. So I came back.

What actually goes wrong in software

Here is the thing I would want you to take from this, whether or not you ever hire me.

Syntax errors fail loudly. Judgment errors fail silently.

A missing bracket stops the build and you find out in nine seconds. Small mistakes have certainly cost people a great deal of money — a misplaced break cascaded through AT&T's switches in 1990 and took long-distance down for most of a day — but they did it by getting past the point where anything announces itself. That is the distinction worth drawing, and it is not about how small the mistake was.

What costs money is the credential sitting in the wrong place. The retry that resubmits an order it already submitted. The reconciliation that balances to a number that is confidently, precisely wrong. The average computed over the wrong set of rows. None of those stop the build. They ship, they run for months, and you hear about it from a customer, an auditor or a broker.

So when somebody asks whether I know a language inside and out — no. I do not. What I know is how systems fail, which is a different body of knowledge and the one that is expensive to acquire. AI has largely taken over the category that fails loudly, and it is getting better at catching the quiet category too. What it will not do is decide what the number is supposed to mean, or be the one accountable when it turns out to mean something else.

What I actually do

I decide what the system is. Where the boundaries sit and what is allowed to cross them. In my trading platform, one service holds the broker token and nothing else does; a separate single-threaded process is the only thing permitted to write to the tables that represent money. That is not a preference, it is enforced: a test walks the imports and fails the build if the research side ever reaches into the production side, or the reverse. The rule cannot be quietly broken by anyone, including me, including a model. No model proposed that boundary. One implemented it after I decided where it went.

I decide what gets checked. Automated analysis produces confident, plausible, wrong answers, and I can show you five from my own tooling, all caught before they reached anybody:

  • A summary that contradicted the table beneath it. “The three above you average 386 reviews”, printed directly above a table reading 25, 127 and 26. It had averaged the three highest numbers anywhere in the results, including a national hardware chain that was not a competitor at all.
  • A finding about the wrong website. “Their robots.txt blocks all search engines” opened the report for thirty-four businesses. It was Meta’s robots.txt: those businesses had no site, and their listings pointed at a Facebook page.
  • Eleven problems with a page that did not have any. Google’s own rendered check scored it 100 out of 100. Mine had inspected the empty shell the server sent, before any JavaScript ran and put the content in it.
  • A live site reported as dead. The machine running the check linked a TLS library too old to negotiate with it, so the failure was mine and the report blamed theirs.
  • A domain quietly corrupted. A string function that removes characters rather than a prefix, turning www.walmart.com into almart.com with no error anywhere.

Every one of those looked entirely plausible. Several were one edit away from a client’s inbox. The rule in my own documentation is six words: never send a generated report unread.

And I decide what I am accountable for, which is all of it. When a stale credential in one of my systems was served quietly by a fallback I had left in place, it looked exactly like my broker had revoked access, and I spent a day chasing the wrong thing. The fix was not to patch the fallback. It was to delete it, because a stale credential served quietly is worse than no credential at all. That reasoning is written down in the repository where the next person will find it. A model did not have that opinion. I did, at some expense.

On the backlash

There are two questions worth asking anybody who builds something for you, and they are the same questions with AI or without it. Can they tell when the output is wrong, and are they still there when it is?

I have tried to make both answerable about me rather than asserted. What I decided and why is written down in every repository, including the parts where I was wrong, which is the only version of that record worth keeping.

The criticism itself is mostly correct and mostly aimed at something else. What people are angry about is code shipped by somebody who could not evaluate it, into a system they did not understand, by a person who was not there when it broke. That is not a fact about the tool. You could do all three of those things in 2015 by copying from Stack Overflow, and plenty of people did.

As for the term: vibe coding was coined for “forget that the code even exists” — accepting changes without reading them. That is close to the opposite of a practice built on the premise that the output is confidently wrong on a regular basis and has to be checked against its own evidence. I am not going to adopt a label for the thing I spend most of my attention preventing.

The honest version of the trade

I cannot outrun a good model at typing and there is no reason to try. What I get back is the whole development cycle — the design, the data model, the security posture, the verification, the part where you decide what correct even means — instead of four fifths of my hours going on tab stops.

If what you are buying is typing, you should not pay much for it, and you should not pay me.

That was never the expensive part. The expensive part is somebody who knows what the number is supposed to be, notices when it is not, and is still answering the phone in March.

Jim Hancock builds data pipelines, integrations and internal tools through Second Chance Opportunities, LLC. What that looks like in practice, or start a conversation.