Bad Vibes Coding

By
Image of a woman playing the piano and frowning.

What chord even is that?

When I think something is a truly terrible idea, it often succeeds beyond my wildest imagination. One example is Twitter. When it launched, I thought it was shallow nonsense for dimwits, but it turned out to be a world-shaping, influential platform, even if it’s now an enormous cultural superfund site. I thought the same thing about Facebook, and Instagram, and TikTok. And pretty much anything blockchain. In general, if I really hate something, you should invest in it. 

I’ve also loathed a lot of technologies that became popular, like HTML5, or JavaScript, or React. They all became huge winners. The thing these systems all have in common is that they start as a huge shock—they’re vibrant, new, scary, different, faster, cheaper, and wrong. Twitter let you reach thousands of people on social media for free—with news about what you had for breakfast. React helped you create web interfaces more quickly, without understanding the framework beneath, leading to endless cookie-cutter interfaces. Can humans be this lazy? I’d wonder. The answer is always, always, yes.

Rich, my co-founder at Aboard, has a nice way of putting it: He says that good technologies let you skip steps. So I’ve learned, when I’m shocked by a new technology—like LLM-based AI—and when everyone is talking about how it will save and/or destroy society, I shouldn’t trust my instincts. I should look at the steps it lets you skip.

Let’s look at “vibe coding”—coding with prompts, not reading the code, and letting the bot fix what’s broken. The term was coined by the AI researcher Andrej Karpathy. He wrote: 

I ask for the dumbest things like “decrease the padding on the sidebar by half” because I’m too lazy to find it. I “Accept All” always, I don’t read the diffs anymore. When I get error messages I just copy paste them in with no comment, usually that fixes it.

I also enjoy vibe coding and have for a while. The thing Karpathy describes—“decreasing padding in CSS”—is a boring syntactic task. It was interesting once, about 20 years ago, and I’ve done it thousands of times since in a sort of numb fog while hitting reload. There are many, many millions of things that we do with computers that basically suck, are annoying, and offer relatively little new knowledge when you do them. For me they are:

  • Remembering obscure shell script syntax
  • Using ffmpeg to do things with video, or sox to do things with audio
  • Writing unit tests
  • Packaging up Python or JavaScript into modules
  • Just about anything related to version control

I love letting the robot do this, and so do most of my nerd friends, even if they’re suspicious of “GenAI” in general.

Good so far. But other “steps” have value! For example, in doing data migrations, I really need to keep an eye on the code that the LLM is writing, because I have no guarantee that it’s fully analyzing all of the data I feed to it. I have to write tests and push it to generate lots of logs and analytics so I can make sure it’s really doing the job, not just saying it’s doing the job.

What ends up happening is that I have to think really, really hard and focus on getting a prompt just right, feed it to the LLM, review the code it produces, and then write lots of little things to make sure it’s reproducible and consistent. This is basically…programming. 

Another way to look at it is, I need to really, really understand the problem I’m trying to solve, well enough to hand it to an easily confused robot (which, to be fair, is a process that often elucidates the problem and forces me to express it with more clarity). Then I need to instruct the robot to do a lot of little chores to make sure that it’s actually doing the work it’s supposed to (the logging tasks, the little reports). By the time I’m done, the ~~~vibes~~~ are extremely off. It’s bad vibe coding, all the way.

In the focus on what’s easy, I think it’s worth noting that one part of AI coding is really hard. When you’re coding in the traditional way, you often arrive at a solution slowly, over weeks or even months, and during that time, you come to really understand what you’re trying to do. You sort of join with the computer and get to know your data, your processes, the challenges of a given language. But that process is no longer slow and iterative. It’s fast, and the computer produces hundreds of lines of code per minute. You are in a very rapid feedback loop with a robot, trying to match its output with your responses—and sometimes, it feels like the mental equivalent of eating a pound of dense nougat.

This is actually bad for you and for your career. Going slowly, making lots of little mistakes, and figuring out how things work is how you learn to solve tons of problems. AI platforms are creating a world where the solution to any problem is “more AI” and prompting. The systems are pretty opaque. It’s amazing that it can write good code, but the future is still humans knowing and doing things, and the whole reward system of computing—where you gain a sense of mastery by knowing what the computer is doing—is inverted by vibe coding. You have to choose which steps to skip, and when to slow down. 

I’ve been learning piano recently, and after a year of noodling around, I finally found a teacher. I thought I was pretty smart—I could play relatively complex material. But the teacher immediately spotted how weak I am at maintaining tempo, and how I need to learn to practice: to break down bits of songs by measure, and quickly jump between them. My fingers just fumble all over the keys. At my last lesson he produced a big, illustrated book with pictures of ducks on it and turned to a song called “The Little Tugboat.” Each note is the size of a dime on the page. “Let’s try this,” he said. And he’s right. I have to go back to elementary school—literally—and learn again. There’s no other way.

Real Software in Real Time

Type in what you need and get a prototype in minutes.