Archive for February, 2026

You had a story

You had a story you used to tell yourself about how you got here in life.

You’d share the story with others. Maybe you’d be at a party, and someone would ask what you do, and you’d say, “I’m a programmer.” And their eyes would perk up and their mind would fill with images of ball pits and propeller beanies and that funny movie with Jesse Eisenberg, and they’d say, “Oh yeah, like you build apps?”

And you’d proudly brush it off and say something like, “Yeah I work on the backend, you don’t know what that is, but it’s basically the magical thing in the cloud that makes your apps work.” Or you’d say, “Yeah I work on the frontend, it’s the thing you touch all day long on your phone, I make it look good and run fast.”

And if you thought about what it took to get there, you’d think of the lines of code, fuzzy green text in a black terminal, the mystical incantations that lit up the glowing rectangles that everyone else was staring at all day. They didn’t know the effort, the raw-adrenaline flow of code bursting from your fingertips as you wove dreams into pixels. Or the writer’s block of the showstopper bug that nagged you on your jog and in the shower until suddenly the answer came to you when you awoke, as if from a dream, and you rushed to the keyboard to pound out the solution, the pure exhilaration of making the computer obey you.

Then someday somebody took that story from you. They told a different story: one where someone on a stage, in a business suit that you’d never wear, with a smug grin that you’d never wear, talked words into a computer and, the little traitor, it obeyed him. He talked words like you or I would, like any simpleton would, and it obeyed him. And the crowd cheered because they knew that now the glowing rectangles belonged to them as well, and not just you, with your wizardly spells that took years of study to master.

When you see your brother at Thanksgiving, he’s excitedly showing your parents an app he built to track football scores. Except he didn’t really build it, you think to yourself bitterly. He’s not a programmer, he’s a mechanic, and maybe he knows his way around cars, but he never grinded LeetCode to pass an interview, or stayed up late studying Data Structures and Algorithms to pass an exam. “Let you brother have this one,” your dad chides you after an outburst at the dinner table. “It’s just an app.” Just an app, you scoff with amazement.

When you go home, you pour yourself a stiff drink and wonder what kind of story you can tell yourself now. You were Superman, and now every schmuck puts on a cape and thinks they can fly. The fools! They’ll fall. They’ll fall and crash, you reassure yourself as you take a swig.

Your friends agree. “This stuff will never work,” they say, as if with bored detachment. “Remember low-code? Remember no-code? What a joke.” But you notice something: a fear in their eyes that you’ve never seen before. You don’t feel reassured.

Eventually you find that your own colleagues are warming to the stuff. “It’s actually pretty useful,” they say. “Give it a shot.” You’re astounded by the pure treason. Don’t they realize this is a rejection of everything they’ve done their entire careers, an insult to their very dignity as a programmer? They shrug. “Sure, but times change. I want to have a job in five years.”

Five years. Your retirement is looming. And you were looking forward to leaving at the top of your game, maybe to tinker on some side projects after money is no longer an issue. But now you don’t know about the money, or the side projects, or whether you’ll be at the top of your game anymore or just a washed-up has-been. The panic is really starting to set in now, and you’re looking for an out.

You approach the tool out of resentment – cautiously, like a cursed artifact. You hold the dead thing at arm’s length, as if its very aura might poison you. You try it out, and it chirps happy success but everything it spits out is failure. You close the laptop lid. Vindication! The thing truly is dead, a fraud, a sham. You can return satisfied to your beloved craft.

Except your craft doesn’t feel right anymore. More and more, you read about astounding feats created with the accursed tool. Colleagues you trust and admire are now reconfirming, in more strident tones, that it actually works. The treason is all around you, choking your joy, ruining what once gave you so much meaning. You can barely stand to look at the blinking cursor in your text editor anymore, which has also betrayed you with its daily offers to steal your voice, retire your fingers, extinguish your spark.

You start to wonder if this industry is even right for you anymore. How can it be right when everything around you feels so wrong? And always, there is the fear: fear that you are losing ground, fear that you won’t make it past the next layoffs, fear that you’ll be joining your brother in the auto shop and he’ll be showing you the ropes, you with your fumbling fingers that can barely hold a wrench, and oh by the way did you see the app he built to replace his content management system?

Where the story goes next is for you to decide. Maybe you can skate by for a few more years in a sinecure, holding onto a payslip for dear life, while the world moves whooshing around you. Maybe you’ll give in and learn the new tools, but with a kind of detached ambivalence, going through the motions but no longer feeling joy or meaning or like you have something worth talking about at a dinner party.

