I was handed a pile of vibe code. And you might be surprised to learn that it has a ton of bugs.

And tips on how to dissect it and break it up into something manageable?

  • ChogChog@lemmy.world
    link
    fedilink
    arrow-up
    3
    ·
    16 minutes ago

    “Working Effectively with Legacy Code” by Michael C. Feathers

    In my opinion, we treat it the same as any spaghetti code

  • dandi8@fedia.io
    link
    fedilink
    arrow-up
    4
    ·
    3 hours ago

    You need the problem space to be restricted to a manageable bunch of classes. If that’s not the case, split the problem until you get there.

    Make sure you have 100% test coverage on this piece of code and that the tests are actually understandable and documenting the functionality well. You might find that there is unreachable code which should be deleted. Mutation testing may also help find code paths which are untested (and so edge cases you might not have considered).

    Until that is true, write tests and/or refactor existing ones. At this point you may find a ton of new bugs there. Better find this now than later and then wonder whether your own changes introduced them. Your new failing tests will document the presence of those bugs.

    By now you should have full documentation of what the code is supposed to do via tests. This will be tremendously helpful in understanding the code.

    Then go public method by public method, line by line, renaming variables, extracting private methods etc. Your basic run-of-the-mill refactoring of classes, until you fully understand what’s going on in the production code.

    For every small refactor, run the tests and commit if they pass. If they fail, you only have a small amount of uncommitted code which you know is the culprit.

    Finally, fix any bugs you documented in the test writing stage.

    At this point you can add any new functionality to the code.

  • froufox@lemmy.blahaj.zone
    link
    fedilink
    English
    arrow-up
    5
    arrow-down
    1
    ·
    11 hours ago

    Depends on the size of the pile. If it’s huge, then you have to use LLM too, with some decent tooling like Claude Code. Let it analyse the code first, and put a summary for you. Then design the proper solution yourself, and either fix it manually, or if it’s too tedious, guide LLM to apply the changes for you. Ofc iteratively and don’t let it apply changesets without your approval. I had a similar task recently, did it like that

  • yaroto98@lemmy.world
    link
    fedilink
    arrow-up
    17
    arrow-down
    1
    ·
    20 hours ago

    For work, or for hobby?

    Hobby: have AI document what it’s supposed to do, then work through it like the ship of theseus one function at a time replacing it with not bad code.

    Work: use it, document the bugs, ninja in and clear them out one at a time until it works. Keep blinders on and ignore anything not directly related to each bug. Same strategy as legacy code.

    • draco_aeneus@mander.xyz
      link
      fedilink
      arrow-up
      2
      ·
      4 hours ago

      The problem with this approach is twofold.

      1. The AI doesn’t know what anything is either. It can annotate faster than you, but if it is all wrong, that doesn’t help.
      2. The primary reason the code is bad, and something the AI is particularly weak at without a human doing much of the thinking for it is architecture. Working your way through ship-of-theseus-style isn’t going to address the fundamental reason the code is difficult to work with. The architecture.
    • reabsorbthelight@lemmy.worldOP
      link
      fedilink
      arrow-up
      12
      ·
      19 hours ago

      For work. The code goes like 8 levels of abstraction. I’m trying to figure out how to unravel it.

      Even a code flow/branching diagram would help I think

      • zener_diode@feddit.org
        link
        fedilink
        arrow-up
        5
        ·
        19 hours ago

        Depending on the language, there might exist an automated tool for generating those kinds of diagrams from code.

  • kibiz0r@midwest.social
    link
    fedilink
    English
    arrow-up
    3
    ·
    16 hours ago

    Nature of the code? Library, CLI tool, cloud service, API, UI?

    My first thought is test suite.

      • VibeSurgeon@piefed.social
        link
        fedilink
        English
        arrow-up
        6
        ·
        16 hours ago

        The same as taking over any legacy project applies, really.

        Start out with some expectation management - the current state of the solution prevents progress from going fast, and your stakeholders need to understand that.

        Then get some tests going, such that you can try to defend whatever value the system has, if any.

        Finally, start refactoring as much as you can get the space to do. Repeat until the system reaches your desired state.

  • owenfromcanada@lemmy.ca
    link
    fedilink
    arrow-up
    3
    ·
    19 hours ago

    Start by separating the files by namespace and class. Then, by method. Delete the first method, then the next, and so on. Then rewrite the code by hand as God intended.

  • 87Six@lemmy.zip
    link
    fedilink
    arrow-up
    1
    arrow-down
    1
    ·
    edit-2
    16 hours ago

    Unironically get Opus to get you a base of a flow document based on the code so you can figure it out.

    Then of course, you dig in yourself, understanding what Opus said, then fiflling in the gaps.

    Edit: I don’t think you need to pay for Cursor to prompt Opus once for this. Just make sure to use Opus, Auto picks the dumbest model available on free tier.