How I use LLMs

Spoiler: the robot didn't write the compiler.

As LLM's have become more prolific, more everywhere and a bit too in your face I feel it's important to clarify what is LLM assisted and what is not.

I've come to like using LLM's specifically I use some offline Deepseek models I run locally and whenever the credits allow, Claude and I used to use Cursor before finding VS code forks too overwhelming and moving to Notepad ++. No I have not used Codex and no I dont really follow AI news that often so this isn't me trying to convince you of any position on the LLM debate. If it is any hint the fact I call it an LLM and not AI should be somewhat of a giveaway but to spell it out it's theyre tools. Very interesting and helpful tools when used right and utterly annoying and frustrating when they spit out confident garbage.

a TLDR of this is: I use LLM's for rubber ducking, some code generation (Throwing tests at a compiler mainly) and helping with a few tidbits. They're rubbish for the things I actually do. The code and the design, for better or for worse, is authored by me.

What I don't use LLMs for

in HLASM (IBM High Level Assembler) there is a very funky feature that doesn't really exist in modern programming languages and that is the fixed width of the program itself. Because IBM had to maintain backward compatibility with the dawn of computing (including punch-cards) in HLASM you have to identify, with an X, if the line continues to the next line. Failing to do this and running over column 72 causes what is called a "continuation error" and it is the bane of all HLASM programmers.

Especially me because I've never worked properly on a mainframe except recently on one the OCaml team gave me access to but that wasn't a HLASM job so I constantly make that error. When I was working on Z390 which I'm a contributor to I asked an LLM to help me with a continuation error happening in the SEARCH macro PR I did. It was like looking at a half blind drunkard try and do a binary search. It generated about 12 odd bash commands, 2 whole python scripts and about 30 minutes of work (I was running it while the kettle was on) and it still didn't find where column 72 is. Because it doesn't know WHERE column 72 is or WHAT a column is or WHAT the number 72 is.

It's a text generator giving the next plausible word. Its fantastic on what it's trained on (see all the python and typescript projects in existence) and is really bad at what its not (HLASM which is largely proprietary, historical languages, lower level programming and compilers which is increasingly being cannibalised by LLVM and MLIR). Also LLM's cannot "see" like a human can, I noticed the continuation error in about 10 seconds after I put my mug down (earl grey tea if you're curious) but the LLM could not. This is because an LLM sees a block of characters (sometimes called tokens I believe) which is why for the longest time no LLM could correctly answer "how many R's are in the word Strawberry", it had to be hardcoded on.

So largely I still have to do what I have to do. LLM's have structural limitations to what they can do, especially in the space I work in.

What they're genuinely good for

However, the flip side is that LLM's have made my life so much easier and I have no shame in admitting that. Ever since BarraCUDA has gotten an ounce of popularity I've had a few hardware companies offer me remote access to test on their GPU's. Although one AMD chip company, Hot Aisle, is a single CLI command and you could sleep walk into it not everyone is built the same. Some you have to go on a journey to Narnia, download a docker image, figure out their specific scripting style and for some reason theres a .yml file. LLM's are fantastic at helping me navigate all these hurdles because otherwise it's just one post on a forum with the singular comment "oh I already fixed this".

When I hop into VS code to use some of their nifty plugins I use intellisense, I use it for adding comments to my code when I dont feel like writing them, I also do some rubber ducking as well as general brainstorming. Its good to be able to bounce ideas off something when I largely do this alone and if I go to sunday dinner talking about Register allocation i'd look like I'm crazy. LLM's have also been a fantastic "second pair of eyes" I wouldn't otherwise have. It's useful for keeping me disciplined in my coding style, noticing where parts are undercommented (I didn't comment on parts of Conway which is a binary translator written in pure Assembler, always write comments for Assembler) and I talk to my local model like its a note and it generates really easy to read .txt files which I can add or change to over time.

My own tooling

I've built my own too, because of course I have. None of it is for release, so the names stay with me, but roughly: a small CLI coding assistant, like Claude Code or one of the dozen spinoffs, except minimal and mine, and it does not tell me it's "schlepping" through my files like that was ever a word anyone said out loud. Some help aimed squarely at low-level work. A graph query over a locally-hosted pile of about 50GB of documentation covering every computer and language I could find, the old and obscure ones included. And a RAG over the CBT tapes I keep, so the things written for machines that are mostly landfill now are at least answerable.

The art stays human

One more line on what is and isn't generated: every image and drawing on this site and across my projects is human-made, and always will be. My sister makes most of them, sometimes me, unless someone else is credited.

LLM's are a tool, a fantastic tool and I hope they'll bring more and more people into the wonderful world of programming. However it is just a tool and does not replace human thought nor judgement. If all of my work was purely LLM's there wouldn't be compilers it would be a sad menagerie of horrible JavaScript libraries and if there was a compiler it'd have 5 separate frameworks and the build process would take an hour and be more verbose than the script to the bee movie.