← All posts

How I Use AI and How I Don’t Use AI

How I don’t use AI

I don’t use generative AI to write prose or lyrics. I don’t use it to write blog posts. I don’t use it to write e-mails for me, outside of the occasional auto-complete of what I was going to say anyway. I don’t use it to create music. I don’t use it to create graphics. I consider those lanes of creativity to either be second nature already or rewarding forms of toil — like a zen garden or a Bonsai tree. I happily do them the old fashioned way, with no generative AI but some minor augmentation via machine learning through plugins, which is essentially inescapable in the modern digital landscape.

You’ll notice that I used an em dash in the last paragraph even though I claimed to not use generative AI to write prose. That’s because I’ve been using em dashes for decades. I find them to be more elegant than semicolons in nearly every way. I also tend to hyphenate small groups of words to enhance their readability, which is apparently another thing that AI does a lot. Sorry for teaching it stuff. I’m not going to change how I’ve been writing for my entire life to pass an AI purity test though, so we’ll just have to use the honor system if that’s alright.

How I Use AI

I use AI when faced with annoying toil, which mostly ends up being the iterative cycle of trial & error that is inherent in software development. I also use it write documentation because, while I have a knack for writing good documentation thanks to several years of working in support, I’d rather be using my time to do something else, so I find that AI written documentation is perfectly readable and useable once edited.

I have never had any particular talent for — or interest in — writing beautiful code. I have always found coding to be kind of an annoying process. I have diagnosed ADHD and suspected AuDHD, so I tend to either hyper-focus on things or not focus at all, which is a bad trait to have as a programmer because I will either spill 2 days of my life out on a single, potentially small problem that I’m trying to solve programmatically, or I forget about what I’m doing altogether and drag my feet to get back to it. Sometimes I never get back to it at all, resulting in a massive graveyard of dead projects that is a familiar fixture for most software developers.

When I code, I’m typically just trying to find the quickest path to solve a problem, automate something, or to make something easier for myself to do again in the future. I’m very lazy and inefficiency makes me mad — literally, it does. That’s why I’ve made a career out of solving problems and automating stuff. Things that get in the way of my ability to be lazy, like manual tasks with high probability for human error — or strings of things I have to remember to do in sequence — always feel like an open sore on the roof of my mouth that I can’t leave alone once I know it’s there.

I am an autodidact, which means that I am self-motivated to learn through self-study, and so I teach myself stuff all the time but combine that with my ADHD and it means I have major trouble focusing on subjects that I’m less interested in. Luckily, I’m in love with computers, so I poured my entire life into learning about them — and I still love and learn. I’m usually somewhere near the cutting edge of the goings-on in tech.

I naturally seek to know a good deal about a lot of stuff, and I can hyper focus on subjects I’m interested in and learn a lot about them in a small amount of time, but I don’t generally have a master’s level of knowledge about any one thing in particular. I’m a Jack of All Trades type of guy and always have been. There are always weird gaps in my knowledge that I have to backfill as needed — if needed.

Prior to the introduction of large language models, most of my projects were ugly amalgamations of code blocks that I found on the Internet somewhere and mashed together until the thing I was coding did what I wanted it to do. It took me days or weeks to come up with something usable most of the time. I actually hated that process, but hated not solving a problem even more, so I typically endured the pain — especially if the problem was someone else’s.

The LLM essentially generates code in the same way that I would have done myself, but much faster, with fewer syntactic blunders that waste time. This new form of iteration feels like rewarding toil to me, like writing music, versus the annoying toil of blind trial & error — or Googling in a desperate attempt to find someone, anyone, who had the same problem in the past and remembered to post a solution to some random forum.

It’s taking my prompt and going to the same places I would have gone, but parses the output way faster than I ever could. I prompt it based on pretty good fore-knowledge of what I’m doing and it backfills the gaps in my knowledge where needed, but my experience as a professional nerd allows me to notice when the AI is doing something in a dumb way or hallucinating, so I can quickly stop it and correct it. The result is a workflow that enhances my productivity while also no longer feeling like work.

I have been coding with LLMs since they came out and I’ve gotten pretty good at writing efficient prompts, knowing which tools are going to be a waste of time and which are going to bolster my workflow, and getting good code out of my agent(s). For all of the time I’ve spent using LLMs, I’ve never once felt like my livelihood was being threatened by them. They can’t reason like I can, they can’t detect shitty UX, or act upon hunches built on the context of an entire career in several areas of tech and related fields — an entire life of interpersonal communication.

Not only will an LLM never replace me, they make me feel more required — more secure. Putting an LLM in the hands of a novice engineer is like putting a Cessna pilot in a F-35 cockpit. They may be able to fly, maybe, but they can’t get anywhere close to the performance of a trained F-35 pilot and the chances they faceplant into the ground, taking the very expensive airplane with them, is very high.