More about AI

Alternative title: Ugh, not again

TL;DR: What Julio Merino said. Seriously, for me it feels spot on.

At work we are doing a lot of AI lately, like everybody else. Code is dead, long live code, etc. etc. I am not going to go into that “eggplant field”, that is not the subject of this entry.

This is about a couple of experiences I had for my personal projects. What? you say (or what I myself would have said 1 year ago). Do you have time for that? Not really. And I refer to the blog post I linked above:

One interesting insight is that I did not require extended blocks of free focus time—which are hard to come by with kids around—to make progress. I could easily prompt the AI in a few minutes of spare time, test out the results, and iterate.

J.M.

Indeed, this is true. Finally, after procrastinating for over a decade and a half, I honestly vibe coded an application to get my father out of Microsoft Access. I am not kidding or exaggerating when I say I developed that MDB “app” at the beginning of the century, so my father could keep a record of his albums. 25 years after (!!) he is still very much using it. Every Windows update, every new computer, we (well, lately my brother-in-law) need to go through the pain of setting this up. And I finally decided to give AI a shot at doing it. I did not want to pay, not yet, until I saw if it would work.

"Registro Musical"

I gave the above screenshot to Gemini (Antigravity), said “Use Rust” (because I may as well go all-in) and sqlite. And oh my. It almost one-shotted the application. The appearance wasn’t quite there, there were rough edges, but it got over the initial, maybe, 50-60%, of the work in a matter of minutes.

I ran out of tokens, switched to Mistral, ran out of tokens, switched to Codex. And got to maybe 80%-90% of the way, even being able to import directly from the original MDB by using the jetdb crate. And that is not a small feat, because the original MDB did not fully work with jetdb, some records went missing. Copilot could debug and fix the import, with some help and some direction, but not much. It took the time between putting the kids to sleep and going to bed myself.

Oh… my.

I kinda understand the Rust side, and that’s where I paid more attention to directing the agent. Since Gemini decided to use tauri and the “frontend” is actually a light-weight web view (ugh), most of the visual part is done in Typescript which, honestly, is fully Vibed. Maybe I gave one or two pushes with respect to the code, but that’s it.

Again, I completely feel Julio’s remarks:

Even though I just said that getting the project to work was rewarding, I can’t feel proud about it. I don’t have any connection to what I have made and published, so if it works, great, and if it doesn’t… well, too bad.

J.M.

Indeed. Who cares, it is an app with a single user, and not critical. The bulk of the hard job (not losing data) is done by sqlite. I will keep vibe coding this for the most part. I still care enough that I’ve set up the CI with some tests, SonarQube Cloud (of course I work there, but I would have anyway), release automation, etc. But for the most part, good enough.

Would my father, or someone without any idea of computers, be able to pull this off? Yes? Maybe? My guess is probably yes, if they felt like investing waaaay more time and tokens than me. The agents screwed some things up (like importing a bunch of empty records), and needed some guidance that, I think, saved time. If you don’t care, and you just prompt to your heart’s content, I think it may have reached the same point, just taken longer. So, for the time being, it feels like agent+SWE can reach a reasonable level of tradeoffs, in terms of time, quality, and functionality. I don’t think you can take someone with no idea of how code works and get the same tradeoff. You will get something that kind of works on the surface, but it will be a can of worms. Still.

And something more

I have a private side project that I started in 2023 that, for the most part, languishes unattended. Every now and then I get some time and it gets a burst. It is not a secret: I started the classic Writing an OS in Rust and then started to throw things on top of it. Supporting custom fonts, supporting bitmaps, improving the console (with interfaces and all the shenanigans). At some point I managed to make PCI work and list the devices. Later I started to add SATA and DMA support, trying to follow specs and not copying code from somewhere else. Then I got stuck. I failed miserably to make the DMA transfer work. The operation reported success, but the buffer was not written into. I tried to go back in September, no luck. I tried asking Copilot in September (not sure who it was back then, whatever was on the free tier), and it got as confused as I was.

Since I have paid for a subscription to keep working on my father’s db, I decided to give it a shot again (pretty sure it was GPT-5.3-Codex). In less than a minute that thing found the bug: “Ah, yes, you are writing to this register in the wrong order, you need to swap this and that, and make sure you restore these flags, there, try now”.

It fricking worked. The buffer had the bytes from the disk. Ok, yeah, yeah, not innovative, how to do this is written all over the place (Linux kernels, toy kernels, OSDev wiki, documentation), I just couldn’t see the bug. This is like a coworker coming over your shoulder and spotting the bug in 5 seconds when you have been debugging for 5 hours because you had tunnel vision, but still… damn.

Am I going to leverage this and keep vibe coding? No!! The whole point of starting this project is because I wanted to learn how to handle this kind of low level stuff. Vibe coding destroys that. There is no learning. It is the doomscrolling of code. It works, you get your dopamine hit, and you quickly move on to the next thing yearning for the high. You can’t learn when vibe coding, by definition. But they can indeed be leveraged to move through when you are stuck or struggle finding documentation. Need to be careful though.

So, I will keep vibe coding the album database, because I don’t think I can learn much new from it. To learn, I will try to avoid using agents too much, unless I get stuck again.