- The Setup

I've been working on a semantic recall application called VaultAI for AI tools and prompts I've previously used and needed to remember, and somewhere along the way, I realised that I've relied too much on "vibe coding" (describing what I want to code and mostly letting the AI generate the actual implementation) to create a chatbot for recalling those entries via a prompt

This has ultimately led to the creation of an impressive, working demo, which impressed my AI/ML club peers and got me good positive feedback for a presentation I gave at the club

- The Bug

A bug that would have been apparent at first glance of the demo wasn't the real bug; it was discovered later when trying to implement more proper API calls and test the chatbot at a closer distance. I ran into issues with some of the API not being handled correctly, and upon inspecting the code to fix them, I noticed that I couldn't actually understand it

The code I've been working with wasn't simple and elegant; it was overengineered in a way that the AI thought would make it seem better than it actually was. It took me a while to realize that the bug was my own ignorance of the code I was writing

- The Realization

I realized then and there that I didn't actually want to be a software engineer, creating generic applications and websites with no particular purpose other than to fill requirements

I want to become a machine learning engineer, and to do so, I have to think like one, not a generic software engineer. Vibe coding let me off the hook by doing the easy way out, and the demo worked well enough for me to get positive feedback from others, but I wasn't thinking properly and assumed the code to be good when it wasn't.

- The Resolution

So instead of pushing the commits to fix the API calls, I did the responsible thing and decided to rewrite VaultAI from the ground up, in steps

First, I wrote the lowest-level implementation of VaultAI I possibly could

I wrote the CLI and got all of the core logic to work, and made sure I understood every single line of code. With that being said, I began working on the next step: working on the backend, slowly implementing it with SQLite, then ChromaDB for vector storage, then FastAPI for the backend API, making sure to understand each and every part before moving on

While it did take longer than vibe-coding the whole thing at once, it ultimately helped me.

- The Resolution Part 2

The resolution wasn't really fixing the bugs; the resolution was me realizing how far I've been letting myself go. Being able to catch myself before I go too far down a slippery slope is important to me, and this time, I've done exactly that.

If you find yourself in a similar situation to me, I suggest you take a moment to ask yourself why you are even doing what you're doing. If you can't explain all of the code you've written, there is likely something wrong