LLMs: the opposable thumb of computing
Our thumbs are opposable: they can, with both strength and precision, touch any part of any other finger. We can grip things, pinch them, hold them carefully or loosely.
The existence of our thumb makes our hand more useful, more dynamic, and importantly: compatible with a wide range of complex tasks. We can smelt metals, we can play the viola, we can sauté a delicious pan of peppers.
We can hunt, we can defend ourselves, and we can write down our thoughts.
All of this, plus every other trade and hobby, thanks to the thumb. Take it away and we are much clumsier, more helpless. Fingers alone can pull and push, but they just aren’t enough for the kind of complexity we built a civilization around.
With the thumb, our hand is a tool for reshaping the universe. And for millennia, for better or worse, we’ve been doing just that.
Amidst all the hype, all the skepticism, all the rending of clothes, I am here to tell you:
The LLM is to computing what the thumb is to our hand.
The power of for
for
is a fulcrum.
On one side of the lever, a method of counting. How long are we doing this? Under what conditions do we stop? How many steps per turn?
On the other side, work.
Each time we do something, what are we doing?
Programming uses loops a lot. They’re essential grammar of computing strategy, since the processor itself is running on a loop.
The same way prepositions have fewer letters, the syntax for writing a loop is terse.
Like math, this is one of those places where learning concepts at the same time you’re learning their symbols just makes life harder. I had the damndest time interpreting loops as a beginning programmer. C-style loops might as well have been hieroglyphics. 1
for (i = 0; i < 10; i++) {
//Do something
}
If I’d started with Swift, the syntax would have been much clearer:
for variety in burritoVarieties {
//Variety-specific code
}
So we have a collection: burritoVarieties
. If we iterate through that collection, for each variety
, our code can take unique directions.
A paper-wrapped, green chile-filled burrito looks very different from a smothered, red chile situation. They’d need different photos, their costs are different.
Your takeout app is a roiling sea of loops.
This is the central premise of conventional computing. Developers write loops that might occur on human timescales, or might be much faster, controlling radios and network behavior at a dizzying rate.
Deep at the level of miraculous miniaturization, many billions of cycles conclude every second, as instructions churn through microscopic transistors carved into silicon by beams of light.
And for decades, that was the story. Learn to work with loops, don’t waste resources inside them, create code that adapts to different situations. Such code is more or less deterministic: you run it 100 times, you get 100 identical results.
This infinite-iteration paradigm of computing has given us everything from ballistic missiles to email to the Facebook algorithm. You can do a lot with it.
But it’s fundamentally constrained: you have to write rigid code and anticipate all the conditions it will face. What if there were another way?
Enter ‘AI’
People are freaking out.
I mean the AI discourse is just rancid stuff. People are charged on this topic.
On some level: I get it.
The rules are changing. We’re watching a churn that could be as consequential as the microprocessor, which kicked off a 50 year supercycle that’s still playing out.
But the ways they’re changing are weird.
After a generation of prosperity and endless career growth, technology workers have faced years of layoffs, stiff competition for roles, and declining flexibility from employers. What was once a safe and growing pie feels like it’s shrinking.
AI, with its claims of labor savings, arrives at the worst possible moment, compounding these headwinds, and handing perceived leverage to the cost-cutter case.
AI is seen as a business lotion: slather it on, get better results.
But the way it actually works is this:
You give up the deterministic clarity of your for
loops.
In the AI age, we all have the choice to wield a very flexible, somewhat unpredictable technology.
In trade, you get much greater range of motion. All you have to do is describe, in natural language, what your goals are. In return, large language models can both interpret and generate endless patterns of structured information.
Instead of a fulcrum, you have a djinn conjuring something that might solve your problem. If you’re cautious, if you’re thoughtful, if your desires are realistically constrained, it can actually happen.
This ambiguity requires thoughtful strategy to harness, and that strategy is in short supply. So you have a lot of sloppy chaos following AI deployments around like hungry ticks on a dog.
The one where an LLM invents new corporate policy remains my favorite category of this failure.
Like all emerging technologies, it’s just not obvious at the beginning how to best use this stuff.
Still, the power of LLMs to reshape things is formidable at scale. That’s just a lot of djinns conjuring a lot desire. It’s unsettling stuff.
But it’s also the destiny of computing to arrive at this place. Now begins the work to make sense of it.
Thumb and fingers
The true power of LLMs emerges when they are combined with conventional computing: run in a loop.
For example:
- An LLM may generate incorrect code
- A linter will catch and report errors as they’re written
- With this error-correction data, the LLM can run again
This loop can continue until all errors are resolved.
This is the agent revolution now underway, and it’s poised to change how code gets made. It’s also a great demonstration of how the fingers of conventional computing pinch against the thumb of the LLM.
Some example fingers:
- Variables and constants, to precisely map a value to an identity
- Logic to compare values
- Algorithms to transform values
- Loops executing code in sequence
- State machines, keeping track of a system or complex operation
These are a lot of power on their own. But add the thumb:
- Interpret unstructured or unanticipated input
- Transform bodies of text
- Create new text to be interpreted by conventional computers
- Read an existing pattern of text, then extend it
The combination of fingers and thumb unlocks an all new epoch for how human imagination solves problems through computing. The rigidity of conventional, deterministic code pinches against the flexible grip of the LLM.
The result is capabilities that will take a long time to fully explore.
Come with me if you want to live
This kind of flexibility has been the quest of computing for as long as we’ve had it. Alan Turing, a father of modern computing, proposed a test he called “The Imitation Game” specifically in anticipation of this capacity. In 1950.
Now we’ve arrived: not just a dull, mechanistic automaton, but a machine capable adjusting its approach even to novel, unanticipated input.
Again: that’s a little scary, right?
An immediate toxic use case for this new power: poisoning every online conversation with fake people. You can just do that now. If you can afford the computing capacity, you can saturate the replies of any conversation.
The spam consequences are numerous, and touch every layer of communication. But they’re nothing compared to the larger threats: ubiquitous state surveillance. This opens the door to monitoring and cataloging every kind of communication.
To say nothing of applying these technologies to war. From psychological operations to target selection, this thumb creates all new opportunities for destruction and mayhem.
But this happens with every tool. The great wars of the 20th century were exercises in heinous experimentation: combining the new powers of industrial technology and fossil fuels with the ancient rites of our worst impulses.
Yet, World War II gave us the dawn of modern computing. It gave us all new ways to harness physics to solve our energy problems. It gave us modern antibiotics.
Humanity is indeed terrifying in its destructive capacity. And since before civilization itself, our tools have been turned toward truly blood-soaked ends.
But we also use our tools to invent musical instruments, new foods, new medical advancements. Our tools have created the sublime, from fine art to cinema to our favorite video games.
There are genuinely good reasons to fear our technological capacity. But it’s up to us to turn every tool toward its best and most fruitful end. The advent of the LLM has opened a pandora’s box, opening a new chapter of what a computer can accomplish.
We know the assholes are going to build something scary. They always do. But what sublime accomplishments could be made with this all new power instead? I don’t think putting our heads in the sand is a reasonable response to the downsides.
I think we have to be the authors of the upside.
- This code starts at zero, and increments until it reaches ten. Then the loop exits. In each stage of the loop, my code can know how far along the process I am by reading the value of i, and respond accordingly. Again: a little opaque, but it’s written simply because it’s written constantly.↩