So you’ve made a decision based on three months of use.
I am legitimately interested in your experience though. What are you creating where you can see the results in that time frame to make entire business decisions like that?
I would really like to see those kinds of productivity gains myself.
I'll give you an easy example. LMDB has a (very) long-standing bug where "DUPSORT" databases become corrupted over time.
Separately, I wanted to make some changes to LMDB but the code is so opaque that it's hard to do anything with it (safely).
So I gave the entire codebase to Gemini Pro 2.5 and had it develop a glossary for local variable renames and for structure member renames. I then hand-renamed all of the structures (using my IDE's struct member refactoring tools). Then I gave the local variable glossary and each function to Gemini and had it rewrite the code. Finally, I had a separate Gemini Pro 2.5 context and a Claude Opus context validate that the new code was LOGICALLY IDENTICAL the previous code (i.e. that only local variables were renamed, and that the renaming was consistent).
Most of the time, GPro did the rewrite correctly the first time, but other times, it took 3-4 passes before GPro and Opus agreed. Each time, I simply pasted the feedback from one of the LLMs back into the original context and told it to fix it.
The largest function done this way was ~560 LOC.
Anyway, the entire process took around a day.
However, at one point, GPro reported: "Hey, this code is logically identical BUT THERE IS A SERIOUS BUG." Turns out, it had found the cause of the DUPSORT corruption, without any prompting—all because the code was much cleaner than it was at the start of the day.
That is wild to me! (It actually found another, less important bug too.)
Without LLMs, I would have never even attempted this kind of refactoring. And I certainly wouldn't pay a software engineer to do it.
> What are you creating where you can see the results in that time frame to make entire business decisions like that?
I've developed new libraries (using GPro) that have APIs it can reliably use. What's easy for LLMs can be hard for humans, and what's easy for humans can be hard for LLMs. If you want to use LLMs for coding, it pays to need code they are really good at writing. AI-first development is the big win here.
(This is all in Clojure BTW, which isn't really trained for by vendors. The idea that LLMs are ONLY good at, e.g. Python, is absurd.)
While your lldb use is interesting,, I’m very much interested in what you said you’re doing greenfield. What is the scope of that?
Clojure has enough code out there that it’s well covered by the major LLMs.
What's the bug ID, have you submitted the fix back?
That was my plan, but I haven't yet--the fix was in my renamed code and I haven't put in the work to make it correspond to the original code. But here's the commit message, maybe you can see it easily:
And here's the function with renames (and the fix): I have confirmed the fixed logic seems correct, but I haven't written a test for it (I moved on to another project immediately after and haven't returned back to this one). That said…I'm almost certain I have run into this bug in production on a large (1TB) database that used DUPSORT heavily. It's kinda hard to trigger.Also, thanks for a great library! LMDB is fantastic.
Thanks for that. It doesn't look like there is an open bug report for this yet.
I understand your commit description but I'm still a bit puzzled by it. cursor_to_update shouldn't have a deeper stack than cursor, even if it was a cursor on a subdatabase. All the references to the subdatabase are in the subcursor, and that has no bearing on the main cursor's stack.
The original code with the bug was added for ITS#8406, commit 37081325f7356587c5e6ce4c1f36c3b303fa718c on 2016-04-18. Definitely a rare occurrence since it's uncommon to write from multiple cursors on the same DB. Fixed now in ITS#10396.
> Fixed now in ITS#10396.
Thanks, appreciated.