Or maybe you’ll look around and study those who have adapted to the new world and are thriving. Maybe you’ll notice the coworker who brushed off all the doom and gloom and just says, “Hey, look at this cool thing I built.” And maybe you’ll notice that this coworker has their own kind of mastery, their own tools and workflows with odd names that turn you off at first but ultimately pique your curiosity. Maybe you’ll wonder if it makes more sense to hang out with the people building and sharing and having fun instead of those who mope and whinge and cry for a lost golden age. Maybe instead of being ruled by fear, you’ll find your creative spark again.

Because isn’t that the point in the first place? Isn’t that why you got into programming? Wasn’t it to make something, to put it out in the world and bring joy to others with your creation? Wasn’t it to make a song out of sand, a painting out of pure thought, a miracle out of nothing, regardless of how you did it?

If it is, then you might find that the story you need to tell about yourself, about who you are and where you came from and why you create, was right there all along. The story has been told hundreds of times throughout history – only the characters and the scenery change – and you still have it in you. You found it once before, and if you search for it with curiosity and an open heart, you’ll find it again. It never really left you.

Days of miracle and wonder

Oprah Winfrey and I have something in common, which is that our favorite album is Paul Simon’s Graceland.

I’ve been thinking a lot recently about the opening track, “The Boy in the Bubble”. The song can be read a few different ways, but I read it as an aging man amazed by modernity but also kind of frightened by it, and comforting his loved one with:

These are the days of miracle and wonder, and don’t cry baby, don’t cry, don’t cry

If these are “the days of miracle and wonder,” then why would anyone want to cry about it? Well, a few different reasons:

These are the days of lasers in the jungle, lasers in the jungle somewhere

Staccato signals of constant information

A loose affiliation of millionaires and billionaires

Sound familiar? It was written in 1986, but it could have been written today.

One thing I’ve noticed during our recent technological turbulations is that some people seem to have lost the capacity for wonder, or are willfully ignorant of the wonders around them. And if you can’t acknowledge that something extraordinary has happened, then you can’t start grieving for what has been lost (the subject of my last post). To me, this is the opposite of what Paul Simon is advocating: awe for the future combined with reverence for the past.

For example, I have a lot of conversations on Mastodon that start with me acknowledging some flabbergasting feat that coding agents have accomplished lately, like one-shotting a browser API that passes 77% of the relevant Web Platform Tests, or building a rudimentary browser that can render basic web pages, or building a C compiler that can compile the Linux kernel, etc. Then the interlocutor says something like, “Sure, but are the Web Platform Tests really representative of a working browser?” (Short answer: yes, it’s the entire basis of cross-browser projects like Interop.) Or: “Well sure, but is the code maintainable and bug-free?”

I find these conversations kind of baffling. It’s as if you’ve been shown a talking dog that can also sing the blues and play steel-string guitar, and your first response is, “Yeah, but the second verse was a bit off-key.” I understand skepticism – being skeptical is good, and there is a ton of hype and hogwash out there in the “AI era,” but like… can we just take a moment to be amazed? None of this was imaginable even three years ago, and now it’s practically worthy of the snooze button.

In fact, some of my more AI-adept colleagues are actually not much impressed with these stories, precisely because they know that even more amazing stories are likely around the corner. The lasers in the jungle have become so commonplace that we hardly notice them anymore.

Personally, I’m trying to maintain my skepticism as well as my sense of wonder. There’s so much breathless hype out there that it clouded my judgment for a while, but I’m also humbled by how fast things have moved, defying my early expectations.

I don’t consider myself a tech optimist – I seriously doubt we’ll ever travel to Mars, let alone colonize it, and I think predictions of the singularity or uploading our brains into the cloud are fun science fiction but hardly a bet I would take on the optimists’ side. But I have to admit that I was wrong on AI coding, so I’m prepared for my expectations to be defied again.

In many ways, I feel like the last year has been a victory for the techno-optimists – LinkedIn bros, Elon Musk stans, former NFT-peddlers – over artists, tech critics, and left-leaning intellectuals, which has been a bitter pill for me to swallow, since I identify with the second group much more than the first. This is what I was trying to get at with “AI tribalism”, although in retrospect I was a bit clumsy about it.

