an eddy in the bitstream

Author: Peter Karman (Page 1 of 76)

Maker of lunches.
Teller of stories.
Singer of songs.
Crafter of code.
Kicker of darkness.

The Trouble with AI Tribbles

The proliferation of software coding tools that leverage so-called Artificial Intelligence via Large Language Models (LLMs) is really quite astounding. In the span of a couple years there is now an entire industry devoted to generating code and whole software applications using the barest of human language prompts. “ChatGPT, make me a sandwich” is the new sudo. I’ve read a few good think pieces on this topic amidst a sea of hot takes but one thing I have not seen is a reflection on the LLM code-generator in the context of the sociology of the prototype.

The prototype is a well-known engineering idea: make a thing quickly and cheaply to demonstrate a proof of concept, and then throw it away. For example, we believe our experience of a problem is real and can be addressed in this way. Having proven that to our satisfaction, now we can think about building the actual solution. A prototype is what comes out of a hack-a-thon, or a weekend coding binge, or even a deliberate phase of discovery and solicitation of feedback during product development.

Anyone who has been around organizations that depend on software tools knows this truth: your stop-gap, one-off, we-only-intended-this-to-last-a-week software has a high likelihood of sticking around much longer than you intended, to suffer bit rot, become brittle, and break at the least opportune time.

The problem with prototypes is sociological: they can work too well. People can quickly become attached to a prototype that actually works and solves a problem. Suddenly your Friday afternoon experiment is a vital piece of your organization’s infrastructure. The people that authorize the paychecks can be hard to convince that we need to stop and write this code as a proper piece of software (tests, documentation, modularity, CI/CD, etc) rather than continue to depend on what was supposed to be a throwaway idea. This is one reason why designers wisely insist on making prototypes ugly during the discovery phase of a project; folks are less likely to attach to something that is unattractive, even if it solves a problem, or at least they are easier to convince later that the prototype was intended to be thrown away and replaced.

LLM code-generators can crank out prototypes at an alarming rate, and they can look very pretty. Tens of thousands of lines of code with just a few sentences of prompting. Suddenly the Friday afternoon experiment can start to resemble a real application and the temptation to insert that experiment into production can be too strong to resist.

Tribbles, per wikipedia
Captain Kirk, forlorn with Tribbles. A still life.

Pretty prototypes puts me in mind of that classic Star Trek episode, The Trouble with Tribbles. The tribbles are cute, furry animals that proliferate at disturbing rates and quickly overwhelm your capacity to contain them. Their secret weapon? They make you feel really good, even as they consume more and more of your resources.

Writing as learning

What makes LLM-generated code deceptive is that it is largely write-once. A ten thousand line software program could evolve over months and years if written by humans. An AI could churn it out in minutes. Sure, it works and it looks good. But when you want to change it, or fix it, you are now dependent on the AI to re-generate it.

Why is this? Because humans learn by doing. Reading code is vital and important, but to really understand it, to learn a codebase intimately to the point that you know where best to nudge it or apply patches to achieve a desired change, you must spend time writing it. Changing AI-generated code is like climbing a sheer wall with no handholds for the first time. You have no muscle memory to fall back on.

As I learned in high school, the best way to learn a topic is to take notes as you read or listen. You build muscle through repetitive actions and activate your neurons and memory-making cells in a way that reading someone else’s notes simply cannot replace.

People sometimes comment to me on how fast I can write code. My trick? I don’t type or think any faster than anyone else. I simply spend a lot of time getting to know the codebase. Usually I do this by writing tests and fixing things that break. The first few months on the job, as I get to know an existing codebase, I tend to start re-writing it. Not a wholesale replacement. Just small things. All code needs care and weeding, just like a garden. All the good gardeners I know are constantly puttering around, trimming, weeding, moving things around to find a more optimal amount of sunshine, shade or water. It’s the same thing with code. And as I do that, I internalize the structure of the code, which files contain which logic, how all the pieces fit together.

The single biggest expense for any business is people’s time. Hiring a new software engineer and training them up to become a fully realized contributor to the efficacy of your team can take several months. In my experience, it takes me about six months, at minimum, to become familiar enough with a large existing codebase to make reasonably intelligent choices about how to change and maintain it. That’s a pretty expensive investment by a business, paying me for six months to learn about something by writing tests and re-writing what already exists. But in the end, after that learning curve is climbed, I can be very efficient and quick at generating fixes, new features, etc. The organization’s investment pays off. Like Daniel LaRusso I need to spend hours sanding the floor, painting the fence, waxing on, waxing off. And then I’m ready for the tournament.

But if I spend that time telling an AI how to generate code, I don’t really learn anything about it. I do not internalize any of it. I sand no floors, wax no cars. A LLM-generated application is immediately a legacy app, and I’m on my first day of the job. So while it seems like a really cheap way to generate working code, we need to be ruthless about treating it like a proper prototype and throw it away after it has proved the concept.

Civic Chill

In May 2022 I decided it was time to take a break from government service. I had been working with and in governments since 2015 and I was tired. I had the privilege and luxury to change jobs and start working in the climate change mitigation problem space.

Below is the spiel I gave my co-workers at Truss on my last day. Truss was a tremendous place to work and if you’re interested in the kinds of technical and organizational challenges that are their speciality, I recommend you give them a look.

