I Know When You're Vibe Coding

Your browser does not support the audio element.

I shouldn’t have to care about this. I don’t want to care about how someone’s code gets into the IDE. Whether you wrote it by hand, copied it from a forum, prompted an LLM, or ran a simulation where monkeys are given infinite time to produce the solution.

I care about what gets merged into the codebase.

When I click that “Approve” button, I’ve got only a few worries on my mind. Does it produce the correct outcome? Will people understand this next quarter? Will they be able to change it?

But lately, I started noticing things that immediately tell me the code is written by an LLM. No, I don’t mean the repetitive comments (I’m fine with those), not even the switch statements they’re so fond of.

I know the code was generated because it was written in a way no developer on the team would.

It works, it’s clear, it’s tested, and it’s maintainable. But it’s written in a way that doesn’t follow the project conventions we’ve accepted. I know it wasn’t written by a human.

The smell of vibe coding

Because no one would write an HTTP fetching implementation covering all edge cases when we have a data fetching library in the project that already does that.

No one would implement a bunch of utility functions that we already have in a different module.

No one would change a global configuration when there’s a mechanism to do it on a module level.

No one would write a class when we’re using a functional approach everywhere.

I don’t want to know how you wrote this. I just want to know that you care about what comes out of the model. This is code you wouldn’t have produced a couple of years ago.

We spent decades coming up with patterns and standards that help us build maintainable software.

That’s always been the challenge - putting something in production that you can take care of for years. Anyone can vomit up a working implementation. You’ll stitch together a Frankenstein-monster-looking piece of code that will get the job done.

The part we’ve struggled with is making changes to that after you push it out the door.

Is speed the greatest virtue?

I was at a local café a few days ago, and they were training a new barista. There was a long line, and the new guy was startled, rushing to make the next cup, spilling coffee and milk.

We’re back at this stage, rushing to push out the next piece of software because we think that speed is the greatest virtue.

But people want a good cup of coffee, even if they have to wait a little bit for it.

I always thought I’d be getting angry at the finance people who’ll be looking for ways to write smaller digits in the spreadsheets, but I’m disappointed by my fellow developers who quickly threw all principles out of the window so they can speedrun software development.

What I really want

I don’t care how the code got in your IDE.

I want you to care.

I want people to care about quality, I want them to care about consistency, I want them to care about the long-term effects of their work. LLMs are engineering marvels, and I have the utmost respect for the people who’ve created them. But we still need to build software, not productionize prototypes.

Write better prompts. Give better descriptions. Tell the LLM what library to use. Give it examples to follow. Write smaller files. There are no new principles - follow the ones that already exist.

Don’t leave a codebase’s maintainability to the weights of a model.

Vocabulary

  • IDE: 集成开发环境,一种为程序员提供全面开发功能的软件应用。

    Integrated Development Environment, a software application that provides comprehensive facilities to computer programmers for software development.

    Whether you wrote it by hand, copied it from a forum, prompted an LLM, or ran a simulation where monkeys are given infinite time to produce the solution.

  • vibe: 由特定情境或环境产生的感觉或氛围。

    A feeling or atmosphere that is created by a particular situation or environment.

    I Know When You're Vibe Coding

  • merge: 将两个或多个事物合并成一个整体。

    To combine two or more things to form a single unit or entity.

    I care about what gets merged into the codebase.

  • approve: 正式同意或接受某事为令人满意。

    To officially agree to or accept something as satisfactory.

    When I click that “Approve” button...

  • repetitive: 重复很多次的,单调的。

    Repeated many times, often in a way that is monotonous or uninteresting.

    No, I don’t mean the repetitive comments (I’m fine with those)...

  • simulation: 使用模型来模拟真实世界系统行为的过程。

    The action or process of using a model to replicate the behavior of a real-world system.

    prompted an LLM, or ran a simulation where monkeys are given infinite time to produce the solution.

  • maintainable: 能够保持良好状态且易于维护或更新。

    Capable of being kept in good condition and easily repaired or updated.

    It works, it’s clear, it’s tested, and it’s maintainable.

  • functional: 为实用目的设计的;基于函数而非类的编程方式。

    Designed for or adapted to a practical purpose; based on functions rather than classes.

    No one would write a class when we’re using a functional approach everywhere.

  • vomit: 以杂乱无章、不受控制的方式产出某物。

    To produce something in a messy, uncontrolled way.

    Anyone can vomit up a working implementation.

  • prototype: 用于测试某个概念或流程的初步样品、模型或发布版本。

    An early sample, model, or release of a product built to test a concept or process.

    But we still need to build software, not productionize prototypes.