So if you’re feeling like me, and a bit bitter that the tech bros are taking a victory lap right now, and maybe hoping that they realize their shoelaces are untied and fall flat on their faces, I’d suggest taking a different tack. Disregard the hype, ignore the breathless prognostications of eternal abundance, and just look around and ask yourself if you would have been impressed by any of this three years ago. If so, take a moment to be amazed. It doesn’t make you a stooge or a credulous mark; it just makes you human.

And if you have to grieve, grieve. Technology is changing in scary and unpredictable ways, and not all the changes are positive. (Far from it – I wonder if someday we’ll look back on the invention of LLMs like the invention of the atom bomb.) But eventually we should move on from our grief, because the world is not ending; it’s just turning, as it always has.

In other words:

These are the days of miracle and wonder, and don’t cry baby, don’t cry, don’t cry

We mourn our craft

I didn’t ask for this and neither did you.

I didn’t ask for a robot to consume every blog post and piece of code I ever wrote and parrot it back so that some hack could make money off of it.

I didn’t ask for the role of a programmer to be reduced to that of a glorified TSA agent, reviewing code to make sure the AI didn’t smuggle something dangerous into production.

And yet here we are. The worst fact about these tools is that they work. They can write code better than you or I can, and if you don’t believe me, wait six months.

You could abstain out of moral principle. And that’s fine, especially if you’re at the tail end of your career. And if you’re at the beginning of your career, you don’t need me to explain any of this to you, because you already use Warp and Cursor and Claude, with ChatGPT as your therapist and pair programmer and maybe even your lover. This post is for the 40-somethings in my audience who don’t realize this fact yet.

So as a senior, you could abstain. But then your junior colleagues will eventually code circles around you, because they’re wearing bazooka-powered jetpacks and you’re still riding around on a fixie bike. Eventually your boss will start asking why you’re getting paid twice your zoomer colleagues’ salary to produce a tenth of the code.

Ultimately if you have a mortgage and a car payment and a family you love, you’re going to make your decision. It’s maybe not the decision that your younger, more idealistic self would want you to make, but it does keep your car and your house and your family safe inside it.

Someday years from now we will look back on the era when we were the last generation to code by hand. We’ll laugh and explain to our grandkids how silly it was that we typed out JavaScript syntax with our fingers. But secretly we’ll miss it.

We’ll miss the feeling of holding code in our hands and molding it like clay in the caress of a master sculptor. We’ll miss the sleepless wrangling of some odd bug that eventually relents to the debugger at 2 AM. We’ll miss creating something we feel proud of, something true and right and good. We’ll miss the satisfaction of the artist’s signature at the bottom of the oil painting, the GitHub repo saying “I made this.”

I don’t celebrate the new world, but I also don’t resist it. The sun rises, the sun sets, I orbit helplessly around it, and my protests can’t stop it. It doesn’t care; it continues its arc across the sky regardless, moving but unmoved.

If you would like to grieve, I invite you to grieve with me. We are the last of our kind, and those who follow us won’t understand our sorrow. Our craft, as we have practiced it, will end up like some blacksmith’s tool in an archeological dig, a curio for future generations. It cannot be helped, it is the nature of all things to pass to dust, and yet still we can mourn. Now is the time to mourn the passing of our craft.

15 years of blogging

My first blog post was published just under 15 years ago in March of 2011. Since then, I’ve published 151 posts, including this one. (If I was a numerologist, I’d think it had something to do with Pokémon.)

This blog has covered a wide variety of topics, including Pokémon in fact (I wrote the first Pokédex app for Android). The topics largely followed the trajectory of my career: starting with machine learning, veering into Android, taking a detour into Solr/Lucene, and eventually settling on JavaScript and web development. Later I wrote about web performance, accessibility, web components – basically whatever topic crossed my desk. You’re reading the unfiltered output of my brain here, more or less.

I don’t publish a lot – less than one post per month apparently. My main guiding principle is that I don’t write unless some topic is itching to get off my chest, or I think I have something novel to say. There are no ads on this humble WordPress blog, and I don’t have anything to sell you, so there’s nothing motivating me except my own desire to explore an idea, make a point, or just stretch the old writing muscle.

As you can tell, I’m too lazy to even update the vintage WordPress theme – odd for someone who pretends to be a professional web developer! I’ve always felt like that was a distraction, though. I know some bloggers who spend more time tweaking their CSS than writing content, and that’s fine, but it was just never my goal for this blog. If I want to scratch that itch, I write an oddball project like Pokedex.org or Pinafore instead.