I’ve duplicated the spiel text directly, so a few notes. One, Truss employees refer to themselves as Trussels. Two, Truss is a fully distributed company and so all the weekly all-hands meetings, or what they call “Prac” (short for Practioners’ meeting), are all on Zoom and most company communication happens via Slack. Three, there’s some salty language, and you may lose some of the affect in reading it versus hearing it. So just try to imagine my serene, Midwestern, public-radio-like, dulcet tones if you can.

If you have small people with you on this zoom call, you might want to mute the audio or put on headphones because I’m about to use some adult language.

There have been a few old timer Trussels who have left the company in the last few months. One of the things I’ve heard them say is they miss how the Truss culture has changed. I am not one of them. I know that culture is always an artifact of who is present, and when a company grows as quickly as Truss has, there’s no way that the culture would remain the same. One thing I have noticed, though, as perhaps a bellwether of that cultural change, is the relative decline of the word “fuck” in Prac meetings. Maybe it’s a subtle self-censorship, as if with so many new people we’re trying to practice a little more polite company etiquette. Maybe not. Certainly we’re living in unprecedented times, so my anecdata is exactly that. In any case, if you’re one of those who bemoan the loss of Truss culture, don’t worry. In the next 3 minutes I’m going to significantly raise the average number of utterances of the word “fuck” dropped during Prac.

I’m going to drop a visual aid into the #prac channel.

I’ve always thought that the word “fuck” is a little like the word “smurf” in that it can mean anything you want it to, entirely dependent on the tone and context in which you use it. If you’re offended by the word “fuck” I completely understand. I was raised in a conservative evangelical family and until I was in middle school, I thought the “f-word” was “fart.” Even to this day, I feel more squeamish saying “fart” aloud than I do saying “fuck” aloud. So now I’ve said both words aloud in a single sentence, and yes, even at age 50, I can confirm that the strange-ness persists.

My own need for therapy aside, I’d like to share my thoughts on two phrases with you on this, my last day at Truss. My dearest hope is that you will hear what I have to say and then actively resist and even reject it. Hopefully you’ll see what I mean by the end.

The first phrase is “give a fuck.” Or its inflammable counterpart, “don’t give a fuck.” I say “inflammable” because “give a fuck” and “don’t give a fuck” seem like opposites but can mean the same thing depending on how you say them, much the way that “flammable” and “inflammable” appear to be opposites but actually mean the same thing. To “give a fuck” means to strongly care about something. But if someone says, in an emotionally strong tone of voice, that they don’t give a fuck, then I suspect they actually do give a fuck. There’s a corollary: “fucks to give” as in “I’ve run out of fucks to give.” And of course, the old chestnut, “what the fuck” which is what you say when you give a fuck but wish you didn’t. I could go on. We have a funny language.

I like people who give a fuck. I feel a certain comradery with them, even if the things they give a fuck about are different than the things I give a fuck about. I have a hard time understanding people who don’t give a fuck about anything. Usually I suspect they are just in the closet about what they give a fuck about, and are afraid of disappointment. That’s what cynicism is: the fear of appearing to give a fuck. As we know, cynics are disappointed idealists. And if there’s anyone who really gives a fuck, it’s an idealist.

I mention giving a fuck and not giving a fuck because of a second phrase I’d like to introduce you to: civic chill. This is a phrase I made up to describe a particular kind of being in the world. Have you ever met another human, especially an older person, like an activist or social worker or community organizer, who seems to both give a fuck and not give a fuck, simultaneously? Like, they are ready to march in the streets, get up in the face of the powerful, agitate and advocate for what needs to be changed, and yet they seem totally chill, relaxed and trusting at the same time? That’s what I mean by civic chill. It’s a passionately detached engagement. It’s the simultaneous embodiment of believing that what you are doing and saying really matter in a crucially important way, and that they are also doomed to fail. It’s a paradoxical tension in the best Kierkegaardian sense.

Some of you know where I’m going with this. And some of you are googling Kierkegaardian.

The kind of work Truss does in and with governments may require a great deal of civic chill. Or not. Whenever you start a project, the odds are not in your favor that you will ever ship something to production. Most often, failure to ship is not a technical problem and most often it is completely out of your control. It’s one of the many tech-in-government problems that are not about technology but are instead about compliance and procurement and budgets and organizational inertia. If you manage to ship, great! Celebrate! If you fail to ship, recognize that there are many forces aligned against you and it’s likely not your fault.

So you have to start each day holding two contradictory beliefs: what you are doing really matters, and likely it will fail and not matter.

Even though I have, temporarily (I hope), currently lost my civic chill, I am still going to share with you my secret for how I keep it when I’m able to. The secret is: give a fuck, really give it. Then give it away. And then celebrate the privilege and opportunity to give a fuck. What a gift.

Alright my friends. I wish for you the freedom to both give a fuck, and not; to dwell in your civic chill, and not; to make good coffee, and not. Peace.

Charlotte’s Web Day, part 10

Today is the tenth anniversary of Charlotte’s Web Day. It has never caught on widely, despite the shoutout from Wikipedia, but I have it on my calendar. This year I re-read the book again in a single sitting and, as usual, new sentences stuck out to me. Here’s one.

“I only distribute pigs to early risers,” said Mr. Arable. “Fern was up at daylight, trying to rid the world of injustice. As a result, she now has a pig. A small one, to be sure, but nevertheless a pig. It just shows what can happen if a person gets out of bed promptly.”

Happy Charlotte’s Web Day!

« Older posts

© 2025 peknet

Theme by Anders NorenUp ↑