The Lost Magic of Friction #
Most of us got into this because we loved the puzzle. There is a massive psychological difference between getting a chat model to generate a full-stack dashboard and the grit required to make a machine speak for the first time using low-level languages.
Consider the effort behind a simple "Hello World" in x86 assembly:
section .data
msg db 'Hello, World!', 0xA
len equ $ - msg
section .text
global _start
_start:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg ; bytes to write
mov edx, len ; message length
int 0x80 ; call kernel
mov eax, 1 ; sys_exit
xor ebx, ebx ; exit code 0
int 0x80
The dopamine hit from that snippet didn't come from the text on the screen; it came from the friction. It came from fighting linker errors, deciphering cryptic compiler warnings, and fixing segmentation faults. The joy was in the cognitive struggle.
AI agents are designed to kill friction. The new value proposition is speed and pure ideation—you dream it, the agent builds it. But by removing the struggle, we've removed the source of professional satisfaction. Reviewing boilerplate doesn't spark the same intellectual fire as wrestling a complex algorithm into submission.
My Hybrid AI Workflow #
I've decided to stop blindly chasing the "maximum speed" promised by every LLM agent. I'm not being a Luddite, but I am being selective about where I apply prompt engineering and automation.
My current rule of thumb for an AI workflow:
Hand off the mechanical: I use agents for repetitive boilerplate, schema migrations, and mundane config files. There's no pride in doing manual labor for tasks with zero architectural value.Reclaim the intellectual: When a problem is complex, critical, or genuinely interesting, I solve it manually.
The goal is to avoid becoming a passenger in my own codebase. If we outsource the hard parts, we lose the deep learning that only happens during the "struggle" phase of development.
Next Active Learning: Solving the Labeling Bottleneck →