The biggest challenge of the early days of this blog was just getting anybody to read it. The biggest challenge later on was dealing with the overwhelming anxiety of realizing “Oh shit, people are actually reading this”, followed by the inevitable fears of:

  • blowback (I got too controversial)
  • audience capture (I got soft)
  • being ignored (I got boring)

I feel like I’ve careened between all of these extremes over the past 15 years. Overall my writing was a lot more freewheeling in the past, and I’ve tried to recapture some of that lately, but having an audience just naturally gnaws at your mind in a way that (I find) I can’t totally ignore.

Quitting Twitter (and wasn’t that a weird story arc on my blog!) helped a lot, although there’s still of course Mastodon and Lobsters and Hacker News and all the rest where the comments can be a vicious cesspool if you spend too much time there. (If you’re reading this from RSS: you’re my favorite readers, and they can take my RSS reader from my cold dead hands!)

Not that this blog has a ton of readers. There’s actually a list of the most popular blogs on Hacker News, and mine hit #631 last year. This puts me somewhere between “I think I’ve seen his face on the internet once” and “never heard of him.” Although based on my WordPress stats, my best days are somewhat behind me, with my all-time most popular posts being:

Although rounding out the top 10, we do get some more recent hits:

Interestingly to me, though, the work that I’m most proud of didn’t get a lot of traction. It wasn’t a polemic, or a thinkpiece, or a perhaps-too-glib takedown of a major browser vendor (sigh) but instead my work on performance optimizations, benchmarking, etc. A lot of my blog posts are basically: “People say this thing is fast. Is it though? Let’s run some numbers.” For example:

This is the kind of stuff that (I like to think) really moves the needle in the web development space, because words are cheap but numbers talk. I’ve heard from some folks that a post of mine immediately short-cutted some internal discussion about whether they should choose Strategy A or B for their web app. I love having that kind of impact!

This experience has taught me that the page stats aren’t everything. Sometimes it’s not about how many people read your post, but whether the right people read it. One example is my recent post on the js-framework-benchmark. This was a sleeper hit: barely touching any of the socials, never high on Hacker News or Lobsters, and yet I know from personal anecdotes that performance experts read it and appreciated it. Not every post needs to be a thrilling dimestore paperback: some can be a ponderous Tolstoy or Joyce.

Conclusion

When I first started this blog, I was early in my career and didn’t really know what I was doing. I made a blog because I guess I thought it was the cool thing to do, and that maybe it would help me land a job someday.

I named it “Read the Tea Leaves” because I thought you were supposed to have a punchy title like “Daring Fireball” or “Coding Horror”. If I were starting it today, I’d probably just call it “Nolan Lawson’s blog” and be done with it (although I do love tea).

Keeping this blog has been a great source of passion for me, and it has indeed opened doors in my career. I landed my most recent job in no small part thanks to this blog (good foresight, 2011 me!), and it’s also just really fun to get recognized at a conference or have a coworker mention that they enjoyed one of my posts.

I’ve found though that the greatest value is just the act of writing itself. That’s one reason I don’t use AI for any of these posts (heck, I don’t even use Grammarly – all the spelling mistakes are mine!). The act of writing is also the act of thinking, and my thoughts are (usually) sharpened by typing words into a blank page.

And if nothing else, I can put an idea out there, let it get tossed in the wind, and see if anybody picks it up to do something useful with it (even if that something is just to denounce or refute it). For that reason, I don’t even regret my most controversial posts, and not even the ones I disagree with today, because I think there’s still value in being wrong in public and at least trying to stimulate people’s minds in the right direction.

Would I recommend that young coders take up blogging? Absolutely. Start up a blog anywhere – WordPress, Squarespace, a file server of HTML files, whatever. Write all the time, even if you don’t always hit “publish.” (I certainly don’t – 63 unpublished drafts!)

Get yourself in the habit of being brave in public, and try to ignore that voice that says “This isn’t good enough” or “You’re not smart enough” or “People will hate you for this.” I’ve sacrificed a lot of sacred cows over the years, and maybe even burned some bridges (man, my recent AI posts may have done that). But if I hadn’t tried to speak my mind, put my thoughts out there, and find the courage to be vulnerable in public, then I would have just felt limp and cowardly and boring. That’s what I regret most: all the blog posts I didn’t write.

Still, I do have a high bar for this blog (despite what some haters may believe!), so I don’t intend to become one of those “post-a-day” kind of people. It’s just not my style. But I do hope to be the kind of person who has more ideas worth expressing and worth putting into cyberspace. Here’s to 15 more years of blogging.