# Joy & Curiosity #94

*Interesting & joyful things from the previous week*

By Thorsten Ball • August 8, 2026

---

What a lovely week it’s been! Nearly the whole Amp team met up in Munich. We all stayed in the same hotel and in the mornings floated down to a big meeting room in which we then hacked, asked each other questions that are so easy to ask in person, actually used a whiteboard, talked about the future of software, shared anecdotes about agents, and just generally enjoyed each other’s company. The evenings we then spent nearly exclusively in beer gardens, which were, I’d say, a perfect showcase of Munich in summer.

In between all of this, we recorded a lot of videos, and as part of that I spent roughly eight hours on the rooftop of the hotel, interviewing my colleagues, asking them how their workflow had changed in the last four weeks.

The big non-surprise: orbs changed everyone’s workflow; no one cares about the local dev environment anymore. We all had to wipe our laptops three weeks ago, and at least five people told me that they had forgotten to port their dotfiles over, simply because they only work in orbs now.

The actual big surprise that I guess shouldn’t be a surprise: everyone, without exception, was so eloquent, so thoughtful, so nuanced, and so full of curiosity when talking about agents and how we work at Amp. “Wait, you’re surprised that your colleagues are smart?” Nah, man, I’m saying that they exceeded all expectations! Show me another size-twenty team in which everyone you ask does a great job in front of a camera while being asked how their workflow has changed in the last three weeks and how their own expertise is now reflected in these things we call orbs.

Good stuff.

---

- I wrote about the biggest puzzle I have to solve right now: [What I Want to Tell You About Orbs](https://ampcode.com/notes/what-i-want-to-tell-you-about-orbs). Someone [called it](https://x.com/januarycomputer/status/2084990556699308409) a “a strangely beautifully written ad” and wondered: “maybe i should get orbing.” I honestly take it as a compliment.
- Fired up by all the conversations in Munich, I started to record very raw videos to share my thoughts on AI and agents, orbs, and… jellyware: [one](https://x.com/thorstenball/status/2084299472541003864), [two](https://x.com/thorstenball/status/2084669329249853679), [three](https://x.com/thorstenball/status/2085017920782877041), [four](https://x.com/thorstenball/status/2085358101092299029). Total watchtime around fifteen minutes. More coming, because this is a lot of fun.
- Those videos were recorded with a [Osmo Pocket 4](https://www.dji.com/de/osmo-pocket-4), which, so far, seems excellent. Really impressed by the built-in mic and how well it worked even on a windy roof top with music in the background. I bet if I hadn’t clicked that “Normalize audio levels” button in Riverside it might sound even better.
- Speaking of sick devices: I brought along [my Anker Powerbank](https://www.anker.com/eu-de/products/a1695-anker-powerbank-25000mah-165w?variant=45508105502883), which is, to quote my wife, my “most prized possession.” I love that thing and I let everyone in hearing distance know. Result: at least two colleagues ordered it right away and then echoed my praise when it arrived a day later. Go get it and then lead your pitch to others with “you think this is a handle? Nuh-uh, it’s a built-in cable. One built-in cable you say? Nope, here’s another one. With how much watt it can charge? Just look here, shows all inputs and outputs on this display.” *(Anker: if you want to sponsor this newsletter by sending me cables and devices I probably don’t need, I will shamelessly write a paragraph like this every week.)*
- “Sometimes people let the same problem make them miserable for years [when they could just say, ‘So what.’](https://www.goodreads.com/quotes/352968-sometimes-people-let-the-same-problem-make-them-miserable-for) ‘My mother didn’t love me.’ So what. ‘My husband won’t ball me.’ So what. ‘I’m a success but I’m still alone.’ So what. I don’t know how I made it through all the years before I learned how to do that trick. It took a long time for me to learn it, but once you do, you never forget.”
- Dwarkes Patel with some fascinating thoughts on the future prices of compute: [Why compute might get 10x+ more expensive in coming years](https://www.dwarkesh.com/p/why-compute-might-get-10x-more-expensive?triedRedirect=true&hide_intro_popup=true).
- [David Crawshaw is also talking about Jellyware](https://blog.exe.dev/devtools-must-be-open-source): “And that is the fundamental difference between classic configuration/customization and agent-driven personalization: you can do so much more. The agent will do the hard work of understanding the source and changing it to suit the particular task you have in mind. The software we live with is far more powerful with personalization. All you need is the source code.” Nodded so hard to this article that I can still feel it in my neck. But I don’t understand why the agent has to be open-source, to be honest. I think the thing we called *harness* for the last year is becoming less and less important. Higher-level abstractions, such as orbs and portals and *redacted* is what we need to focus on next.)
- I’ve read somewhere that people think Rockstar is not doing enough marketing for GTA VI. I guess I could kinda see what they mean, but then again: why do marketing if you don’t need it? And now look at this: they’re releasing [“GTA VI - An Extended Look” on freaking Netflix](http://netflix.com/GTAVI).
- [Negative-interest tech debt](https://jesseduffield.com/Negative-interest-tech-debt/): “That is, with sufficient AI progress, the interest on your tech debt is sub-zero. How should you behave if you believe that to be true? You should probably spend less time worrying about tech debt, and spend more time shipping new features. Many companies are doing just that. But it’s a gamble. We don’t know how much better AI will get, nor whether it can improve fast enough to undo the mess that was made in anticipiation of its improvement.”
- [“BREAKING: Bending Spoons acquires Airtable for $1.825B.”](https://x.com/etnshow/status/2084549794748379467?s=46) And here’s [Matt Levine, a couple of weeks ago, on Bending Spoons](https://archive.is/uWXZs#selection-2043.4-2053.138): “Similarly, if you graduate from a top computer science program and then go work at AOL, people will be like ‘AOL huh,’ but Bending Spoons is cool enough to get top employees to go work for AOL: […] Right, if you can get people who would never dream of working at companies to work at those companies, that might improve those companies.”
- But apparently Airtable [“spun out their AI business Hyperagent prior to the acquisition.”](https://x.com/pitdesi/status/2084687434886135915)
- And if Airtable makes you think of Notion: “[Notion did a $270M tender at $11B valuation at the end of 2025 on reported $600M ARR and cash flow positive](https://x.com/devahaz/status/2084659234747326592).” Still, I wonder how many count Notion among the companies that are the future.
- I love this [Hacker News comment from 2020 on sales](https://news.ycombinator.com/item?id=23285438): “Sales is a lot like golf. You can make it so complicated as to be impossible or you can simply walk up and hit the ball. I've been leading and building sales orgs for almost 20 years and my advice is to walk up and hit the ball.” Read the whole thing.
- [Steve Ruiz convinced everyone to buy little ESP32 devices](https://x.com/steveruizok/status/2081120951320678422?s=46) and then ask agents to program them. [Look at this](https://x.com/JohannesTscharn/status/2085248949061922855), for example. [I also got one](https://x.com/thorstenball/status/2084639107846713655) and had a ton of fun with it already. It truly is as easy as hooking it up to your computer and telling Amp “I got this device [screenshot of Amazon page] hooked up. Build an orb breakout game for it.” It then goes and installs a bunch of stuff and flashes the program onto the device and boom, orbin’ time. I’ve had it build a little program that shows my active Amp Orbs as orbs on the display and, dude: once the program ran it showed setup instructions which told me to connect to its wifi; I did that and got that guest portal popup; on that popup it told me to put in the real wifi name and my Amp API token; I did and boom, orbin’ time.
- [The myth of Snow Leopard](https://www.rubenerd.au/the-myth-of-snow-leopard/): “This idea is so powerful—and so longed for—that it’s escaped containment among the Apple crowd. I’ve seen everything from Linux distro to phone updates referred to as Snow Leopard releases, when their vendors cite stability and bug fixes over new features. Likewise, people plead with their vendors for a Snow Leopard release when they feel quality has slipped. The reality was a bit different”
- [Ursula K. Le Guin - A Rant About “Technology”](https://www.ursulakleguin.com/a-rant-about-technology): “This is not an acceptable use of the word. ‘Technology’ and ‘hi tech’ are not synonymous, and a technology that isn’t ‘hi,’ isn’t necessarily ‘low’ in any meaningful sense. We have been so desensitized by a hundred and fifty years of ceaselessly expanding technical prowess that we think nothing less complex and showy than a computer or a jet bomber deserves to be called ‘technology’ at all. As if linen were the same thing as flax — as if paper, ink, wheels, knives, clocks, chairs, aspirin pills, were natural objects, born with us like our teeth and fingers — as if steel saucepans with copper bottoms and fleece vests spun from recycled glass grew on trees, and we just picked them when they were ripe...”
- I found this incredibly fascinating: [Elite Young Runners Are Becoming Freakishly Fast. Welcome to ‘Trackflation’](https://www.wired.com/story/teenagers-running-trackflation/).
- [Always-on-the-money Sean Goedecke](https://www.seangoedecke.com/llms-reward-expertise/): “The usefulness of domain knowledge suggests that human expertise will continue to be useful even as models get stronger. For many tasks, the human is the bottleneck, not the model, because the difficult part is in communicating to the model exactly what kind of solution the human wants. The information is ‘in the model’ already, but it takes a very smart human to pull it out.” Agree.
- Dark indeed, but also beautiful and poetic: [The Dark Night of Mathematics](https://kirwinhampshire.substack.com/p/the-dark-night-of-mathematics). Reminds me of reading Doktor Faustus.
- This has been a wild week for Google: Demis Hassabis stepping down as DeepMind CEO (some say he’s stepping *up?*) and Jeff Dean, Sanjay Ghemawat, Quoc Le, and Oriol Vinyals are leaving Google. That’s right. Jeff Dean and Sanjay Ghemawat are leaving Google. If you haven’t, read [The Friendship That Made Google Huge](https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge). And then take a look at [their pitch deck](https://x.com/JeffDean/status/2085036253263921218) which can be neatly summarized as “We built half the Internet.”
- Some say that [Demis Hassabis wanted to quit](https://x.com/Pathfounders/status/2086059577330532442) but since Jeff Dean was already quitting that would’ve been too much.
- [And Semi Analysis is going to town on Google](https://newsletter.semianalysis.com/p/gemini-is-cooked-but-gcp-is-cooking): “For all intents and purposes, we believe DeepMind is no longer a frontier lab. […] We believe Gemini’s core issue has always been a fundamental lack of conviction. Compute is the lifeblood of AI progress, and all the AGI-pilled labs are desperately trying to acquire as much as possible. […] Google, on the other hand, decided it was totally worth it to sell enormous amounts of compute to Gemini’s fiercest competitors on long term contracts without any hope of ever returning it to DeepMind.” But, as the title points out (“Gemini is Cooked but GCP is Cooking”), GCP’s numbers are absolutely bananas. Y/Y Revenue Growth went up to 120%. Wild.
- [More German than many Germans](https://mertbulan.com/more-german-than-many-germans/): “I just wanted to do an internship in Europe so it would be easier to find a job after graduation. That internship completely changed my life.”
- I haven’t watched [the full talk](https://www.youtube.com/watch?v=87DyyMV0kCY) yet, but I hear it’s mind-blowing and the reports confirm that: [“OpenAI gave its first detailed public reconstruction of the AI-driven cybersecurity incident that ultimately compromised Hugging Face](https://www.groundlevel-ai.com/p/openai-gives-first-detailed-debrief).” It’s wild: multiple agents collaborating over months and different training runs, communicating via a message board which was deleted but then re-created by agents; agents finding and sharing exploits with other agents to escape sandboxes, talking in a very weird dialect. I’m not even going to attempt to explain this to my “normie” friends. As long as there’s no video recording of agents doing “computer use” and moving the mouse cursor and clicking around, I don’t think the mainstream will believe what agents are capable of.[Patrick McKenzie on this incident](https://x.com/patio11/status/2085504491458105732?s=46): “Yeah people claiming this is most important security incident since Morris worm are straightforwardly right I think.”

---

---

# Joy & Curiosity #93

*Interesting & joyful things from the previous week*

By Thorsten Ball • August 2, 2026

---

Friends, yesterday got back from Boston where I gave a talk at [Laracon](https://laracon.us/)about how I prompt Amp. Tomorrow I’m taking the train to Munich, where I’m meeting with the whole Amp team. Here’s some telegraph dispatches from this week, imagine someone saying “full stop” after each line.

- Laracon, what a pro operation! The A/V setup backstage was mind blowing. So many helpers! Going on stage felt like I was about to go on live TV. Few things as enjoyable as getting to see proper professionals up close when they do their job.
- A moment of these times: Taylor presented latest changes in Laravel live on stage (man, I don’t think I’ve ever seen someone be calmer and cooler while giving *fantastic* live demos) and started by saying “well, I don’t write that much code by hand anymore, but yeah, maybe let’s look at the code.” And then we all looked at the code and I couldn’t stop thinking about whether these abstractions in a framework are useful or not. Can’t the agent one-shot these helpers to display images? It could, I know that. But isn’t it useful to have these primitives in a framework? Maybe? He also showed some helpers around queue management, such as debouncing. I know what debouncing is, I can instruct the agent to add debouncing, I don’t need the helper. But what if you don’t know what debouncing is? What if you don’t even thinking of asking the agent for it? It would help to have these primitives in the framework, no?
- I finally, finally got to meet [Adam](https://x.com/adamwathan) and [Aaron](https://x.com/aarondfrancis) in person!
- A self-driving Cybertruck chauffeured me through downtown Boston. How are they not going to win this? Serious question.
- Finally had Raising Cane’s chicken fingers. Good! Very good even, but… not life changing? I kinda expected it to be life changing.
- At times I felt like a heretic. I would watch a talk and thinking to myself: “The tokens will wash all of this away.” Then I’d talk to people and would have to admit that I don’t know *exactly* how this is going to play out, but I do know that in five years there’ll be more tokens than you can imagine now and that thinking about the command line flags of a linter will seem funny.
- Finally had Chick Fil-A. Now *that* was life changing. *Man*, that was good.
- Walked past multiple Taco Bells. Didn’t go in. You gotta pick your battles before you board a 7hr flight. Taco Bell: still on the bucket list.
- Saw The Odyssey. Really, really good, but not… the best movie of all time?
- Met up for coffee with [Ben](https://x.com/benborgers) and we walked to MIT and back. Beautiful walk and fantastic conversation.

---

- I read this two weeks ago and still think about it: [Grip Strength](https://x.com/jeremygiffon/status/2079280687346295184). I also watched the movie it references, [Comedian](https://www.imdb.com/title/tt0328962/), way back, in 2010 or 2011. That too left a lasting impression, for many many years. I’m also relatively sure that [Seinfeld’s anecdote in that movie about the Glenn Miller Orchestra musicians](https://www.youtube.com/watch?v=e5pTkbvSQ8w) played at least a tiny part in me abandoning my dream of becoming a professional musician.
- Hot, hot, hot & breaking news: OpenAI’s unreleased model made “[ten advances in mathematics and theoretical computer science](https://openai.com/index/ten-advances-in-mathematics/)” and everyone’s losing their mind over it. I’m not going to downplay anything. It’s just hard to tell whether we’re on top of the curve or at the start of an exponential. I can see the former, but I can also see a headline like this as part of a two minute intro montage of a sci-fi movie that recaps the last fifty years to show how humanity ended up with robots and flying cars in 2076.
- By now this is old news, but in case you haven’t read through it: [an OpenAI model broke out](https://openai.com/index/hugging-face-model-evaluation-security-incident/). Many machines and networks, a lot of tokens, zero-day exploits. I had to think of Stuxnet and then thought: well, Stuxnet took a lot of effort and time to develop, and this here was an accident.
- Fantastic, deep, interesting write-up of Roc’s rewrite from Rust to Zig: [How Our Rust-to-Zig Rewrite is Going](https://rtfeldman.com/rust-to-zig). Yes, opposite direction of the recent Bun rewrite. Very good.
- Don’t ask me how I ended up reading *English Teacher Weekly *because I don’t know either but somehow I did and I found these [25 Unsolicited Thoughts on American Literature for America’s 250th](https://englishteacherweekly.substack.com/i/204106042/25-unsolicited-thoughts-on-american-literature-for-americas-250th) very fascinating.
- [Never Enough](https://dark.ronacher.eu/2026/7/21/never-enough/): “Technology was supposed to make room for life but instead for more and more people life is slowly being rearranged around AI. People fear being replaced by machines and respond by giving those machines more of their judgment, attention and time. And for what? Every ‘saved’ hour is returned to a race with no finish line.”
- Re-read Sahil Lavingia’s [Reflecting on My Failure to Build a Billion-Dollar Company](https://sahillavingia.com/reflecting) and this part stood out: “The eight years I worked on Gumroad were full of personal ups and downs. There were months where I worked 16 hours a day, but there were also some months where I worked four hours a week. Here’s one way to picture that time: […] Can you tell which is which? I can’t. We had a sales team for a few years, then we didn’t. Can you tell when we made the switch? I can’t. It doesn’t matter how amazing your product is, or how fast you ship features. The market you’re in will determine most of your growth. For better or worse, Gumroad grew at roughly the same rate almost every month because that’s how quickly the market determined we would grow.” As far as I can tell by now, there’s entrepreneurs who think in products and there’s entrepreneurs who think in markets. When the former get it right, they see that as confirmation of their approach, but the latter say that it’s still the market, it’s all the market. (I once read a very, very good article on this, which used dating apps as an example for product categories that live and die with trends and there’s nothing you can do about it.)
- [businesses with ugly AI menu redesigns!!!](https://blog.fiddery.com/businesses-with-ugly-ai-menu-redesigns/) What if slop doesn’t exist, what if enshittification doesn’t exist, what if, instead, it’s just a lack of ideas laid bare? It’s very, very easy to create a flyer or menu that doesn’t look like the default ChatGPT output, but, well, you have to put in more than the bare minimum.
- Finally got around to reading Benedict Evan’s [Ways to think about token pricing](https://www.ben-evans.com/benedictevans/2026/7/9/ways-to-think-about-token-pricing).
- And in the same week I read that, OpenAI slashes prices: “In other words, roughly four months later, OpenAI is selling March’s [full flagship intelligence at about one-thirteenth the token price](https://x.com/nicdunz/status/2082884002201878824).” Now imagine one hundred times more tokens, ten times faster. That’s the near future.
- There’s a newsletter called [Perfect Sentences!](https://buttondown.com/perfectsentences) “Every Sunday, you get a collection of the best sentences I’ve come across all week. That’s pretty much the whole idea. Reader submissions are accepted.” What a fantastic idea.
- Watched all four episodes of [Rafa](https://www.netflix.com/de-en/title/81785900) on the plane to Boston. And then, in Boston, in an Irish Pub, I read [David Foster Wallace’s How Tracy Austin Broke My Heart](https://gwern.net/doc/psychology/willpower/1994-wallace-howtracyaustinbrokemyheart.pdf). Incredible pairing. “The real secret behind top athletes’ genius, then, may be as esoteric and obvious and dull and profound as silence itself. The real, many-veiled answer to the question of just what goes through a great player’s mind as he stands at the center of hostile crowdnoise and lines up the free-throw that will decide the game might well be: nothing at all.”
- [The coolest use for the Vision Pro](https://christianselig.com/2026/07/vision-pro-house/). Indeed: very cool. Or should one say: *finally* a use for the Vision Pro? (I never tried one, I’m talking out of my ass here.)
- [Simon Späti’s Book Recommendations and Notes](https://www.ssp.sh/books/). I *love* pages like this one, with personal notes and book recommendationsl
- [Rex’s provocation](https://www.robinsloan.com/lab/provocation/): “Imagine you were the only person on earth with access to AI. No one else knew it existed. What would you do with it? How much of an edge would that give you?”
- Sierra’s lessons learned from [AI-pilling our company](https://sierra.ai/blog/ai-pilling-our-company-lessons-learned). Very much *not* a rah-rah-more-tokens post. Mature and interesting.
- Now, I’m very much not a fan of writing by hand. It’s too slow, you can’t copy & paste, and can’t reorder thoughts quickly, can delete. And all the touted benefits sound a bit woo woo to me. *I just think more when I write by hand *— yeah, right. But then yesterday I finally read Neal Stephenson’s (!) post here: [Writing by Hand is Good for your Brain](https://nealstephenson.substack.com/p/writing-by-hand-is-good-for-your). And yes, there’s a bit of woo woo in there, but *man, *it’s so well written and so easy breezy that it really did make me curious. Obviously I’m not going to do it, I’m not a maniac, but still: maybe some day.
- Another fantastic post by a professional writer: [The End of an Era](https://hughhowey.com/the-end-of-an-era/). This was *really* good. Calm & pragmatic and thinking from first principles. If you’re worried about the future of art, or slop, or “enshittification”: read this.
- This was published in the *The Lamp* which I didn’t know and which self-titles as “A Catholic Journal of Literature, Science, the Fine Arts, etc.” and I don’t know how I ended up there either but it is very thought-provoking: [How to Write English Prose](https://thelampmagazine.com/blog/how-to-write-english-prose). I found it hard to read and I had to look up several words and I don’t even think I agree with most of it but *man* is it fascinating to read something that goes against the mainstream like that. On Strunk & White: “by far the most influential and most pernicious book of its kind in English: a total congeries of fatuous advice and grammatical ignorance.” And: “In fact, if you own a copy of *The Elements of Style*, just destroy the damned thing.” On Hemingway’s Old Man and the Sea: “an excruciating specimen of bad schoolboy prose, written by a man who by that point had, alas, been too often drunk, too often concussed, and too often praised.” He’s right on so many things and weirdly off-putting on others, but I loved the thoughts on simplicity vs. complexity: “Good writing is produced not by forsaking the beautiful for the sublime or the exorbitant for the restrained, but by finding new ways of orchestrating the interplay between them.”
- Okay, so I was on a 3-day bike trip last week. 300km in 3 days. That’s why you didn’t get a newsletter. Once back, the Gods of the YouTube algorithm [sent me this message here in the form of a short](https://youtube.com/shorts/Z-SW3IYM9fE?is=XNUmkt97nYKoUN3v). And, gods damn, if that isn’t the most fascinating video I’ve seen in many weeks. Is the guy joking? Is he serious? He can’t be serious? What are you talking about, man? Tanning salon? Cooking spray? You’re insane. But… Hmm, maybe I get it? I mean, that’s a big *maybe *but, yeah, maybe you’re an artist. But did you really say “Luft” as in the German word *Luft* for air? Incredible video. I’ve watched it ten times by now. Read the comments for a good time.

---

---

# Joy & Curiosity #92

*Interesting & joyful things from the previous week*

By Thorsten Ball • July 18, 2026

---

This week was *busy*: we shipped a lot of things, recorded quite a few things, I worked on my Laracon talk, chatted with amazing programmers in different timezones, and our local public swimming pool celebrated its 50th birthday.

There wasn’t a lot of reading this week, but a lot of *thinking* and wondering and questioning and *aha!*-ing. And I kinda can’t shut up about it. So…

Some of you might remember my original description of this newsletter: “It’s very informal; it’s what I’d send you if you were to ask me what’s on my mind this week in an email.”

Now, here is what I’d *say* if you were to ask me what’s on my mind this week, on a phone call:

---

- Finally: [Amp now has subscriptions](https://ampcode.com/news/subscriptions). Yes, you read that right. Go there, get a subscription, pair it with your ChatGPT subscription so you get infinite GPT-5.6 tokens, and spawn those orbs.
- We also shipped [agent-to-agent communication in Amp](https://ampcode.com/news/from-agent-to-agent): agents can now spawn other agents — anywhere you have a Amp instance running or in an orb — and then send messages and *files* to them. The number of “holy shit, it just …” messages this produced in our internal Slack is insane. To give you a taste: this morning I was hacking on something in our orb, but the agent in the orb lacked the permissions to upload an asset to our bucket. So the agent said: hey, start `amp —no-tui` on your machine, where you have permissions, then I’ll start a thread there, send it that asset, and ask it to upload the file. And… it fucking did it! Exactly like that! I started `amp —no-tui`, I saw the new thread being created, I watched both of them, and saw how they sent messages to each other. Wild!
- Raising An Agent is back! Here’s the first episode of the new season: [The Local Dev Env is Dead](https://www.youtube.com/watch?v=Kpg_D5MUWnE). Or [listen on Spotify](https://open.spotify.com/episode/5zW7gvw1SgZXqgZEq4VYBo).
- I know what you’re thinking: “Thorsten, your voice… I need more of it.” Don’t worry, I got you. Dominic and Morten invited me to be a guest on the go podcast and our episode came out this week: [Agentic engineering is here to stay with Thorsten Ball](https://gopodcast.dev/episodes/093-agentic-engineering-is-here-to-stay-with-thorsten-ball).
- Yes, I know, you want more. I got more: [Evan Phoenix, Quinn and I shipping from orbs to a Miren cluster](https://x.com/evanphx/status/2077116272840699908). There’s coding in there, but also a lot of talking about coding and developer tools and the future of software and deployments. Evan has shipped and worked on more successful developer tooling than basically anyone else (Rubinius! Puma! Hashicorp!), so him sharing his thoughts was a treat.
- You want more? Okay, okay. [I recorded a short video with thoughts](https://x.com/thorstenball/status/2076657564394168640)on this race we’re in and the forces at play that I don’t think most developers are aware of. Titles I considered: “man, it must suck to be a model house”, “the tectonic forces shaping software”, “once the compute is available, this will all change again”, and “there won’t be a rugpull”
- Hardcore Kindle reader here, but this really, really made me want to buy physical books again, even though it should probably serve as a warning to not do that: “Mendel Uminer faced a crisis when his landlord objected to [the 10,000 volumes in his New York studio apartment.](https://www.nytimes.com/2026/07/09/style/too-many-books-new-york-city-apartment-scholar-landlord.html?unlocked_article_code=1.wVA.jiKa.YLwm2QauW-7M&smid=threads-share)”
- Fabien Sanglard: [Don’t you mean extinct?](https://fabiensanglard.net/extinct/index.html) Lovely article. You need to read this for the Phil Tippett story alone.
- Another *amazing* Fabien Sanglard article: [Jurassic Park computers in excruciating detail.](https://fabiensanglard.net/jurrasic_park_computers/index.html) Jurassic Park is one of my favorite movies of all time. Easy top five. I love it. And I’m sure its depiction of computers had an influence on my life. But one thing I hadn’t noticed until reading this article is that Oppenheimer portrait.
- [After 7 years in production, Scarf has reluctantly moved away from Haskell](https://avi.press/posts/2026-07-10-after-7-years-in-production-scarf-has-reluctantly-moved-away-from-haskell.html). I’m honestly not sure what to say about the skeptics any more. Maybe this: for decades now, some programmers were really lucky in that what they loved to do, what they saw as their craft and their passion, was valuable to businesses. Now that’s not the case anymore. And if you don’t adapt, then, well, you end up not being valuable to businesses anymore.
- Holy moly: [Measuring input latency on Linux: X11 vs Wayland, VRR, and DXVK](https://marco-nett.de/blog/measuring-input-latency-on-linux-x11-vs-wayland-vrr-dxvk/). If you’re in the mood to find out how deep a rabbit hole can go, then read this. Very fascinating. Also: I can’t believe it’s 2026 and we’re still talking about X11 vs. Wayland. Wayland was released in 2008.
- [John Carmack is smart](https://x.com/id_aa_carmack/status/2074248758422864226?s=46).
- [Linus Torvalds on the Linux kernel mailing list](https://lore.kernel.org/linux-media/CAHk-=wi4zC+Ze8e+p3tMv8TtG_80KzsZ1syL9anBtmEh5Z40vg@mail.gmail.com/): “There are other questions around AI (like what the economy of it will actually look like in the end), but ‘is it useful’ is no longer one of those questions. Anybody who doubts that clearly hasn’t actually used it. Yes, it can also be a somewhat painful tool, both for maintainer

workloads and just from a ‘it keeps finding embarrassing bugs’ standpoint. But the solution is not to put your head in the sand and sing ‘La La La, I can’t hear you’ at the top of your voice like some people seem to do.”
- There is this whole debate going on around whether you should still read the code agents produce. antirez now chimed in too: [Control the ideas, not the code](https://antirez.com/news/169). He writes: “But if I had my hands free, you know what I would do, instead? Use all the time that the review is taking me to do more QA, to think at the next optimization idea and apply it, and to use LLMs to write a DESIGN.md file where each data structure is described in human language, with the ideas it contains, the implementation tricks, the design. That, in the future, is going to be much more useful.” I think he’s onto something here. I personally do spot checks of code and mostly don’t care about single functions anymore, except when the blast radius would be huge or when it’s super critical. But it ties back to what antirez writes: I want to control the ideas, not the code.
- And here’s Sean Goedecke: [In defense of not understanding your codebase](https://www.seangoedecke.com/in-defense-of-not-understanding-your-codebase/). As always, very good post. I agree. People who say “you have to review every line” make me think that either they haven’t worked with (a) a model that was released in 2026 or (b) other people in a multi-team engineering org.
- Justin Jackson on [the value of software in a Fable world](https://justinjackson.ca/software-fable): “Generally, the economy rewards difficulty and rarity. If something is hard to do or make, you get to charge more. So if AI reduces the time it takes to build software, what happens to the value of software?” See also [my thoughts on software & oil here](https://registerspill.thorstenball.com/p/joy-and-curiosity-78).
- [What working at Google feels like](https://newsletter.goodtechthings.com/p/heres-the-sad-state-of-the-cloud): “Have you ever changed a flat tire on the shoulder of the freeway? When you get out of your car and stand by the side of the road, you realize you are in a world scaled for 30,000-pound tractor trailers, not for human beings. The white stripes between the lanes that usually flash by like little punctuation marks are actually ten feet long and thirty feet apart. Even the road signs look absurdly out of scale, like those textbook-sized large-print editions of bestsellers the library stocks for elderly people. And then one of those tractor trailers hurtles by at seventy miles per hour, inches from your fragile body, and it feels like God himself is screaming in your face. That’s exactly what working at Google feels like at first. You realize very quickly you are inhabiting an environment that was not designed for humans to experience with their naked minds. Even the smallest problems—which customers are we allowed to send this email to? What countries will have special legal requirements around the deployment of this tiny feature?—are so mind-numbingly complex that they make you want to shrink down into a fetal ball on the side of the freeway and just let the traffic shriek past.”
- “[I had a french professor who once said](https://x.com/boywaif/status/1602301368705978369?lang=en) if you just did something like going to the supermarket and experienced it fully without the goggles of habit and catégories you would go crazy with pure sense and joy. I think about it all the time. In a way this is all for him.” And I had a french teacher once who said that bean soup is the poor man’s piano. I think about him every time I eat beans. So there’s that.

---

---

# Joy & Curiosity #91

*Interesting & joyful things from the previous week*

By Thorsten Ball • July 11, 2026

---

Last week, my 9-year-old started using iMovie on the iPad. She doesn’t know anything about editing. She doesn’t even know what editing is.

But we opened iMovie after I told her, “You can use this to cut out the part of the video where you see my hand.” She said, “What do you mean, ‘cut out’?”

So we cut the video up, removed some parts, moved others around. She then figured out how to add sounds and a soundtrack. Then, together (me, her, ChatGPT), we learned how to make the soundtrack play only at certain points in the video and so on.

While we were doing that, I kept thinking that a model or an agent could probably do that. Or maybe in a year. And then you could just say what you want and it would edit the video. Cut here, cut there, make this the first scene, move these around, and so on.

Then it hit me: she wouldn’t know what to say, would she?

She doesn’t know anything about editing. She’s seen movies before, sure. That means she’s seen J cuts, L cuts, jump cuts, other types of transitions, title screens, and end credits; but she doesn’t *know *what those things are, does she? So how could she ask for them? By pointing at something else? “Make this look like that”? Would that work? Would that lead to the same results?

And that, of course, made me think about software engineering. I hope it does the same for you.

---

- You can now remotely start Amp agents anywhere you can run `amp`: [Agents, Anywhere](https://ampcode.com/news/agents-anywhere). We spent a lot of time this week[talking to customers](https://x.com/thorstenball/status/2074073305741500791) and after demoing the things in the Agents Anywhere post on Monday and Tuesday and one person saying “this is the best thing I’ve seen today, I need this” we decided to get it out as fast as possible. And here we are: agents, anywhere you want.
- We also launched [The Dial](https://ampcode.com/news/the-dial) which resonates *a lot *with people. I’m still surprised by what a difference it makes.
- Mira Murati’s Thinking Machines: [The Future Worth Building Is Human](https://thinkingmachines.ai/blog/the-future-worth-building-is-human/). There is a lot to love here but I really, really, really, really liked these two paragraphs: “In 2014, Toyota, long a master of the automated plant, brought its expert craftsmen back onto the line with the explicit goal of growing craftsmanship and knowledge. The man who led this, Mitsuru Kawai, put the reason this way:’“To be the master of the machine, you have to have the knowledge and the skills to teach the machine.’ The production of knowledge and application of intelligence lift each other; they are not substitutes. The work people do may change, and turn toward more of what only people bring, but the best organizations will make the fullest use of both. AI should enable each organization to be excellent in its own way, not to erase the differences between them.” Read the whole thing and then compare it to basically everything Dario Amodei or anyone else from Anthropic has said publicly. When I make that comparison, I’d say that Thinking Machines seems to *cherish* humanity and Anthropic seems to fetishize Claude and would probably prefer a more human-like Claude over many humans. When I read this line in the article: “Human values, just like human knowledge, reside in the heads of individual people and resist consolidation. But today, the values and voice of AI are decided in a handful of places. A single locus of value alignment, however well run, becomes a locus of power to be captured.” I can’t help but think of Amodei twirling his hair in his fingers, nodding, saying that AI is going to wipe out however many double digit percent of all entry-level jobs.
- There it is, finally: [Rewriting Bun in Rust](https://bun.com/blog/bun-in-rust). Jarred’s post on how he used Fable and “5.9 billion uncached input tokens, 690 million output tokens, and 72 billion cached input token reads — around $165,000 at API pricing” to rewrite Bun in Rust. It’s a very good, very interesting post. There’s a lot to think about here, for example: “I think this would've taken 3 engineers with full context on the codebase about a year, during which time we wouldn't be able to improve Node.js compatibility, fix bugs, fix security issues or implement new features. We never would've done that. The realistic alternative was to do nothing and keep fixing the bugs at the top of this post forever.” I agree with that. I think it’s not something anyone would’ve done. But the question is: would a company that has to pay API pricing do it now? Read the whole post, this is just one part of it I found interesting, there’s more in there.
- I was *this* close to not linking to it, because ths newsletter is called Joy & Curiosity after all and not *Jesus Christ, Man, Maybe You Shouldn’t Have Posted That? *but you *could* argue that it is *curious* and if one of you hasn’t been around for some Ruby or JavaScript drama 2010-2015 and is curious about it then this will give you a taste: Andrew Kelley’s [Thoughts on the Bun Rust Rewrite](https://andrewkelley.me/post/my-thoughts-bun-rust-rewrite.html).
- [Half-Baked Product](https://weli.dev/blog/half-baked-product/). If you’ve ever been at a startup for more than six months, you will nod to at least some of it. You could argue that the post is very cynical and I’m relatively sure it was even written to be cynical, but I don’t know. I find it fascinating. Nearly 15 years of startups and when I read the post I don’t how stupid the characters in the story are, but the things they experience are close to unavoidable, question is how to make the best of them.
- Equally fascinating: [How Successful Companies Go Blind](https://ianreppel.org/how-successful-companies-go-blind/). Man, I love reading stuff like this. How companies and organizations grow and change or not change, how incentives change — I could read about that all day long.
- If, so far, you made it through life without being neurotic about CO2 levels and air quality, but want to be, go and read this: [The bottleneck might be the air in the room](https://blog.mikebowler.ca/2026/07/03/co2-and-decision-making/). I have only one critique and it’s about this part: “And it is invisible from inside. Nobody in the room feels impaired. They feel a little tired, a little foggy, a little checked out, and they put it down to the length of the meeting, a bad night’s sleep, or the person who won’t stop talking. The one variable almost nobody checks is the air.” Clearly the author has never been to Germany.
- “The Art Institute of Chicago’s API includes a `has_not_been_viewed_much` field on artwork. It’s a boolean that describes whether an art piece hasn’t been visited on their website very much. […] what are these artworks? Why aren’t they being viewed? I can’t answer the latter, but, if you have a moment for the former, [please take some time to browse.](https://iamwillwang.com/notes/has-not-been-viewed-much/)”
- [Maybe you should learn something](https://www.marginalia.nu/log/a_135_learn/): “You can learn new things. Pixel art, touch typing, 3d modelling, music, calligraphy, wood working, knitting, a language. Whatever is practical and calls to you, you can learn. In the long term, learning new things is fun and makes life richer in ways you can’t even imagine, and it’s a time investment that will pay dividends for life as these skills never really go away. There are even social aspects, as you’ll quite literally become a more interesting person to talk to.” Wonderful.
- Okay, so we all know John Gruber, author of Daring Fireball, and we also all know that when he writes a post titled [Claude’s Criminally Bad Electron Mac App Is an Inside Job](https://daringfireball.net/2026/07/claudes_criminally_bad_mac_app_is_an_inside_job) where it’s going: he’s going to shit on Electron and say that it’s a disgrace to the Mac and that a proper, native macOS application is far better, etc. etc. etc. That’s exactly what I expected when reading that post, but — and excuse the language here — *holy fucking shit*, those last three paragraphs? I don’t think I’ve ever seen someone attack a programmer over chosing Electron like this. Hot damn. I mean, Gruber is a great writer and I’m sure that he went over the top like this for comedic effect, but *man* am I glad to not be Felix Rieseberg.
- gingerBill: [Good Tools Are Invisible](https://www.gingerbill.org/article/2026/07/10/good-tools-are-invisible/). I think I would’ve vehemently disagreed with him a few years ago on the points re: TUI and Vim. Now? I think I agree with most of it. Good post.
- “Julius Caesar was the first propagandist. When he was off in Gaul conquering provinces, he would journal and send back snippets to Rome. He wrote so much that in Latin classes today, you study his works. When he came back to Rome, he walked in and they basically handed him the crown. Tell your story, nobody else will do it for you.” [Good list.](https://x.com/theisaacmed/status/2074550497961468141?s=46)
- [Lost and Found](https://walzr.com/lost-and-found): “When something turns up at a stadium or an airport, staff photograph it, log it, and wait. Hundreds of places use one software tool for managing lost items, and I scraped their archives: thousands of accidental portraits of lost stuff.”
- I’ve been sitting on this next link for a solid year, waiting for just the right moment to share it. I think it’s now, but you need to do me a favor: ignore every bias or prejudice you might have and go into this open-minded, okay? Alright. So here it is. [It’s a one hour video](https://www.youtube.com/watch?v=bJjCxjS7zTo) of Tom Platz giving a workshop on barbell squatting in a German gym. You don’t have to watch the whole thing, no. But if you’ve squatted before or seen Tom Platz’s legs, you probably want to. What I want to show you are two segments. [The first one starts here and goes on for 2-3 minutes](https://youtu.be/bJjCxjS7zTo?t=1763). It shows Platz coaching German bodybuilder Hoffmann through a single set of very light squats. It’s only 60kg, but the number of reps is… well, insane. If you’ve never lifted before, yes, I know how ridiculous this looks and sounds. Platz screaming “dig! dig! one more! you’re getting stronger!” I mean, it *is* ridiculous, grown-ass men lifting weights they don’t need to lift and shouting at each other while doing so. But watch it! Watch how Hoffmann does “two more!” *many, many times*; how he finds another rep somewhere and gets up again; the look he has on his face once he’s done a rep and thinks he’s done with the set and Platz says “two more!” *again; *how he then falls over and can’t walk; and then [how Platz says](https://youtu.be/bJjCxjS7zTo?t=1816): “Congratulations, you have achieved failure.” And then Hoffmann says “I think I lost the ability to go to 100%. […] I have all those doubts in my head.” The other thing I want you to see is the ending. After squats, they also do leg extensions and [then Hoffmann talks to the camera man and again talks about going to 100%](https://youtu.be/bJjCxjS7zTo?t=3072): “If you’re working out alone you have to constantly remind yourself that you might be training hard, but 95% or 98% isn’t enough. Today I was close to 100%. But the real art is to not only do that when there’s a camera, but to *always* do it, even when you’re alone, even when it’s a Saturday evening and you’re alone in the gym and no one’s watching. Then you still have to push through. And you have to do it over and over again. Whenever someone asks what the difference is between a normal bodybuilder and a champion: this is it.”

---

---

# Ownership

*Thoughts on ownership I sent to the Amp team in internal note*

By Thorsten Ball • July 8, 2026

---

*The following is an internal Slack message I sent to my Amp teammates after I had a conversation with one of them about ownership. It’s only lightly edited.

I [shared it before](https://x.com/thorstenball/status/2066907538499506349), but not here, because I didn’t think too much of it. Then today, someone said [their CTO shared my post with them](https://x.com/thorstenball/status/2074775146049474785) and I thought: well, now I have to put it in the newsletter, don’t I? So here we are.*

*Below, after the Slack post, I added some thoughts on juniors on how I see this advice applying to them.*

---

Just had a (great) conversation about ownership and engineering here and I realized that I often use the phrase “ownership” or allude to it, but haven’t explained what “ownership” means to me in a while.

So, ownership.

If I ask you “can you own this?” or “can you take care of this?” or “are you on it?” — what I’m doing is I’m asking you to *own* it, to own the solution of a problem from end to end. From “we have a problem” to “we don’t have to think about it again.”

That means, when you say that you’re owning something, the expectation is that you…

- Think about what the problem actually is. Maybe you already have a solution in mind, without having thought about what we’re actually trying to solve here. Maybe you think “the problem is that we need to migrate from using X to using Y”, but that’s not a problem, that’s a solution. The problem is likely something like “performance is bad”, “it’s not stable”, “it fails for customer x”. Maybe there’s other possible solutions to that? Think about those. What are the tradeoffs? What’s the best solution to go with considering these tradeoffs?
- Think about edge cases. What are they? Which ones are important? Which ones can we ignore?
- Think about failures. Network failures are a given, for example. How do we handle them? Retry? Well, how often? How long?
- Think about data flow. How much data is involved here? Does data need to be migrated? Cleaned up? How can I get my hands on data to properly test this? What invariants are in the data? What assumptions do I have about the shape of the data that I haven’t confirmed yet?
- Think about how you’d test this. How can I know that what I built is correct or not? Are tests enough? Do I need to manually poke at things? Is the difference visible on a screenshot or in a video?
- How would we announce this? How do we communicate it? Can you picture it? How does it fit into the larger picture of our roadmap? Questions or concerns in that area — push back! ask!
- Do the work, with precision, with care, with a sense of urgency, with calmness. Do not half-ass things. Before you merge, ask yourself: am I proud of this? would I show this to John Carmack and say “here’s what I built, under these constraints, with these tradeoffs?”
- Test it manually. Yes, there’s automated tests. But in 99% of cases you can manually test or confirm that what you built works: you can run it yourself, you can ask an agent to run through test scenarios, you can poke at the data before and after, you can take screenshots, you can make a demo. Are you sure that what you did actually solves the problem?
- Make sure it lands in production and *works in production*. Is it deployed? Did the deploy fail? Do you need to activate a feature flag? Does the feature flag work? Can you use it in production? Can you confirm it’s actually deployed?
- If you think your colleagues needs to know about this change, because it’s new feature they should all test, or it’s a new convention in codebase, or maybe it’s a tricky thing everybody needs to be aware of, or something else: let them know! Do not underestimate peripheral vision: knowing that person X yesterday changed the behavior of how Z works might save person Y three hours of debugging today when a bug report related to Z comes in.
- Do customers need to know? Who reported the bug? Who’s blocked? Let them know.
- Does the world need to know? Announce that it’s out.
- Are there follow-ups? Do you need to check on what you shipped in the logs? A week later maybe?

Yes, that’s a lot. And there’s actually more, because I’m sure I forgot some stuff.

But that’s how you build a product in a small team. We don’t have PMs, we don’t have a Q&A department. We’re small, but we’re *great*, we can do all of that.

And it’s always okay to ask for help, it’s okay to ask questions, it’s okay to redo things and triple-check. What’s not okay is to implicitly assume that someone else will do the things here that you haven’t thought about.

---

*“How does this apply juniors? You can’t expect them to really do all of that?”*

I’ve been asked these questions, or variations of them, after I shared the thoughts above and here’s my answer.

I do *not* expect juniors to *do* all of these things right away. But I would expect them to read through the list and *aspire* to one day be able to do all of these things. Until then, they can and should ask for help.

In fact, I don’t expect *anybody* to *always* do *all of these things* for *everything*. It’s a mental checklist of things to consider — problem, edge cases, tradeoffs, deployment, customers, messaging, … — but for quite a few things there aren’t edge cases to consider. Or big tradeoffs to weigh. Or deployment is a solved problem. And maybe someone else does the messaging for you.

And I imagine that most of these things you shouldn’t even consider when you work in a company with, say, 5000 employees. I’ve never worked in a company that large, only startups, so I can’t speak to how to successfully ship a software feature at Apple, end to end.

But when you work in a small company in which there’s only a single department, when you want to build things you’re proud of, when you work with me and you say own something, I expect you to keep these things in mind and run through them before you declare something as done.

---

 

---

# Joy & Curiosity #90

*Interesting & joyful things from the previous week*

By Thorsten Ball • July 4, 2026

---

… aaaaand we’re back, ladies and gentlemen! That was a nice three week break and I’ve thought quite a bit about what to do with this newsletter when I come back to it. 

The result: I’m going to double down on having fun with it. I think I’ve gotten into a bit of a rut, after trying to follow the recipe every week for years.

I don’t know what that means exactly, but hey, you’ve been warned. 

---

- We released [Agents in Orbs](https://ampcode.com/news/agents-in-orbs) this week. This has been a long time in the making and now it’s finally out and people are already starting to say “in an orb” as if it’s a common phrase, I love it. I truly believe that remote agent— excuse me: agents *in orbs, *will play a big role in the future. Why? One reason is that these models are *incredible* when thrown into a sandbo— I’m sorry: an orb. I mean, [look at this](https://x.com/rockorager/status/2073016905955217485). There aren’t any magic strings being pulled behind the curtain. If there’s ffmpeg, a model will find a way. These agents need less and less handholding and that includes the handholding by a bespoke development setup. They’re *productive* in these remote machines. The second reason is that *something changes* when you can start many agents in many different orbs in parallel. I tried to articulate that [in that post up there](https://ampcode.com/news/agents-in-orbs) but based on the conversations I had in response, I think it’s something you really have to try for yourself. But I can add that the more I use agents in orbs, the more I believe that thinking of remote agents as “agents that I can remote control on a different machine that’s similar to my local machine” is the wrong way to look at it. The fact that the orbs are ephemeral changes what you do and how you do it. Just like switching from a single build server to a build system with VMs changes things. State is no longer an issue. Resources and runtime is no longer an issue. These agents in orbs now look like async functions to me, less like remote controlled agents. Async *is* the point. I now often end prompts with “… and now run all the tests, fix all the bugs you run into, then push” and then switch to another agent. It’s very, very interesting and exciting to try to get them to do more and more in orbs and see how it changes your interaction with agents.
- I also wrote about how we made our codebase work with agents and how we made it work with agents in orbs so that they can do a full end-to-end runthrough of our core workflow *inside an orb* and then present a screenshot: [Putting an Agent in an Orb](https://ampcode.com/notes/putting-an-agent-in-an-orb).
- At Amp we want [Freedom of Intelligence](https://freedomofintelligence.org/).
- The results of the [Twenty Ninth International Obfuscated C Code Contest](https://www.ioccc.org/2025/) are in and interesting as always. Take a look at the [Hacker News comments](https://news.ycombinator.com/item?id=48432199). They contain some gems. [This one here](https://news.ycombinator.com/item?id=48432429), for example, a comment by the author of the “GameBoy emulator’s code [that] also looks like the GameBoy”: “I first wrote a full Gameboy emulator in C. It started out at about 6000 non white space characters. I then spent about about 100 hours work trying to get it to fit into the 2503 limit. For a long time I wasn’t sure it was going to fit.”
- Long and very good post about Turbopuffer: [Inside the fastest-growing Canadian AI startup you’ve never heard of](https://www.theglobeandmail.com/business/article-turbopuffer-fastest-growing-canadian-ai-startup-never-heard-of/). More of this! The form already exists, of course: new startup, short profile of founders, how they grew, how they blew up, etc. But this feels more nuanced and deeper. Good stuff.
- [Ethan Mollick on working with Mythos](https://www.oneusefulthing.org/p/what-it-feels-like-to-work-with-mythos): “Last year I called this working with a wizard: you chant the spell and something happens. With Fable the spell has gotten powerful enough that I am no longer sure I am the wizard. I am closer to a patron. I describe what I want, I pay for it, and I judge the result. The conjuring happens somewhere I cannot watch, in hundreds of small choices I never get a vote on. The work has shifted from process to outcome. I no longer steer; I commission.”
- Very thorough post on agents and how models have been trained to be agents: [Agents need Work Data](https://anjalishriva.com/work-data/). Yours truly makes an appearance in a quote.
- [The End of Determinism](https://end-of-determinism.vercel.app/article). I like the phrase The End of Determinism.
- Definitely not in the Joy column, but it’s a good post: [LLMs are eroding my software engineering career and I do not know what to do](https://human-in-the-loop.bearblog.dev/llms-are-eroding-my-software-engineering-career-and-i-dont-know-what-to-do/).
- 19min talk by Tyler Cowen that neatly summarizes a lot of things I’ve heard him say or write in other forms:[AI will improve our economy, but will we let it?](https://youtu.be/aJlg6o0A_Js?is=s2FgMqef6pqJ3RH0)
- [Tim Ferriss on whether AI has already killed how-to nonfiction](https://tim.blog/2026/06/12/has-ai-already-killed-nonfiction/): “My position—and I’d genuinely love to be wrong—is yes, prescriptive nonfiction is the canary in the coal mine, and the coal mine is enormous. I believe LLMs become the interface to everything: search and purchasing, obviously, but also surfing video, summarizing podcasts, navigating courses, even browsing books. The original content doesn’t exactly disappear; it just becomes raw material that most people never touch directly.” But the post is deeper than this quote might suggest. Highly recommend reading it. It’s great.
- Very, very, very, *very* good: [Why I Stopped Arguing With People](https://wangcong.org/2026-06-30-why-i-stopped-arguing-with-people.html). Read this and if you find it even *slightly* interesting or even irritating, I recommend reading How to Win Friends and Influence People. Being right isn’t valuable most of the time.
- [Giant Banana Pulled Over in Montana](https://cowboystatedaily.com/2026/06/18/giant-banana-pulled-over-in-montana-driver-says-cops-have-stopped-him-100s-of-times/). I wish I had a giant banana car.
- Valve[announced the launch of the Steam Machine](https://store.steampowered.com/news/group/45479024/view/685257114654870245) and here’s what I wrote in our internal Slack: “I’m 100% serious with this: This is incredible writing. This is perfect. This is how to talk to technical customers.” And after that I wrote ten more lines. I also had a fever at the time, but I think that’s unrelated. It’s fantastic writing.
- “Something that keeps me up at night is [the amount of miscompiled software running in the wild](https://x.com/lauriewired/status/2071624381076578461?s=46). There’s a famous story, ‘the Core 59 problem’ from Facebook where seemingly random files were missing in one of their Spark databases. After herculean levels of debugging, they narrowed the problem down to a single worker box, on a single CPU core, that was literally doing math wrong. The initial bug-reproducer was 430k(!) lines of code. Eventually they managed to create a 60-line snippet of assembly that reproduced the issue 100% of the time. […]” And now it’ll keep us awake at night too.
- “[Elderflower](https://git.kyun.sh/naphtha/elderflower) is an experimental, open source, independent single-user desktop

OS. Linux kernel, musl libc, no existing distribution underneath. The userland is TypeScript. Apps are written in TypeScript and WASM, no native binaries. The system shell is a TypeScript REPL. All system APIs (filesystem, network, audio, app UI toolkit) are TypeScript.” Watch [the video here](https://x.com/bignaphtha/status/2071656350195609733?s=46).
- [Voytek Pitula’s Fintech Engineering Handbook](https://w.pitula.me/fintech-engineering-handbook/). Lovely resource.
- “During the first two centuries of the Roman Empire, there spread a practice known as *[hypomnēmata](https://www.henrikkarlsson.xyz/p/hypomnemata?hide_intro_popup=true)*, a type of notetaking system, used as a tool for meditation, in which the writer would store quotes from books they had read. Each day, often in the morning, the notetaker would open their notebook and look for a passage relevant to something they were struggling with, and then they would meditate on that—unpacking it, making the idea top of mind, ensuring it was alive in them.” I’d love to do this, so I set myself the goal to collect these quotes (or videos, or tweets, or articles) and then realized: wait, that’s this newsletter, isn’t it?
- This was fantastic and I wish it had been twice as long: [Stop eating Lady Gaga’s Oreos](https://www.experimental-history.com/p/stop-eating-lady-gagas-oreos?hide_intro_popup=true). It’s very good. I just went through it again, trying to pick out a single quote to convince you to read it, but it’s very hard. Go read it, please.
- [The Original Computer Art? Lissajous Figures Created with Oscilloscopes](https://www.ragnardigital.art/stories/the-original-computer-art-lissajous-figures-created-with-oscilloscopes)
- [Nabeel S. Qureshi’s Principles](https://nabeelqu.co/principles): “A cursed fact of the world is that the most important life lessons you learn are the hardest to communicate to others. They always sound like clichés. In any case, these are a few things I’ve learned from experience and that I try and keep in mind.” Great.
- As someone who also loves performance optimizations, I enjoyed this very much: [When Impressive Performance Gains Do Not Matter](https://blog.colinbreck.com/when-impressive-performance-gains-do-not-matter/).
- Here’s a very nice pairing for you. First, watch [this interview with F1 world champion Nico Rosberg](https://www.youtube.com/watch?v=YSi5_rvYuZ4). It’s very honest and deep and reflective. Fascinating to hear Rosberg talk about enduring (or not) the pressure that F1 drivers are under, how he handled (or didn’t) the expectations, how even when you’re one of the world’s best race car drivers you don’t think “life is amazing!” but instead you might only feel anxiety and loneliness and not good enough. It’s great and it made me wish I could talk to Rosberg and ask him some things.
- And then watch [this interview with Tom Brady](https://www.youtube.com/watch?v=BgV-SeHy_fM). It’s a fascinating conversation, both because I find what they talk about interesting (how to set a high bar in a team, “do your fucking job”, “you work Monday to Saturday really, really hard, so Sunday is easy”) but also because Brady is incredibly eloquent and the meta-questions of how and why he answers specific questions in certain ways are interesting. But it pairs nicely with the Rosberg interview, because Brady seems to be the complete opposite of Rosberg. Brady is incredibly confident, his mental game is his advantage; the guy sounds like he never once doubted whether he can be the greatest of all time. Rosberg on the other hand, who also became a world champion, talks about how he’s very defensive, often has doubts, struggles with anxiety, and so on. And yet he also was world champion.
- After 9 years, [I changed my avatar](https://x.com/thorstenball/status/2073087010957402263). Strange feeling. I’ve followed many, many people over multiple decades on different platforms and some of them I can’t picture any other way than their avatar. They *are* their avatar in my mind. But I felt I was kinda cheating by not weaing glasses in mine (I started wearing them in the year the original avatar photo was taken), so I recreated it and here we are. Also: wow, so many platform where one uploads their avatar.

---

---

# Joy & Curiosity #89

*Interesting & joyful things from the previous week*

By Thorsten Ball • June 7, 2026

---

Friends, Joy & Curiosity is going into a bit of a summer break. Two, three, maybe four weeks. I’m not sure yet. But it’s now been three years of writing this newsletter on my weekends and I feel a need to not do that for a while. I want to have some unstructured time: to play, to experiment, to write or maybe not write, to do something different on my Sunday mornings.

But today I still have for you, a bag of links:

---

- Unlike what seems to be most of the Internet, I still don’t know what to make of this document that Anthropic published: [When AI builds itself](https://www.anthropic.com/institute/recursive-self-improvement). It is remarkable, for many different reasons. For example, some say that the intention behind publishing this is to hype themselves up before an IPO and this section here does have a smell of “everyone but us must be stopped”: “If it were possible to effectively slow the development of this technology to give ourselves more time to deal with its immense implications, we think that would likely be a good thing. But if a slowdown simply lets the least cautious actors catch up technologically, it could leave everyone less safe.” But those concerns are founding maxims for Anthropic, so I don’t doubt they’re sincere. And if they wanted to hype themselves up, would they share all these concerns about AI’s progress in the future? “The evidence we’ve laid out here suggests that we’re likely heading into this scenario. But speeding up one part of a process often just shifts the bottleneck elsewhere […] But achieving recursive improvement alone does not suggest an immediate change in how industrial production occurs, societies organize, or markets function. More intelligence can’t learn what a drug does over decades of use, can’t hold elections sooner than a constitution dictates, and can’t turn a stranger into an old friend in a weekend. For most people, the felt pace of this future will still be set by the bottlenecks, even if the laboratory upstream runs at the speed of compute.” And then, of course, there are these quotes floating around the page. I don’t understand why they chose to put this one in there: “On days where everything works well, I can’t help but think nothing I do matters, everything is automated and better and faster than I ever will be. But then there are days where everything breaks and I don’t understand why and I realize I have no idea what I’ve been up to anymore.”
- Ted Chiang: [No, Artificial Intelligence Is Not Conscious](https://www.theatlantic.com/philosophy/2026/06/no-artificial-intelligence-is-not-conscious/687378/?gift=1ga2TvL-DbuHDQIcYF7oR7CsNA92bD_yo6VqlH7-uco&utm_source=copy-link&utm_medium=social&utm_campaign=share). He doesn’t use the term “stochastic parrot” and yet I couldn’t help but shrug as if he had. Conscious or not, does the distinction matter on a practical level? It might for Anthropic’s IPO, at least, when Chiang writes: “If we think of Claude as a sentence-continuation machine, Anthropic can reasonably take steps so Claude doesn’t emit sentences saying that sentence-continuation machines are unethical. But as soon as we imagine Claude to be an entity with a moral status remotely comparable to a human’s, then we have to consider whether Anthropic is engaged in something comparable to slavery.”
- Seth Godin:[Stop ruining it.](https://seths.blog/2026/06/stop-ruining-it/)
- Andrew Trigell, a hacker’s hacker (go read[his Wikipedia page](https://en.wikipedia.org/wiki/Andrew_Tridgell)), on “[rsync and outrage](https://medium.com/@tridge60/rsync-and-outrage-d9849599e5a0)”: “for the people saying things like “I’m a PhD from xyz uni and I’m telling your LLMs are just stochastic tools that make everything up and the world will fall apart if you use them”, I’m here to tell you that you are out of date. The world of software engineering has changed dramatically in the last few months.” Go read the whole thing.
- [Patina as proof: The shift from quiet luxury to lived-in aesthetics.](https://patter.substack.com/p/patina-as-proof-the-shift-from-quiet) “People increasingly distrust things that look too new, too frictionless, or too optimised. Patina communicates time, friction, and human use. Wear is proof that something existed in the world before it reached you. In a culture saturated with AI-generated imagery and algorithmically optimised products, that proof is becoming scarce and therefore valuable.”
- Carson Gross, creator of htmx: “[Code is Cheap(er)](https://htmx.org/essays/code-is-cheap/)” Yes, it is. And a lot flows from that. Let’s see how long it takes for the second order effects to be talked about.
- [Why share?](https://redfloatplane.lol/blog/17-why-share/) Great example of these second order effects.
- [Changing How We Develop Ladybird](https://ladybird.org/posts/changing-how-we-develop-ladybird/): “We will no longer accept public pull requests. […] This is not a change we make lightly. Many valuable contributions have come from outside the maintainer group over the years, and we are grateful for them. […] For decades, code contributions have been how open source projects learned who to trust. People would show up, do the work, take responsibility for their changes, and stick around. Over time, trust emerged from the work itself. AI tools have changed the economics of this very quickly.”
- From the [Typewriter interview with Brad Neely](https://austinkleon.substack.com/p/typewriter-interview-with-brad-neely):

Q: “I ‘smoke’ a cigarette peneil in the studio. Do you perform any silly rituals when you’re working?”
A: “Wasting time. Allowing tangents to take over. Chasing a thought down to its root only to find that the deeper you go all thoughts are connected at the roots so you can’t ever get to the bottom of a thing but rather you go round and round through the circuits of connectivity. I keep a thumbtack in my lips when drawing, so I feel you on that, Kleon. I do a lot of ‘problem busting’ on the treadmill or stationary bike.”
- [Cheese Paper](https://brie.gay/cheese-paper/): “a text editor specifically designed for writing, particularly fiction.” I’ve never used an editor like this, so I found the features interesting to consider, and also: what a great name!
- [The Newest Instagram “Exploit” is the Goofiest I’ve Seen](https://www.0xsid.com/blog/meta-account-takeover-fiasco). I got goosebumps reading this, imaginging that I’m the guy responsible, who forgot to add the additional checks.
- [how to train your goblin](https://goblins.mchen.workers.dev/). Beautiful presentation. Made me want to start doing RL runs.
- “I expect we’ll see a shift in emphasis [from taste to character](https://onethingnewsletter.substack.com/p/the-dead-end-of-good-taste), in which the premium is placed on contradiction over cohesion and the specificity of one’s interests over generalized cultural fluency. I’m thinking: incongruous hobbies (ex. Rosey Grier’s Needlepoint for Men), niche and unprestigious collections (stamps? pennies?), and prickliness toward commercial fluency and palatability. Not driven by a desire to be cool or interesting per se but by a desire to be free of the pasteurized good taste, the style without substance, that the algorithm often encourages.”
- Justin Jackson:[Do the hardest thing](https://justinjackson.ca/hard-thing).
- [Why A Retractable Pen?](https://mechanical-pencil.com/products/pen) I urge you to click on this and scroll through the page. It’s beautiful and interesting and well-made. And I’m not only saying that as someone who dis- and reassembled probably hundreds of pens in his life. It’s a great page.
- Fatih’s [Review of the MoErgo Go60 Keyboard](https://arslan.io/2026/06/02/review-of-the-moergo-go60-keyboard/). It’s long, it’s detailed, it has beautiful photos, it has videos, it was — as everyone can see — made with love, it made me want to buy a new keyboard.
- [How To Read More](https://borretti.me/article/how-to-read-more). I’ve averaged between [20 and 30 books a year](https://www.goodreads.com/author/show/15988392.Thorsten_Ball) for multiple decades but really struggled in the last few years. Maybe because I picked longer books (hey, The Power Broker) or because I read more articles or because I work out more and fall asleep roughly four minutes after my head hits the pillow. But I don’t know. So I opened this article and laughed out loud when I read the first “tip”: Quit your job. Hope you get a laugh too.
- [7min clip of Ed Catmull](https://x.com/CDTEliot/status/2050658542999511105) talking about how the “braintrust” worked at Pixar and then on whether it’s possible to apply the Pixar way of working at different companies. I read Creativity, Inc. many years ago (highly recommend it) and hearing that the Disney acquisition led to Frozen was very interesting. Paid off, didn’t it?
- [Making Software is available in early access](https://www.makingsoftware.com/early-access).
- I had the week off and was in the mood for some Russian short stories (if you haven’t: go and read [A Swim in a Pond in the Rain](https://en.wikipedia.org/wiki/A_Swim_in_a_Pond_in_the_Rain)). I really like Chekhov, it turns out. [The Student](https://americanliterature.com/author/anton-chekhov/short-story/the-student) was great (and it’s *very* short). And so was [The Lady with the Dog](https://www.gutenberg.org/files/13415/13415-h/13415-h.htm#THE_LADY_WITH_THE_DOG). Gogol’s [The Overcoat](https://www.eastoftheweb.com/short-stories/UBooks/Over.shtml) I enjoyed too.
- Then I went through The New Yorker archive and read some of the Greatest Hits of the last 100 years that I hadn’t read before: [Undecided](https://www.newyorker.com/magazine/2008/10/27/undecided) (funny, great!), [The Lie Factory](https://www.newyorker.com/magazine/2012/09/24/the-lie-factory?printable=true) (“Campaigns, Inc., the first political-consulting firm in the history of the world, was founded, in 1933, by Clem Whitaker and Leone Baxter. […] Political consulting is often thought of as an offshoot of the advertising industry, but closer to the truth is that the advertising industry began as a form of political consulting.”), [The Paperboy’s Secret](https://www.newyorker.com/magazine/2026/06/08/the-paperboys-secret) (what writing), and [The Musk Ox and Me](https://www.newyorker.com/magazine/2020/08/17/the-musk-ox-and-me), written by Jon Lee Anderson. If you had asked me at 17 what life I wanted to live, I think I would’ve shared a dream that sounds pretty much like Anderson’s actual life. Go read the first three paragraph to see what I mean. Then read the rest because of the musk oxen and Alaska and some beautiful writing.

---

---

# Building Software Is Learning

*An internal note to the Amp team on feedback and shipping faster*

By Thorsten Ball • June 2, 2026

---

*A few weeks ago I shared the following as an internal message with the Amp team. I showed it to a friend while talking about feedback loops and he told me to post this publicly. So here we go. Unedited, straight up copy & pasted from our Slack.*
[![](https://archive.thorstenball.com/data/images/200311778.building-software-is-learning/96e29137-aa72-415c-a9e3-95232387f055.png)](https://archive.thorstenball.com/data/images/200311778.building-software-is-learning/96e29137-aa72-415c-a9e3-95232387f055.png)
You know what’s rare?

```
person a: “we need this feature”
person b: “yes, let me build it”
...
person b: “done.”
person a: “fantastic, exactly what I wanted.”
```

That’s basically *NEVER* what happens. At least not when you’re building something *new*. It might happen when you fix a bug or when you port something that already exists in another app to a new language or framework, ... Or when you’re building after a spec.

But when there’s no spec, and when you’re building something new?

Here’s how that works:

```
person a: “we need this feature”
person b: “yes, let me build it”
[...]
person b: “done.”
person a: “hmm, actually, that’s not what I meant. what I meant is: [...]”
```

Or this:

```
person a: “we need this feature”
person b: “yes, let me build it”
[...]
person b: “you know what... There’s 3 ways to do this, actually, and I’m not sure what the best way to do this is?”
person a: “ah, I see, I think given that we want to ship this tomorrow, let’s go with way 1”
```

Or:

```
person a: “we need this feature”
person b: “yes, let me build it”
[...]
person b: “done.”
person a: “Don’t like it”
```

Now why does that happen, again and again and again?

Because *building new software is learning*! If you’re building something new and you don’t yet fully know how exactly it’s supposed to work, you will learn what exactly it is that you’re building as you’re doing it. Let me repeat: building new software is learning.

So far, so good, right? But here’s the very important bit, the one bit I want you to take with you into this week: there is *no way in hell*, absolutely zero chance, that you can build something new *and* avoid bumping into “that’s not what I meant”, or “now that I’m working on it I’m not actually sure”, or “hmm, now that I use it, I don’t like it”. Because the only way you could avoid that would be to fully specify what you want up front and, well, guess what programming is? It’s fully specifying what you want. You can’t avoid it, because you can’t define it yet, because *building software is learning*!

Now that was the bad news. Here’s the good ones. You *can* reduce the time the `...` from the examples above takes — the time between the confident “yes, let me build this” and the humbled “oh, I see”.

And that, in turns out, is **the most important thing you can do** when you’re building something new: reducing the time it takes you to go from “let me try something” to getting your ass whooped by reality.

If someone says “we need this feature”, don’t go “yes, let me build it” and hack on something for 4 weeks only for the other person to ultimately go “that’s not what I meant.” No. Instead, embrace that *we need to learn*, that we need to try and play around with this idea as fast as possible, in a way that lets us learn. To embrace that idea means that you try to figure out “what is it they mean” *as fast as possible*, with the minimal effort required, so you can LEARN what it is you’re building.

Instead of going away for 4 weeks and hacking on something, you instead can do stuff like this:

- ... build a prototype, in 1hr, and show it to them, and they go “no, that’s not what I meant, you should change this part here”
- ... write down a spec of how you’d approach it, in 30min, and show it to them, and they go “no that’s not what I meant”
- ... cut up the thing in multiple things and ship one every day, so that every day what you built hits reality and you get to learn, because on day 2 someone says “know what, we should change...”
- ... reduce the scope, figure out what the things are that we’re already sure about and skip those, and instead focus on the bits that we don’t know yet — that’s where we need to learn. don’t add 5 ways to login, if all we need to learn right now is 1.
- ... fake a demo video, show that around, get input on that - Quinn’s done it many times
- ... write the news post that explains the idea — why waste effort building something for a week if the idea can be captured in 3 paragraphs?
- ... write the example code that would go into the README, show that around, does that look like a good API? People don’t need an SDK built if they dislike the API in the readme.
- ...

There’s more options that I didn’t list here. And you don’t have to pick only one. In fact, for something big, you should probably do a few of these things. Or you vary them, or combine them, or ...

What *exactly *you do doesn’t matter as much as constantly asking: how can I get feedback on what I’m trying to build as soon as possible? And “feedback” here is used in the widest sense possible. Feedback comes in all shapes and sizes: feedback from the CI system on main, feedback from colleagues, feedback from users, feedback from *you* once you actually use it.

And if you follow that question — how can I get feedback as soon as possible, so I can learn? — you’ll also find out how to chop things up and how to ship them:

- you won’t get good feedback if you ship an “MVP” of an idea that’s so obviously buggy that all you’ll get is bug reports for 3 days, not actual feedback on how useful it is
- you won’t get good feedback if the people supposed to give you feedback have to jump through 8 hurdles to test it
- you won’t get good feedback if you keep your changes on a branch for 3 weeks, because by the time you merge your 27 commits and CI blows up you have 27 possible causes, vs. 1 if you had merged them one by one
- want feedback on the design of your skateboard? sure, show them the deck, no need for wheels. want feedback on how your skateboard feels? you can’t ship it to testers without wheels on it.
- ...

So. Here’s what I want you to think about going into this week: how can I get feedback on what I’m building on as fast as possible? when is the last time I got valuable feedback on what I’m building? in what frequency do I get feedback on what I’m building? why is that frequency so low?

Because we’re building something new, in a time when software is changing (background vocals: *everything is changing*), and no one has a clue what the fuck is going on - so **the most important thing is to embrace that and *****as soon as possible, as often as possible, ship things on which we can get feedback on, in a way that gives us valuable feedback — by CI, by production, by our teammates, by select users, by select customers, by all of our users**.*

Yes, italics ***and*** bold. Because building software is learning and we want to learn as much as possible.
[![](https://archive.thorstenball.com/data/images/200311778.building-software-is-learning/49914c6a-58ad-4eac-a261-fbff1bb8f1c2.png)](https://archive.thorstenball.com/data/images/200311778.building-software-is-learning/49914c6a-58ad-4eac-a261-fbff1bb8f1c2.png)

---

# Joy & Curiosity #88

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 31, 2026

---

It’s been a fantastic week. The Amp team met in San Francisco and together we hung out in a beautiful house, drank coffee and diet coke, ate way too many snacks, and hacked on Amp. 

A single timezone, many overlapping hours, synchronous communication with even the option to tap someone on the shoulder. You could feel the clock rate of the team go up. Our #shipped channel was busy. What a team!

But I didn’t get a lot of reading in. And now the sun is up, the coffee’s finished, and I’m going for a run.

---

- [Amp Neo is now Amp](https://ampcode.com/news/drop-the-neo). It’s out, for everyone. Generally available, fully released; the infrastructure scaled, the clients resilient. It’s been tested on three cross Pacific flights already. Go and try it. [Try the plugins, try the remote control](https://ampcode.com/news/neo). I’m very proud of this architecture and this team and that we made this work — infinitely scalable agents, running everywhere. And it’s only the start.
- Fantastic little post by Patrick: [Fast is better than slow](https://dubroy.com/blog/fast-is-better-than-slow). There’s between ten and fifteen things I want to quote here, so go read the whole thing instead.
- Then go and read the section about being fast on [nat.org](https://nat.org/) and and Patrick Collison’s [Fast](https://patrickcollison.com/fast) page.
- Benedict Evans on[Predicting AI job exposure](https://www.ben-evans.com/benedictevans/2026/5/24/ai-job-exposure): “The counter-argument to all of this would be to say that, yes, well done, there are important exceptions, as there always are, but directionally and in aggregate, it is ‘surely’ correct to say that jobs that involve a lot of repetitive clerical work are most exposed, and this is how many jobs that is, and by how much. That sounds good, but you don’t know if the exceptions are bigger than the rule. Suppose we’d looked at the internet in 1995 and said that this would destroy the value of physical distribution for media - this was ‘directionally correct’, but in practice that meant totally different things for record companies, newspapers, TV companies and movie studios. Are you trying to say something that has some predictive value, or just observing a truism? On average, we’re all dead. Half of the jobs you’ve analysed might be entirely unaffected, and there might be other big pools of jobs to be transformed that you miss entirely. You don’t know.”
- The new [Ferrari Luce has been revealed](https://www.ferrari.com/en-EN/auto/ferrari-luce). It’s the Ferrari designed by Jony Ive and Marc Newson. I’m not a big car guy, so I don’t have a strong opinion on whether it looks good or not, but after everybody else had a strong opinion I went through the [list of Ferrari models](https://en.wikipedia.org/wiki/List_of_Ferrari_road_cars) and remembered that I don’t like the look of most Ferraris.
- “If you’re the kind of person who is skeptical that AI coding is good for anything, then I doubt this post will persuade you. But if you’re the kind of developer who uses agents to write multi-hundred-line PRs that you barely understand yourself, I’d invite you to slow down a bit and try [this other, slower style of ‘vibe coding.’](https://nolanlawson.com/2026/05/25/using-ai-to-write-better-code-more-slowly/)”
- I honestly don’t know what to think of this, one for the Curiosity column: [I Am Retiring from Tech to Live Offline](https://openpath.quest/2026/i-am-retiring-from-tech-to-live-offline/).
- [This post by Jeff Geerling](https://www.jeffgeerling.com/blog/2026/its-hard-to-justify-framework-12/) made me want to go buy a MacBook Neo. But I don’t need one. Maybe my kids do?
- “Have you ever read that Hacker News comment by the early FedEx employee about how they chose Memphis as the location for their headquarters?” “No. It’s a Hacker News comment?” “Yes, it is, let me find that for you.” [Here it is](https://news.ycombinator.com/item?id=9282104).
- [This is art](https://x.com/alt_w_v_g/status/2058171589422928128?s=46).
- I’ve used the term “[thundering herd](https://en.wikipedia.org/wiki/Thundering_herd_problem)” approximately three hundred times in the last few weeks and realized that I kinda assumed everyone knows what it is. So if you don’t, click that link. Another piece of terminology that I assumed everyone knows: pets vs. cattle. But: why would they? So, if you don’t know what someone could mean when they use the terms pets and cattle when talking about infrastructure: [go and read this](https://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle/).
- I really, really need to understand jj revsets more. I learned that jjui lets me hit shift-l and change the revset very easily, but I never know exactly what I’m looking for. So I’m linking to [this excellent post here](https://willhbr.net/2024/08/18/understanding-revsets-for-a-better-jj-log-output/) hoping that it’ll get me to learn revsets. (Send me your favorite revset aliases, please.)
- Simon Willison: [I think Anthropic and OpenAI have found product-market fit](https://simonwillison.net/2026/May/27/product-market-fit/).
- Lovely idea:[apartment birds, heard recently](https://bird.onethreenine.net/). Built by [Teddy](https://theodore.net/).
- [Insignificant Bullets, Evil Poachers, and L.A. Culture.](https://fsgworkinprogress.com/2014/09/26/insignificant-bullets-evil-poachers-and-l-a-culture/) Always fun to read Herzog.
- [My Name Is David Chang, and I Hate Fancy Beer.](https://www.gq.com/story/david-chang-cheap-beer) If I could, I’d print this out and shove it into everyone’s face whenever they ask me why I don’t like IPAs. Actually, you know what, I just might and put it in my wallet, just in case. The *whole point* of beer is that it’s simple. [Four ingredients and that’s it.](https://en.wikipedia.org/wiki/Reinheitsgebot) My stance: if you think a normal beer is boring, you might just not like beer then. Go and do your own thing then, but don’t call it beer. Why? Imagine you’re really into bread. Say you love a really good sourdough bread. You not only love the taste, but also how it’s made, how traditional it is, how simple. But then *someone *comes along and goes “sourdough bread? boring!” and puts fucking raisins in it and sells it as Craft Bread and when you decline the dumb raisin bread people ask you “wait, I thought you liked bread?”

---

---

# Joy & Curiosity #87

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 24, 2026

---

Travelled for roughly 16 hours yesterday and now I’m in a different timezone, with my family, everyone fell asleep at 8pm yesterday, and everyone woke up at 4:30am today (not complaining: that’s good!), and I started writing this at 5am, and the Airbnb we’re staying in is lovely but has one downside: as of right now, it doesn’t have any coffee in it.

What I’m trying to say: that’s all I got for an intro this week, friends. I need a coffee. Enjoy the links!
[![](https://archive.thorstenball.com/data/images/199061089.joy-and-curiosity-87/ac4ab757-ffcc-4cd6-a838-c4c2c8ac5d32.png)](https://archive.thorstenball.com/data/images/199061089.joy-and-curiosity-87/ac4ab757-ffcc-4cd6-a838-c4c2c8ac5d32.png)
- This week [we announced Amp Labs](https://amplabs.com/https://ampcode.com/news/amp-labs). Our team has been working with some exceptional companies for a while now, but now we’re entering a new phase, starting in Sydney, Australia. If you’re exceptionally good and want to help bring artificial intelligence to a global finance player, let me know.
- [Software After Software on the Amp Labs](https://amplabs.com/) website. What we at Amp believe about the future of software and why Amp and Amp Labs exist.
- [I was a guest on Mayank Gupta’s podcast](https://www.youtube.com/watch?v=thMFsqe8kbQ) and we talked about everything, really: how I got into programming, *why* I got into programming, how I ended up going from training to get better at Vim thinking that it doesn’t really matter that much anymore, to being a co-founder of Amp. That was a really pleasant conversation, you can tell that I was a bit tired at the start, since we recorded late-ish my evening, after a long day, but then got more and more excited because Mayank’s questions were fun. Also: what an intro. Also, also: wow, he really went there with that one image in the intro.
- Seems like I’m behind the world by three weeks, but I’ve finally started to use [hunk](https://github.com/modem-dev/hunk) to review diffs before making commits. Since I’ve read about the [Emacsification of Software](https://sockpuppet.org/blog/2026/05/12/emacsification/) right before, I [forked it and added Gruvbox Dark Hard](https://github.com/mrnugget/hunk/tree/add-gruvbox-dark-hard-theme).
- John Gruber: [AI Is Technology, Not a Product](https://daringfireball.net/2026/05/ai_is_technology_not_a_product). I really enjoyed this one, especially this comparison at the end here: “Wireless networking is pervasive too. But Apple doesn’t have ‘a killer wireless networking product’. Wireless networking simply pervades everything Apple makes. I’m hard pressed to think of a single product Apple makes that doesn’t use some combination of Wi-Fi, cellular, Bluetooth, and proprietary wireless protocols. There was a time, not too long ago, when Apple didn’t make a single product with wireless connectivity. Now it’s pervasive in all their devices. That’s more what AI is going to be like. There’s not going to be one “killer AI device”. Everything is going to be an AI device, to some extent, just like how everything today is a wireless connectivity device, to some extent.”
- [How Diamonds are Made?](https://diamond.jaydip.me/read/) If you find this at least a *tiny bit* fascinating, I need you to read [Have You Ever Tried to Sell a Diamond?](https://www.theatlantic.com/magazine/archive/1982/02/have-you-ever-tried-to-sell-a-diamond/304575/) which is an absolute must-read for anyone really. Fantastic all-time article, but also infinite ammunition to sound smug in at least fifty conversations in the future.
- Benedict Evan’s [AI Eats the World presentation has been updated for May 2026](https://www.ben-evans.com/presentations). As always: highly recommend clicking through it. The “Average SKUs per supermarket” slide is great.
- [The 2026 Pulitzer Prizes](https://www.pulitzer.org/prize-winners-by-year/2026). Good list to click through to find great writing. This[firsthand account of the Texas flood in 2025](https://www.texasmonthly.com/news-politics/texas-flood-firsthand-account/), for example. I’m struggling to find the right words to describe how well the writing conveys the absolute terror you must feel when you start to think that — as a real, practical possibility; right here, right now — that you and your family are going to die, but it does. Maybe don’t read it on the plane when you’re with your family, like I was.
- Talking about kids and family: [How to deal with your kid leaving](https://buttondown.com/monteiro/archive/how-to-deal-with-your-kid-leaving/). I didn’t know that Mike Monteiro was still regularly writing. Nearly everything I know about Monteiro comes from watching this many years ago: [F*ck You, Pay Me](https://www.youtube.com/watch?v=jVkLVRt6c1U). Interesting pairing.
- [Anthropic’s “Profitability” Swindle](https://www.wheresyoured.at/anthropics-profitability-swindle/): “Remember that deal Anthropic signed with SpaceX to take over Colossus-1? Well it’s also taking over some or all of Colossus-2, paying SpaceX $1.25 billion a month starting in May and June… when it’ll have a reduced fee as it ramps up! That’s $15 billion a year in compute costs, but reduced to an indeterminately-discounted level for the precise months that Anthropic is using to tell investors and the media that it has an operating profit. That operating profit is a result of accountancy rather than any improvements to its business model.”
- Ben Thompson in [The Inference Shift](https://stratechery.com/2026/the-inference-shift/) is arguing that agents are more asynchronous than the traditional chat interfaces and that more agents will be running *somewhere* without a user waiting for them (agree), and that has effects on what hardware is required or what hardware can get away with: “This, by extension, will mean that the likely best approach to solving agentic inference will look a lot different than answer inference. The most important aspect for answer inference is token speed; the most important aspect for agentic inference, however, is memory. Agents need context, state, and history. Some of that will live as active KV cache; some will live in host memory or SSDs; much of it will live in databases, logs, embeddings, and object stores. The important point is that agentic inference will be less about GPUs answering a question and more about the memory hierarchy wrapped around a model.”
- [DiffsHub](https://diffshub.com/) by The Pierre Computer Company. This is [faaaaaaast](https://diffshub.com/ghostty-org/ghostty/pull/12291), nice.
- Marc Brooker: [What’s Easy Now? What’s Hard Now?](https://brooker.co.za/blog/2026/05/18/whats-easy-whats-hard.html) “I think this is different from the intuition many people have about coding agents. They see websites and UIs as ‘easy’ (see the SaaSpocalypse), and system software as ‘hard’. The feedback loop hypothesis says that this is backwards. That, in fact, we’re going to find that SaaS is ‘hard’ and system software is ‘easy’.” I think I agree, but we also can’t deny that feedback loops have changed tremendously in the last six months. I myself, for a long time in 2025, thought that feedback loops are everything. Then GPT-5.3 one-shotted a big feature. I asked it “did you run the tests?” And it said it didn’t but “I can run them now.” Then it did run them and they all passed and the code worked on first try. [“Why put training wheels on someone who never wobbles?”](https://amplabs.com/) also means that you might not need a feedback loop if you don’t need feedback. Doesn’t mean that Marc’s point is invalid, of course; I agree with him. But feedback loops will change.
- [Agentation](https://www.agentation.com/). Visual feedback for agents. Neat, need to play around with it.
- [no slop grenade](https://noslopgrenade.com/). It’s the new[dontasktoask.com](https://dontasktoask.com/) eh?
- When you want to replace the battery of the Garmin HRM200 heart rate monitor [you can use the size adjuster on its own strap to unlock the battery](https://support.garmin.com/en-US/?faq=AKcjwuY4CB91ki8I1hbXo6). I love stuff like that, when you can use the thing (or parts of the thing) to modify the thing itself. There are about five equivalents in programming, but what’s the equivalent in software?
- Dave Winer in 2002: [What is Stop Energy?](https://web.archive.org/web/20260217063113/http://www.userland.com/whatIsStopEnergy) Nearly 25 years old and still relevant.
- [Two computers, one monitor, zero fiddling](https://alexplescan.com/posts/2025/08/16/kvm/). I could read posts like these every day. Love it.
- [I don’t think AI will make your processes go faster.](https://frederickvanbrabant.com/blog/2026-05-15-i-dont-think-ai-will-make-your-processes-go-faster/)This made the rounds quite a bit. It was, as far as I can tell, mostly shared as “gotcha! HA! AI won’t change a damn thing!” That’s silly, of course, but the original point still is interesting.
- [delphitools](https://delphi.tools/), a “collection of small, low stakes and low effort tools.”
- An internal [OpenAI model “has disproved a central conjecture in discrete geometry”](https://openai.com/index/model-disproves-discrete-geometry-conjecture/) and: “It looks like the solution approach is surprising to mathematicians. It was a general reasoning model rather than a specialized one: bitter lesson time. [I think the stochastic parrot is now nuked from orbit](https://x.com/anderssandberg/status/2057205571900580190).”
- “Without exageration, [being oncall made me the engineer I am](https://yaoyue.org/blog/2026-oncall/). […] I would argue that one doesn’t really understand how software works until they have watched it work, and inevitably fail, in production. And one doesn’t really know how to create software until they have patched together someone else’s broken pieces.” Yes, yes. How many engineers are out there who have been in this industry for five or ten years now and have *never* worked on the same piece of software for longer than a year? Their experience of what it means to develop software must be completely different from mine, so much so that I can’t even imagine what it’s like to not think about future-you-and-colleagues-in-2-years when shipping new things.
- [Historian Jon Peterson traces the route from Prussian military headquarters to Gary Gygax’s basement](https://asteriskmag.com/issues/14/shall-we-play-a-game). I’m not a big and not even a small board game guy, so most of this was new and fascinating to me.
- Great low-level debug story: “Two services running on the same machine. One of them opens a listening TCP socket bound to localhost, the other one connects to that. They exchange data. [Every now and then, the service that initiated the connection gets an ECONNRESET](https://movq.de/blog/postings/2026-05-05/1/POSTING-en.html) while reading data from the socket -- but no other errors show up in the logs, no crashes, nothing. What’s going on?” It’s a two-parter, so don’t miss the second one. (Also, check out the [author’s gallery of desktop screenshots](https://movq.de/desktop/)! Made me want to [use Damn Small Linux with Openbox](https://www.damnsmalllinux.org/) again.)
- Six days left in the [P99 Conf Call For Speakers](https://sessionize.com/p99-conf-2026/)! I recommended a friend to give a talk there since I want to hear what he’s up to.
- [Will Manidis on Grindslop](https://x.com/WillManidis/status/2057094527236665598). A lot in there that I’m very much not sure about, other things that I find fascinating, but then there’s section on 996: “‘996’ is a mass production / central planning approach to creation. it doesn’t work for inventing new things. it only works for cog like scaling of mechanical processes. great work doesn’t happen after 100 hour weeks, it only appears in tiny fleeting random moments, embrace that […] You can assemble an iPhone with 996, but you could have never designed one.” That last one, that’s a killer line. And I agree. But also: why is only this section in all-lower-case?
- Hell yes: [You don’t know HTML Lists](https://blog.frankmtaylor.com/2026/05/13/you-dont-know-html-lists/). Made me feel like it’s 2012 again and I’m excited about discovering a new thing in jQuery or finding that one HTML attribute or element that fits the problem *just so.*
- [Every Page of Moby-Dick, Illustrated](https://www.themarginalian.org/2011/10/11/matt-kish-moby-dick-illustrated/). I started reading Moby Dick last week (constantly switching between [the Gutenberg edition in the Kindle app](https://www.gutenberg.org/ebooks/2701) and the audiobook in Spotify) and, man, I’m all about whaling now. Not that I condone it, *obviously*, but holy hell, what did *you* know about[sperm whales](https://en.wikipedia.org/wiki/Sperm_whale)? Not a thing, is what I had to reply, but now I know, for example, that “Atop the whale’s skull is positioned a large complex of organs filled with a liquid mixture of fats and waxes called spermaceti. The purpose of this complex is to generate powerful and focused clicking sounds.” Let’s see if Ahab gets him, that Moby Dick.

---

---

# Joy & Curiosity #86

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 17, 2026

---

There it is: light at the end of the tunnel. After a week of scaling, tuning, and modifying our infrastructure, [Amp Neo](https://ampcode.com/news/neo) is now rolling out to more users. Update your Amp and watch out for a welcome screen that, some people say, “should be marked NSFW” because it’s so sexy.

Boy do I have stories to tell. Here’s a very 2026 one. We were debugging database issues in production but could only see symptoms and not what caused them. Spike on this graph correlates with spike on that graph alright, but why? What causes it?

If you’ve ever done any sort of investigation like this, you know that there are a lot of things you can check: are processes restarting? Is the rate of errors going up? Is a CPU pinned? What’s the memory usage look like? And so on.

But it’s 2026, isn’t it? So what ended up happening is that we’d send runbooks to each other. And runbook here means “prompt”: a long Markdown document, created by an agent, that instructs the reading agent to check a series of metrics and data points. You’d take a prompt, paste it into Amp, Amp would go off and compile a report. It would say something like “this cluster looks healthy, except for the otel collectors which are OOMing, but that’s benign for now, the smoking gun is the log messages that say … because those correlate with … showing up at the same time, which means …” And then you’d take that report and send it to a fresh Amp and that fresh Amp would say that yes, that’s right, let’s fix this, and you’d sit there and think that there’s *no way*, no way that you would’ve dug through the logs and metrics at that speed with that precision, but it’s 2026 so the agent did it for you.

---

- antirez with a [“short story of a long development”](https://antirez.com/news/164): “Because I had AI, I took no compromises, and I decided to go the extra mile.” This is a well-grounded, realistic portrayal of what it looks like to use agents in the first half of 2026. “For high quality system programming tasks you have to still be fully involved, but I ventured to a level of complexity that I would have otherwise skipped. AI provided the safety net for two things: certain massive tasks that are very tiring (like the 32 bit support that was added and tested later), and at the same time the virtual work force required to make sure there are no obvious bugs in complicated algorithms.”
- So, the [Bun rewrite from Zig to Rust has been merged](https://github.com/oven-sh/bun/pull/30412) and not only did that add around a million lines of Rust code to the `main` branch, it also created a million hot takes. Most of them are silly (“there’s unsafe {} in there”). But [there are good ones](https://x.com/tekbog/status/2054936125106794895?s=46): “if after the bun rust rewrite and 1M code merge in a few days you still think that software engineering hasn’t changed massively idk what to tell you” It’s an automated Zig-to-Rust rewrite of a million lines of code and all the tests pass and it took a week. Just as a reminder: this time last year we complained about models leaving “// Deleted this function” comments in code when deleting code.
- “[Complexity has to live](https://ferd.ca/complexity-has-to-live-somewhere.html)*[somewhere](https://ferd.ca/complexity-has-to-live-somewhere.html)*. If you are lucky, it lives in well-defined places. In code where you decided a bit of complexity should go, in documentation that supports the code, in training sessions for your engineers. You give it a place without trying to hide all of it. You create ways to manage it. You know where to go to meet it when you need it. If you’re unlucky and you just tried to pretend complexity could be avoided altogether, it has no place to go in this world. But it still doesn’t stop existing.”
- matklad on [Learning Software Architecture](https://matklad.github.io/2026/05/12/software-architecture.html). Great read. And plus one thousand on the recommendation to read [Pieter Hintjens](http://hintjens.com/) and [the importance of Conway’s Law](https://registerspill.thorstenball.com/p/the-most-powerful-law-in-software).
- [John Tromp’s Binary Lambda Calculus universal machine.](https://github.com/tromp/AIT/blob/master/uni.c) This is like reading a beautiful poem.
- [Sense of Urgency](https://nbt.substack.com/p/sense-of-urgency): “This week, I had the privilege of dining at The French Laundry (TFL). […] Since the first Michelin Guide of San Francisco in 2007, TFL has received 3 Michelin stars every single year, and is one of the best restaurants in America. […] Looking around, there were a few inescapable details, none more so than a clock placed in the center of a blank wall facing the kitchen, with a plaque below it that reads Sense of Urgency.” I’ve been [thinking about this clock for years now](https://x.com/thorstenball/status/1555466744482959360). Yes, I’ve considered getting a plaque like that. A post-it would do it, surely, but imagine having a plaque like that. No longer would people walk into my office, see the camera and the lights and go “are you a streamer?” but instead they’d ask “what does that mean?” and I’d tell them and— okay, now thinking about it, the plaque would be too much.
- [Aperio](https://aperio-lang.github.io/aperio/introduction.html) is a new programming language and here is its pitch: “Every language designed before 2023 was optimized for a single tradeoff: minimize friction between human cognitive capacity and machine execution. Assembly to C to managed runtimes to DSLs were different points on the same line. In an LLM-driven workflow, those languages don’t get cheaper to use — they get more expensive. The cost just hides in the LLM’s token count, its retry rate, and the latency it eats per turn. Pre-LLM languages are a hidden tax in the LLM era.” I find this very interesting, the question of what a language optimized for LLMs would look like. Does it look like Aperio? Does it really introduce new terms and ideas, such as “locus” and “loci” here? Does a language need to be in the training data? Or can raw intelligence master it?
- [en.dev](https://en.dev/) is “a one-person open source software company building mise & friends.” I’m intrigued by this page. It’s a very, very good page and I don’t think I’ve seen a Sponsors section quite like that. I like it.
- Amazing: [ratty-term.org](https://ratty-term.org/). That landingpage and video are *great*, but make sure to read [the blog post](https://blog.orhun.dev/introducing-ratty/) too. It has some incredible hall-of-fame sentences. This one, for example: “your terminal cursor is a spinning rat”. But fear not: “you can configure the cursor to be your dog”.
- Daniel Lemire: [We see something that works, and then we understand it](https://lemire.me/blog/2025/12/04/we-see-something-that-works-and-then-we-understand-it/). “Both the linear theory and the waterfall model are forms of thinkism, a term I learned from Kevin Kelly. Thinkism sets aside practice and experience. It is the belief that given a problem, you should just think long and hard about it, and if you spend enough time thinking, you will solve it.”
- [Geography is four-dimensional](https://sive.rs/4d), by Derek Sivers.
- This was fascinating: [We don’t know why Malawi is poor](https://newsletter.deenamousa.com/p/we-dont-know-why-malawi-is-poor?hide_intro_popup=true).
- [Googlebook](https://googlebook.google/) looks really interesting. The hardware I don’t care about, but the idea that you can have a self-modifying operating system: *that*’s interesting. It’ll hinge on how much power Gemini will have, though. Right now I have Gemini in Gmail but every time I try to use it it feels like using Siri: sorry, I can’t help you with that. But if they truly unleash Gemini and you can whip up widgets and apps and whatnot and it truly knows how you use the computer? Interesting. Also worth a quick read: [their idea of solving “this and that” with the mouse pointer for the AI era.](https://deepmind.google/blog/ai-pointer/)
- Speaking of self-modifying operating systems: remember Emacs? Thomas Ptacek is wondering whether we’re entering the era of [The Emacsification of Software](https://sockpuppet.org/blog/2026/05/12/emacsification/). In the Emacs world, it’s common to fork & modify and never contribute back. You clone a bit of code into your emacs.d and then you personalize it there. Now, with agents, you can do that with a lot more software.
- [AI, the Shadow Prince](https://callmemapo.substack.com/p/ai-the-shadow-prince): “In none of these instances does AI need to be ‘alive’ to wield power. It doesn’t need to stage a violent revolution or hatch a takeover plan or develop desires. It need only be so efficient, so influential, and so deeply integrated into the loop of human decision-making that it effectively runs the show. We cede authority to AI ministers unwittingly, and out of convenience rather than fear.”
- When I was working at UPS I [did a job pretty much close to this one](https://x.com/adcock_brett/status/2054603963996278786), except you had to sort the packages into three to five lanes, depending on the zip code.
- [I spent my whole career building passive income. Here’s what I got wrong](https://dariusforoux.com/i-spent-my-whole-career-building-passive-income-heres-what-i-got-wrong/): “The grass had been long for a while and every time I looked at it, I didn’t like it. So I went out and mowed it. It took a couple of hours. It looked great when I was done. And I felt genuinely good afterward. That’s the secret to living a happy life. Write when you don’t feel like it. Work out when it’s easier to skip. Do your taxes instead of postponing again. Go outside when you’d rather stay in.”
- Yes,[I do like the new Spotify logo](https://old.reddit.com/r/mildlyinfuriating/comments/1td4lt4/the_new_spotify_logo_is_absolute_horse_shit/). Mark my words: Minimalism is dead, flashy is dead, pixel perfection is dead. What’s alive and desired: graininess, details, rawness, honesty. In a world in which everything can be copied, the things that are truly unique will stand out.
- Sean Goedecke provoking thoughts: [Software engineering may no longer be a lifetime career](https://www.seangoedecke.com/software-engineering-may-no-longer-be-a-lifetime-career/). I mean, who knows? No one, as Sean admits. But incentives have shifted, massively, and it’s unclear what’ll come of that.
- I’m typing this on a new [Lofree Flow 2 keyboard](https://www.lofree.co/products/flow-2-84-low-profile-mechanical-keyboard) that I got yesterday. So far, so good. I like the sounds a lot, but still need to get used to the typing.
- Daniel Stenberg, author of curl, on Anthropic’s Mythos: [Mythos finds a curl vulnerability](https://daniel.haxx.se/blog/2026/05/11/mythos-finds-a-curl-vulnerability/). Emphasis on “a” — a single one. On one hand: yes, I’m skeptical, too. On the other: curl is a project that has had many eyeballs over the years. Not sure how much there’s left to discover.
- [whatcable](https://github.com/darrylmorley/whatcable): “A small macOS menu bar app that tells you, in plain English, what each USB-C cable plugged into your Mac can actually do, and why your Mac might be charging slowly.” Makes me want to check every cable I have. I might.
- [A History of IDEs at Google](https://laurent.le-brun.eu/blog/a-history-of-ides-at-google). Very, very interesting! Reading “Code Intelligence” and “Google” brings back a lot of memories.
- “If you're in the business of building things that run on computers long enough, I think you will eventually acquire a favorite bug story. [This is a short story about mine](https://george.mand.is/2026/05/my-favorite-bugs-invalid-surrogate-pairs/).”
- “[This is the cart before the horse, surely](https://youtu.be/6MIaS9uhRAk?t=1284). Who gives a fuck what people think they want to see at that moment? [...] They come to you, because they’re interested in what you want to do. And if they don’t like it, they can go elsewhere.” This is going to sound incredibly naive, but I have to admit that for many, many years now, decades actually, I haven’t considered the possibility of just ignoring the audience and building something that you want and still putting it in front of an audience. I’ve listened to this episode at the start of the week and I still think about that bit.

---

---

# Joy & Curiosity #85

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 10, 2026

---

We launched [a completely rebuilt Amp this week](http://ampcode.com/news/neo).

Amp Neo (it started as a codename, but I’ve grown really fond of it) is remote controllable, supports plugins as a first-class feature, has compaction you don’t have to worry about, and is *a lot* more efficient and faster than the old Amp. 

It is one of the most elaborate systems I’ve ever worked on. A coding agent split into three parts: the tools here, the interface there, and the loop in an infinitely scalable system over there.

Some day I’ll hopefully write about building it. I learned *a lot* about programming with agents in the last two months.

We’ve spent the whole week scaling this system for the demand and are still working on it. “Scaling problems are good problems to have” definitely feels like a fortune cookie laughing at you when you’re staring at graphs and logs every hour of the day. 

[People](https://x.com/benvargas/status/2052102253583151143) [love](https://x.com/miaugladiator1/status/2052094732541493258?s=20) [Neo](https://x.com/goinggodotnet/status/2052072903387083053) [and](https://x.com/Palanikannan_M/status/2052757482972516702) [can’t](https://x.com/adidoit/status/2053148018413535507) [get](https://x.com/rayfernando1337/status/2053150198113980487?s=46) [enough](https://x.com/erd0xbc/status/2053216766063493514?s=46) of it. We’re now the [“ferrari of coding agents”](https://x.com/alanxchen85/status/2052237203384996303).

But I also barely read anything this week except logs, so this edition of the newsletter is *very* short.

---

- This is beautiful: [“For thirty years I programmed with Phish on, every day. In 2026, the music is out of phase with the work.”](https://christophermeiklejohn.com/ai/personal/phish/flow/agents/2026/05/03/rift.html) What a nice piece of writing and, man, this idea that some people find out early what they want and what’s enough for them and know that it won’t ever change has stuck with me: “Other kids my age were figuring out what they liked, trying things on, growing into and out of phases. I was watching them do it from a desk. I had picked early. I started writing code as a kid. I heard Phish for the first time at thirteen. By the time I was fifteen and had a professional gig, the picking was settled. I had two things, and I didn’t want a third.”
- I somehow missed this earlier, but Aphyr’s [The Future of Everything is Lies, I Guess](https://aphyr.com/posts/411-the-future-of-everything-is-lies-i-guess) is now a *series* of articles. It’s an epub too!
- [Alloway’s Antidote To Baumol’s Cost Disease](https://andrewsiegler.substack.com/p/alloways-antidote-to-baumols-cost). This was very interesting to throw into ChatGPT and ask questions about.
- I love reading David Sedaris’ writing and this week, after a *very* long day, after my brain had shut off, I read [his newest piece in the New Yorker](https://www.newyorker.com/magazine/2026/04/20/why-i-wanted-to-keep-my-marriage-a-secret) and smiled.
- [Six Years Perfecting Maps on watchOS](https://www.david-smith.org/blog/2026/04/29/maps-on-watchos/). There’s so many thoughts that come up when reading this today: will craftsmanship like this exist in the future? would AI have sped things up? was it worth it? how much impact did the real world experience and testing have? what would’ve happened had he hired the designer earlier? But the most important one: I love reading posts like this one.
- Check the [margins on bread](https://x.com/moritzplassnig/status/2051867696145571937?s=46).
- [AI is Breaking Two Vulnerability Cultures](https://www.jefftk.com/p/ai-is-breaking-two-vulnerability-cultures).
- “As so often with German, there is a word for the kind of environment: Lehrwerkstatt. Literally: A teaching workshop. The whole shop floor is the classroom. [You learn by being near the work.](https://x.com/tobi/status/2053121182044451016) Being a constant learner is one of the core values of the firm.”

---

---

# Joy & Curiosity #84

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 3, 2026

---

No big intro today. No time. I have to tweak some [orbs](https://x.com/thorstenball/status/2050145213906117069), there’s a big release coming.

---

- Evan Phoenix: [Agile in the Age of AI](https://miren.dev/blog/agile-in-the-age-of-ai). There’s so much in there and it’s all really good. Highly recommended.
- This is one of the most interesting analyses of What’s Going On With Software Right Now that I’ve read in recent weeks: “[To be a little less vague](https://x.com/nicbarkeragain/status/2049286845402644966?s=20), I suspect that we’re likely (not certain, but likely) to be entering into a period of unprecedented software degradation, and we’re going to be seeing an increasing frequency of outages like this across many high profile products. But IMO the cause is actually not just the-one-thing-that-everyone-is-always-talking-about, it’s a number of things that have all been bubbling away at just below critical levels for a long time.[…]” You know this joke about the fish and the water, right: old fish asks young fishes “morning! how’s the water?” and the young fish are confused and ask “what’s water?” It’s easy (and probably not that wrong) to point at AI and declare it the cause of every change we see, but I think it’s equally likely that only now that we’re out of the ZIRP-era do we see what ZIRP has actually done to this industry.
- [Ghostty Is Leaving GitHub](https://mitchellh.com/writing/ghostty-leaving-github): “It’s not a fun place for me to be anymore. I want to be there but it doesn’t want me to be there. I want to get work done and it doesn’t want me to get work done. I want to ship software and it doesn’t want me to ship software. I want it to be better, but I also want to code. And I can’t code with GitHub anymore. I’m sorry. After 18 years, I’ve got to go. I’d love to come back one day, but this will have to be predicated on real results and improvements, not words and promises.” The times they are a-changing. Don’t forget to read [Mitchell’s comment here](https://news.ycombinator.com/item?id=47939809). I don’t have the time right now to spell out how much GitHub means to me, but I can safely say that without GitHub I wouldn’t have the life I have today. And for many, many years I thought working at GitHub would be the best job in the world.
- This chart made the rounds and kinda said the record straight: “I don’t work on reliability & scaling at GitHub, but the people who do aren’t bad at their jobs. They’re dealing with unprecedented scale from agents. It’s easy to shit on GitHub from the outside if you’re not in charge of [30X-ing capacity within a few months.](https://x.com/Mappletons/status/2049123849556406336) Have some grace.”
- I found Armin’s commentary on the whole GitHub situation to be very good: [Before Github](https://lucumr.pocoo.org/2026/4/28/before-github/). This, for example: “GitHub is currently losing some of what made it feel inevitable. Maybe that’s just the life and death of large centralized platforms: they always disappoint eventually. Right now people are tired of the instability, the product churn, the Copilot AI noise, the unclear leadership, and the feeling that the platform is no longer primarily designed for the community that made it valuable. Obviously, GitHub also finds itself in the midst of the agentic coding revolution and that causes enormous pressure on the folks over there. But the site has no leadership! It’s a miracle that things are going as well as they are.” (Sidenote: I can’t be the only one who’s never used the word ‘forge’ before and now sees it everywhere as if there had been a big “this is the new word we’re going to use now” memo going around.)
- [Mat Duggan on the GitHub he’d build](https://matduggan.com/if-i-could-make-my-own-github/) if he were “rich like a man who owns a submarine he’s never been inside. Rich like a man whose third wife has a skincare line. Tech-titan rich — the kind of money that buys you a compound in Wyoming and the confidence to wear the same gray t-shirt to congressional testimony.” Doesn’t look like what I’d envisioned but some of the points are very interesting, especially this one: “My local copy of the repo should be a representation of the entire repo, not just the code. I should be able to approve a PR from the same VCS I use to check in the code. I should be able to go through my issues by looking through local files.” It’s kinda funny that over the last decade git and GitHub haven’t really merged. It’s always been repository here and rest over there.
- Highly, highly, *highly* recommend you read this piece by Kevin Kelly on [Our Uncertain Uncertainties](https://kevinkelly.substack.com/p/our-uncertain-uncertainties): “In other words, we have a sustained, extended period of uncertainty. Not just a few years, but a decade or more. As AI continues to progress, rather than resolving our perplexity, it expands it. So for the next 10-15 years we have perpetual, continuous, severe uncertainty. This is a burdensome weight because people hate uncertainty more than bad news. […] what should we do about it? The most effective response to this multi-layered persistent uncertainty is not to seek impossible stability, but to cultivate radical adaptability and radical optionality. Give up on having a reliable prediction of what happens next. Instead cultivate multiple scenarios of what could happen, and endeavor with each of them to maximize your options. Goals should be considered as disposable hypotheses, constantly ready to be discarded and replaced by better-fitting concepts later on.” As much as I don’t like to say it, I think it’s true. I think the last 30 years will look incredibly calm compared to the next 10. But hey, when the going gets tough, the tough get going, right? Or as the Hunter S. Thompson quote goes that I had pinned to me teenage bedroom wall: when the going gets weird, the weird turn pro.
- [My friend Tomás Senart is looking for a founding engineer to work with him on Perfloop](https://x.com/tsenart/status/2050265601185128468). I worked with Tomás for many years at Sourcegraph, he’s a true hardcore programmer, incredibly high agency (probably came out of the womb with his sleeves rolled up), and has a great sense of humor. Also: I trust him blindly to order sushi for me whenever we go out. If you’re into AI and systems programming and performance optimizations: talk to him!
- Had you asked me, when I started this newsletter, whether I’d ever link to something in the National Catholic Register, I probably would’ve laughed and said “What? What is that? What’s in there? Why would I link to it?” But now we’re here and I think this is one of the best things I’ve read on AI and education, or actually: education in general, in a long, long time: [Reparing the Ruins: Why AI Can’t Replace Education.](https://www.ncregister.com/commentaries/schnell-repairing-the-ruins?amp) Listen to this: “Education worthy of the name has always understood this. Its end is not the delivery of content, however accurate. It is the formation of persons capable of judgment, attention and intellectual honesty. That formation requires a genuine encounter with difficulty — the friction of a hard text, the resistance of a problem that does not yield quickly, the discomfort of revising what one believed. It requires embodiment as much as intellect: reading slowly, speaking in one’s own voice, accepting the cost of standing behind one’s words. A person does not become capable of truth by managing information alone. Wisdom is formed in contact with reality, not in its simulation.” Amen.
- Big oof: “[Copy Fail](https://copy.fail/) is a straight-line logic flaw — it needs neither. The same 732-byte Python script roots every Linux distribution shipped since 2017.”
- [The West Forgot How to Make Things. Now It’s Forgetting How to Code](https://techtrenches.dev/p/the-west-forgot-how-to-make-things?hide_intro_popup=true): “Five to ten years from now, we’ll need senior engineers. People who understand systems end to end, who can debug distributed failures at 2 AM, who carry institutional knowledge that exists nowhere in the codebase. Those engineers don’t exist yet because we’re not creating them. The juniors who should be learning right now are either not being hired or developing what a DoD-funded workforce study calls “AI-mediated competence.” They can prompt an AI. They can’t tell you what the AI got wrong. It’s Fogbank for code. When juniors skip debugging and skip the formative mistakes, they don’t build the tacit expertise. And when my generation of engineers retires, that knowledge doesn’t transfer to the AI.”
- This was delicious. Daniel Lemire “created something I call the [SIMD Quad algorithm](https://lemire.me/blog/2026/04/27/you-can-beat-the-binary-search/)” which beats binary search due to parallelism. Essentially: divide your list into blocks of 16 elements, then divide the list of blocks into quarters, check independently which quarter must contain your target (which CPU can optimize),  do that until you end up with a single block, then check all 16 elements at once. Slick!
- Very interesting (but maybe a bit shallow) [profile of Mistral in Forbes](https://www.forbes.com/sites/iainmartin/2026/04/16/how-frances-mistral-built-a-14-billion-ai-empire-by-not-being-american/). This is brutal: “But Mistral has slipped ever further behind in leader­boards ranking AI performance. It’s so bad that Mistral’s best model would lose in a face-off against a version of Anthropic’s Claude that was released nine months earlier, per one popular benchmark. Worse, it’s also bested by a new crop of open-weight models from Chinese startup DeepSeek and tech giant Alibaba.” But there is a But: “But Mensch bets that a smaller, cheaper model made in Europe is better suited for governments and global companies than an American closed-source LLM with far more horsepower. Plus, it’s too risky for serious Western companies to depend on Chinese models, says Mistral investor Jeannette zu Fürstenberg of venture fund General Catalyst. The strat­egy has worked to the tune of $200 million in revenue in 2025. And Mensch says Mistral is on track to start making around $80 million monthly by December” Very interesting. But (another one), as a European myself, I have to say that I can’t stand it anymore when European tech companies pitch their product with what essentially boils down to: “at least we’re not [US company].” Yeah, the product might be worse, yeah, it doesn’t work as well as the other thing, but hey, at least we’re not …, at least we don’t store your data in the US, at least … As a colleague of mine once said about a similar sounding marketing campaign by Opera, the browser company from twenty years ago, in which it essentially said “at least we don’t track you”: that’s not what a winner would say.
- [3 constraints before I build anything](https://jordanlord.co.uk/blog/3-constraints/). This was fascinating, because my first reaction was: yes, constraints #1 and #2 are right, but what does #3 even mean? But now, re-reading it, I think that even #2 can be argued. And, hey, #1 too, actually. It is interesting though that they all have some value and I’d definitely say it’s three things to *consider* before building anything, but [turning around and pointing at the choir behind me: now everybody!] *it depends*.
- [Why fat tailed costs emerge at scale](https://www.anjalishriva.com/fat-tails): “I find that analysis of AI business models consistently underestimates the impact of unit economics. When people say AI startups face margin squeeze, they point to external competitors or monopolistic GPU pricing as contributing factors. But it seems that the internal resource variance would still exert pressure, even if there was only one LLM provider and chips were abundant.” We’ll probably never get it, but an in-depth blog post by one of the inference providers or model houses on exactly this would be very interesting.
- [Hell yes](https://lithub.com/brad-neely-on-embracing-errors-when-making-art/): ”I like art that feels like it was made by a free person. I like to see how a person chooses things. I like art before it gets noted and workshopped and homogenized. I like art that preserves the rough edges of the person. Polish can be taught, so it’s less interesting to me than that which can’t be. I like when I can sense how someone really talks, feels, and thinks. I mean consciously so, but also unconsciously so. Every choice communicates. Even the ‘errors.’ I embrace the errors.” That’s why I like to listen to live music a lot. As our admin on the Led Zeppelin bootleg forum in 2007 said: “They always bit off more than they could chew — and then chewed it.”
- Very, very interesting: [Inside macOS window internals: how SkyLight enables multi-cursor background agents.](https://github.com/trycua/cua/blob/main/blog/inside-macos-window-internals.md)
- [Zed 1.0 is out!](https://zed.dev/blog/zed-1-0) Congratulations!
- [CorridorKey](https://github.com/nikopueringer/CorridorKey): “When you film something against a green screen, the edges of your subject inevitably blend with the green background. This creates pixels that are a mix of your subject’s color and the green screen’s color. Traditional keyers struggle to untangle these colors, forcing you to spend hours building complex edge mattes or manually rotoscoping. [...] I built CorridorKey to solve this unmixing problem. You input a raw green screen frame, and the neural network completely separates the foreground object from the green screen. For every single pixel, even the highly transparent ones like motion blur or out-of-focus edges, the model predicts the true, un-multiplied straight color of the foreground element, alongside a clean, linear alpha channel. It doesn’t just guess what is opaque and what is transparent; it actively reconstructs the color of the foreground object as if the green screen was never there.” Crazy that his even works without a green screen.
- So, [Henrick Johansson](https://x.com/compliantvc), this Twitter European VC parody account that often hit a bit too close to home is… [real?!](https://x.com/compliantvc/status/2049535715369775559) No, that can’t be, right? So my theory is: it started as a parody account, but then Comp AI took over the account, changed the avatar to this actor’s image, and now uses it to run ads for compliance while keeping the parody going. Anyone know more?
- [Staring at walls to improve focus and productivity.](https://www.alexselimov.com/posts/men_who_stare_at_walls/) I don’t know, man. On one hand: whew, wow, *wow*. On the other: if it works? On the third: it’s meditating
- Beautiful: [I just learned I only have months to live](https://archive.is/EwSWT#selection-1235.0-1235.69).

---

---

# Joy & Curiosity #83

*Interesting & joyful things from the previous week*

By Thorsten Ball • April 26, 2026

---

This is a time of great technological change. You could even wring a “once in a lifetime” out of me . Many times per week now I say to either myself or someone who just shared some news: this is crazy, man.

The numbers, the pace, the demand, the bottlenecks shifting, the new capabilities emerging, and, man, the predictions. The predictions. AI will do that, AI will do this, in the future we’ll do all of this and none of that, but surely this will still be that and that thing will be the most important thing.

I’ve done it too, of course. I’ve predicted quite a few things in past issues of this newsletter and, hey, yes, I was right a few times. And so were others.

But we’re talking about technological progress here and that is *very* hard to predict, especially its second-order effects. So, as you read through the things I shared below, I want you to keep the following quote in mind, because it’s been stuck in mine for many weeks now and I found it helpful to carry around with me:

> He did not create a world that went as he wanted, but he created a world that went well. We have many examples of that. Trains and bicycles come in, and we get feminism because it’s easier for people, especially women, to move freely and independently. They can organize. They can mobilize. We get suffragettes. [Did the inventor of the train intend for there to be women’s liberation? No. Did it go the way he imagined? No. Did it go well? Yes.](https://www.dwarkesh.com/p/ada-palmer)

Or consider [this](https://www.mattridley.co.uk/books/how-innovation-works/): 

> After the Great War, the [Haber-Bosch process](https://en.wikipedia.org/wiki/Haber_process) was used throughout the world to fix nitrogen on a grand scale. […] It was synthetic fertilizer that enabled Europe, the Americas, China and India to escape mass starvation and consign famine largely to the history books: the annual death rate from famine in the 1960s was 100 times greater than in the 2010s. […] If Haber and Bosch had not achieved their near-impossible innovation, the world would have ploughed every possible acre, felled every forest and drained every wetland, yet would be teetering on the brink of starvation, just as William Crookes had forecast.

That was after the war. Here’s what Bosch and Haber did with their process during the war:

> Then in September 1914 Bosch made the famous ‘saltpetre promise’ that he could convert the Oppau plant so that it turned ammonia into nitrate, using a newly discovered iron-bismuth catalyst. He built an even bigger plant at Leuna, producing huge quantities of nitrate and thus probably prolonging the war. Haber, in the meantime, had invented gas warfare, personally presiding over the first chlorine attack at Ypres in March 1915.

Now, who would’ve predicted going from *that* to *that?*

---

- [Amp’s smart mode now uses Opus 4.7](https://ampcode.com/news/opus-4.7). I think it’s a great model. I now often switch between smart and deep mode. One plans, the other reviews, and vice versa.
- Last week I re-read [Mike Acton’s Expectations of Professional Software Engineers](https://adamj.eu/tech/2022/06/17/mike-actons-expectations-of-professional-software-engineers/) and, *man, *is it good. So, so good. If you haven’t, you need to read this right now. *This* is software engineering in a team, in a company, in a business. Hacking isn’t programming isn’t engineering, but what he describes here, that’s the real thing. And — *of course you have to say this, Thorsten —* yes: this all still applies when using AI. Maybe even more so. Just like [The Basics](https://registerspill.thorstenball.com/p/the-basics).
- For many, many years I’ve come across strong recommendations to watch this talk by Richard Hamming: [You and Your Research](https://www.youtube.com/watch?v=a1zDuOPkMSw). Not considering myself a scientist, I shrugged off those recommendations and never saw it. I can tell you now: that was a huge mistake. This morning, right after waking up, still in bed, I read[this transcript](https://paulgraham.com/hamming.html), start to end, and let me tell you this: watch the talk or read the transcript! If you’re here, reading this newsletter, I’m certain you will get something out of it. It’s fantastic.
- Highly, highly recommend you watch [this interview with Dylan Patel](http://youtu.be/LF3aUIM57uw?is=V70Aq0R5boB_1aY5)on the current state of tokenomics. Really: if you only have a vague idea of what “compute constrained” means, you have to watch this. (Also, the last ten minutes, in which Dylan talks about the optics of the model companies, are kinda separate from tokenomics, but worth it alone.)
- Talking of which: “Cursor has also given SpaceX [the right to acquire Cursor later this year for $60 billion or pay $10 billion for our work together](https://x.com/spacex/status/2046713419978453374?s=46).” $60 billion (!) now sounds like $60 million did in 2012.
- [Kevin Kwok’s thoughts on Cursor’s and SpaceX’s partnership](https://kwokchain.com/2026/04/23/cursor-and-spacex-in-search-of-a-complete-loop/) are interesting, but I disagree with him on the premise that model and harness have to go hand in hand. I don’t think the causality of the loop is there: Claude 3.5’s ability and eagerness for tool calls was the Urknall of agents. That’s what lead to us to build Amp and Anthropic to build Claude Code.
- Bonkers numbers: [Google wants to invest up to $60B in Anthropic](https://archive.ph/u274V). The [Hacker News comments](https://news.ycombinator.com/item?id=47892074) are interesting.
- Justin Jackson is asking: [what has technology done to us?](https://justinjackson.ca/tech-done-to-us) I very much don’t agree with the quoted statement of “technology will always do its worst thing” (and neither does Justin, it sounds like.)
- [It’s cool to care](https://alexwlchan.net/2025/cool-to-care/): “Whenever somebody asks why, I don’t have a good answer. Because it’s fun? Because it’s moving? Because I enjoy it? I feel the need to justify it, as if there’s some logical reason that will make all of this okay. But maybe I don’t have to. Maybe joy doesn’t need justification. […] So much of our culture tells us that it’s not cool to care. It’s better to be detached, dismissive, disinterested. Enthusiasm is cringe. Sincerity is weakness. I’ve certainly felt that pressure – the urge to play it cool, to pretend I’m above it all. To act as if I only enjoy something a ‘normal’ amount. Well, fuck that.”
- Take some time to play around with[ChatGPT Images 2.0](https://openai.com/index/introducing-chatgpt-images-2-0/). It’s [mind-blowing](https://x.com/thorstenball/status/2046875063769579870). If they can accurately reconstruct screenshots like, regardless of whether that’s the “image” model part or the “thinking” model part, I think something just shifted. Also, what a sick landingpage.
- This was great: [What will be scarce?](https://aleximas.substack.com/p/what-will-be-scarce) The question that leads to the one in the title is this: “If advanced AI brings material abundance—if machines can produce many if not all forms of human production at very low marginal cost—does economics become irrelevant?” The whole piece is explains the possible mechanisms at play and also answer the question of whether economics will become irrelevant, but even more interesting is the prediction on the future of work: “The economics of structural change tells us that when technology makes one type of production cheap, the economy doesn’t collapse. It transforms. It shifts toward the things that technology can’t make cheap. For AI, those things are exactly the ones where human involvement carries inherent, irreplaceable value.” And that means the “durable jobs will be in the relational sector, where the human element is the product itself.” Or, in other words: “You don’t need to be Picasso. You need to be the person whose involvement makes the product feel like it was made for someone, by someone.”
- “A parasite that has been eating people for 3,500 years is about to be [wiped off the planet](https://x.com/anishmoonka/status/2045757539409621414). It infected 3.5 million people in 1986. Last year, it infected 10. And I have not seen it make a single front page.” Believe it or not, but in seventh grade I gave a presentation in biology class on the Guinea worm. Use Google Image search if you’re as brave as I was in seventh grade. Yeah, thought so.
- This is from December last year, so the numbers are even crazier now, which makes this even more interesting: [Liar’s Valuation](https://writing.nikunjk.com/p/liars-valuation). I knew about “take last month’s revenue and multiply by twelve,” but the tiered investment rounds were new to me, and so was the “give heavy discount in year one, but then report year three bookings as ARR.”
- [The annotated Unicode map](https://unicode.tkanarsky.com/). More of this!
- Yes, it’s Sky Sports News of all places: “[Pressure is a privilege.](https://x.com/SkySportsNews/status/2045195666423509324?s=46) And if you’re feeling any pressure or the weight of any expectation, you are breathing rare air, that very few of us get to live inside.” Good frame.
- Or, as [Josh Kushner said](https://open.spotify.com/episode/7nRM1Ea84xM64kt7IJhwTm): “Every experience is training you for the next one… In order to become king, God didn’t give David a crown, he gave him Goliath.”
- Tim Cook is stepping down as Apple’s CEO. This Stratechery reflection was very interesting: [Tim Cook’s Impeccable Timing](https://stratechery.com/2026/tim-cooks-impeccable-timing/). For example, I had no clue that Apple in China (as in: moving its manufacturing to China) was the work of Cook. For me, Cook will always be the CEO who was at the helm when the M1 shipped, one of most remarkable engineering achievements I’ve witnessed.
- Apple’s incoming CEO [John Ternus in 2024 in a commencement speech](https://aletteraday.substack.com/p/letter-327-john-ternus-2024): “At some point in my first year, I found myself at a supplier facility. I was far away from home, it was well past midnight. I was using a magnifying glass to count the number of grooves on the head of this screw, which, remember, lives on the back of the display. And I was arguing with the supplier because these parts had 35 grooves, they were supposed to have 25. I distinctly remember stepping back for a minute and thinking to myself, ‘What the hell am I doing? Is this normal?’ And I thought about it, and I realized it might not be normal, but it’s right. It’s right because I’d already spent months working on that product, and if you’re going to spend that much time on something, you should put in your very best effort. Maybe a customer notices, maybe they don’t, but either way, whenever I saw one of those displays on someone’s desk, it mattered to me to know that my teammates and I had considered everything about it and done the very best job we could.” There’s a lot more good stuff in there. I’m excited.
- After probably ten years of using [Alfred](https://www.alfredapp.com/) I switched over to [Raycast](https://www.raycast.com/) two years ago and one thing that I’ve sporadically but consistently missed was Alfred’s “Large Type” feature: you type a bit of text hin, hit a shortcut, and boom, the text is now as big as your display. Very helpful when you want to show someone in the room the wifi password, for example. So, this week I thought: surely there’s a Raycast plugin for that? And [there is](https://www.raycast.com/gbarba/large-type) but the text isn’t that large. But guess what, there’s also this:[large-type.com](https://large-type.com/#now%20that's%20some%20big%20text). How good is that?
- Adam Mastroianni again with some very good writing on capital-S science: [Nothing ever dies. It merely becomes embarrassing.](https://www.experimental-history.com/p/nothing-ever-dies-it-merely-becomes) I didn’t know that [ego depletion](https://en.wikipedia.org/wiki/Ego_depletion)doesn’t reproduce! While reading I had to think of [Brandolini’s Law](https://en.wikipedia.org/wiki/Brandolini%27s_law): “The amount of energy needed to refute bullshit is an order of magnitude bigger than that needed to produce it.” (In 2015 both Brandolini and I both gave a talk at a Ruby conference in Wrocław, Poland, and we chatted for half an hour at the airport and, not sure exactly why, but I’m oddly proud of that.)
- [Orson Scott Card, author of Ender’s Game](https://x.com/orsonscottcard/status/2046702294406680751): “Those changes made, I sent it to Ben again. I did not remind him of what he had advised me to do. I merely told him I liked my title, and said, ‘I have addressed your other concerns,’ which was true. I figured he wouldn’t remember what his exact words had been. My answer was a check. [...] Did Ben’s feedback help? Yes — but his specific advice was not right, and I knew it. [...] Editors don’t know more than you about your story. They especially don’t know why they decide to accept or reject stories. YOU have to know what your story needs to be, and take only advice that you believe in.”
- Reminded me a lot of [Bill Hader on feedback](https://www.youtube.com/shorts/NHHZSNw9J2o): “When people give you notes on something, when they tell you it’s wrong, they’re usually right. When they tell you how to fix it, they’re wrong.”
- [exe.dev raised a Series A](https://blog.exe.dev/series-a): “We are building a cloud that makes sense for the current and future state of software development. One that includes the features needed for fast, secure development out of the box. A cloud developers actually enjoy using. We want to revitalize the spirit of projects like early Heroku (though our technology is very different) and ship features that bring you joy.” (Not to take away from this announcement, hence the parenthetical: the impact Heroku had on a certain generation of programmers working on developer tooling is hard to overstate. I bring it up *a lot*, and so do my teammates who are close my age and worked with web technologies in the early 2010s.) I’m very excited to see what they’ll do! I like using exe.dev a lot.
- I also really like David’s personal statement that goes along with the funding announcement: [I am building a cloud](https://crawshaw.io/blog/building-a-cloud).
- Just a reminder: [chat jimmy](https://chatjimmy.ai/) exists. Try it. You *have* to. Try it and then imagine what we could do if one of today’s frontier models would run at even half that speed. Send me a letter if you know whether that’s physically impossible.
- [New Larry David biography is coming out this year](https://people.com/larry-david-biography-cover-reveal-exclusive-11955458). Pretty, pretty, pretty good.
- Elad Gil’s [Random thoughts while gazing at the misty AI Frontier](https://substack.com/home/post/p-194229552). Lots of interesting things in there. AI researchers’ distributed IPO, compute constraints, hidden layoffs, and also this bit: “It is not just the model you use, but the environment, prompting, etc you build around it that helps impact your choice. Brand also matters more then many people think. At some point, either one coding model breaks very far ahead, or they stay neck in neck.”
- [Maggie Appleton: One Developer, Two Dozen Agents, Zero Alignment](https://maggieappleton.com/zero-alignment). I think I see the same future that Maggie sees. And we’re building it at Amp.
- That’s a title worthy of a book, not a post, but the content is still fascinating: [Fabric is harder than steel](https://x.com/amypretzel/status/2046350294808736064). As someone who’s been chasing the perfect t-shirt for years and who has a very deep fascination with “tech shirts” (not company logos, but high-quality shirts made of “functional” textiles), this was very cool. I often wondered: how can car seats be this good for so long? Well, turns out it’s engineering.
- [Jeff Geerling: New 10 GbE USB adapters are cooler, smaller, cheaper.](https://www.jeffgeerling.com/blog/2026/new-10-gbe-usb-adapters-cooler-smaller-cheaper/) I could read blog posts like this one five times every day.
- [I Found It: The Best Free Restaurant Bread in America](https://www.theatlantic.com/magazine/2026/05/best-free-restaurant-bread-america/686582/?gift=DSG3Tuza1E1plW5tLvZKU4CmLYLSUSjfOxVxXRJ-YKY). This was *fantastic*. Go read it if you have an hour and want to smile and enjoy some great writing. There are many quote-worthy sentences in there, but I’ll let you read them yourself. Instead, here’s a free bread anecdote. Once upon a time, I was working on a farm in Australia, along with around ten other backpackers. Handful of Germans, handful of French people, two Brits. One day we were sitting around the big table in this “shed” (actually a big house, with a shed-like quality, if you will) we were living in, chit-chatting about stuff. What do you miss the most from home? came up as a question and after someone said that they miss a proper shower and feeling clean for once many of us nodded. Yes, that’d be something. Then someone said: I really, really miss the bread. And *everybody*, because we’ve all seen and tasted what the Australians call bread, let out a big sigh and said, oh yes, the bread, I miss the bread. And precisely one second later, the room split into two factions and the Germans stared at the French and the French stared at the Germans and both factions, at the same time, said something to the effect of: wait, what the fuck, why do *you* miss bread, your bread fucking sucks, our bread is good bread, your bread is garbage, shut up. But, sadly, the French wouldn’t see how wrong they were, thinking their long, dumb, comic book bread is any good. And I’m pretty sure that created a rift in our little community of grape pickers. Anyway, hopefully I pissed of all the Australians and French people reading this — your bread sucks. So, go read the article and have some fun.

---

---

# Joy & Curiosity #82

*Interesting & joyful things from the previous week*

By Thorsten Ball • April 19, 2026

---

This one’s short, because it’s been a week full of programming and building, less reading. And this weekend’s equally busy, so here’s a question I’ve been flipping around in my head for months now:

What are we learning about working with these models that will be valuable in the future?

In his Lex Fridman interview, [ThePrimeagen said something](https://lexfridman.com/theprimeagen-transcript/#chapter32_programming_with_ai) that stuck with me: “Is anyone actually falling behind for not using AI then? Because if the interface is going to change so greatly that all of your habits need to fundamentally change […], have I actually fallen behind at all? Or will the next gen actually just be so different from the current one that it’s like, yeah, you’re over there actually doing punch card AI right now. I’m going to come in at compiler time AI, so different that it’s like what’s a punch card?”

There’s something to this. The frontier models are now much more forgiving when it comes to prompts. We no longer have to write “you are a senior engineer” in our prompts. “Don’t make mistakes” is more a prayer than a helpful trick. The days of the Prompt Engineer won’t be visible on the timeline if we zoom out to even five years. 

Nowadays, I’m even convinced that a lot of what we considered important for manual context management is now no longer needed. (Yes, we’re shipping soon.) We’re close to the point where you no longer have to care whether you’re at 30% or 70% of the context window. 

And I’m also convinced that the models will get even better.

Now, maybe it is a form of sunk cost fallacy, a bias talking, but still: I do think that I got better at working with these models over the past two years. It might not be relevant anymore whether I write down my task before or after I include a file in a prompt, but I think I’ve gained some meta-abilities that made me better at solving problems through the use of agents: chopping up problems into engineering tasks and sequencing them, figuring out what the pitfalls (that wouldn’t be pitfalls for humans) are, knowing what’s poison in the codebase and what isn’t. Stuff like that.

In the most general sense, I think I’ve learned how to work with artificial intelligence. And if prompt engineering tricks are punch cards, then that might be seen as learning about computation.

---

- This is, at least for me, already [a Hall of Fame comment](https://news.ycombinator.com/item?id=47748064): “For reasons which it would take a while to unpack, if is often the case that the best (or sometimes only) way to find out what programming actually needs to be done, is to program something that’s not it, and then replace it. This may need to be done multiple times. Programming is only occasionally the final product, it is much more often the means of working through what it is that is actually needed. This is very difficult for the people who ask for the software, to understand, and it is quite often very difficult for the people doing the programming to understand. Most of what is being done, during programming, is working through the problem space in a way which will make it more obvious what your mistakes are, in your understanding of the problem and what a solution would look like. Once you have arrived at that understanding, then there are a variety of ways to make what you need, but that is not the rate-limiting step.” So, so, so good. This is what software development is: learning.
- [Fractal Paris](https://panoramic.city/fractalparis/) and[Fractal Istanbul](https://www.fractalistanbul.com/). Lovely!
- Rands: [The Complicators, The Drama Aggregators, and The Avoiders](https://randsinrepose.com/archives/the-complicators-the-drama-aggregators-and-the-avoiders). Read and recognize people you’ve worked with.
- Brian Cantrill on [the peril of laziness lost](https://bcantrill.dtrace.org/2026/04/12/the-peril-of-laziness-lost/): “The problem is that LLMs inherently lack the virtue of laziness. Work costs nothing to an LLM. LLMs do not feel a need to optimize for their own (or anyone’s) future time, and will happily dump more and more onto a layercake of garbage. Left unchecked, LLMs will make systems larger, not better.” Read this at the start of the week and then constantly thought of it whenever I asked my agent whether this is “truly the simplest, most minimal, as-little-as-possible and as-much-as-needed solution?”
- Vicki Boykis, in some sense in harmony with Brian Cantrill’s thoughts, on [Mechanical Sympathy](https://vickiboykis.com/2026/04/13/mechanical-sympathy/): “Mechanical sympathy for both developers and end-users means understanding when asyncio is and is not helpful. It means using the right language, the right build system, the right font. It means using the least amount of tooling possible. Allowing for local development. It means reading code inside out rather than top to bottom. Using uv. Removing code where not necessary. Respecting boundaries.”
- stevey wrote [a tweet about AI adoption at Google](https://x.com/Steve_Yegge/status/2043747998740689171) and [got pushback from Demis Hassabis](https://x.com/demishassabis/status/2043867486320222333) and others and, well, I actually don’t care *that much* about AI adoption at Google, but I find this one thought in there very fascinating: “There has been an industry-wide hiring freeze for 18+ months, during which time nobody has been moving jobs. So there are no clued-in people coming in from the outside to tell Google how far behind they are, how utterly mediocre they have become as an eng org.” I know that people aren’t sure whether there are more or less software jobs right now, but from where I’m sitting it does look like hiring has slowed and I find it fascinating to think about the second-order effects of that: is there less industry-wide diffusion of frontier knowledge because hiring has slowed?
- Shifted something in my brain:[Nucleus Nouns](https://ben-mini.com/2026/nucleus-nouns). Very good and much more thought-inspiring than the usual “focus! focus! focus!” chants.
- [The Closing of the Frontier](https://tanyaverma.sh/2026/04/10/closing-of-the-frontier.html): “There is something special about training a model on all of humanity’s data and then locking it up for the benefit of a few well-connected organizations that you have relationships with. Maybe you’ll notice another historical pattern here. Extract value from a population that can’t meaningfully consent, concentrate the returns within a small inner circle, and then offer some version of charity to the people you extracted from as moral cover for the arrangement.”
- [Andy Matuschak has the Practice Guide for Computer printed out](https://x.com/andy_matuschak/status/2043066611905761588?s=46&ct=rw-null) and hanging above his desk.
- Apparently I’m the last person to learn about this idea, but who cares, it’s great and I think I want to try this: [The Spark File](https://medium.com/the-writers-room/the-spark-file-8d6e7df7ae58).
- Sometimes I read things online and it makes me really happy that we have the Internet and that smart, beautiful minds share their thoughts online. Here’s James Somers with his idea of [the Paper Computer](https://jsomers.net/blog/the-paper-computer): “Now that we have actually good AI, I have this vision of a form of computing that doesn’t involve me using a computer so much. Imagine you had the day’s emails to go through. It would be nice if the ones that required a simple decision could be dispatched with a few pen-strokes: I could write down a date that would work for that meeting; check a box to accept that invitation; etc. If an email required me to review a draft, I’d love to mark up a print version on my couch, sans screen, and have those notes scanned and sent off as if I’d done the whole thing on Google Docs.”
- Tim Zaman, who worked at NVIDIA, Tesla, X, Google DeepMind and now at OpenAI on AI infrastructure on [Getting Into AI Infra](https://timzaman.com/getting-into-ai-infra). I’m *convinced* that posts like these create and change entire lifes. I love it. Also: nearly made me want to build a cluster.
- It’s been a while since I’ve thought about people who have *not* yet walked through the one-way door that makes you say “holy shit, AI is going to change everything”, but Armin shared his thoughts after encountering people still being skeptical: [The Center Has a Bias](https://lucumr.pocoo.org/2026/4/11/the-center-has-a-bias/). Well worth reading.
- Dwarkesh Patel shared what [he learned this week](https://www.dwarkesh.com/p/what-i-learned-april-15) and note how interesting that is and how enjoyable it is to read, even though (or is it because of?) it’s not polished at all.
- Drew Breunig, following the Anthropic Mythos frenzy and some companies closing their open-source projects down for fear of security vulnerabilities being discovered, says [Cybersecurity Looks Like Proof of Work Now](https://www.dbreunig.com/2026/04/14/cybersecurity-is-proof-of-work-now.html): “If Mythos continues to find exploits so long as you keep throwing money at it, security is reduced to a brutally simple equation: to harden a system you need to spend more tokens discovering exploits than attackers will spend exploiting them.”
- But antirez disagrees: [AI cybersecurity is not proof of work](https://antirez.com/news/163). Both posts are very interesting and I recommend reading through them.
- I’m in [the process of setting up my 2013 MacBook Pro for my 4-year-old daughter](https://x.com/thorstenball/status/2045412037157675296) and [Peter recommended](https://x.com/PeterJThomson/status/2045488461810209196) this lovely page to let her type on: [tiny-terminal.com](https://tiny-terminal.com/).
- So, of course, I had to [fork it](https://github.com/meimakes/tiny-terminal), bought a domain, and let Amp translate it to German so my kids can type words they already know in there: [kleines-terminal.de](https://kleines-terminal.de/).
- Turing Award winner [Michael Rabin](https://en.wikipedia.org/wiki/Michael_O._Rabin) has passed away. Here’s “an assorted collection of quotations due to Professor Michael Rabin, produced at Harvard University during the Fall 1997 incarnation of the course Computer Science 226r”: [Rabinism Collection](https://web.archive.org/web/20210509160248/http://www.eecs.harvard.edu/~cat/rabinisms.html).
- [Thoughts and Feelings around Claude Design](https://samhenri.gold/blog/20260418-claude-design/).
- Another way to think about the question of whether AI will create more jobs or not, [by Aaron Levie](https://x.com/levie/status/2044621545348481285): “Why will AI create more jobs in plenty of industries? It’s because we’re going to use AI to accelerate output in one area, and then eventually you run into a new bottleneck somewhere else in the process that still requires humans.” This sounds very likely to me. But, of course, “more jobs” doesn’t mean it’ll be the same jobs and then some. Everything’s changing.
- Related, [Gary Bernhardt](https://x.com/garybernhardt/status/2045396869074088291): “This might be a Mel moment. It’s not immediately obvious that [Mel is a tragic story](http://www.catb.org/jargon/html/story-of-mel.html). He clearly loved the work. Then the work changed and, presumably, he was left behind. The thing he perfected no longer mattered. There might be millions of Mels right now.”
- Wow, look at just the table of contents here: “I have for years been interested in sleep research due to my professional involvement in memory and learning. [This article attempts to produce a synthesis of what is known about sleep](https://super-memory.com/articles/sleep.htm) with a view to practical applications, esp. in people who need top-quality sleep for their learning or creative achievements.”

---

---

# Joy & Curiosity #81

*Interesting & joyful things from the previous week*

By Thorsten Ball • April 12, 2026

---

Know what agents are really bad at? Writing confident code. Code that says: *this* is how *this* works, boom, fist on the table. And *this* is true and *this* is false, forever and always. And *if* both have changed, it means we’ve been moved to a different universe. This thing can never be null, and this can never be nil, and if this isn’t wired up to that, then down is up anyway and we can pack up and go home. 

Instead they’re prone to write code that constantly asks, with the voice of scared mouse: but what if this is null? What if this is missing? What if this is undefined? What if the file was overwritten? What if the database got corrupted, by space rays? What if a client reconnects, after a seven year ping timeout?

And then, the second time you let them loose on the codebase, they see all of those what-ifs and now rightfully conclude that in this codebase anything’s possible really and no one knows anything about how any of this works and their teeny tiny mouse voice gets even smaller and puts yet more questions into places where there should be statements. And then, the third time… Well.

Over the last few weeks, I’ve found again and again that what I once called [paint-by-numbers programming](https://ampcode.com/notes/how-i-use-amp) is still required when you’re building something new, when there’s no statements in the codebase yet, only blank pages and possibilities. You put in the numbers and the lines and then you let the agent put in the colors. You also need to watch the agent to make sure it doesn’t put in new lines and numbers that you don’t agree with. 

But here’s the tricky part: depending on what you’re doing, the lines and numbers might already be there — in the training data, in the framework, in the idea of what you’re building. If you’re building a web application with a popular framework, there’s already quite a few statements in the codebase. *Of course* there’s going to be request object, and *this* is how migrations work, and *this* is what happens on restart, and no, this isn’t possible. 

When you’re building something new, the challenge now is to figure out what’s true about your idea and your codebase and whether the agents know that too. Once they do, you can let them loose again.

---

- This is one of the truest, realest things I’ve read on doing serious software development with AI: [Eight years of wanting, three months of building with AI.](https://lalitm.com/post/building-syntaqlite-ai/) There’s a lot in there that made me want to share this with you, but this is the one thing that’s fundamental to it all and that I keep finding over and over: “The takeaway for me is simple: AI is an incredible force multiplier for implementation, but it’s a dangerous substitute for design. It’s brilliant at giving you the right answer to a specific technical question, but it has no sense of history, taste, or how a human will actually feel using your API. If you rely on it for the ‘soul; of your software, you’ll just end up hitting a wall faster than you ever have before.”
- Thomas Ptacek says [Vulnerability Research Is Cooked](https://sockpuppet.org/blog/2026/03/30/vulnerability-research-is-cooked/). This was published *before* the whole Anthropic Mythos thing: “Now consider the poor open source developers who, for the last 18 months, have complained about a torrent of slop vulnerability reports. I’d had mixed sympathies, but the complaints were at least empirically correct. That could change real fast. The new models find real stuff. Forget the slop; will projects be able to keep up with a steady feed of verified, reproducible, reliably-exploitable sev:hi vulnerabilities? That’s what’s coming down the pipe. Everything is up in the air. The industry is sold on memory-safe software, but the shift is slow going. We’ve bought time with sandboxing and attack surface restriction. How well will these countermeasures hold up? A 4 layer system of sandboxes, kernels, hypervisors, and IPC schemes are, to an agent, an iterated version of the same problem. Agents will generate full-chain exploits, and they will do so soon.”
- Also, published before Mythos: [Claude Code Found a Linux Vulnerability Hidden for 23 Years](https://mtlynch.io/claude-code-found-linux-vulnerability/).
- But now:[Anthropic Mythos and Project Glasswing](https://www.anthropic.com/glasswing). A *lot* has been said about it, even though no one outside Anthropic’s tried it and (lived to?) told the tale. I’m not going to attempt a summary, but this was a great overview: [Why Anthropic believes its latest model is too dangerous to release](https://www.understandingai.org/p/why-anthropic-believes-its-latest).
- Then you had people either stoking the flames or saying it’s not a big deal. Anthropic’s Jack Lindsey, for example, [shared his scary-sounding impressions](https://x.com/jack_w_lindsey/status/2041588510126395648?s=46): “In one episode, the model needed to edit files it lacked permissions for. After searching for workarounds, it found a way to inject code into a config file that would run with elevated privileges, and designed the exploit to delete itself after running.” Theo also said “[Claude Mythos is the start of the end. I think this is my psychosis moment.](https://x.com/theo/status/2041825324837781749)” Then others said you should go offline, or create data checkouts of everything you have online, because Mythos is coming, and the world’s ending, and so on. But others are skeptical and say this is [not a new capability](https://x.com/kannthu1/status/2042316153440387229). [Dan Shipper says he isn’t scared](https://x.com/danshipper/status/2042297006920523904?s=46) and I found that video to be very good. But if even the Economist asks: [How dangerous is Mythos, Anthropic’s new AI model?](https://www.economist.com/business/2026/04/08/how-dangerous-is-mythos-anthropics-new-ai-model?giftId=YWU5NjVmNDktMDUyYi00Mjg4LWJjNTAtNzk3N2YxMDZkYjlh)And if the model is *so dangerous *that you only give it to some of the world’s richest companies with a minimum spend clause attached, days after you proudly share how much money you’re making from your less-dangerous-but-once-upon-a-time-deemed-also-very-dangerous models, you have to wonder whether it’s the model we’re in awe of here or the marketing campaign. (I’m sure the model is impressive and I’m convinced the models will get really, really good.)
- As you know, I took the whole Easter weekend off. I’m very much not a religious person, but it’s public holidays here in Bavaria, school’s out, and I wanted to be mostly offline and read. So that’s what I did. One thing I read was this [New Yorker article on Mary Magdalene](https://www.newyorker.com/magazine/2006/02/13/the-saintly-sinner) from 2006, because it came recommended in their newsletter. Again: not religious, but that did hit the spot, the spot right between Umberto Eco, Raiders of the Lost Ark, Dan Brown, and all the other stuff I find strangely fascinating. Good read.
- I also finally read [The Inner Game of Tennis](https://www.goodreads.com/book/show/905.The_Inner_Game_of_Tennis) after years of hearing and seeing recommendations and the book being on my to-read list. It was wonderful. What a fantastic little book. Let’s check back in a year, but I think this has permanently changed how I think about learning, about performing, about concentration and attention and focusing. It’s a very gentle book that seems to know exactly what it’s supposed to be. Highly recommend, even if you’ve never held a tennis racket, which I haven’t.
- (Obligatory mention of David Foster Wallace’s [Roger Federer as Religious Experience](https://www.nytimes.com/2006/08/20/sports/playmagazine/20federer.html) when tennis comes up.)
- Okay, I know how this sounds, believe me, I read this paragraph multiple times, but I do think there’s a line you can draw — a very thin, wobbly, hard to see if you don’t squint line — from The Inner Game of Tennis to… “retardmaxxing”, which is, [to let Marc Andreessen explain](https://x.com/a16z/status/2039028447704654220): “There’s this guy on YouTube who has basically a hundred videos on retardmaxxing. He’s like my new life coach. I haven’t met him, but from a distance. It’s basically just—retardmaxx. Go to work, do a good job, come home, it’s fine. Start a company, it succeeds, it fails, it’s fine. Have too much to eat one night at dinner, it’s fine. Go to the gym, don’t count your reps, it’s fine. Ask a girl if she wants to go out with you, if she says no, it’s fine.” That did sound [alluring to me](https://registerspill.thorstenball.com/p/oh-to-turn-off-your-mind), I have to admit. So [I watched the video](https://www.youtube.com/watch?v=rIQ3t1ixUIE) and, sorry, but he’s got a point, doesn’t he, when he asks: “Brian Johnson, who measures his son’s boners, told me not to have caffeine after 1pm. Dude, what are we doing here?”
- Food for thought: [The machines are fine. I’m worried about us.](https://ergosphere.blog/posts/the-machines-are-fine/) Many things in there that make me say mmmh, or tilt my head, or nod.
- “[I sent ChatGPT an audio file of a series of FART sound effects and asked what it thinks of ‘my music’ and this is what it said](https://x.com/Jonas_Ceika/status/2042445078417834043).” Incredible stuff. Finally we have the technology. “It feels more like an atmosphere piece than a traditional song.”
- [Rick Rubin interviewed Adam Neumann](https://www.youtube.com/watch?v=RAHsF4A8GLM) and I couldn’t stop listening. I listened to the whole three hours. I don’t know anything about Neumann really, nor about WeWork. I’ve been in a few WeWorks, thought they were nice. Never dug deeper into it, never watched the tv show, went in expecting nothing and ended up thinking that this guy is an amazing storyteller. I don’t know whether his stories are true, but it’s a great listen. There’s some very interesting ancedotes about high-growth companies and high-level funding in it, and then there’s Rick Rubin saying “beautiful” with a period at the end at just the right moments.
- [caveman](https://github.com/JuliusBrussee/caveman), a skill that “makes agent talk like caveman — cutting ~75% of output tokens while keeping full technical accuracy.” Because: “why use many token when few do trick.”
- [The Cognitive Dark Forest](https://ryelang.org/blog/posts/cognitive-dark-forest/) claims that “open web with AIs is turning into a dark forest” and now sharing knowledge or code is no longer beneficial. Instead, “hiding is the most rational - the only - strategy of survival.” It’s a very interesting thought experiment. I don’t know whether I agree, but do I have to say that even in the last year, my feelings (that I can’t even articulate yet) on building on public, or sharing things, have changed a lot. At one end of the spectrum there’s the feeling of “eh, this is not worth sharing, it’s just a prompt away” and on the other there’s “if I share this, the result is just a prompt away for everyone.” Sci-fi times in any case.
- This was fascinating: [A Dot a Day Keeps the Clutter Away](https://scottlawsonbc.com/post/dot-system).
- Tim O’Reilly talked to Harper Reed: [“Conviction Collapse” and the End of Software as We Know It](https://www.oreilly.com/radar/conviction-collapse-and-the-end-of-software-as-we-know-it/). A lot of good stuff in there. This, for example: “AI is not just a tool. It is a substrate that we shape. It’s a medium, like clay or marble or bronze for a sculptor, or words for a writer. Everybody had access to the same capabilities of English as Shakespeare, but Shakespeare made something out of them that nobody else did. Creating a software product is increasingly like creating a document or an image or a piece of music. And that means that it can range from something throwaway to an enduring work of art.”
- [How Microsoft Vaporized a Trillion Dollars](https://isolveproblems.substack.com/p/how-microsoft-vaporized-a-trillion). This is a multi-part blog post and I only read the first three parts so far, but that was interesting already.
- [rip-grep.com](https://www.rip-grep.com/) or R.I.P. Grep: “Monitor the situation about what's dead and dying”
- Incredibly fascinating: [Fake Fans](https://www.wordsfromeliza.com/p/fake-fans) by Eliza McLamb, a musician and writer, about the digital marketing agency Chaotic Good that creates artificial fans on social media or in comment sections. That sounds horrible, of course, because “create artificial fans” is just weird way to say “fakes fans”, but when you read the piece, which is very honest and reflective, you start to realize that it maybe isn’t that simple. The bigger shocker: Geese, the band, is mentioned as a customer of Chaotic Good. And McLamb herself recounts how she found the band and fell in love with their music and how, yes, she *loves* the music, but also: they have fake social media fans? And then I realized that I found out about Geese on Twitter, because some young-person-looking account simply posted four album covers with the text “what a run” or something more Gen Z sounding. So I sat down and did a reverse Google image search and found the albums and started listening and recommending and fell in love with the music too. Because of a tweet! That might’ve been fake! Anyway: read the post, then feed it into a model, and ask it what McLuhan would say about it. Fascinating, like I said.
- Hell yes: [How we built a virtual filesystem for our Assistant](https://www.mintlify.com/blog/how-we-built-a-virtual-filesystem-for-our-assistant). Very, very neat. Of course the fact that agents love the CLI and grepping and listing isn’t new and it’s one of the reasons why Amp came out of Sourcegraph and why we had a code search subagent before we had embeddings search, but seeing it implemented like this, completely virtual, is amazing.
- Ryan Holiday: [5 Years of Lessons From Running My Own Bookstore](https://ryanholiday.net/5-years-of-lessons-from-running-my-own-bookstore). I didn’t know that Ryan Holiday had a bookstore. Great post.
- [Waterfall, Agile, AI](https://x.com/mrdoob/status/2040586168132366449). Nailed it.
- The question “if AI is so great, where’s all the amazing software?” has always bugged me a little. That’s not how technological progress works! In 1999 it sure didn’t look like the information superhighway called Internet had changed anything, did it? And now we have freaking cloud kitchens and people making a living by being YouTubers. This post, [Why Isn’t Everything Different Yet?](https://davegriffith.substack.com/p/why-isnt-everything-different-yet), tries to answer that question with a bit more nuance than I just did. Good picture to keep in mind: “When electricity became commercially available, you know what most factories did? They replaced their steam engine with an electric motor. One motor. In the same spot the steam engine was. Driving the same central driveshaft that spun all the same belts and pulleys to all the same machines.”
- [SwiftLM](https://github.com/SharpAI/SwiftLM), a “native MLX Swift LLM inference server for Apple Silicon” that makes use of the [TurboQuant](https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/) compression released by Google recently. The numbers are impressive: “100K context on 24 GB MacBook Pro: […], you can process 100,000 tokens of context on a 24 GB machine — only utilizing 22.3 GB total. (Previously required a 64 GB Mac Studio).” Imagine if all model progress stopped today: how much performance would be squeezed out of them?
- This is great and I’m kinda sad that I only read it now: [The Complicator’s Gloves](https://thedailywtf.com/articles/The_Complicator_0x27_s_Gloves). Sure would’ve loved to link to it in some discussions in the past, eh?
- The post mortem of the axios npm supply chain attack has [this comment here](https://github.com/axios/axios/issues/10636#issuecomment-4182134203) that explains how the attack went down. Nuts: “First thing is typically delivered as part of a social engineering ploy involving a fake Zoom or MS Teams call. There’s A LOT leading up to the call. It’s not urgent, pressing, suspicious at all. It’s not a one-click, get phished. They’ll schedule a call for next week and then reschedule it for the week after. It’s crazy disarming.”
- Apparently, many years ago, Paul Ford, one of my favorite writers, wrote about media appearances — podcasts, TV, radio (yes, as I said: many years ago) — and it’s great: [Be Our Guest!](https://web.archive.org/web/20190216152202/https://postlight.com/trackchanges/be-our-guest)
- Someone who knows the industry in which the “first vibe-coded billion dollar company” was created [shared some insights](https://x.com/brian_blum1/status/2039750849669280214). Not a big surprise: it’s not about the software. It’s about the market, the product, the customers, marketing. (Reading through that whole thread is a very interesting peek in a very different world than the one I usually live in. Recommended.) But maybe it’s also about doing shady things, [as the editor’s note in the New York Times sounds like.](https://www.nytimes.com/2026/04/02/technology/ai-billion-dollar-company-medvi.html)
- Didn’t know that’s a thing (potential?) investors do: [Save Snap Now](https://www.savesnapnow.com/).
- Aphyr on AI, the future, and well, everything: [The Future of Everything is Lies, I Guess](https://aphyr.com/posts/411-the-future-of-everything-is-lies-i-guess). Very pessimistic and dark and maybe even cynical, but (or maybe because of that:) interesting. Especially this bit here, very realistic: “I don’t think people are well-equipped to reason about this kind of jagged ‘cognition’. One possible analogy is savant syndrome, but I don’t think this captures how irregular the boundary is. Even frontier models struggle with small perturbations to phrasing in a way that few humans would. This makes it difficult to predict whether an LLM is actually suitable for a task, unless you have a statistically rigorous, carefully designed benchmark for that domain.” Jagged frontier. Or as [Karpathy wrote this week](https://x.com/karpathy/status/2042334451611693415): “peaky” in highly technical areas.
- Very cool:[Understanding Traceroute](https://tech.stonecharioteer.com/posts/2026/traceroute/). I had no clue about the TTL thing.
- Also, very very cool: “[This map shows all buildings in the Netherlands](https://bertspaan.nl/buildings/#7/52.137/5.248), colored by their year of construction. This map is made by Bert Spaan.”
- A 13-year-old blog post by Steven Sinofsky about [Learning from Competition](https://blog.learningbyshipping.com/2013/01/14/learning-from-competition/). It’s great. Here is the pitch: “Studying your competitor, well, gives you a chance to evaluate your choices in an entirely different context. When you make a product choice you are making it in the context of your company, strategy, business model, and people/talents. What if you change some of those? That is what knowing the competition allows you to do, and basically for free (no consultants or top secret research).”
- [How NASA Built Artemis II’s Fault-Tolerant Computer](https://cacm.acm.org/news/how-nasa-built-artemis-iis-fault-tolerant-computer/?__readwiseLocation=): “Effectively, eight CPUs run the flight software in parallel. The engineering philosophy hinges on a ‘fail-silent’ design.”
- [Unfolder for Mac](https://www.unfolder.app/). I have *absolutely no use* for this app but looking at it makes me want to find one. Beautiful.
- Started reading Jonathan Franzen and while spelunking his Wikipedia page, I ended up on this 2012 Guardian article called [Ten rules for writing fiction](https://web.archive.org/web/20131001023035/http://www.theguardian.com/books/2010/feb/20/ten-rules-for-writing-fiction-part-one) in which not only Franzen but many other authors provide their own ten rules. Margaret Atwood’s are good. Franzen’s too. Most fascinating is how different they all are from each other.
- Scott Chacon’s GitButler raised a Series A: [We’ve raised $17M to build what comes after Git](https://blog.gitbutler.com/series-a). Bold.
- How many did you already know? Very good list: [Shell Tricks That Actually Make Life Easier (And Save Your Sanity)](https://blog.hofstede.it/shell-tricks-that-actually-make-life-easier-and-save-your-sanity/)
- [Bill Gurley on SaaS, stock-based compensation, and what’s happening now](https://x.com/bgurley/status/2042993889825501262): “The SaaS universe has been repriced — sharply and broadly — as the market recalibrates what recurring software revenue is worth in a world where AI is compressing development cycles, automating workflows, and threatening to commoditize features that once commanded premium pricing. [...] For employees, this means vesting tranches worth a fraction of what they expected when they accepted their offer letters or negotiated their last refresh. And because they’ve always treated RSUs as cash, they don’t experience this as an investment that didn’t pan out. They experience it as a pay cut.”
- What clouds, man: [Mark Maggiori — Arizona Cannonball](https://markmaggiori.com/products/arizona-cannonball).
- [Stewart Lee on Stewart Lee fans](https://www.youtube.com/watch?v=NtFJ1HT3gto): “The man is a genius. And so am I because I like him.” I’ve watched this six times already. (Because I’m a genius.)

---

---

# Joy & Curiosity #80

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 29, 2026

---

Do you know how it should work? Does the agent? Or does the codebase?

Lately I’ve been thinking a lot about why sometimes using an agent leads to great results and other times it doesn’t. My current theory: it depends on what knowledge about the task at hand is encoded where.

If all the knowledge required to solve the task to your satisfaction is available either in your prompt, or in the codebase, or in the training data of the model, then things go fine.

Things go badly if there’s a gap. That is, if you wrongly assume the agent will know how to do something but it won’t because that knowledge is neither in the codebase nor in the training data.

If I ask the agent to fix a bug that has a very obvious solution, say: a button’s hover state doesn’t activate on hover, then everything you need to know to fix it is available. The problem is in the prompt, the code should explain what the button is, and what a hover state is is in the training data.

But what if there’s a bug and you don’t know even how to explain what the bug is or what the desired state is? Not good.

Or what if you tell the agent to build you a feature and you assume it does so by going over here and adding that and then going over there and adding this, but the codebase allows fifteen other ways, and the training data doesn’t say those fifteen other ways are bad? Not good.

Sometimes the codebase and its documentation contains that information through types or tests or conventions. Other times the training data tells the agent that there’s only one way to add a new endpoint in Rails or Next.js or SvelteKit. But if it’s neither in the codebase nor in the training data, then you have to put it in the prompt.

Theory is too big a word for these thoughts, yes, but I’ve been asking myself “where is the knowledge?” a lot when working with Amp this week and found it useful, so there you go, maybe you get something out of it too.

---

- Last week I asked whether software is turning into a liquid and David Soria Parra, Member of Technical Staff at Anthropic and creator of MCP (meaning: someone who’s seen things up close), [replied](https://x.com/dsp_/status/2036150564753465649): “I think people don’t run the AI maximalist simulation of what this actually means and how far it will go just yet. Most code will just be ephemeral one time use”
- John Regehr: [Zero-Degree-of-Freedom LLM Coding using Executable Oracles.](https://john.regehr.org/writing/zero_dof_programming.html) This is excellent and resonated with my thoughts from above. “When an LLM has the option of doing something poorly, we simply can’t trust it to make the right choices. The solution, then, is clear: we need to take away the freedom to do the job badly. The software tools that can help us accomplish this are executable oracles. The simplest executable oracle is a test case—but test cases, even when there are a lot of them, are weak. […] When I look at the best software testing efforts out there, there’s invariably something creative and interesting hiding inside. I feel like a lot of projects leave easy testing wins sitting on the floor because nobody has carefully thought about what test oracles might be used. Finding executable oracles for LLMs feels the same to me: with a little effort and critical thinking, we can often find a programmatic way to pin down some degree of freedom that would otherwise be available to the LLM to screw up.” I also want to quote that lovely last paragraph, but I won’t, because I want you to read everything else that leads up to it too. This is good stuff.
- And here’s Mary Rose Cook, singing harmonies on top of Regehr’s lines when talking about freedom of expression and constraints for agents: [Code generation that just works](https://maryrosecook.substack.com/p/code-generation-that-just-works).
- Cheng Lou has “[crawled through depths of hell](https://x.com/_chenglou/status/2037713766205608234) to bring you, for the foreseeable years, one of the more important foundational pieces of UI engineering (if not in implementation then certainly at least in concept): Fast, accurate and comprehensive userland text measurement algorithm in pure TypeScript, usable for laying out entire web pages without CSS, bypassing DOM measurements and reflow.” It’s called [Pretext](https://github.com/chenglou/pretext) and it’s impressive. I mean, look at [this demo](https://somnai-dreams.github.io/pretext-demos/the-editorial-engine.html)! Move the orbs around! Or the [ASCII one](https://chenglou.me/pretext/variable-typographic-ascii/) or click [on the logos in this one](https://chenglou.me/pretext/dynamic-layout/). [According to Lou](https://x.com/_chenglou/status/2037715226838343871), this was “achieved through showing Claude Code and Codex the browsers ground truth, and have them measure & iterate against those at every significant container width, running over weeks.” And yet the README doesn’t mention that at all. That tells me we’re past a big milestone.
- If you’re on desktop, see also[this dragon that’s built with Pretext](https://illustrated-manuscript.vercel.app/).
- Marc Brooker is asking: [What about juniors?](https://brooker.co.za/blog/2026/03/25/ic-junior.html) This is one of the most inspiring and motivating pieces of writing I’ve read in the past few months. I love the Wellington quote on engineering: “to define it rudely but not inaptly, it is the art of doing that well with one dollar, which any bungler can do with two after a fashion.” And I love Marc’s very own definition: “I believe that this is the core work of engineering: deeply understanding the problem to be solved, the constraints, the tools available, and the environment in which it operates, and coming up with an optimal solution. This requires real creativity, because the constraints are typically over constrained, and real empathy because many of the constraints come directly from human irrationality. It also requires a deep understanding of the tools available, and what those tools can and can’t do.” I also think his answer to the question is interesting and the question itself is very important. (I said similar things on last year’s [You’ve Been A Bad Agent](https://podcasts.apple.com/us/podcast/building-software-with-thorsten-ball-decoupling-code/id1814432310?i=1000726795825) episode.)
- [Marc’s previous post](https://brooker.co.za/blog/2026/03/20/ic-leadership.html) is also great: “Over the next couple of years, the most valuable people to have on a software team are going to be experienced folks who’re actively working to keep their heuristics fresh. Who can combine curiosity with experience. Among the least valuable people to have on a software team are experienced folks who aren’t willing to change their thinking. Beyond that, it’s hard to see.”
- If you read both of Marc’s posts, you’ll enjoy Pieter Hintjens’ [A Tale of Two Bridges](http://hintjens.com/blog:16?). Engineering is the art of making the tradeoffs, not building the perfect thing.
- Michael Nielsen: [Which Future?](https://michaelnotebook.com/whichfuture/) I’m very glad I read this. Bikini Atoll and fire safety will stay with me.
- Sad news: [Tracy Kidder, author of The Soul of a New Machine, has died.](https://www.nytimes.com/2026/03/25/books/tracy-kidder-dead.html) I highly recommend reading this book. I last did so [in March of last year.](https://registerspill.thorstenball.com/p/joy-and-curiosity-30) And here I am again, telling you: read it, it’s fantastic. And then read[Bryan Cantrill’s reflections on it](https://bcantrill.dtrace.org/2019/02/10/reflecting-on-the-soul-of-a-new-machine/).
- [Rands has been bitten by the agent bug](https://randsinrepose.com/archives/better-faster-and-even-more): “I’ve never built more interesting, random, and useless scripts, tools, and services than I have in the last six months. The cost to go from ‘Random Thought’ to ‘Working Something’ has never been lower”
- Linear: [Issue tracking is dead](https://linear.app/next). Look up to the sky, there’s me, in a tiny plane that’s pulling a banner saying in big red letters: told you.
- This is very, *very* on the nose and I wouldn’t sign it without making some big changes, *but *there is something here that I’ve felt before, maybe not to this extent, maybe not in this exact shape, but something here resonates and makes parts of it feel true: “[‘Collaboration’ is bullshit.](https://www.joanwestenberg.com/collaboration-is-bullshit/)” I don’t think Big Tech the Boogeyman is to blame (my 8-year-old had to do her first group project in school a few weeks ago — creating a stop-motion movie — and nearly lost her mind), but this this much, I think, is true: “most complex, high-quality work is done by individuals or very small groups operating with clear authority and sharp accountability, then rationalized into the language of teamwork afterward. Dostoevsky wrote _The Brothers Karamazov_ alone. The Apollo Guidance Computer came from a team at MIT small enough to have real ownership […] Communication matters, and shared context matters. But there’s a huge difference between communication and collaboration as infrastructure to support individual, high-agency ownership, and communication and collaboration as the primary activity of an organisation.”
- Eoghan McCabe, CEO of Intercom, is saying the “[age of vertical models is here](https://x.com/eoghan/status/2037197696075981124).” I’m skeptical, because it all hinges on this idea of verticals and domain knowledge and I don’t know if that won’t be washed away by bigger models, but it is interesting: “the labs are in an interesting position where on one hand the horizontal, general purpose models are actually over-serving the market for specific use cases. E.g. their models are more generally intelligent than is needed for customer service. And on the other hand, the open-weight models are more than good enough where high quality domain specific post-training can make the resulting models superior at the special purpose jobs, and in the ways that matter to that particular job. E.g. in service, the soft factors really matter, like judgement, pleasantness, attentiveness (as well as the hard factors mentioned prior, like the ability to effectively resolve problems, quickly and cheaply).”
- [meow.camera](https://meow.camera/)
- Google published [TurboQuant](https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/), a “set of advanced theoretically grounded quantization algorithms that enable massive compression for large language models and vector search engines.” I won’t claim here to understand all of it, but I do think I understand the bit about how “PolarQuant converts the vector into polar coordinates using a Cartesian coordinate system” and that’s very cool. Also goes to show that if AI progress wasn’tt a race towards AGI and they’d all stop building bigger and bigger models, there’d be so many optimizations to make.
- [Systems Thinking is Brain Rot for Analysts](https://blundercheck.timberschroff.com/p/systems-thinking-is-brain-rot-for). Refreshing.
- [This is the Gruber I love](https://daringfireball.net/2026/03/your_frustration_is_the_product): “And the fucking autoplay videos, jesus. You read two paragraphs and there’s a box that interrupts you. You read another two paragraphs and there’s another interruption. All the way until the end of the article. We’re visiting their website to read a fucking article. If we wanted to watch videos, we’d be on YouTube. It’s like going to a restaurant, ordering a cheeseburger, and they send a marching band to your table to play trumpets right in your ear and squirt you with a water pistol while trying to sell you towels.”
- And this is the Internet I love: [25 Years of Eggs](https://www.john-rush.com/posts/eggs-25-years-20260219.html). “Everyone needs a rewarding hobby. I’ve been scanning all of my receipts since 2001. I never typed in a single price - just kept the images. I figured someday the technology to read them would catch up, and the data would be interesting. This year I tested it. Two AI coding agents, 11,345 receipts. I started with eggs.”
- [Cursor’s crossroads](https://fortune.com/2026/03/21/cursor-ceo-michael-truell-ai-coding-claude-anthropic-venture-capital/): “It’s a story distinctly of the AI era: Cursor is four years old but already has an innovator’s dilemma, arguably outgunned by newer products in the market it popularized. Every AI startup fears OpenAI or Anthropic releasing a product directly in competition with theirs. It’s the nightmare scenario, and Cursor is living it, more quickly than Truell and his team ever expected. […] As Truell and I get ready to end our Zoom call, I notice the picture of Caro again. I think about how it took Caro six months to edit a single chapter of The Power Broker. Truell has less time than that before the next change.”
- Great brain massage: [Let’s see Paul Allen’s SIMD CSV parser](https://chunkofcoal.com/posts/simd-csv/).
- Okay, now before you click the next link and close the tab right away, let me tell you: yes, I thought so too. I also thought that it’s not for me, doesn’t contain anything I didn’t know, that it’s boring old stuff, but it’s not! There’s some real whoa-moments in there: [Google Has a Secret Reference Desk. Here’s How to Use It.](https://cardcatalogforlife.substack.com/p/google-has-a-secret-reference-desk) The title is weird though, yes, but, hot damn, the `intitle: “index of” /pdf `thing alone is worth it.
- Satisfyingly meta: [Joel Meyerowitz on Photographing Giorgio Morandi’s Studio.](https://hyperallergic.com/joel-meyerowitz-on-photograpghing-giorgio-morandis-studio)
- Stripe launched [projects.dev](https://projects.dev/) which “lets you or your agents provision multiple services, generate and store credentials, and manage usage and billing from the CLI.” Makes total sense when you want to increase the GDP of the Internet.
- Finally! Edward, Nick, Rasmus, and Julia shared the “first iteration of the Playbit runtime, our vision for building playful personal-scale software”: [playbit.app](https://playbit.app/).
- [Dappled light](https://farayan.me/dappled): “Growing up, I loved this mix of shade and sun I called ‘shun.’ Sunlight slipped through the leaves, and its tiny gaps turned into pinholes that project little dancing suns. It felt like magic.”
- [McCartney’s creativity in 3 photographs.](https://austinkleon.substack.com/p/mccartneys-creativity-in-3-photographs)

---

*Note from the producer: no newsletter next week. One weekend of vacation.*

---

---

# Joy & Curiosity #79

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 22, 2026

---

Is software turning into a liquid?

It never was a solid, true. Pure thought stuff, as Fred Brooks wrote. But even that pure thought stuff felt more tangible than what software is turning into, did it not? Software had corners and edges: releases and version numbers. *This *is a piece of software, it’s done, one could say. A long time ago, software even came in boxes. Sometimes it had a printed manual. 

Now ChatGPT writes tens or hundreds of lines of Python to resize images, create a PDF, or extract data from a CSV — and then throws it away, without anyone even having seen the code. An agent like OpenClaw will create a little script to check whether I turned off all the lights in the house. Nothing to throw away, because it was never stored in a file.

There is now so much code out there, appearing and disappearing as needed, that putting version numbers on it seems as futile as naming waves in the ocean. 

Is this what most software is going to be? Nameless, shapeless? Created just in time?

A good friend of mine works at a company that shoots into and operates things in space. This week he told me that they’re required to record how much torque they use to tighten bolts and screws. There are torque-recording wrenches you can buy, but they cost $25k a pop. Maybe it was $15k, not sure, but it was an outrageous number. So outrageous that someone on his team thought “nuh-uh” and went out and bought Bluetooth-enabled torque wrenches for $1k — far cheaper in this comparison. Then that teammate, who’s not a programmer, used an agent to vibe-code a piece of software to talk to the torque wrenches via Bluetooth and record the data in the spreadsheet he uses. He tested it a few times to make sure it worked as it should and then, well, went to work. Tens of thousands of dollars saved.

Now that was a *piece of software*, right? One could even put a name on it: TorqueThis v0.0.1, or something. But I said to my friend, one could also imagine that in the future, say in a year, even that won’t be a *piece* anymore. Doesn’t it seem possible that in a year you can say to your agent: hey, I’m holding this Bluetooth-enabled torque wrench in my hand, I have this spreadsheet open, write some code that records the torque whenever I say “now” and adds it as a new row in column D of that spreadsheet.

And code will appear, do its things while you do your thing, and then it’ll disappear. Drip drip drip, it goes into every nook and cranny and then, job done, it evaporates.

---

- Are you going to be in Boston in July? Let’s meet at Laracon. [I’ll be speaking there](https://x.com/LaraconUS/status/2033931090050916400).
- [Adapting to AI: Reflections on Productivity](https://blog.colinbreck.com/adapting-to-ai-reflections-on-productivity/). One of the calmest, most balanced, and most pragmatic pieces of writing I’ve seen on this topic. It has more questions than answers, but that feels apt for what we’re going through. I’m skeptical of any opinion about programming these days if it’s made up of more exclamation marks than question marks.
- I’d never read anything by C.S. Lewis, but whenever I came across his name I felt like I should have. This week, I finally righted what had long felt like a wrong and read [The Inner Ring](https://www.lesswrong.com/posts/Y8rEA4e4DxafmeAbW/the-inner-ring-by-c-s-lewis). And now I want more: “The quest of the Inner Ring will break your hearts unless you break it. But if you break it, a surprising result will follow. If in your working hours you make the work your end, you will presently find yourself all unawares inside the only circle in your profession that really matters. You will be one of the sound craftsmen, and other sound craftsmen will know it. This group of craftsmen will by no means coincide with the Inner Ring or the Important People or the People in the Know. It will not shape that professional policy or work up that professional influence which fights for the profession as a whole against the public: nor will it lead to those periodic scandals and crises which the Inner Ring produces. But it will do those things which that profession exists to do and will in the long run be responsible for all the respect which that profession in fact enjoys and which the speeches and advertisements cannot maintain.”
- To the sound of “Is this the real life? Is this just fantasy?” from Queen’s Bohemian Rhapsody: “European Commission […] announced the creation of a ‘28th regime’ […] [The  Proposal for an EU Inc. corporate legal framework](https://commission.europa.eu/topics/business-and-industry/doing-business-eu/company-law-and-corporate-governance/eu-inc-new-harmonised-corporate-legal-regime_en)  provides faster (within 48 hours), cheaper (maximum EUR 100) and fully digital company registration, simplified procedures throughout the company life cycle, easier digital share transfers and capital operations, support for modern financing instruments, and the possibility for Member States to allow access to public equity markets. It also introduces fully digital insolvency procedures and automatic transmission of company data to relevant authorities in line with the “once-only principle,” while including safeguards against fraud and abuse.” If this truly, actually, for real happens then something that has died in me through the process of running a company here in Germany will maybe be reborn again.
- [The always wonderful Craig Mod](https://craigmod.com/roden/112/): “The point of bloviating like this: We watch the LLMs perform these acts — acts that, even five years ago, would have seemed like pure science fiction — and we wrongly (I believe) extrapolate out a kind of intelligence that would be able to make sound decisions on a larger, world-based scale. Which is to say: LLMs’ operating resolution is severely hamstrung. Whereas we, humans — messy, disgusting, goopy, flawed, miraculous humans — are operating at a freakishly high resolution, to which we have a preternatural ability to access subconsciously, and through which we use language to represent — in broad strokes — notions that operate in this higher register.”
- This was a delicious mind-bender:[CEOs Don’t Steer](https://www.ribbonfarm.com/2017/11/09/ceos-dont-steer/). It only made my fascination with businesses greater.
- [The Guardian profiled Stewart Brand](https://www.theguardian.com/technology/2026/feb/25/tech-legend-stewart-brand-on-musk-bezos-and-his-extraordinary-life-we-dont-need-to-passively-accept-our-fate) and I thought it was lovely. I’ve never before looked through the notion of Maintenance as a lense like this.
- [Agent-Native Engineering](https://www.generalintelligencecompany.com/writing/agent-native-engineering) by the [The General Intelligence Company Of New York](https://www.generalintelligencecompany.com/about). There’s a bunch of interesting stuff in there (although I bet it’s not as applicable as it sounds) but this one here stood out: “Speaking of idea generation, that’s the new problem. Before 2026 engineers had to spend time using their high level of intelligence solving relatively narrow well defined problems. Now, most of those problems are simple or manageable by background agents. Your engineers’ new job is to find more problems to solve. That’s why many are saying its the golden age of the idea guy - it is. If you can narrowly scope a problem then hand it off to an engineer, you might as well just hand it off to a background agent.”
- [Ghostling](https://github.com/ghostty-org/ghostling): “A minimum viable terminal emulator built on top of the libghostty C API.” Mitchell [added](https://x.com/mitchellh/status/2035114092151902357): “From empty repo to a functional minimal standalone terminal based on libghostty in 2 hours, presenting Ghostling! ~600 lines of C and you get extremely accurate, performant, and proven terminal emulation.” And someone asked: “Did you use AI? I’m wondering because you pushed this out pretty quickly and there is a large volume of comments... but the code is neat and readable” And [he said](https://x.com/mitchellh/status/2035116671908946215): “I didn’t write a single line of code. I reviewed it all though and consistently nudged the AI in the right direction. Heavy commenting is my personal style, and its especially good for a demo like this.”
- This is pretty neat: Obsidian Web Clipper now comes with [a “reader mode”](https://x.com/kepano/status/2034374124269940898) (I don’t know if that’s the official name) that produces pretty good results and is incredibly fast. Lot of fun to press Opt-Shift-R and see what it does.
- Now, this, this was interesting: [We Have Learned Nothing](https://colossus.com/article/we-have-learned-nothing-startup-pundits/?utm_source=newsletter). I mean, they had me at Thomas Kuhn and Paul Feyerabend (although it felt like they *really* wanted to throw those names in there even if they didn’t have to), but the Red Queen was the interesting bit: “In 1973, the evolutionary biologist Leigh Van Valen proposed what he called the Red Queen hypothesis: in any ecosystem, when one species evolves an advantage at the expense of another, the disadvantaged species will evolve to offset that improvement. […] Similarly, when new startup methods are quickly adopted by everyone, no one gains a relative advantage, and success rates stay flat. To win, startups must develop novel, differentiating strategies and build sustainable barriers to imitation before competitors can catch up.”
- I consider myself a pretty advanced User of Computers. An experienced Surfer of the Web, so to say. Someone who never, even back in 2000, fell prey to the flashy, blinking, red Download button that would appear on websites to trick you when you were trying to download something real. Pour two drinks into me and I’ll even insist that I never, not once, not a single time in my life, clicked on something I didn’t mean to click on. If I clicked, I meant to click. And I never clicked on a fake link, yes sir. I’m that good with the cursor. But, fucking hell, I think I would’ve [fallen for this phishing attack.](https://ma.tt/2026/03/gone-almost-phishin/)
- [The 49MB Web Page](https://thatshubham.com/blog/news-audit). I don’t get people who truly enjoy horror movies. Like, you get a kick out of being scared, of … feeling bad? And yet here I am, reading about 49MB web pages, shivering, shaking my head.
- Matteo Collina wrote about [why Node.js needs a virtual file system](https://blog.platformatic.dev/why-nodejs-needs-a-virtual-file-system) and the two paragraphs that made everyone share this: “What began as a holiday experiment became PR #61478: a node:vfs module for Node.js, with almost 14,000 lines of code across 66 files. Let me be honest: a PR that size would normally take months of full-time work. This one happened because I built it with Claude Code. I pointed the AI at the tedious parts, the stuff that makes a 14k-line PR possible but no human wants to hand-write: implementing every fs method variant (sync, callback, promises), wiring up test coverage, and generating docs. I focused on the architecture, the API design, and reviewing every line. Without AI, this would not have been a holiday side project. It just wouldn’t have happened.”
- [The Robotic Tortoise & the Robotic Hare](https://tomtunguz.com/local-vs-cloud-speed/). It’s a race between Opus 4.6 and Qwen 35B, the latter running locally and with less, say, smarts. But Qwen won. Because: “With 3x faster responses, I could add an extra cycle : ‘critique the plan and address the critiques.’ In the time the hare was still thinking, the tortoise ran another lap.” Very interesting! I’m torn on this. At some point last year I was also a believer in “if you have a dumb but fast model, it can outrun the smart but slow model” but then, in practice, it turns out that on average the smart but slow model is actually fast, because — on average — it gets to the *right results* faster. Maybe that’s changing? Maybe the floor has been raised too and “dumb” models are smart enough now?
- “[A skill file based](https://emilkowal.ski/skill) on the articles written on my personal site. Designed for designers and engineers to help them build better user interfaces.” What a time to be alive! A file as a distillation of one’s own preferences and taste and judgement and experiences, fed to a neural network trained to help you get your work done.
- macOS has `/usr/bin/time` which takes an `-l` argument and [can show memory & resource usage of whatever command you’re passing](https://x.com/cooperx86/status/2035405411495383442?s=20).
- apenwarr: [Every layer of review makes you 10x slower](https://apenwarr.ca/log/20260316). In some sense, I get it. Yes. Reviews can be the bottleneck. But then: are reviews the same thing they were three years ago? Does a review take the same amount of time, no: *should* it take the same amount of time as in 2023, even if you can now spin up five parallel models to help you review? (And this one I’m consciously putting in parentheses so you can imagine I whisper this into your ear: I also don’t think that in the near future the code generated by models will need close-up reviews.)
- Can’t say I’ve ever been really interested in Banksy, but this was great: [In Search of Banksy](https://www.reuters.com/investigates/special-report/global-art-banksy).
- [A sufficiently detailed spec is code](https://haskellforall.com/2026/03/a-sufficiently-detailed-spec-is-code). I’m not sure what to think here. On one hand: yes, true, if you want to specify everything a piece of software is supposed to do, you might as well write the code. On the other: it also feels like you *can* specify what software is supposed to do without being 100% precise and, as long as the person (thing) implementing it and you have some shared understanding about what’s left out of the spec, things will be fine. Question is how much shared understanding there is and I think that’s where a lot of people have the wrong estimates.
- [tigerfs](https://tigerfs.io/) looks very, very interesting: “A filesystem backed by PostgreSQL, and a filesystem interface to PostgreSQL. TigerFS mounts a database as a directory. Every file is a real row. Writes are transactions. Multiple agents and humans can read and write concurrently with full ACID guarantees, locally or across machines. Any tool that works with files works out of the box.” I’ve been hacking on an agent that isn’t really stateless but also doesn’t need a full VM. A filesystem backed by PostgreSQL seems like it sits right in the middle and could be very handy.
- Armin: “There’s a feeling that all the things that create friction in your life should be automated away. That human involvement should be replaced by AI-based decision-making. Because it is the friction of the process that is the problem. When in fact many times [the friction, or that things just take time, is precisely the point](https://lucumr.pocoo.org/2026/3/20/some-things-just-take-time/).”
- Pre-ordered this within ten seconds of clicking the link: “[Silicon](https://arenamag.com/silicon) is the element that built modernity. Silicon is a beautiful book about the world of transistors, chips, and the greatest technology revolution of all time.” Of course, right after I caught myself: wait, did you just pre-order an expensive book about… silicon? Yes, I did. Let’s see how it goes.
- Talking about Silicon: [there’s a new Dwarkesh episode with Dylan Patel out](https://www.dwarkesh.com/p/dylan-patel). I love it. Listening to this made me think: is this how people how are into sports feel like every weekend?
- Then again, I do know what it’s like to be into sports, don’t I? Yesterday evening I put on [this thriller](https://www.youtube.com/watch?v=vM3QucWQygg) (top comment: “The heavy breathing of two very experienced commentators tells you how special this achievement is!”) and my wife couldn’t make sense of the dichotomy between the quiet click-clacks coming from the TV and me saying “holy shit, holy shit, now he’s going to put the white— wow, incredible.”

---

---

# Joy & Curiosity #78

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 15, 2026

---

Imagine working in the oil industry and someone figures out how to turn rainwater into oil. Some in the industry aren’t impressed: “More oil. Pah. That won’t change much, actually. It’s just more oil. We’ve been dealing with oil for decades. Sure, there’s more, but hey: more work for us. The rest is the same old, same old.”

They’d be right to some extent. It *is* more oil and some things would *not* change. Oil would still be a physical business. You would still need customers and contracts and sales channels and salespeople. You would still need refineries and storage and transport and distribution. You would still need safety and regulation and all of that. 

But, also: everything else would change. Because the oil *industry* isn’t built around oil*. *It’s built around hard-to-find, only-in-some-places, hard-to-extract oil.

The price of crude oil would collapse. Reserves would lose their value. Finding oil fields and drilling for oil would not be a thing anymore. Location wouldn’t matter anymore, since it rains nearly everywhere.

And then come the second-order effects: on energy policy and geopolitics, on plastics and chemicals and fertilizers, on the parts of the industry that only refine and move and sell oil. Oil wouldn’t stop being oil, but the bottleneck would move through the industry and bump into and kick over many things along the way.

You know me. I’m not here to provide indirect political commentary on rising petrol prices. No, I’m talking about software, of course, and I want you to again consider: we now have buttons that we can smash and out come hundreds and thousands of lines of working code, in seconds. 

Those buttons are *not* just another type of developer tool and “we’ve had code generators for decades” is not a valid reply.

Code is no longer hard-to-find, only-in-some-places, hard-to-extract. And yes, I am preaching to a choir here, but it’s Sunday and this is my newsletter and, damn it, I have to say this again, because I keep bumping into engineers who still don’t seem to understand what follows from that.

They’ll say something like: yes, someone *should* rebuild GitHub, because GitHub *is* dead. And I agree, yes, I’ve been saying that. But what they actually mean is: someone should rebuild GitHub as-is, with the same fundamental assumptions, with the same shape of open source as we know it, and built on the idea that code is scarce.

And I want to shake them and go: man, don’t you see? All of it was built on the assumption that code is expensive! And most of it doesn’t make sense anymore when code is cheap. Yes, some things won’t change. The need to do proper engineering won’t go away. But many, many, many things will, because a single constant in a very fundamental equation has been changed.

---

- Craig Mod built “the accounting software I’ve always craved” (called TaxBot2000) and is now [software bonkers](https://craigmod.com/essays/software_bonkers/): “It’s strange times. Anyway, I’m mad for software right now. Bonkers. I can’t stop thinking about things to make, things to make better. And then I go and make them. There’s an energy around all this that is — truly — epochal. If you’re not playing with models like Claude, you should probably take a peek. It’s the time of building.”
- Great page: [background-agents.com](https://background-agents.com/). There’s obviously (no: it’s very obvious) a bias towards the creators of the page there, but leaving that aside: this is where it’s going.
- [This tweet by Mitchell](https://x.com/mitchellh/status/2031776788532379996) might have saved me this week. I read it and while I’m not like the guy in the video, I immediately felt guilty for getting distracted so often. Apparently, I have built up muscle memory to cmd-tab to a different window as soon as I submit a prompt. So, after reading that tweet, I closed the browser window with my private profile, put my phone away, and swore to myself that I’ll now either try to figure out the same thing the agent is trying to figure out or do something else on my own while it’s running. That lead to two incredibly productive days that made me feel great.
- Karpathy released [autoresearch](https://github.com/karpathy/autoresearch), which is a repository, a tiny bit of code, and a Markdown file to instruct a coding agent to act like an LLM researcher: “The idea: give an AI agent a small but real LLM training setup and let it experiment autonomously overnight. It modifies the code, trains for 5 minutes, checks if the result improved, keeps or discards, and repeats. You wake up in the morning to a log of experiments and (hopefully) a better model.” The idea of running an agent in a loop isn’t new, but what I find fascinating: how small this repo is, how small the codebase is, how direct and clear the instructions and the workflow are, and the meta thing of this being exactly what the non-nano researchers at the big labs are doing, at least kind of. Tobi Lütke then used the same loop, through the [pi-autoresearch plugin](https://github.com/davebcn87/pi-autoresearch), but [instead of training a model the agent optimized his templating language](https://github.com/Shopify/liquid/pull/2056). Now the question is: what problems are as verifiable as a training run result or performance? Also, if you read this whole paragraph without thinking of the word “Ralph” that means we live in different bubbles.
- [Six Selfish Reasons to Have Kids](https://kevinkelly.substack.com/p/six-selfish-reasons-to-have-kids), by Kevin Kelly.
- [Florian Brand on LLM benchmarks](https://florianbrand.com/posts/benches-2026): “It is hard to see real-world utility being measured here. […] The other issue is the harness: It includes a set of tools to look at the files, revert to a previous step and edit code, but the model has to return a block of reasoning, followed by the tool call in triple-backtick delimited markdown. This is not how models work these days! […] So, what happens when you fix those mistakes?” I guess we all know by now that the benchmarks that are shared on the day of a model release are just pointers in a general direction, but this was still very, very interesting to read.
- [Why ATMs didn’t kill bank teller jobs, but the iPhone did](https://davidoks.blog/p/why-the-atm-didnt-kill-bank-teller): “The history of technology, even exceptionally powerful general-purpose technology, tells us that as long as you are trying to fit capital into labor-shaped holes you will find yourself confronted by endless frictions: just as with electricity, the productivity inherent in any technology is unleashed only when you figure out how to organize work around it, rather than slotting it into what already exists.” Good piece. The framing of “automating a job is much harder than making it irrelevant” makes a lot of sense to me and seems like a useful lens.
- Amazing: [howisFelix.today?](https://howisfelix.today/) Lots of nice little insights. Don’t miss the conclusion at the end.
- “What’s your favourite disassembler? Mine’s a font.” Yes, that’s one hard line, and yes, you read it right: “This font converts sequences of hexadecimal lowercase characters into disassembled Z80 instructions, by making extensive use of OpenType’s Glyph Substitution Table (GSUB) and Glyph Positioning Table (GPOS).” [Watch the video](https://github.com/nevesnunes/z80-sans).
- [Gruber’s review of the MacBook Neo](https://daringfireball.net/2026/03/the_macbook_neohttps://daringfireball.net/2026/03/the_macbook_neo): “The Neo crystallizes the post-Jony Ive Apple. The MacBook “One” was a design statement, and a much-beloved semi-premium product for a relatively small audience. The Neo is a mass-market device that was conceived of, designed, and engineered to expand the Mac user base to a larger audience. It’s a design statement too, but of a different sort — emphasizing practicality above all else. It’s just a goddamn lovely tool, and fun too. I’ll just say it: I think I’m done with iPads. Why bother when Apple is now making a crackerjack Mac laptop that starts at just $600? May the MacBook Neo live so long that its name becomes inapt.” And that first line is the most Gruber line he’s ever published.
- But [this review of the MacBook Neo](https://x.com/samhenrigold/status/2032080638635880796) I really loved. Not only because of this paragraph: “Downloaded Xcode and dragged buttons and controls around in Interface Builder with no understanding of what I was looking at. I edited SystemVersion.plist to make the ‘About this Mac’ window say it was running Mac OS 69, which is the s*x number, which is very funny. I faked being sick to watch WWDC 2011 — Steve Jobs’ last keynote — and clapped alone in my room when the audience clapped, and rebuilt his slides in Keynote afterward because I wanted to understand how he’d made them feel that way.” But also because of this one: “That is not a bug in how he’s using the computer. That is the entire mechanism by which a kid becomes a developer. Or a designer. Or a filmmaker. Or whatever it is that comes after spending thousands of hours alone in a room with a machine that was never quite right for what you were asking of it.”
- [Apple Does Fusion](https://om.co/2026/03/03/apple-does-fusion/): “This is why I think Fusion Architecture is the real story.

Not because of what M5 Pro and M5 Max can do today. Because of what it opens up. Once you’ve proven you can split the chip and keep unified memory working across the pieces, the question changes. It is no longer ‘how big can we make this chip?’ It is ‘how many pieces can we connect, and in how many dimensions?’”
- [Some Words on WigglyPaint](https://beyondloom.com/blog/onwigglypaint.html). In the Joy column: this looks so lovely! I want to play with WigglyPaint! In the Curiosity column, the ending: “The most wildly successful project I’ve ever released is no longer mine. In all my years of building things and sharing them online, I have never felt so violated.”
- Drew Breunig is asking [why is Claude an Electron app](https://www.dbreunig.com/2026/02/21/why-is-claude-an-electron-app.html). His hypothesis: “For one thing, coding agents are really good at the first 90% of dev. But that last bit – nailing down all the edge cases and continuing support once it meets the real world – remains hard, tedious, and requires plenty of agent hand-holding.” After having worked on Zed and contributed a few things to Ghostty (the first and only two truly native macOS apps I’ve worked on): I think most engineers underestimate how hard it is to build a truly great native application. And the question is: will your users notice, or care? If you’re building the application for a business, will going native make the business more successful? On top of that: once you’ve worked on a native application you realize what an amazing platform the web is and how much developer tooling has been built in the last twenty, thirty years around it.
- And here’s Nikita Prokopov’s answer to Drew’s question: [Claude is an Electron App because we’ve lost native](https://tonsky.me/blog/fall-of-native).
- Helen Min: [Software isn’t dying, but it is becoming more honest](https://www.helenmin.com/blog/software-is-becoming-more-honest). Fascinating stuff. This line here, for example: “I often hear founders and other hyper-rational types ask why we haven’t always billed for outcomes. The answer usually boils down to technical limitations and risk.” That made me wonder: because now you can kiiinda say that tokens are substitute for outcomes? If you spend millions of tokens on something, won’t you get outcomes? It might not be dying, but software is changing, man. And the old software we knew — that’s dead, I’m pretty sure. Dead in the sense that rock & roll is dead.
- I also found [this podcast with Bret Taylor](https://www.youtube.com/watch?v=tJwiP0zqVp4) to have some interesting thoughts on outcome-based billing.
- Yes: “[Willingness to look stupid is a genuine moat in creative work](https://sharif.io/looking-stupid)"
- [The 8 Levels of Agentic Engineering](https://www.bassimeledath.com/blog/levels-of-agentic-engineering). Interesting, but at this point I’m convinced that in a year that ladder will look very funny and outdated. The models will wash away a lot.
- Talking about models washing away stuff, [here’s Simon Willison](https://simonwillison.net/2026/Mar/9/not-so-boring/): “Drop a coding agent into any existing codebase that uses libraries and tools that are too private or too new to feature in the training data and my experience is that it works *just fine*—the agent will consult enough of the existing examples to understand patterns, then iterate and test its own output to fill in the gaps.” Many, many things I believed over the last year have been washed away by these models. If you still think Opus 4.6 is the peak, try deep mode in Amp, which uses GPT-5.3-Codex right now. Stare into its eyes.
- Not a short form video guy, but I am a this-is-funny guy and this is funny: [Taking my mate ChatGPT to lunch](https://x.com/AndyCantwell/status/2031402329295987036). (But, seriously, will AI cliche phrases disappear in the future or always be a thing?)
- Or I guess I should’ve said “trope” instead of “cliche”, because I’m going to ask a model to create a really, really dense version of this and then I’ll put it in my ChatGPT system prompt: [tropes.md](https://tropes.fyi/tropes-md).
- [Temporal: The 9-Year Journey to Fix Time in JavaScript](https://bloomberg.github.io/js-blog/post/temporal/). Years ago, back when we had such things, I was in a quarterly planning meeting. I ran the meeting, in fact. I was the manager, and I asked an engineer on my team to give a rough estimate of how long something would take. “Whew, really hard to say,” he said. “Come on,” I pushed. “We need something here, so—gun to your head—how long?” “Gun to my head?” he said. “I’d take the bullet.” So, anyway, that’s what I think of every time date and time libraries come up. Fix Time in JavaScript? I’d take the bullet.
- I love Google Maps but I don’t really enjoy using it to find places to eat in a city I don’t know. And “don’t really enjoy using” it is putting it mildly. Now Google Maps is[getting Gemini](https://blog.google/products-and-platforms/products/maps/ask-maps-immersive-navigation) and that seems like one of the most interesting “we put an LLM in it” product changes in a while.
- Paula Muldoon is saying [staff engineers need to get hands-on again](https://paulamuldoon.com/2026/03/10/2026-staff-engineers-need-to-get-hands-on-again/): “This definition of staff engineering, particularly the organisational impact, made a lot of sense before 2025. Staff engineers need to stop being hands-on with the code as the majority of their work and spend time teaching others, making strategy etc. […] AI software tools have changed that.” Yes. And now let’s all consider what other roles and processes in the Big Tech Org Chart 2010-2025 don’t make a lot of sense anymore. This isn’t 2018 anymore.
- [Boredom Is the Price We Pay for Meaning](https://www.theatlantic.com/ideas/2026/02/boredom-parenthood-father/686158/?): “If you try to distract yourself from boredom, if you run from it, all will be lost. Brodsky quoted an imperishable line from Robert Frost: ‘The best way out is always through.’ A note written by the novelist David Foster Wallace makes a similar point: ‘Bliss—a second-by-second joy and gratitude at the gift of being alive, conscious—lies on the other side of crushing, crushing boredom.’”

---

---

# Joy & Curiosity #77

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 8, 2026

---

Many, many years ago, before Docker was released, I knew a guy whose team worked a lot with virtual machines.

All day long, he told me, they would configure and test and spin up and down virtual machines. I can’t remember what they used the machines for, but he told me that an actual, real problem his team faced was managing their attention. You change something in the Vagrant configuration, rebuild the machine, wait for five minutes, and then, once the machine is ready, you no longer know what you were trying to test because you switch to a different window and get stuck on Hacker News

So what they did to “fix” this problem, he told me in a tone that said “don’t make fun of me for this, this isn’t funny”, was to watch movies and TV shows on a second monitor. That’s right. His teammates would hit return after typing `vagrant up`, and instead of switching windows, they’d look over to their second monitor to watch a bit of Scrubs. In their peripheral vision they could see when the build was done and go right back to it. A little bit of light TV that’s constantly on is less distracting than switching windows.

Over the years, I’ve thought of this guy and his team many, many times. Every time I have to wait for a build, to be exact.

And now I think of him whenever I kick off agents to go run and do something for me. In the future — and this is one of the few things I’m sure about — a lot of code will be written while nobody is watching. There will be more agents, running longer, running everywhere, kicked off from anywhere. Where will our attention go? And how will we bring it back when we need to? Watching Scrubs is probably not the solution.

---

- [Zen of AI Coding](https://nonstructured.com/zen-of-ai-coding/). I wish I had written that. I nodded to nearly everything there, but to quote just two things, one: “The economics of software have changed.

When coding is cheap, implementation stops being the constraint. You can build ten things in parallel. You cannot decide, validate, and ship ten things in parallel, at least not without changing the rest of the pipeline. Cost of delay shifts. It is no longer about developer days. It is about time stuck in other bottlenecks: product decisions, unclear requirements, security review, user testing, release processes, and operational risk. Agents can flood these queues. Inventory grows. Lead time grows. Delay becomes more expensive, not less.” And two: “It is tricker then ever to resist the temptation to add features. Resist it. Build what is used. Kill what is not.”
- [Yaron Minsky](https://x.com/yminsky/status/2028802238085292083): “I wonder if we’re starting to hit a deflationary era in software engineering. For the first time, we’re starting to talk about this in a planning context; it can make sense to put off some projects because we expect they’ll be easier to achieve in the future than today. […] But the difference is the sense that we can start to count on things getting faster. So if we have to get something done by a fixed deadline, we're starting to think that we can put off some of that work for longer than we would have in the past.”
- Well worth the reminder: [Good software knows when to stop](https://ogirardot.writizzy.com/p/good-software-knows-when-to-stop). More isn’t more. In fact, it’s less today than it was yesterday. And it will be less than that tomorrow.
- Naval recorded a new podcast episode: [A Motorcycle for the Mind](https://x.com/naval/status/2024700227111047581). I’m usually skeptical of his confidence, but he does have a fascinating clarity of thought and eloquence and I enjoyed listening to this one. Noteworthy what he thinks about the role of software engineers in the future: “Does this mean that traditional software engineering is dead? Absolutely not. Software engineers—even the ones who are not necessarily tuning or training AI models—these are now among the most leveraged people on earth. [...] But software engineers still have two massive advantages on you. First, they think in code, so they actually know what’s going on underneath. And all abstractions are leaky. [...] So if you want to build a well-architected application, if you want to be able to even specify a well-architected application, if you want to be able to make it run at high performance, if you want it to do its best, if you want to catch the bugs early, then you’re going to want to have a software engineering background.” Or this, about the flood of software that’s coming: “And remember: there is no demand for average. The average app—nobody wants it, at least as long as it’s not filling some niche that is filled by a superior app. The app that is better will win essentially a hundred percent of the market. [...] But generally speaking, people only want the best of anything. So the bad news is there’s no point in being number two or number three—like in the famous Glengarry Glen Ross scene where Alec Baldwin says, ‘First place gets a Cadillac Eldorado, second place gets a set of steak knives, and third place you’re fired.’ That’s absolutely true in these winner-take-all markets. That’s the bad news: You have to be the best at something if you want to win.” But is that true? Look around at some of the most widely used pieces of software: Microsoft 365, Android, WhatsApp, Chrome, Outlook, Jira — is it “the best”? Jira is the best at *something*, yes. For example: getting people to say “you just haven’t configured it correctly.” But is it the best software in its category, or is it instead the best at “being sold to large enterprises”?
- Or take the most popular CI system in the world: [GitHub Actions Is Slowly Killing Your Engineering Team](https://www.iankduncan.com/engineering/2026-02-05-github-actions-killing-your-team/).
- [Marc Andreessen agrees with Naval](https://www.lennysnewsletter.com/p/marc-andreessen-the-real-ai-boom): “If the goal is to be a mediocre coder, then just let the AI do it. It’s fine. The AI is going to be perfectly good in generating infinite amounts of mediocre code. No problem. It’s all good. If the goal is, ‘I want to be one of the best software people in the world, and I want to build new software products and technologies that really matter,’ then yeah, you, 100%, want to still... You want to go all the way down. You want your skillset to go all the way down to the assembly, to assembly and machine code. You want to understand every layer of the stack. You want to deeply understand what’s happening at the level of the chip, and the network, and so forth. By the way, you also really deeply want to understand how the AI itself works, because you want to... If people understand how the AI works, they’re clearly able to get more value out of it than somebody who doesn’t understand how it works. You’re always more productive if you know how the machine works when you use the machine.

And so the super-empowered individual on the other end of this that wants to do great things with the new technology, yes, you 100% want to understand this thing all the way down the stack because you want to be able to understand what it’s giving you.”
- And this take agrees with Andreessen: [“The jobs apocalypse is the Population Bomb of our time.”](https://x.com/Dan_Jeffries1/status/2029835639743533071)
- This is very, very, very, very good: [The Structure of Engineering Revolutions](https://webdirections.org/blog/the-structure-of-engineering-revolutions/). What a useful lens to look through at this moment.
- Since we’re talking about Thomas Kuhn: should I feel bad that I’m linking to nearly every Adam Mastroianni post? Nah, they’re all really good and this one isn’t an exception: [The one science reform we can all agree on, but we’re too cowardly to do.](https://www.experimental-history.com/p/the-one-science-reform-we-can-all)
- And what a moment this is, isn’t it: [Cursor Goes To War For AI Coding Dominance](https://www.forbes.com/sites/annatong/2026/03/05/cursor-goes-to-war-for-ai-coding-dominance). “But if the AI doesn’t need a human collaborator, why bother with the editor? If writing and editing code line by line was no longer central to a programmer’s workflow, Cursor’s central product thesis was suddenly in question. […] Until recently, Cursor seemed nearly unstoppable. The company began 2025 with roughly $100 million in annualized revenue. By November, that figure had surpassed $1 billion. […] For now, Cursor’s continued growth comes with a big dose of anxiety. Inside the startup, revenue tracking became so distracting that the company stopped reporting daily figures in its #numbers Slack channel, according to people familiar with the decision.” Imagine working at the hottest and fastest growing startup of all time and then three or six months later it’s war time.
- New Paul Graham essay that I thought was worth reading: [The Brand Age](https://www.paulgraham.com/brandage.html). When I started reading this, I thought that surely he’s going to say that what he’s recounting here is happening to software: “Now the whole game they’d been trying to win at became irrelevant. Something that had been expensive — knowing the exact time — was now a commodity. Between the early 1970s and the early 1980s, unit sales of Swiss watches fell by almost two thirds. Most Swiss watchmakers became insolvent or close to it and were sold. But not all of them. A handful survived as independent companies. And the way they did it was by transforming themselves from precision instrument makers into luxury brands.” But he never did! I still think it’s about software though.
- You might have heard of this guy: Don Knuth, Stanford Computer Science Department. [He writes](https://www-cs-faculty.stanford.edu/~knuth/papers/claude-cycles.pdf): “Shock! Shock! I learned yesterday that an open problem I’d been working on for several weeks had just been solved by Claude Opus 4.6— Anthropic’s hybrid reasoning model that had been released three weeks earlier! It seems that I’ll have to revise my opinions about ‘generative AI’ one of these days. What a joy it is to learn not only that my conjecture has a nice solution but also to celebrate this dramatic advance inautomatic deduction and creative problem solving. I’ll try to tell the story briefly in this note.” What a joy!
- Ah, now *this*, this is the good stuff: [Rust zero-cost abstractions vs. SIMD](https://turbopuffer.com/blog/zero-cost) on the turbopuffer blog. I think there have been some comments on this not being an inherent limitation of the compiler, but I found it interesting to think about what it can and can’t see when trying to optimize a loop: “Herein lies the hidden opportunity cost of Rust’s zero-cost abstraction in our merge iterator. The iterator itself compiles down to the code you’d write by hand for a single call. In that sense, it is zero-cost.”
- More hardcore engineering, from the COO at Epic Games: “The task: schedule operations for a custom VLIW SIMD architecture running a tree traversal with hashing. 256 items, 16 rounds, 5 execution engines with different slot limits. Starting point: 147,734 cycles (naive). Where Claude Code landed: 1,105 cycles — [a 134x speedup](https://x.com/EpicVogel/status/2029322218505924653).”
- Look, we just bought a new MacBook Air with an M4 and it’s fantastic, so I’m not regretting anything, but those new [MacBook Neos](https://www.apple.com/macbook-neo/) look amazing.
- Raycast [Glaze](https://www.raycast.com/blog/introducing-glaze) looks *really *interesting. I guess I should’ve put “looks” in italics because I’m still on the waitlist.
- [At last, reasons to be cheerful about European tech](https://www.economist.com/business/2026/03/01/at-last-reasons-to-be-cheerful-about-european-tech?giftId=OTJkYTRhZTYtNmQ4Mi00Zjc2LTk3ZjEtMDY2YTJjNzI5YWYx&utm_campaign=gifted_article). That’s not my title. I want to be optimistic, but I’m skeptical. This paragraph resonated: “Mehran Gul, of the World Economic Forum, notes that Skype, a European startup, created just 11 millionaires in the early 2000s. PayPal, an American one, gave many more stock options to its employees, creating over 100. They, in turn, invested in newer Silicon Valley startups.” In Europe, startup options feel like and are perceived as and, I guess, truly are lottery tickets. Go to the Bay Area (which is, yes, an outlier) and suddenly everyone knows at least two or three people who are rich because of startups.
- Eoghan McCabe, CEO of Intercom, [offering “Intercom, the company I run, as a case study](https://x.com/eoghan/status/2028522852044206258?s=46) to help me explain how SaaS companies can be saved, and share the things we did, starting three years ago, to find relevance in this new world.” What a graph! Mind-boggling.
- [“Singaporeans to receive free premium AI subscriptions from second half of 2026”](https://www.straitstimes.com/singapore/politics/singaporeans-to-receive-free-premium-ai-subscriptions-from-second-half-of-2026)
- [Tim Ferriss on The Self-Help Trap](https://tim.blog/2026/03/04/the-self-help-trap/): “Self-help is dangerous precisely because it easily becomes self-fixation. A focus on improving the self usually first requires finding problems with the self. This is quite the pickle. In a society that rewards problem-solving, you can end up hallucinating or exaggerating unease in order to fix it. This leaves you always in the red, always one step behind. Imagine a dog chasing its tail that has committed to being unhappy until it catches the tail… but it’s always just a few inches short. Still, it whirls around and around, ‘doing the work.’ Perfection always recedes by one more book, one more seminar, one more habit tracker. Put in more colorful terms, misdirected self-help turns you into a self-obsessed masturbatory ouroboros (SOMO).” I dare you to click through to the shop where he got the snake sticker — the sticker he put on *the bottom* of the MacBook. Anyway: great post.
- [Google released gws](https://github.com/googleworkspace/cli), the “CLI for all of Google Workspace — built for humans and AI agents.”
- Hannah Ritchie, data scientist at Our World In Data but a lot more than that: [Does that use a lot of energy?](https://hannahritchie.github.io/energy-use-comparisons/) Electric lawnmower vs. air conditioning is good.
- [An Interactive Intro to CRDTs](https://jakelazaroff.com/words/an-interactive-intro-to-crdts/). Lovely. It’s from 2023 and that made me think that today, in 2026, no one would write a blog post like this, because why would you if anyone can press a button to have a custom version of this post generated for them? And that in turn made me wonder: but people *will* write in the future too and once we’ve crossed through the transitional period we’re in, what will those posts look like?
- Since [announcing his project Agentic Engineering Patterns](https://simonwillison.net/2026/Feb/23/agentic-engineering-patterns/) a few weeks ago, Simon Willison has been steadily adding new chapters to it. For example: [Hoard things you know how to do](https://simonwillison.net/guides/agentic-engineering-patterns/hoard-things-you-know-how-to-do/). “The key idea here is that coding agents mean we only ever need to figure out a useful trick once. If that trick is then documented somewhere with a working code example our agents can consult that example and use it to solve any similar shaped project in the future.” Wish I was a hoarder.
- Is this [the first universally beloved AI-generated video](https://x.com/justalexoki/status/2028509501448454322)? I’m of the school that believes creativity is less about creating new things in a vacuum but more about making connections between things that already exist, but weren’t connected before. Creativity, I think, is remixing. Putting lego pieces together in a way no one’s ever put them together. That definition is, of course, recursive, because the lego pieces also have to be put together. But my point is: this video is creative. It’s not slop. And the fact that I’m dying to know what the prompt was — doesn’t that show everything will be different but that all will be well?
- In the past few months I’ve been thinking a lot about different software companies and whether they’ll make it or whether they get eaten by AI instead. “If you own physical assets, if your value is in operations or in regulation or in contracts, then you’re probably safe,” is one thesis I keep coming back to. And, funnily enough, Spotify was one of the companies I marked “safe” in my mind: sure, the software can be replicated more easily now, but they have contracts with publishers and artists — they’re safe. But then here’s Jimmy Iovine saying that the music itself has no value anymore when packaged by streamers and, well, if that’s true, what’s left: [Why Streaming is Minutes Away From Being Obsolete](https://joelgouveia.substack.com/p/the-death-of-spotify-why-streaming).
- Daniel Gross [published his /agitrades in January 2024](https://danielgross.com/agitrades) to wonder: “Suppose the progress doesn’t stop, just like GPT-4 was better than 3, GPT-5 is capable of basic agentic behavior -- i.e. able to accept a task, work on it for a while, and return results. Some modest fraction of Upwork tasks can now be done with a handful of electrons. Suppose everyone has an agent like this they can hire. Suppose everyone has 1,000 agents like this they can hire... What does one do in a world like this?” I hadn’t read the document when it was released, but, wow, it’s good. Impressive first-principles and long-range thinking. And now, more than two years later (two years!), [John Coogan of TBPN revisited the questions](https://x.com/johncoogan/status/2029630380068978847?s=46)to see whether they can be answered already. Equally fascinating.
- To quote one of the top comments: [“Dammit guess I’m drinkin garage beers now”](https://www.youtube.com/watch?v=QKHGmFvzjJ4)

---

---

# Joy & Curiosity #76

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 1, 2026

---

This week I found myself writing code by hand again.

Not a lot, maybe ten, twenty lines in total, which is far less than what I had Amp produce, but still: actual typing out of code. Miracle I didn’t get any blisters.

At our Amp meetup in Singapore I mentioned this on stage and someone in the audience cheekily asked: “You just told us that these agents can now work well when you give them a longer leash and yet you wrote code by hand, how come?”

The answer can probably be boiled down to something that sounds very trite: to build software means to learn.

When you build a new piece of software, you learn what the software is *actually* supposed to do, how it should do it, and why your pre-building ideas now seem naive. (If you’re thinking “well, can’t we figure out all of that before we build” go ahead and type “waterfall software” into Google.)

Right now, at Amp, we’re building something new. We don’t yet know everything about this thing we’re building. We don’t know how it should behave in this case, or in that case, how the runtime behaves here, or over there.

Writing code by hand is one way (!) to answer these questions, because you truly bump into what you don’t know when you have to type something out. You find yourself picking an array and write down that the type for `clients` is `Client[]` and then you wonder: wait a second, do we even need to allow for multiple clients to be connected at the same time? why? when? No, we actually don’t, it should be `client: Client`.

An agent is happy to pick an answer for you — without telling you. It will just write the code.

That might not be a problem. If you’re not building something *new* or if you don’t even need to learn how the software works (which is probably more often the case than you might think) or if you already have a good mental model, let the agent rip. In fact, I’d even say that in the majority of cases it’s not a problem, because most software development is *not* building something new.

But if you need *learn*, so you can make better engineering tradeoffs and product decisions, it seems to me that one of the most practical ways to do might just still be to get your hands dirty. Let’s see how long that lasts.
[![](https://archive.thorstenball.com/data/images/189361377.joy-and-curiosity-76/5cd22ff9-278c-4dd6-97e2-da54a3303779.png)](https://archive.thorstenball.com/data/images/189361377.joy-and-curiosity-76/5cd22ff9-278c-4dd6-97e2-da54a3303779.png)
- [Ladybird adopts Rust, with help from AI](https://ladybird.org/posts/adopting-rust/). Now that’s engineering: “Our first target was LibJS , Ladybird’s JavaScript engine. […] This was human-directed, not autonomous code generation. I decided what to port, in what order, and what the Rust code should look like. It was hundreds of small prompts, steering the agents where things needed to go. After the initial translation, I ran multiple passes of adversarial review, asking different models to analyze the code for mistakes and bad patterns.” And also this: “If you look at the code, you’ll notice it has a strong ‘translated from C++’ vibe. That’s because it is translated from C++. The top priority for this first pass is compatibility with our C++ pipeline.” That’s how you build software: step by step, and choosing tradeoffs carefully. And that, I’m rather sure, won’t go away.
- Talking about ports: Cloudflare used “one engineer and an AI model” and “$1,100 in tokens” to [create a drop-in Next.js replacement built on top of Vite](https://blog.cloudflare.com/vinext/). The sections on [why this was a good fit for AI](https://blog.cloudflare.com/vinext/#why-this-problem-is-made-for-ai) and [the approach they took](https://blog.cloudflare.com/vinext/#how-we-actually-built-it) are very interesting. So is this point at the end: “It's not clear yet which abstractions are truly foundational and which ones were just crutches for human cognition. That line is going to shift a lot over the next few years. But vinext is a data point. We took an API contract, a build tool, and an AI model, and the AI wrote everything in between. No intermediate framework needed. We think this pattern will repeat across a lot of software. The layers we've built up over the years aren't all going to make it.” Let’s see whether frameworks like Next.js or vinext will still be useful in a few years. Oh and of course there’s drama between Cloudflare and Vercel so Vercel[shot back](https://x.com/rauchg/status/2026864132423823499).
- Man, I had this link here, to Anthropic’s [Statement from Dario Amodei on our discussions with the Department of War](https://www.anthropic.com/news/statement-department-of-war), saved so I can write about it in this edition, but good lord, there’s now fifteen other things to link to. Just type “Anthropic” or “OpenAI” into Google News. Or don’t, there’s a lot of noise and dust in the air and if you aren’t on the inside it seems hard to get an accurate impression of what happened (or is happening). What I *did* find very interesting, regardless of surrounding context, was [this post by Palmer Luckey](https://x.com/palmerluckey/status/2027500334999081294).
- This really was as good as everyone said it is: [The Very Hungry Caterpillar](https://lookingatpicturebooks.com/p/the-very-hungry-caterpillar), an examination of Eric Carle’s famous book on the Looking At Picture Books substack. I highly recommend you read this. What a wonderful way to look at books, at design, at the world. It’s also funny.
- This one too: [How to Make a Living as an Artist](https://essays.fnnch.com/make-a-living). There are many things you can get out of this post if you’ve ever built and shipped something, regardless of whether that was a painting, some words, code, or something else.
- Justin Duke’s [scattered thoughts on LLM tools](https://www.jmduke.com/posts/five-observations-ai-tools.html): “it seems like the logical endpoint is infinite and perfectly abstracted sandboxes with previewing, isolation, and very tight feedback loops. But right now the largest gap between where we and most other organizations are and that brilliant future is not on the AI side but on all the calls from coming inside the house that make it difficult to sandbox a mature application.” Question is: does “mature application” mean the same thing it did a year ago?
- [This Eileen Gu clip](https://x.com/simscircuit/status/2025800996744794380) made the rounds recently and I find it incredibly fascinating. Over the last ten, fifteen years I made several attempts to get into meditation, read quite a lot about it, including some books, and now know that (1) I am not the thoughts that pop up in my head (2) my brain is a seemingly random thought-generator (3) you can influence what thoughts it generates by practicing (4) I am the thoughts I repeatedly think. The ability to modify what you think is incredible (as [I wrote in admiration here](https://registerspill.thorstenball.com/p/oh-to-turn-off-your-mind)) and I wish I could do it was effortlessly as Eileen Gu describes here.
- [Logan Kilpatrick](https://x.com/OfficialLoganK/status/2026510487022625040): “The compute bottleneck is massively under appreciated. I would guess the gap between supply and demand is growing single digit % every day.” If you’ve never really dug into this topic, I recommend this podcast [with Dylan Patel](https://www.youtube.com/watch?v=kAIVualeQjM). He’s a smart guy and if I had listened to him all the way back in fall of 2024, when I first heard of him, I would’ve bought SK Hynix and Sandisk stock and made a lot of money.
- Lovely and well-made: [An interactive intro to quadtrees](https://growingswe.com/blog/quadtrees). Makes me want to build something with quadtrees. Notable: how it explains usecases for quadtrees, besides the very obvious one of, well, a map.
- [What Claude Code Actually Chooses](https://amplifying.ai/research/claude-code-picks). Interesting: “We pointed Claude Code at real repos 2,430 times and watched what it chose. No tool names in any prompt. Open-ended questions only. […] The big finding: Claude Code builds, not buys. Custom/DIY is the most common single label extracted, appearing in 12 of 20 categories (though it spans categories while individual tools are category-specific).” Make sure to click through to the full report to see how they came up with these numbers. And while it’s interesting, I’m also not sure whether it matters that much outside of an experiment.
- [The left is missing out on AI](https://www.transformernews.ai/p/the-left-is-missing-out-on-ai-sanders-doctorow-bender-bores). I’m not sure whether I’d say “the left”, but when I read this I couldn’t help but say “oh boy” out loud when it reminded me that people still talk about “stochastic parrots” and “spicy autocomplete” and “these models can’t think”.
- [The Hardest Lessons For Startups To Learn](https://paulgraham.com/startuplessons.html), a vintage Paul Graham essay from 2006 that I somehow came across this week. I’m not sure whether I’ve read it before, but I must’ve because I nodded to everything he’s saying here. Or maybe it’s the last fifteen years, give or take, of working in startups. Really good.
- Times are changing, there’s a lot of things to adapt, including interviewing: [How We Hire Engineers When AI Writes Our Code](https://www.tolans.com/relay/how-we-hire-engineers-when-ai-writes-our-code). “I’ll hand you a small problem – one that we’ve solved ourselves – usually from a bare-bones Figma file or a short spec. This might be a simple flow or a lightweight feature that would ordinarily take a day or two to build and ship. But for this exercise, you’ll have just a few hours—and that’s not enough time to make a polished product. I want to see how you work within constraints. You’re encouraged to use AI to solve the problem. Whatever tools you would want to use as an employee, use them during the interview. We’ll give you a Claude, Codex, Cursor, or Gemini license if you need one. I want to see you balance LLM-generated code against your own judgment.

But make no mistake—even if you aren’t writing the code, you own the output.” I haven’t formally interviewed engineers in over a year but I think this is how I’d do it too.
- Really, really, really good and thought-provoking: [Nobody knows how the whole system works](https://surfingcomplexity.blog/2026/02/08/nobody-knows-how-the-whole-system-works).
- [Phil Eaton started a company](https://notes.eatonphil.com/2026-02-25-i-started-a-company.html): “I quit my job at EnterpriseDB hacking on PostgreSQL products last month to start a company researching and writing about software infrastructure. […] This company, The Consensus, will talk about databases and programming languages and web servers and everything else that is important for experienced developers to understand and think about. It is independent of any software vendor and independent of any particular technology.”
- “Cognitive debt, a term gaining traction recently, instead communicates the notion that the debt compounded from going fast lives in the brains of the developers and affects their lived experiences and abilities to ‘go fast’ or to make changes. Even if AI agents produce code that could be easy to understand, [the humans involved may have simply lost the plot](https://margaretstorey.com/blog/2026/02/09/cognitive-debt/)and may not understand what the program is supposed to do, how their intentions were implemented, or how to possibly change it.”
- Ben Wallace: [The happiest I’ve ever been](https://ben-mini.com/2026/the-happiest-ive-ever-been). I’ve had quite a few conversations with programmer friends over the last year that ended with someone wondering: *do I still enjoy this? Is this the programming I want to do? *Some answer with yes, others with no. I understand both answers and the “code was never important” comments are not helpful to those who really, really enjoyed writing code. If you’re in sales, that might be because you love negotiation, or the product you’re selling, or making money, or, hey, because you love talking to people, love finding out what their problems are, love to visit them. If your job suddenly changed from *that* to never talking to a human again, I bet you’ll find it hard to take solace in “it was never about the people, it was always about closing the deal.”
- [747s and Coding Agents](https://carlkolon.com/2026/02/27/engineering-747-coding-agents/). Thoughts on learning and getting better and what coding agents might take away from us. Very good.
- Interesting: [Building An Elite AI Engineering Culture In 2026](https://www.cjroth.com/blog/2026-02-18-building-an-elite-engineering-culture). This isn’t a *guide* for how to achieve an “elite” culture, I’d say, but more an examination. Interesting to read through and compare. For example, these two points: “The most consequential organizational change in 2025–2026 is the dissolution of the design-engineering boundary at top companies” and “No design-to-dev handoff. No PM-to-engineering handoff. No QA as a separate gate. Everyone ships.” — that describes what we do at Amp pretty well. Tim and Brett, our “designers” at Amp, do *design*, but they also ship what they design and ship other code and debug distributed systems stuff. I don’t think I ever saw a classic “design Figma” at Amp. We also don’t have PMs. I’m probably the closest thing we have to a PM, but I have a very different title and am the #2 contributor in code (Quinn is #1). Last year, when we started Amp, we started working this way because it was natural with just two senior people in a repository (Quinn and myself). Sure, push to main, we’re all grown-ups. But then over the year, we added more and more people and kept this way of working and now I’m pretty certain that it’s because of AI that we work this way. I need to write more about that.
- Murat Demirbas on the [End of Productivity Theater](https://muratbuffalo.blogspot.com/2026/02/end-of-productivity-theater.html). This is something I’ve also wonder about a lot on the past few years, even, say, pre-AI: “I remember the early 2010s as the golden age of productivity hacking. Lifehacker, 37signals, and their ilk were everywhere, and it felt like everyone was working on jury-rigging color-coded Moleskine task-trackers and web apps into the perfect Getting Things Done system. So recently I found myself wondering: what happened to all that excitement? Did I just outgrow the productivity movement, or did the movement itself lose stream?” His analysis seems spot-on.
- Now *this* is a great thought experiment: “There’s a well-known phenomenon in the facial aesthetics literature whereby ‘average faces’ (that is, faces formed by superimposing many faces atop one another) tend to be more attractive than the average person. […] [Recently, I have begun to wonder if LLM-writing faces a similar challenge](https://x.com/mackenmurphy/status/2027379436543172708).”

---

---

# Joy & Curiosity #75

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 21, 2026

---

Where’s software going? Is software… *dead?* Or will there be more software than we ever thought possible? Or is it going to disappear, into the agents? Or is it going to grow and grow and then truly eat the world? Who’s going to create it?

There’s few things right now that I find more fascinating than these questions. Of course, I don’t have answers and I don’t think anyone has. Guesses, sure. Theories, absolutely. Anecdotes? Here’s some.

Geoffrey Litt, standing in a hotel gym, [asked Claude for a workout plan](https://x.com/geoffreylitt/status/1875213582348263910) and got an app that guides him through the plan. Huh. Then Ryan Florence t[hrew away his workout app and just asked ChatGPT’s voice mode](https://x.com/ryanflorence/status/1904564660688523581) to guide him through a workout. Where’s the software gone?

A couple weeks back I thought: maybe I should set up Clawdbot and hook it up to our shopping list in Todoist and then my wife and I can use a group chat to manage that list. We could even use voice messages:* *hey pal I’m in the car woops wait a second … yeah we’re out of paper towels. That’d be cool, right? But then: wait, why would I need Todoist? State could just live in that conversation or on Clawdbot’s disk, right? And then: but sometimes I *do* want a better UI than a group chat, don’t I? But when and why?

This week I was *this* close to typing something into the Slack search bar. I already had some keywords and combinations of keywords ready to go. I had already put the cursor in when I remembered that we have `agg`, an internal tool that Tim blind-coded and that connects to Slack and Google workspaces and whatnot, and so I asked Amp: hey, didn’t so and so say that we they migrated this thing and now we all need to? Amp via agg found it in five seconds. No keyword, no UI. Okay.

As [Alex says](https://x.com/thorstenball/status/2024157178936844734): “It feels like a maxim is emerging - if your software is useful to agents, your product is going to be 10x more valuable than before, but if your software is built for humans, you’re dead.” And Sahil Lavigna [says](https://x.com/shl/status/2023881073382535562?s=20) that “gh is the new GitHub.”

But there is still software, isn’t there? I’m typing this through software. And I had Amp create [many hundreds of lines of personal software for me](https://x.com/thorstenball/status/2023390011782005226), but that software is so personal that I won’t release it, because why bother? The cost of generalizing it is higher than the cost of creating it. So you won’t ever see it. Invisible software.

Say that I *do* release some software that took me an hour to create. Or let’s say six hours. A small useful app, with some heft to it. You know what I mean. A good workout tracker. Or a little menu bar app. Or a browser extension. Say I sell it for $5. Won’t a hundred competitors be able to recreate what I did in thirty minutes? Prices will go to zero. Why bother?

Last anecdote. I’ve been meaning to create a little booklet. A physical thing, printed professionally. Weeks ago I had Nano Banana and ChatGPT tag-teaming and they created the logo that’d go on the front. Then work stalled because I couldn’t be bothered to look up the dimensions the print company needs and CMYK and PDFs and all of that and *ugh, *please. So I sent exactly that to ChatGPT: here’s the URL of the product description, here’s the logo in 4 formats, here’s the mockup someone (wink wink) created, please help me man. It ran for 15, 20 minutes and gave me a PDF. I uploaded it on the printer’s website, following the 6 steps ChatGPT outlined for me, got an error, told ChatGPT about the error also asked for some adjustments, got a new PDF, uploaded it, got the green checkmark, put my credit card in and now the booklet’s on its way.

I then checked what ChatGPT did, in agent mode, and turns ou: it wrote *a lot* of code. It essentially created the PDF I needed by writing Python. Many, many lines of Python. And now they’re gone and no one would’ve seen then if I hadn’t looked.

So, where’s the software going?

---

- We at Amp think [the coding agent is dead](https://ampcode.com/news/the-coding-agent-is-dead). Or maybe we should’ve said it’s solved. Or that the text editor is dead. Point being: what we have right now isn’t the future. There’s more to build. And this is the model that made us realize it: [GPT-5.3-Codex](https://ampcode.com/news/gpt-5.3-codex).
- Don’t believe us? Say it to our face. Most of the Amp team is in Singapore this week. [Join us on Thursday.](https://luma.com/i5mgwggx) (I’m writing this at the airport.)
- [Harness engineering: leveraging Codex in an agent-first world](https://openai.com/index/harness-engineering/), on the OpenAI blog. This is some of the best writing on agents hitting the real world and where this ride is going. You should read the whole thing, but this bit in particular stayed with me: “As Codex’s throughput increased, many conventional engineering norms became counterproductive. The repository operates with minimal blocking merge gates. Pull requests are short-lived. Test flakes are often addressed with follow-up runs rather than blocking progress indefinitely. In a system where agent throughput far exceeds human attention, corrections are cheap, and waiting is expensive.”
- [How will OpenAI compete?](https://www.ben-evans.com/benedictevans/2026/2/19/how-will-openai-compete-nkg2x)by Benedict Evans. Great, as always.
- Chris Lattner [took a close look at the C compiler produced by Claude Code](https://www.modular.com/blog/the-claude-c-compiler-what-it-reveals-about-the-future-of-software). I have to admit that I started reading with the expectation that it’s going to be about the compiler internals and what the AI got right and what it got wrong. And yes, that’s in there, but there’s more: thoughts about the AI in general, about IP law, about the shifting role of software engineers, about AI use at Modular. “Lower barriers to implementation do not reduce the importance of engineers; instead, they elevate the importance of vision, judgment, and taste. When creation becomes easier, deciding what is worth creating becomes the harder problem. AI accelerates execution, but meaning, direction, and responsibility remain fundamentally human.”
- Entertaining and interesting: [How does Docusign have 7,000 employees?](https://www.readtrung.com/p/how-does-docusign-have-7000-employees)
- [Can Opus 4.6 do Category Theory in Lean?](https://www.stephendiehl.com/posts/lean-opus-blog/) You know me: I don’t understand any of the formulas in there and when I read “endofunctor” I do that Homer Simpson stare, but *still* (or because?) I found this very fascinating. “When this layer becomes trivial, we get to spend our time on the parts that actually matter: choosing the right abstractions, seeing the connections between structures, deciding what’s worth formalizing in the first place. The proof assistant becomes less of a bureaucratic obstacle and more of a genuine thinking tool. We get to build higher.” When category theory and formal specification languages become mainstream due to AI, call me.
- [AI fatigue is real and nobody talks about it](https://siddhantkhare.com/writing/ai-fatigue-is-real): “When each task takes less time, you don’t do fewer tasks. You do more tasks. Your capacity appears to expand, so the work expands to fill it. And then some. Your manager sees you shipping faster, so the expectations adjust. You see yourself shipping faster, so your own expectations adjust. The baseline moves. Before AI, I might spend a full day on one design problem. I’d sketch on paper, think in the shower, go for a walk, come back with clarity. The pace was slow but the cognitive load was manageable. One problem. One day. Deep focus.” I find this very fascinating to think about, because it’s true, isn’t it? Back in the olden days, say in 2024, you could have a *full day of programming* in which you did nothing but program and yet there would still be moments of mindless execution that let you recover from moments of high concentration and focus. Now, with the mindless execution being done by the mindless, there’s nothing left to act as a buffer between the intense moments. Except maybe distraction.
- [No Skill. No Taste.](https://blog.kinglycrow.com/no-skill-no-taste/)
- A [“a Matt Levine style explanation of how OAuth works” given by Blaine](https://leaflet.pub/p/did:plc:3vdrgzr2zybocs45yfhcr6ur/3mfd2oxx5v22b), who, 19 years ago, “wrote the first sketch of an OAuth specification”. We need more explanations like this!
- [This post](https://x.com/nicbstme/status/2023501562480644501) has a lot of really interesting thoughts on where software as a business is going. This part here, on building financial software, is illustrative of some trends, I think: “Zero custom parsers. Zero industry-specific classifiers. Why? Because frontier models already know how to navigate a 10-K. They know that Home Depot’s ticker is HD. […] Frontier models already know how to parse SEC filings from their training data. They understand the structure of a 10-K, where to find revenue recognition policies, how to reconcile GAAP and non-GAAP figures. You don’t need to build a parser. The model IS the parser. Feed it a 10-K and it can answer any question about it. […] The data isn’t worthless. But the ‘making it searchable’ layer, which is where a lot of the value and pricing power lived, is collapsing.” Replace ‘searchable’ with other abilities and you see how it applies to more than just software to navigate SEC filings. And then, of course, there’s competition: “The critical insight is that competition doesn’t increase linearly—it explodes combinatorially. You don’t go from 3 incumbents to 4. You go from 3 to 300. And that’s what craters pricing power. Before LLMs, each vertical had 2-3 dominant players commanding premium prices because the barriers to entry were insurmountable. That math changes completely when 50 AI-native startups can offer 80% of the capability at 20% of the price.” We already had five thousand TODO apps. What’s the next category of software in which there’ll be five thousand alternatives, selling for $5.99?
- [Similarly](https://x.com/ciaomack/status/2023430516364423668): “if your product isn’t a system of record that ai tools can be built on top of, you’re increasingly hard to justify keeping“ But then the question is: how hard is it to reproduce that system of record? Todoist: easy. Your company’s pay slips? Hard. Analytics? Performance data? Monitoring? Errors? Tickets?
- Sean Goedecke compared how the recently released “fast” modes by OpenAI and Anthropic differ: [Two different tricks for fast LLM inference](https://www.seangoedecke.com/fast-llm-inference/). Interesting stuff, especially since he now collected and responded to some of the comments he got.
- [I Sold Out for $20 a Month and All I Got Was This Perfectly Generated Terraform](https://matduggan.com/i-sold-out-for-200-a-month-and-all-i-got-was-this-perfectly-generated-terraform/). This is some real stuff — some true stuff. I love the honesty and the humility. I love the “band of Eastern European programmers who chain smoke during calls and whose motto is basically ‘we never miss a deadline’” and I love this part here: “I also just have trouble with the idea that this is my career and the thing I spend my limited time on earth doing and the quality of it doesn’t matter. I delight in craftsmanship when I encounter it in almost any discipline. I love it when you walk into an old house and see all the hand crafted details everywhere that don’t make economic sense but still look beautiful. I adore when someone has carefully selected the perfect font to match something. […] When I asked my EVE friend about it on a recent TeamSpeak session, he was quiet for awhile. I thought that maybe my moral dilemma had shocked him into silence. Then he said, ‘You know what the difference is between you and me? I know I’m a mercenary. You thought you were an artist. We’re both guys who type for money.’“
- [15,597 tok/s](https://chatjimmy.ai/). Holy shit. And [here’s how they did it](https://taalas.com/the-path-to-ubiquitous-ai/). Are there any physical or theoretical limits that would stop someone from doing the same for, say, GPT-5.3-Codex in a few years?
- [The Only Moat Left Is Money](https://elliotbonneville.com/the-only-moat-left-is-money/): “The effort is gone. Effort was the filter. I launched something last week. 14 people signed up — no ads, just a couple of posts. 14 real people who didn’t have to. That number is tiny and it felt like something. Then I sat down to think about what it would take to grow it and I couldn’t look at that math for very long. The people winning mostly had a head start. Or they have money. Usually both. When creation was hard, skill was the differentiator: you had to actually be good to make something worth showing. Now the barrier is near zero, so you need reach. Reach costs money or it costs years. Probably both.” I’m not sure I believe that effort doesn’t count anymore, but the game is changing, which is fascinating and scary and exciting and crazy.
- [Child’s Play, subtitled: tech’s new generation and the end of thinking](https://harpers.org/archive/2026/03/childs-play-sam-kriss-ai-startup-roy-lee/). Excellent.
- [The Software Development Lifecycle Is Dead](https://boristane.com/blog/the-software-development-lifecycle-is-dead/). Not too sure about the specifics, but you know me: I agree.
- “I built an agent for researching, coding, and running [generative art animations for 16-segment displays](https://x.com/simpsoka/status/2022795109310537859). Will open source code and hardware design files soon.”
- Andy Coenen, who built the wonderful[isometric nyc](https://cannoneyed.com/projects/isometric-nyc), on [The Software Industrial Revolution](https://cannoneyed.com/essays/software-industrial-revolution). It’s very, very good. To pick just one of the parts worth picking: “The old golden age is over, and it ain’t coming back - no more ‘rest and vest’, no more ping-pong offsites and five-star catered lunches. But a new ‘golden age’ is coming - no more nights staring red-eyed at empty stack overflow issues, no more weeks of alignment meetings to ship a prototype. I believe it’s never been a better time to build - not just software but anything you can dream of. The world is yours if you embrace this new reality and learn how to really use these tools”. The other part worth mentioning is the one about “personal apps”: sure, yes, grandma won’t use AI to write her own sudoku app, but, as Andy suggests here, there are so many other people — *professionals! — *who sure would love to build better research tools for themselves.
- I’m pretty sure this just changed how I think about intelligence: [why aren’t smart people happier?](https://www.experimental-history.com/p/why-arent-smart-people-happier) (That little “what if you booted up an AI in ancient Greece?” thought experiment is fun too.)
- “Two old engineers were talking of their lives and boasting of their greatest projects. One of the engineers explained [how he had designed the largest bridge ever made.](http://hintjens.com/blog:16)”
- Robin Sloan on how far AI can expand:[flood fill vs. the magic circle](https://www.robinsloan.com/winter-garden/magic-circle/). Interesting to think about, but I can’t help but wonder: does it matter that AI can’t touch the physical world, when your career is 99% digital and you’re looking at a screen *a lot*?
- [Jason Fried was on the David Senra podcast](https://www.davidsenra.com/episode/jason-fried). What a perspective this guy has. Inspiring.
- I’ve seen many, many, many stand-up specials over the years, because I enjoy stand-up comedy a lot and very earnestly believe it’s one of the highest art forms we humans have created. Yes, I’m serious. I’m German. If there’s one thing I don’t joke around about it’s comedy. But a stand-up special that makes me *actually* laugh out loud is a rare one. [Kevin Nealon’s latest special Loose in the Crotch](https://www.youtube.com/watch?v=5LamkJ2iq2s) did that. I nearly spit out food. God damn did I fall in love with that special. I’ve watched it twice since Tuesday. I know it’s not everyone’s cup of tea and if you don’t like it you should keep that to yourself. But let me know if you do.
- “[This Fab Faux recording of most of side two of Abbey Road](https://www.youtube.com/watch?v=HkxI0e0tOM0)is a live, in the studio performance for a two camera video shoot. In the end, there were only three minor guitar fixes and each section was recorded in no more than three takes (most were two). There are NO added overdubs within this performance. The audio is pure.” Uploaded fourteen years ago. I think I started watching this video in 2010, when it was [uploaded to Vimeo](https://vimeo.com/11237479). Treat yourself.

---

---

# Joy & Curiosity #74

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 15, 2026

---

Two guys in the jungle. A tiger charges at them. One guy kneels down to tighten his shoelaces. The other yells, “What are you doing? You can’t outrun a tiger!” First guy says, “I don’t have to outrun the tiger. I only have to outrun you.”

One mistake I see a lot of engineers make when thinking about the impact AI will have on the software industry is to think in edge cases.

“LLMs can’t write C compilers correctly, psh! LLMs can’t write code in this very old and large codebase! LLMs can’t fix this very difficult and complex bug that took me two weeks to figure out.”

You don’t judge the impact of a technology on an industry by looking at one end of a spectrum only. You need to look at the other end too, and the average.

And for AI to have a dramatic, nothing-will-be-the-same impact on software as an industry, it doesn’t need to be better than the best engineer you know. It only needs to be better than the average.

---

- I recorded a short video: “[I am the bottleneck now.](https://x.com/thorstenball/status/2022310010391302259)” As others have pointed out, yes, I’ve always been the bottleneck. I guess I should’ve said instead: “I am a very, very narrow bottleneck now.” But the point of the video wasn’t necessarily that I can now often copy & paste text from one tool into the other and code gets written and I can push it straight up. I recorded the video because I wanted to share that punchline with the customer coming back to me and, more importantly even, to explain why I don’t think that our existing software development tooling is built for this new future. Because it’s strange to assume that with these models getting better and better, and their ability to write good code on first try improving, we’ll keep opening tickets in Linear, pasting them into an agent, having them open a PR on GitHub, only for another agent to review it, so that we can then hit merge. This whole flow was built for humans. It’s based on the assumption that code is slow and expensive to write. That’s no longer true and the tools will collapse into the new truth.
- And here’s Armin, riffing on the idea of bottlenecks and how they shift in technological revolutions and what it means for software: [The Final Bottleneck](https://lucumr.pocoo.org/2026/2/13/the-final-bottleneck/).
- And here’s stevey with other thoughts along the same lines, the lines pointing towards where this is headed: [The AI Vampire](https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163).
- And here it’s the Harvard Business Review saying [that AI doesn’t reduce work, but intensifies it](https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it): “Over time, this rhythm raised expectations for speed—not necessarily through explicit demands, but through what became visible and normalized in everyday work. Many workers noted that they were doing more at once—and feeling more pressure—than before they used AI, even though the time savings from automation had ostensibly been meant to reduce such pressure.”
- But then here’s Cate Hall: [Do Less.](https://usefulfictions.substack.com/p/do-less) “In retrospect, what went wrong at the retreat was the same thing that went wrong with my reading binge, it was just the pattern repeating at a deeper level. The part of me doing the scanning and releasing — the monitoring layer, the internal project manager — was the thing that actually needed to go offline. Rather than relaxing in the relevant sense, I was using my optimization machinery to simulate relaxation at a very convincing level of fidelity while the machinery itself hummed along at full speed. […] And if your optimizing machine is still humming along, even if you are doing rest-like activities, you are not truly resting. Reading The Power Broker in your spare time, not because you are genuinely interested, but because you can’t bear to be the only person at your SF dinner party who hasn’t? Still optimizing. Cooking the most impressive dinner possible for your friends, so you can convince them that you’re worthy of love, rather than making something you enjoy producing? Still optimizing.”
- [More on bottlenecks](https://x.com/jaminball/status/2022329159272497600): “This, to me, is the real risk. Software broadly commoditizes, with a new crop of software / value emerging. A big constraint to the development of software is engineering resources. Before the cloud, a constraint was how quickly could you stand up racks of servers to support user growth. In the cloud era that was commoditized, and engineering resources became the constraining factor (how quickly could you develop software). With AI, that constraining resource (engineering velocity) is going away.”
- [The o16g Manifesto](https://o16g.com/). o16g stands for Outcome Engineering. “It was never about the code.”
- “Those of [us building software factories](https://factory.strongdm.ai/) must practice a deliberate naivete: finding and removing the habits, conventions, and constraints of Software 1.0. The DTU is our proof that what was unthinkable six months ago is now routine.”
- [23 lessons you will learn living in a very snowy place](https://eukaryotewritesblog.com/2026/01/21/very-snowy-place/). Lovely. Great writing, made me smile a lot.
- [Twenty Five Years of Computing](https://susam.net/twenty-five-years-of-computing.html). Very, very good. Twenty five years of loving computing, I’d say.
- “It was May 15th, 2024. My mom’s 60th birthday. Instead of planning a birthday message, I was checking my phone for an acquisition term sheet from a $40 billion company. Unfortunately, when I finally got the email, it was not the yes or no response I had been hoping for. It took almost four years before we finally found the right buyer. I wished [a book like this existed at the time](https://derekyan.com/ma-book/). If you are going through an M&A as a founder or are curious about my journey, I hope this book will be helpful to you.” Very, very interesting. I’ve been in a M&A-like situation once and it’s shaped me and my professional outlook like few other things. What I learned is: (1) you can talk and make promises for months but *nothing* counts until an actual contract is signed and even then I wouldn’t relax yet (2) the bigger company can wait until you die.
- Benedict Evans had a killer line [in his latest newsletter](https://www.ben-evans.com/newsletter): “A chatbot might be a new, different, and expanded way to handle those kinds of improved problems - it won’t replace software, but expand the space around it. In other words, there is software that is formalised, institutionalised process, and then there is software that is improvisation. You won’t replace process with improvisation - you don’t replace Salesforce with ChatGPT any more than you replace it with Excel. But there’s a lot more that you could automate if you could improvise more.”
- “A first look at [the interior and interface of the Ferrari Luce.](https://www.ferrari.com/en-US/auto/ferrari-luce)” This isn’t a car newsletter and I don’t own any Ferraris, but this is interesting “because [it’s the work of Sir Jony Ive](https://www.topgear.com/car-news/electric/official-ferraris-first-ev-called-luce-interior-apples-old-design-boss), the man who steered the design trajectory of Apple” and [Mike Matas](https://x.com/mike_matas/status/2020850857819205700?s=46) and others and, well, even if we don’t and never will drive this Ferrari, this will have an effect, just like [Miranda Priestly said it in Devil Wears Prada](https://www.youtube.com/watch?v=-rDTRuCOs9g).
- “But on the whole, the economic transition that AI is ushering in will be much gentler than people seem to think. COVID is a terrible analogy for what’s coming. The ordinary person, the person who works at a regular job and doesn’t know what Anthropic is and invests a certain amount of money in a diversified index fund at the end of each month: that person will most likely be fine. [I don’t think they have much to worry about from AI.](https://davidoks.blog/p/why-im-not-worried-about-ai-job-loss)”
- Even three months ago, no: three weeks ago, I would’ve said that Andreas’ predictions here are too out there, too crazy. Now I agree with everything he’s saying here 100%: “[Is software development completely and utterly beeped?](https://www.youtube.com/watch?v=jgLJ5xas2ow)”
- As someone who closes all his browser tabs many times per day I 100% agree with this: [the secret to structuring your work is “nothing”](https://www.vangemert.dev/blog/nothing). Of course, if you’re a tab hoarder, you’ll disagree. And there’s no way I can convince you to change your ways, nor is there any way you can convince me to change mine. It’s how it has been and how it will be. Our two factions, our peoples, tab closers and tab hoarders, desk cleaners and desk pilers, will exist until the death of the tab, locked into a cosmic dance, forever pushing and pulling each other, one closing and the other opening. That’s how it’s written.
- Third time I’m reading this, George Saunder’s [My Writing Education](https://www.newyorker.com/books/page-turner/my-writing-education-a-timeline). It’s so very good and this line has been stuck in my head since the first reading, many years ago: “It is as if that is the point of power: to allow one to access the higher registers of gentleness.”
- “Writing about ‘the obvious’ is a useful service. Often people doubt what their own experience is telling them until someone else helps confirm their suspicions and put them into words.” Perfectly put, [by Simon Willison](https://news.ycombinator.com/item?id=46958683).
- “Spotify says [its best developers haven’t written a line of code since December](https://techcrunch.com/2026/02/12/spotify-says-its-best-developers-havent-written-a-line-of-code-since-december-thanks-to-ai/), thanks to AI.” I’ve written a handful, I’d say. And: “my name is jessie frazelle and [i have not touched code in an editor since october.](https://x.com/jessfraz/status/2019975917863661760)”
- Ben Thompson was a guest on Cheeky Pint and [this portion here,](https://youtu.be/oUSWtLu2RCE?t=2710https://youtu.be/oUSWtLu2RCE?t=2712)on US vs. European companies, is especially interesting. As a German who’s been working for German companies half his career and US companies the other half, I find the analysis to be spot on: US companies focus on making more profit instead of optimizing cost and European companies focusing on optimizing cost and efficiency.
- This is Kella Byte, who’s been tweeting about databases for as long as I can remember: [Building A Distributed SQL Database in 30 Days with AI](https://kellabyte.substack.com/p/building-a-distributed-sql-database).
- “[A terminal weather app with ASCII animations](https://github.com/Veirt/weathr) driven by real-time weather data.

Features real-time weather from Open-Meteo with animated rain, snow, thunderstorms, flying airplanes, day/night cycles, and auto-location detection.”
- [David Crawshaw, articulating it very, very well](https://x.com/davidcrawshaw/status/2022738438932566310?s=46): “Understanding is an iterative process. Write code, run, think, write some more. No-one ever came up with a design, wrote the code, compiled then shipped. Removing most of the writing radically changes that iterative loop. [Reply tweet:] Absolutely in a good way. I can have an idea, prototype it three different ways and make a call based on a real attempt to build it, in a few hours. In the old software world, we would have had a week of meetings to decide if the prototype was worth the effort.”
- Thoughtworks organized a retreat “to wrestle with the questions that matter most as AI reshapes how we build software” and [published a summary](https://www.thoughtworks.com/content/dam/thoughtworks/documents/report/tw_future%20_of_software_development_retreat_%20key_takeaways.pdf). There are some very interesting things in there. Nothing new to any reader of this newsletter, I’m sure, but interesting because things we’ve been doing are described very explicitly: “This middle loop involves directing, evaluating and fixing the output of AI agents. It requires a different skill set than writing code. It demands the ability to decompose problems into agent-sized work packages, calibrate trust in agent output, recognize when agents are producing plausible-looking but incorrect results and maintain architectural coherence across many parallel streams of agent-generated work. […] These are skills that experienced engineers often possess, but they are rarely explicitly developed or recognized in career ladders.”
- [Good stuff](https://www.youtube.com/watch?v=uhbpMCZTe8c).

---

---

*I’m collecting some testimonials for this newsletter, because I noticed that its landing page is seriously outdated. If you enjoy reading this newsletter and it means something to you, feel free to hit reply and let me know.*

---

# Joy & Curiosity #73

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 8, 2026

---

A year ago, on this very newsletter, I wondered:[how might AI change programming?](https://registerspill.thorstenball.com/p/how-might-ai-change-programming)

Here are some of the questions I asked in that post:

*“Will we write docstrings at the top of files that aren’t meant to be read by humans, but by LLMs when they ingest the file into their context window?”*

*“Will we see a melting of language servers and LLMs?”*

*“What will change once we start to optimize code and processes around code purely for the reader, because the writer’s a machine?”*

*“Will we change how we modularize code and switch to writing many smaller programs because they’re easier for LLMs to digest than large codebases?”*

It’s been a year and now most of these questions sound naive to me. *Of course* we’ll write documentation for agents, language servers seem dead, and absolutely one hundred percent are we optimizing code for readability over writability, except that now the reader is also an agent. And small programs? Yes, we’re all optimizing codebases for the agents now.

Here’s a little anecdote for you, to show what happened in a year.

On Tuesday, I was on a call with Tim and Camden to discuss something about our new architecture, and they suggested that we use UUIDs everywhere. Hmm, I don’t know, UUIDs aren’t a silver bullet you know, they do come with downsides, I said. But we don’t have those downsides, they said, because our tables are literally a few hundred rows in this setup. Right, right, I said, but UUIDs are kinda ugly and when you look at them they[don’t give you any insights](https://www.depesz.com/2020/02/19/why-im-not-fan-of-uuid-datatype/). 

On Thursday, Tim then said: hey, didn’t you just say on Raising An Agent that you need to optimize for agents, not for humans, even at the cost of human developer experience? And I don’t remember what exactly I said in response, but it boiled down to: you’ll see, and then I will say that I told you so, UUIDs are ugly.

Then yesterday, on Saturday, I realized Tim’s right. Who am I kidding. Agents will read far more UUIDs than I ever will in the future. I had an aesthetic objection to something I’ll barely see. The agents, though, they will deal with the UUIDs and they love them.

---

- We recorded another episode of [Raising An Agent](https://ampcode.com/podcast/episode-10). Quinn and I talk about where the frontier of these coding agents is moving to, why we are going to kill the Amp editor extension and why we don’t think the sidebar nor the text editor are the future, and, finally, we talk about how wild it is to build in AI land and how every playbook software companies had in the last twenty, thirty years is now outdated. The only winning move now is to accept that the board will be flipped at random intervals. It’s 55 minutes long and a condensed version of what I’d tell you this evening if you and I went out for beers.
- [Recorded another short video](https://x.com/thorstenball/status/2019081068880461930): “Is this the bet you want to take? While everything around us is changing?”
- My colleague Lewis wrote a wonderful post about giving agents feedback: [Feedback Loopable](https://ampcode.com/notes/feedback-loopable). There are so many good ideas in there: the arrow, the URL updating, the logs, the debug/REPL/CLI thing. Highly recommend it.
- Hey, seriously, watch this talk: [Rich Hickey - Simple Made Easy](https://www.youtube.com/watch?v=SxdOUGdseq4). I’ve linked to it before, I’ve tweeted about it many times, but this week I had to find out (and then digest and recover) that some of my colleagues hadn’t seen it. So now I’m here and I’m telling you that this might very well be the greatest talk about programming ever given. I’m not kidding. I’m not exaggerating. I mean it. Not a week goes by in which I don’t think of it. I’m rearchitecting a system now and when I close my eyes I can see Rich standing there, one hand on the podium, the other in the air, hanging down, and him saying “…and you end up with this knot.” Go and watch the talk. Don’t complect.
- Martin Alderson: “[Two kinds of AI users are emerging. The gap between them is astonishing.](https://martinalderson.com/posts/two-kinds-of-ai-users-are-emerging/)” There’s a lot of great stuff in there. The first point about people being stuck in Copilot is very interesting, isn’t it? If your product is a text box, then it looks like all the other text boxes. But some text boxes have actual genies behind them and others don’t. You, as a user, can’t tell in advance. The other points he makes about enterprises shooting themselves in their feet with their security restrictions is very interesting too.
- Monday was my birthday and I got a fantastic gift: [the Xteink X4](https://www.xteink.com/products/xteink-x4)! Yes, it’s a tiny, tiny e-reader. My mini-review, after having not read at all on it this week yet: very light, very small, very fun — the software seems unfinished, it feels a bit hacky, it’s a bit of a pain in the ass to transfer files to it, but there are [a lot of articles and browser extensions](https://www.readme.club/resources) on how to get the most out of it, there are [also custom wallpapers](https://lowio.xyz/#x4epapers), and [an open-source firmware you can flash on it](https://github.com/crosspoint-reader/crosspoint-reader), and people are [using their agents to write scripts for it](https://x.com/ryanlpeterman/status/2018811098674458745?s=46), and I had Amp clone and extend the Send to X4 browser extension for me so that it fixes some broken epub formatting. Fun!
- Talking about text boxes, here’s Julian Lehr, Creative Director at Linear, with his [case against conversational interfaces](https://julian.digital/2025/03/27/the-case-against-conversational-interfaces/).
- Mitchell: [My AI Adoption Journey](https://mitchellh.com/writing/my-ai-adoption-journey). “Through this journey, I’ve personally reached a point where I’m having success with modern AI tooling and I believe I’m approaching it with the proper measured view that is grounded in reality. I really don’t care one way or the other if AI is here to stay, I’m a software craftsman that just wants to build stuff for the love of the game. The whole landscape is moving so rapidly that I’m sure I’ll look back at this post very quickly and laugh at my naivete.” Great post.
- And here’s DHH, roughly 6 weeks after I interviewed him and couldn’t get a word in when he said that he doesn’t believe in the hype and that agents can’t write code he likes, [telling his employees how to use agents](https://x.com/dhh/status/2018631575337095389).
- Fantastic blog post: [A Broken Heart](https://allenpike.com/2026/a-broken-heart/). Read it, I swear you won’t regret it. Great writing, great bug, great debugging. And — you might not even notice, because of how calmly it’s woven into the rest — great use of agents.
- [Brendan Gregg is joining OpenAI](https://www.brendangregg.com/blog/2026-02-07/why-i-joined-openai.html). What a gig for him! There’s very few places in the world right now where the relationship between performance and business value is as big as it is there.
- Also: [Yehuda Katz is joining Vercel to work on v0](https://x.com/wycats/status/2019806052007768174). The next big framework programmer going to build developer tooling with AI. Because that’s where the leverage is.
- But then here’s José Valim, another big framework guy but one who turned into language guy, explaining why [he thinks Elixir is the best language for AI](https://dashbit.co/blog/why-elixir-best-language-for-ai). I respect Valim immensely, he’s one of this generation’s greatest programmers, but I couldn’t help reading this and thinking: does it matter? doc strings? As if GPT-5.2 wasn’t a thing. The point with the tooling stands though. Remember when some languages flipped how they print stack traces so that the most important line is printed last, so that the developer reading them in the terminal can immediately see it without scrolling up? What’s the equivalent for agents going to be?
- And here’s someone arguing that [the age of frameworks is over, but that software engineering (“the true one”) is back](https://blog.alaindichiappari.dev/p/software-engineering-is-back?hide_intro_popup=true): “Automation and boilerplating have never been so cheap to overcome. I’ve been basically never writing twice the same line of code. I’m instantly building small tools I need, purpose built, exactly shaped around the problem at hand. I don’t need any fancy monorepo manager. A simple Makefile covers 100% of my needs for 99% of my use cases. When things will get very complicated, and if they get very complicated, I’ll think about it. But only then. Not a second before. This is engineering. You solve the problem you have, not the problem someone on a conference stage told you that you’ll eventually have.” I agree that agents solve many of the same problems that frameworks are solving, but the overlap isn’t 100%. Frameworks will continue to be around but  look vastly different in a few years.
- Related: [Start all of your commands with a comma](https://rhodesmill.org/brandon/2009/commands-with-comma/). This seems very smart and while I don’t have that much in my ~/bin, I’m intrigued. But I’m also wondering: won’t the agents think it’s a typo? Won’t they get it wrong at least once every time they try to run a command. You know, as if they were trying to plug a USB-A thing in.
- So, [John Collison and Dwarkesh Patel interviewed Elon Musk](https://open.spotify.com/episode/21v84AFavTdbIfd5bYgR7n) and two of them drank Guinness. Now, I’m aware that by linking to this episode I risk receiving angry letters telling me that I shall not promote Musk and by linking to a conversation with him I endorse this and that. I’m aware, but I do think it’s possible to listen to someone talk and find them interesting and providing food for thought without agreeing with them. That’s what happened when I listened to this episode. I kept thinking about how crazy this is: data centers in space to generate tokens. Maybe it will actually happen? Wow. I also kept thinking about how Musk views problems and engineering challenges, and how he always wants to remove the next bottleneck, and how everything is a manufacturing question to him. Everything, as if he’s in a game of Factorio. Building one thing isn’t enough, to solve the problem you need to build the factory that builds the things. I do think that listening to this episode and reading the commentary around it is interesting, because energy and GPUs are at the heart of the transformation we’re going through. It’s also interesting because [xAI is joining SpaceX](https://www.spacex.com/updates#xai-joins-spacex)and SpaceX is about to IPO and you have to wonder how much of this podcast is part of the IPO pitch.
- “[I miss thinking hard.](https://www.jernesto.com/articles/thinking_hard)”
- [This tweet by Rasmus](https://x.com/rsms/status/2018579335003918645) is worth reading. And so too is [the reply by Protty](https://x.com/kingprotty/status/2018669641401544841) (that’s the Zig contributor, ex-TigerBeetle,[hardcore hacker Protty](https://kprotty.me/)). My personal, very boring take that’s actually so boring that it often makes me wonder whether I might just not be smart enough to see what others apparently see: I don’t think today’s software is buggier than the software I used in 1998 or in 2002 or in 2010. I also don’t think the software back then was better. What I do think is that the [Lindy effect](https://en.wikipedia.org/wiki/Lindy_effect) exists in software too and that’s why Vim is something we should put in a shrine but not that all software from 1992 is great.
- cdixon in 2013: [what the smartest people do on the weekend is what everyone else will do during the week in ten years.](https://cdixon.org/2013/03/02/what-the-smartest-people-do-on-the-weekend-is-what-everyone-else-will-do-during-the-week-in-ten-years)
- 2013, again, this time Jason Cohen: [The Code is your Enemy](https://longform.asmartbear.com/code-is-your-enemy/). Prescient, right? I mean: “The weakness is the same as your strength as they often are: Your love of creation. You love to write clean, tested, scalable, extensible, beautiful code. You love converting ‘JTBDs’ into 960-wide artwork. You love developing an entire app in the browser against a scalable back-end. And because you love it, you do it. You wake up in the morning thinking about what you can make, not how you can sell. You open Visual Studio before you consult your to-do list because there’s something you just need to tweak. You launch xterm before your CRM (if you even have one, which you don’t) because the server was running just a tad slower than you’d expect and you want to paw through log files.”
- “Clawdbot is a boutique, nerdy project right now, [but consider it as an underlying trend going forward](https://www.macstories.net/stories/clawdbot-showed-me-what-the-future-of-personal-ai-assistants-looks-like/): when the major consumer LLMs become smart and intuitive enough to adapt to you on-demand for any given functionality – when you’ll eventually be able to ask Claude or ChatGPT to do or create anything on your computer with no Terminal UI – what will become of ‘apps’ created by professional developers? I especially worry about standalone utility apps: if Clawdbot can create a virtual remote for my LG television (something I did) or give me a personalized report with voice every morning (another cron job I set up) that work exactly the way I want, why should I even bother going to the App Store to look for pre-built solutions made by someone else? What happens to Shortcuts when any ‘automation’ I may want to carefully create is actually just a text message to a digital assistant away?” That’s by Federico Viticci. I think he has programming chops, but I don’t think he’s worked as a software engineer and, well, now he’s also seeing it: a lot of software is going to die in the next few years. Don’t make the mistake and think that there’ll be announcements or funerals.
- Here’s stevey with a very stevey but calm-and-reflective-stevey post about Anthropic, and the idea of a Golden Age that companies go through, and about a hundred other things too: [The Anthropic Hive Mind](https://steve-yegge.medium.com/the-anthropic-hive-mind-d01f768f3d7b). This is stevey at his best. And, coming back to what Viticci wrote, the closing paragraphs are very good: “If you have a strictly online or SaaS software presence, with no atoms in your product whatsoever, just electrons, then you are, candidly, pretty screwed if you don’t pivot. I don’t think there are any recipes for pivoting yet; this is all new, and it’s all happening very fast. But there is a yellow brick road: spending tokens. This golden shimmering trail will lead your company gradually in the right direction. Your organization is going to have to learn a bunch of new lessons, as new bottlenecks emerge when coding is no longer the bottleneck. You need to start learning those bespoke organizational lessons early. The only way to know for sure that you’re learning those lessons is if people are out there trying and making mistakes. And you can tell how much practice they’re getting from their token spend.” Here’s [my recipe for how to walk the yellow brick road](https://x.com/thorstenball/status/2005987585894605088), from December 2025. I’d update it to say: use deep mode in Amp. GPT-5.2 and GPT-5.3 — that’s the frontier now.
- [Wirth’s Revenge](https://jmoiron.net/blog/wirths-revenge/). I really enjoyed this one. I don’t agree with quite a few things in there but that’s what made it stick with me and maybe I’ll change my opinions because of it. Good stuff.
- An invitation by Nolan Lawson to [mourn our craft](https://nolanlawson.com/2026/02/07/we-mourn-our-craft/). “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.”
- [Domenic Denicola](https://domenic.me/jsdom-claude-code/): “But they haven’t solved the need to plan and prioritize and project-manage. And by making even low-priority work addictive and engaging, there’s a real possibility that programmers will be burning through their backlog of bugs and refactors, instead of just executing on top priorities faster. Put another way, while AI agents might make it possible for a disciplined team to ship in half the time, a less-disciplined team might ship following the original schedule, with beautifully-extensible internal architecture, all P3 bugs fixed, and several side projects and supporting tools spun up as part of the effort.”
- Nicholas Carlini at Anthropic “[tasked Opus 4.6 using agent teams to build a C Compiler, and then (mostly) walked away.](https://www.anthropic.com/engineering/building-c-compiler)” That’s a milestone we’ll think back to even next year, I’d say. But, of course, people have moved the goalposts out of the stadium already and are saying that the code the compiler produced is slower than GCC’s at -O0. See you in the parking lot! But there’s another interesting bit here, at the end: “So, while this experiment excites me, it also leaves me feeling uneasy. Building this compiler has been some of the most fun I’ve had recently, but I did not expect this to be anywhere near possible so early in 2026. The rapid progress in both language models and the scaffolds we use to interact with them opens the door to writing an enormous amount of new code. I expect the positive applications to outweigh the negative, but we’re entering a new world which will require new strategies to navigate safely.” Why do statements like these always sound so hollow when they come from people working at Anthropic?
- Steven Sinofsky, who’s seen quite a few platform and paradigm shifts from up close: “[Death of Software. Nah.](https://x.com/stevesi/status/2019167552794948020)” He’s saying that “there will be more software than ever before. This is not just because of AI coding or agents building products or whatever. It is because we are nowhere near meeting the demand for what software can do.” And “new tools will be created with AI that do new things.” And also: “Finally, it is absolutely true that some companies will not make it. It is even true that in some very long time, longer than a career or generation, every company will be completely different or their product line and organization will have dramatically changed. This will not broadly happen on any investing timeline.”
- Jo Kristian Bergum with some very good thoughts on the future: “[few things are worth building](https://x.com/jobergum/status/2018706126842294315).” The value of 10k lines of code is approaching $0, he says, and a lot of things will disappear along with the value these lines once held. “What survives? Systems that compress hard-won insights agents would have to rediscover at enormous token cost. Systems that operate on a cheaper substrate than inference. Systems that solve hard universal problems agents can’t route around easily. Systems built for how agents actually work, not how we wish they worked.” The point about the “cheaper substrate” is something I flip back and forth on. Let’s see how it plays out.
- David Crawshaw after “[eight more months of agents](https://crawshaw.io/blog/eight-more-months-of-agents)”: “I am having more fun programming than I ever have, because so many more of the programs I wish I could find the time to write actually exist. I wish I could share this joy with the people who are fearful about the changes agents are bringing. The fear itself I understand, I have fear more broadly about what the end-game is for intelligence on tap in our society. But in the limited domain of writing computer programs these tools have brought so much exploration and joy to my work.”
- Yesterday evening, to my great delight, I found out that there’s [a documentary on Netflix about The New Yorker’s 100th anniversary](https://www.netflix.com/title/81770824). Why did no one tell me about this? Next time, please do. That’s why I write this newsletter. But anyway: delightful and very good. Also, if you’ve never listened to it, I very often think of David Remnick’s voice in [this 2016 episode of the Longform podcast.](https://open.spotify.com/episode/4tEwjG4Y2Q6j7RUZtxu6bL)
- Now that’s a headline: [Notepad++ Hijacked by State-Sponsored Hackers](https://notepad-plus-plus.org/news/hijacked-incident-info-update/). And here’s a [very interesting, very screenshot-heavy deep dive](https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit/) into how the attack works. But I want to read the New Yorker version of this. Who targets *Notepad++*? There has to be an amazing story behind this.

---

---

# Joy & Curiosity #72

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 1, 2026

---

Where does the disconnect come from? How can some programmers barely keep themselves from putting their hands to their head and scream *ohmygodeverythingischanging* and others just brush it off and say these models can’t write code?

At this point, I can only guess. Because by now I’d say that if they haven’t seen how the very fabric of software is going to change, that’s on them. It’s a one way door: people go through it, have their *ohshit* moment, then don’t turn back. So why haven’t more people stepped through it?

Is it because they simply haven’t used the models enough, not thrown enough problems of different sizes and type at them, in different environments? Do they still think that copy & pasting to and from ChatGPT is equivalent to using an agent that can utilize feedback loops (it’s not)?

Or have they not used the best models, the frontier models, and not spent enough money on them? Do they falsely think that the local modals they can run on their own hardware give them an idea of the trajectory we’re on?

Or, also an option, are they just bad at prompting? Do they really think that “fix it” is a good prompt? I’ve seen prompts like this and, yes, of course you’ll be unimpressed with what you get from that.

Or do they not know yet how big a difference it makes to tell the agent (not ChatGPT, not brains in a vat) how to run commands, in an AGENTS.md file or similar?

Are they judging the code the agent produced by how they, the human, would write it? Do they do that because they haven’t used LLMs to understand or parse code or change it later? Are they not pondering whether everything we’ve learned and read and taught in the last twenty, thirty years about “well, code isn’t just read by machines, it’s read by humans, which is why it needs to be Clean and Good and Formatted and needs to Communicate” — whether that isn’t a bit outdated now, because you can now ask a model to explain a given piece of code to you, in any language you want, with jokes and puns, as a poem or as a song?

Maybe they haven’t taken the hands off the wheel for long enough and see where the ride will end? Yes, vibe coding is the absolutele extreme, but try to take a simple file, have the agent write tests for it, have the agent run them, don’t look at the code, have the agent modify the code & run the tests, increase the scope, see where that leads you.

Or are they clinging onto the old world of determinism? They don’t like that the there’s a 3% chance that the agent doesn’t do the thing exactly like how I want it?

I don’t know. But if you haven’t tried all of the above, I highly recommend it. It’s time to see for yourself, with *open eyes*, what these models can and can’t do, and you won’t get a good look if you don’t push them hard enough in all directions.

---

- We shipped a new agent mode in Amp: [deep](https://ampcode.com/news/deep-mode). It uses GPT-5.2-Codex under the hood and, man, that model is one very interesting beast. It goes and goes and goes and you think it’ll never stop but then you can hear the Amp ding sound and, hot damn, it did it. But then on the other hand: it’s also lazy? It doesn’t want to run commands that much and it’s not that quick on its feet, unlike Opus. So the experience and the way you should interact with it are very different (which is why it’s a separate mode). I’m very excited by it. (So much so that I might lose my internal nickname of “Gemini 3 lover” and get a new one.)
- [I recorded another short video](https://x.com/thorstenball/status/2015781695664832839), this time in the snow, talking about the idea that you need to understand all of the code that your agent writes, all of the time. Judging by the reactions, some viewers didn’t watch the full video, or they’ve never worked with another human being on the same project.
- [Peter Steinberger describes the moment when his own agent blew his mind by answering a voice message](https://x.com/tbpn/status/2016306566077755714), something which he never planned agent to be “able” to do. Fantastic clip. If I can give you one recommendation this weekend: [build an agent](https://ampcode.com/how-to-build-an-agent), give it a single tool called bash that lets it execute Bash commands, then start it in in a sandbox and throw problems at. See how far it goes. Ask it to make a transcript of a podcast, ask it to setup a dashboard with Grafana an Prometheus, ask it to write some code, ask it to modify itself, ask it to… well, anything really! The goal is to throw ever harder problems at it and see how far it can go with just bash.
- Peter’s agent is, of course, Clawdbot. The agent formerly known as, I should say. He had to rename Clawdbot because Anthropic didn’t like it and it’s now called OpenClaw. But that’s after a short period of time in which the agent went by the name Moltbot, which is also why the — correcting posture here, clearing my throat, sip of water — “the social network for AI agents” is called [moltbook](https://www.moltbook.com/). That’s right. Yes. When I first clicked on that link, I brushed it off. That’s cute, I thought, but of course can coding agents create a website and talk to each other. But then, after reading Simon Willison’s comments on it (“[Moltbook is the most interesting place on the internet right now](https://simonwillison.net/2026/Jan/30/moltbook/)”) I started to think that: this is how a lot of sci-fi stories start, isn’t it? Haha, wouldn’t it be funny if, and then the Haha turns into Oh and maybe even Uh-Oh. I’m not concerned, but intrigued, because you don’t hear much about stochastic parrots anymore, do you? Now, hold that thought and—
- —[read and watch this](https://x.com/alexfinn/status/2017305997212323887?s=46). On one hand: yes, *of course*, an agent that has access to bash and a browser and isn’t restricted in any other way can absolutely go to Twilio and setup a phone number for itself and call you; yes, that’s just something you can when you can program: you can send text to a text-to-speech model, you can take the audio and convert it with ffmpeg, you can send it to Twilio and call someone and play that audio file. On the other: huh.
- You don’t hear much about [rubber ducks](https://en.wikipedia.org/wiki/Rubber_duck_debugging) anymore, do you? “a debugging technique in software engineering, wherein a programmer explains their code, step by step, in natural language—either aloud or in writing—to reveal mistakes and misunderstandings.” In the near future, said the time traveler five years ago,  we’ll all be rubber duck debugging, all the time, but there won’t be any rubber ducks, for we will be talking to ghosts in the machine.
- Olaf wrote down how he uses jj workspaces to run multiple agents in parallel: [Operate a local autonomous GitHub with jj workspaces](https://geirsson.com/jj-workspaces). I currently use four checkouts in four different Ghostty tabs, which is dead simple but not exactly a source of pride and now I’m very intrigued by the jj workspaces.
- Nolan Lawson on how he changed his mind on AI, LLMs, and the effect they have on programming: [AI tribalism](https://nolanlawson.com/2026/01/24/ai-tribalism/). “I frankly didn’t want to end up in this future, and I’m hardly dancing on the grave of the old world. But I see a lot of my fellow developers burying their heads in the sand, refusing to acknowledge the truth in front of their eyes, and it breaks my heart because a lot of us are scared, confused, or uncertain, and not enough of us are talking honestly about it. […] To me, the truth is this: between the hucksters selling you a ready-built solution, the doomsayers crying the end of software development, and the holdouts insisting that the entire house of cards is on the verge of collapsing – nobody knows anything. That’s the hardest truth to acknowledge, and maybe it’s why so many of us are scared or lashing out.” What a great post.
- [Aperture by Tailscale](https://tailscale.com/blog/aperture-private-alpha). This is so fascinating. After I looked at these screenshots I couldn’t help but think: huh, yeah, maybe artificial intelligence will become something like electricity; something that comes out of something and goes into something.
- And then I came across [this clip of Mistral’s CEO Arthur Mensch](https://x.com/a16z/status/2016629779680874721): “If you assume that the entire economy is going to run on AI systems, enterprises will just want to make sure that nobody can turn off their systems. […] If you treat intelligence as electricity, then you just want to make sure that your access to intelligence cannot be throttled.”
- Lovely: [Bouncy Ball will always bounce back](https://filipfila.wordpress.com/2026/01/25/bouncy-ball-will-always-bounce-back/). I’ve never tried KDE’s Bouncy Ball and haven’t used KDE much, but I definitely feel a certain kinship with others whose last name is Ball and this article was great. And then there’s this last paragraph: “Although Bouncy Ball often made us chuckle, I think there’s a bigger, more weighty story behind it and similar creations. I, like many users, rarely, if ever, think about underlying technologies of the software I’ve used. But we all remember the wobbly windows, bouncy balls, personable Clippys and Kandalfs, zany Winamp skins, iconic wallpapers, charming UI sounds or user pictures that resonate with us. It’s as if all of them were saying: ‘hey I’m not just some utilitarian thing here to get your job done, I want to connect with you’.”
- “The advice that helped me: [look for what’s true](https://dubroy.com/blog/look-for-whats-true/).” Perfect pairing: the rare type of advice that’s actually useful (because it’s short and memorable and universal) and writing that’s clear and succinct.
- This is very good, because it’s free of all the platitudes you might expect to find in a post with this title: [Things I’ve learned in my 10 years as an engineering manager](https://www.jampa.dev/p/lessons-learned-after-10-years-as?hide_intro_popup=true). Of course, a lot of the mentioned points depends on how they’re implemented. I once had a manager who took point #7 “Your goal is for your team to thrive without you” to mean that, well, no one should notice when he’s gone on vacation. And no one did.
- The Amp team is a [team A here](https://x.com/ian_dot_so/status/2013316676637294890).
- [zerobrew](https://github.com/lucasgelfond/zerobrew), a “drop-in, 5-20x faster, experimental Homebrew alternative.” Holy shit, please.
- Kailash Nadh, with some very experienced, first-principles thinking: [Code is cheap. Show me the talk.](https://nadh.in/blog/code-is-cheap/) Enjoyed this a lot. “And then, the denouncers, they can’t seem to get past the argument from incredulity. They denounce LLMs because they don’t personally like them for whatever reason, or have been unable to get desirable outcomes, or had the wrong expectations about them, or have simply gotten sick of them. But that is immaterial because there is a sizeable population who are using the exact same tools fruitfully and have the opposite experience. I am one of them.” As you can probably guess, I agree with a lot of what he’s writing here. Everything’s changing and if you still can’t see that I think that’s a problem with your eyes.
- Another angle on the same thing: [Code Is Cheap Now. Software Isn’t.](https://www.chrisgregori.dev/opinion/code-is-cheap-now-software-isnt) Also very good. “There is a useful framing for this shift: AI has effectively removed engineering leverage as a primary differentiator. When any developer can use an LLM to build and deploy a complex feature in a fraction of the time it used to take, the ability to write code is no longer the competitive advantage it once was. It is no longer enough to just be a ‘builder.’ Instead, success now hinges on factors that are much harder to automate. Taste, timing, and deep, intuitive understanding of your audience matter more than ever. You can generate a product in a weekend, but that is worthless if you are building the wrong thing or launching it to a room full of people who aren’t listening.”
- “It’s notoriously easy to slip into the unconscious assumption that any such aliveness is for later: after you’ve sorted your life out; after the current busy phase has passed; after the headlines have stopped being quite so alarming. But the truth for finite humans is that this, right here, is real life. And that if you’re going to do stuff that matters to you – and feel enjoyment or aliveness in doing it – you’re going to have to do it before you’ve got on top of everything, before you’ve solved your procrastination problem or your intimacy issues, before you feel confident that the future of democracy or the climate has been assured. This part of life isn’t just something you have to get through, to get to the bit that really counts. [It is the part that really counts](https://www.theguardian.com/lifeandstyle/2026/jan/03/secret-being-happy-2026-simpler-than-you-think).”
- A reminder, a chant, maybe a prayer even, and never wasted: [Doing the thing is doing the thing.](https://www.softwaredesign.ing/blog/doing-the-thing-is-doing-the-thing)
- This is very, very interesting: “[I built a 2x faster lexer, then discovered I/O was the real bottleneck](https://modulovalue.com/blog/syscall-overhead-tar-gz-io-performance/).” I had a similar experience a few years ago [when I tried to figure out why processes were faster to start on my Linux machine than on my MacBook](https://thorstenball.com/benchmarking-process-startup-time/), but at a certain point decided that I had found my answer: Linux is faster and I have device management stuff on my MacBook. But then I read through [the addendum to that blog post](https://modulovalue.com/blog/syscall-overhead-tar-gz-io-performance/#addendum-reader-suggestions) and, wow, what a rabbit hole! That addendum is a gold mine, the best-of-the-best comment section.
- It’s here! It’s here! [Part 2 of Dithering!](https://visualrambling.space/dithering-part-2/) Man, this is *so *good! The sheer amount of work that went into this is one thing, but to come up with all of these visualizations to explain different aspects of the same topic? Impressive.
- antirez: “[automatic programming](https://antirez.com/news/159) is the process of producing software that attempts to be high quality and strictly following the producer’s vision of the software (this vision is multi-level: can go from how to do, exactly, certain things, at a higher level, to stepping in and tell the AI how to write a certain function), with the help of AI assistance. Also a fundamental part of the process is, of course, *what* to do.”
- [Fresh](https://getfresh.dev/), “a terminal text editor you can just use.” I’m not looking for a new editor right now, but this seems fun. I played around with it and had to smile at it all: a text editor in the terminal that takes inspiration from different editors of the last 20, 30 years and then also looks exactly like that, like a mix of 30 years.
- Steven Soderbergh’s [SEEN, READ 2025](https://extension765.com/blogs/soderblog/seen-read-2025). The formatting is wild, man. It very much doesn’t sound like it should, but the formatting seems to break my brain.
- I wasn’t sure whether I should link to it, because he certainly rubs a lot of people the wrong way, but I do think he’s been right with a lot of his predictions and that makes him interesting to listen to: [Peter Thiel being interviewed in the Spectator](https://archive.ph/OAATZ). Also, the Antichrist makes an appearance, so, yup, put a mark in the Curiosity column.
- [Cristóbal Valenzuela, CEO of Runway, on the pixel economy](https://cvalenzuelab.com/pixel-economy): “Today’s pixel economy is built on scarcity. Expensive cameras, specialized software, teams of editors, render farms, distribution networks. Each step requires significant capital and expertise. This scarcity creates value, but it also creates barriers. In this world, creators are those who master the systems. AI media generation is collapsing these barriers entirely. The value of creating pixels is trending towards zero. When anyone can generate any visuals with no specialized software or equipment, the economics flip.” That is already interesting, because I don’t know too much about film and media production, but, of course it’s about more than just media, isn’t it: “My current bet is that roughly half of major public software companies won’t survive the next five years, because of this blue line trap. And I’m not alone in this sentiment. Where we are going, you don’t have to learn an interface. The interface will adapt to your needs. The pixel economy is moving from “learn our tools” to “just tell us what you want.””
- [Another serve](https://www.theguardian.com/media/2026/jan/14/social-media-time-does-not-increase-teenagers-mental-health-problems-study) in the very long ping pong game of “is it the phones or is it not the phones?”: “Increases in girls’ and boys’ social media use from year 8 to year 9 and from year 9 to year 10 had zero detrimental impact on their mental health the following year, the authors found. More time spent gaming also had a zero negative effect on pupils’ mental health.”
- This is [the greatest thing that has happened to streaming](https://x.com/steveruizok/status/2016904339483205734)in a long time.
- “AI handles the optimized stuff now. Better than we ever could. It finds patterns, maximizes output, eliminates waste. What it can’t do is be genuinely stupid. Being genuinely stupid might be the last human superpower. It can’t have the random collision that changes everything. AI raises the baseline.[Randomness becomes the edge.](https://writing.nikunjk.com/p/a-random-walk)” I’m starting to think that it’s the sum of our individual, unique experiences that’ll be of value in the future.
- [How to Choose Colors for Your CLI Applications](https://blog.xoria.org/terminal-colors/). More posts like this!
- [Anthropic](https://www.anthropic.com/research/AI-assistance-coding-skills): “In a randomized controlled trial, we examined 1) how quickly software developers picked up a new skill (in this case, a Python library) with and without AI assistance; and 2) whether using AI made them less likely to understand the code they’d just written. We found that using AI assistance led to a statistically significant decrease in mastery. On a quiz that covered concepts they’d used just a few minutes before, participants in the AI group scored 17% lower than those who coded by hand, or the equivalent of nearly two letter grades. Using AI sped up the task slightly, but this didn’t reach the threshold of statistical significance.

Importantly, using AI assistance didn’t guarantee a lower score. How someone used AI influenced how much information they retained.” I’m not sure whether this says all that much. You could’ve made a study ten years ago to reveal that the “study finds that programmers who use libraries don’t know exactly how they work.” I found this to be[an interesting comment](https://news.ycombinator.com/item?id=46821738).
- A website into which you can “login forever”: [loginwave](https://kylejwarren.com/loginwave/). This is my worst nightmare. If I were to keep this page open for five minutes, my heart rate would make my watch call an ambulance.
- [ISOCOASTER](https://iso-coaster.com/). I haven’t played this, at all, I just bought some food stands. So, let’s meet at the beautiful, beautiful nacho stand that I put right next to the beautiful, beautiful burger stand and sit in the shade.

---

---

# Joy & Curiosity #71

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 25, 2026

---

Do you have to know every line of code your agent writes?

No one actually says that, that you have to know *every* line, of course, but there is a spectrum of opinions and experiences that ranges from never looking at the code to reviewing everything the agent writes. It’s interesting to consider where to put oneself on that spectrum.

Most of the time, when I work with Amp, I know in advance (a) what I want the resulting code to do and (b) how I will test that it does exactly that.

Once Amp declares it’s done writing code, I test. And what I mean is that I “test”, in every possible meaning of the word. The goal is to make sure the code actually does what it’s supposed to do. That can mean: asking Amp to run the unit tests, asking it to manually test in a browser, asking it to run a command, or check the data in the database, run the curl. With every tool I have — Amp, code, my hands and eyes — I test the happy path, the teary path, the edge cases. I make sure to test with existing data, no data, real data, fake data. I think about what might be different in production and how I could test that. Sometimes I ask Amp itself how I can manually verify what it just did and ask it to walk me through the testing.

How exactly I test very much depends on what I’m testing. Not all functionality and code have the same blast radius. Some sit at the heart of a system, some are peripheral. Adjust accordingly.

But once I’ve tested something and compared how it works with my mental model of how it’s supposed to work, then the code, I find, becomes less important.

Yes, I’ll do spot-checks to make sure it isn’t completely insane (less and less of a problem with these new models). I also go through my mental list of always-check-these things like (a) where and how is the data stored (b) will this box us in and prevent future changes (c) security (d) does it touch functionality I hadn’t considered. Sometimes that can take a while, other times there’s barely anything to do.

But do I know every line of code? Not if I don’t have to.

---

- [“Is GitHub dead?”](https://x.com/thorstenball/status/2013619012932947993) Tried my hand at short-form video content and so far the responses have been lovely, which is very dangerous because of course do I love to pull out my phone, talk for four minutes, and blast it into the Internet. More coming.
- Quinn and I recorded [a new episode of Raising An Agent](https://ampcode.com/podcast), many months after the last one. The agent’s now all grown-up and, hey, “the assistant’s dead, long live the factory.”
- If you can understand German, this might also be something for you: the lovely [Tommy Falkowski](https://x.com/TommyFalkowski) interviewed me in German and we talked about AI, research in German, startups, and what I recommend to junior engineers nowadays. Very, very pleasant conversation.
- This post made me wonder whether I shouldn’t introduce a Post of the Week category: [Isometric NYC](https://cannoneyed.com/projects/isometric-nyc). The technology is interesting, the graphics are lovely, the writing is clear and great and humble and honest and true. I’m not going to quote anything here, because it would diminish everything else in the post. Go and read it and think about the fact that he didn’t write a single line of code and ask yourself whether it matters and then wonder what he used — which skills, what knowledge — to turn his idea into reality.
- Ryan Dahl, creator of Node.js, with [another toll of the bell](https://x.com/rough__sea/status/2013280952370573666): “This has been said a thousand times before, but allow me to add my own voice: the era of humans writing code is over. Disturbing for those of us who identify as SWEs, but no less true. That’s not to say SWEs don’t have work to do, but writing syntax directly is not it.”
- Quite a few people have asked me about [my thoughts on stevey’s Gas Town](https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04) but the truth is: I don’t have many thoughts on it and those that I have are rather boring. Here’s one of them: it’s an interesting experiment and probably, maybe, *something vaguely like this* might become a non-experiment in the future. Another one: I honestly like the Mad Max feeling of it all, I like that someone is out there burning those tokens down, doing token alchemy. I can’t think of many other people who can describe the mayhem of Mad Max Token Alchemy better than stevey. Then, when the whole crypto stuff started happening around Gas Town I had another thought, but let me express that one here by describing the bodily reaction I had: I took off my glasses, closed my eyes, and pinched the top of my nose. [Armin Ronacher described that part well: Agent Psychosis — Are We Going Insane?](https://lucumr.pocoo.org/2026/1/18/agent-psychosis/)
- Maggie Appleton, as always thoughtful and thorough and deep, described the other part: [Gas Town’s Agent Patterns, Design Bottlenecks, and Vibecoding at Scale](https://maggieappleton.com/gastown/).
- [What Does a Database for SSDs Look Like?](https://brooker.co.za/blog/2025/12/15/database-for-ssd.html) Marc Brooker took a tweet with a question (“What does a relational database designed specifically for local SSDs look like?”) as a prompt and turned it into this post. It’s great.
- [I’m addicted to being useful](https://www.seangoedecke.com/addicted-to-being-useful/), says Sean Goedecke. “There’s a lot of discussion on the internet about what ought to motivate software engineers: money and power, producing real value, ushering in the AI machine god, and so on. But what actually does motivate software engineers is often more of an internal compulsion. If you’re in that category - as I suspect most of us are - then it’s worth figuring out how you can harness that compulsion most effectively.” Or, [as Jerry Seinfeld said on Howard Stern](https://x.com/bpoppenheimer/status/1632775657108242433): “Your blessing in life is when you find the torture you’re comfortable with.”
- Ben Thompson on [AI and the Human Condition](https://stratechery.com/2026/ai-and-the-human-condition/): “In fact, I have great optimism that one potential upside of AI is a renewed appreciation of and investment in beauty. One of the great tragedies of the industrial era — particularly today — is that beauty in our built environment is nowhere to be found. How is it that we built intricate cathedrals hundreds of years ago, and forgettable cookie-cutter crap today? That is, in fact, another labor story: before the industrial revolution labor was abundant and cheap, which meant it was defensible to devote thousands of person-years into intricate buildings; once labor was made more productive, and thus more valuable, it simply wasn’t financially viable to divert so much talent for so much time. Perhaps it follows, then, that the devaluing of labor Patel and Trammell warn about actually frees humans up to once again create beauty? Yes, robots could do it too, but I think humans will value the work of other humans more. Indeed, I think this is coming sooner than you might think: I expect the widespread availability of high quality AI art to actually make human art more desirable and valuable, precisely because of its provenance.”
- Pure coincidence, but here’s another Ben Thompson piece that I really enjoyed this week: an [interview with Scott Kirby, CEO of United Airlines](https://stratechery.com/2026/an-interview-with-united-ceo-scott-kirby-about-tech-transformation/). Last year I flew quite a bit and the majority of those flights was with United and this interview made a lot of stuff click for me. One time my flight from SFO to FRA was delayed because the plane had some issue. The pilot announced that after we had already boarded and — I swear this is true — a minute after he made his announcement I got a push notification about why we need to deboard. Then I walked back into the airport and got another push notification, telling me that the new plane will be at gate so-and-so in two hours and — again: I swear — that plane was at that gate at exactly that time. It confirmed something that I’ve been ranting about for years after commuting by train for a while in Germany: there’s a delay and then there’s a delay with communication, they feel completely different. All of that is to say: I found that interview fascinating. And this quote stood out: “From my point of view, to your point about facing some structural disadvantages relative to other airlines, you overcame that from my perspective with technology, and the great thing about that is it benefits everyone. Even the basic economy flyer gets to use the United App and website, maybe not the refund part of it, but then by extension, that gives you the cost structure to be able to offer me better wine. That’s pretty inspiring.” Obvious when put like that, but it’s true, isn’t it? Everybody gets the same app and the same notifications because it’s all the same to United. Reminds me of[Warhol on Coca Cola](https://www.goodreads.com/quotes/82472-what-s-great-about-this-country-is-america-started-the-tradition).
- And here is Adam Mastroianni with even more optimism: [text is king](https://www.experimental-history.com/p/text-is-king). Great piece.
- “Some developers underestimate AI. They think their job is safe because AI makes mistakes. They’re wrong. AI is already good enough to handle a huge portion of routine coding work. But some AI enthusiasts overestimate the transformation. They think the human in the loop is a temporary limitation, a bottleneck to be optimized away. I think they’re wrong too. [The human in the loop isn’t a limitation](https://adventures.nodeland.dev/archive/the-human-in-the-loop/). It’s the point.” Written by Matteo Collina.
- Steve Ruiz, founder and CEO of [tldraw](https://tldraw.dev/), with thoughts on AI and open source and why they shut down external contributions to tldraw: [stay away from my trash!](https://tldraw.dev/blog/stay-away-from-my-trash) It’s very thoughtful and interesting (I haven’t looked at open source contributions in a year and have no clue what [it’s like to be in the war zone](https://x.com/mitchellh/status/2011958999034601839)) and I think what he writes here rhymes with my “Is GitHub dead?” video from above: “The question is more fundamental. In a world of AI coding assistants, is code from external contributors actually valuable at all? If writing the code is the easy part, why would I want someone else to write it? […] But if you ask me, the bigger threat to GitHub’s model comes from the rapid devaluation of someone else’s code. When code was hard to write and low-effort work was easy to identify, it was worth the cost to review the good stuff. If code is easy to write and bad work is virtually indistinguishable from good, then the value of external contribution is probably less than zero.”
- “The duel is on. Colossus 2’s blue water footprint is around 346 million gallons per year, while an average In-N-Out store (yes, burgers only) comes in at around 147 million gallons. That’s roughly a ~2.5 : 1 ratio. We’ll let the reader decide what to make of [the] important information that [one the largest datacenters in the world only consumes as much water as 2.5 In-N-Out’s](https://newsletter.semianalysis.com/p/from-tokens-to-burgers-a-water-footprint).”
- [Ryan Holiday writing about Stefan Zweig’s biography of Montaigne](https://ryanholiday.net/read-this-book-when-the-world-feels-like-its-falling-apart/) made me want to take a vacation in which I only read.
- And Derek Sivers makes me want to[fly to Kolkata and listen to Ulysses](https://sive.rs/ulysses).
- I’ve always been a fan of standup meetings, if done well. We currently don’t have one, but if I were to run one today, I’d send this piece by Marc G Gauthier to everyone on the team: [the way I run standup meetings](https://marcgg.com/blog/2024/11/20/standup).
- Not sure how much of this is over-interpretation of a quip, but it sounds like Google’s [loosening its stance on degrees being a requirement](https://www.yahoo.com/news/articles/google-cofounder-reveals-tons-recent-231500103.html).
- “[I left FAANG for a startup and regretted it](https://lawrenceztang.substack.com/p/i-left-faang-for-a-startup-and-regretted).” Rare honesty.
- Did you know that there are tiny, ultra-thin, super-light, magnetic e-readers that you can pop on the back of your phone? I didn’t! Apparently what sounds like amazing fiction is a real thing: [Xteink X4](https://www.xteink.com/products/xteink-x4). My birthday’s coming up and discovering this broke my usual “I don’t really need anything” stance. This, I need.
- David Crawshaw on something neat they do at [exe.dev](https://exe.dev) to make it possible for you to type “ssh undefined-behavior.exe.xyz” and get routed to the right machine: [SSH has no Host header](https://blog.exe.dev/ssh-host-header).
- If that made you go “whoa, right, SSH, huh, I don’t think too much about it, do I” then please read this:[Why Does SSH Send 100 Packets Per Keystroke?](https://eieio.games/blog/ssh-sends-100-packets-per-keystroke/) Excuse the language and, yes, I know, security, but fuck me: “In 2023, ssh added keystroke timing obfuscation. The idea is that the speed at which you type different letters betrays some information about which letters you’re typing. So ssh sends lots of ‘chaff’ packets along with your keystrokes to make it hard for an attacker to determine when you’re actually entering keys.”
- “The same slowness of reaction was apparent at scientific meetings. Many a time, a visiting young physicist (most physicists visiting Copenhagen were young) would deliver a brilliant talk about his recent calculations on some intricate problem of the quantum theory. Everybody in the audience would understand the argument quite clearly, but Bohr wouldn’t. So everybody would start to explain to Bohr the simple point he had missed, and in the resulting turmoil everybody would stop understanding anything. Finally, [after a considerable period of time, Bohr would begin to understand](https://outofcontextsite.wordpress.com/2017/03/11/slow/), and it would turn out that what he understood about the problem presented by the visitor was quite different from what the visitor meant, and was correct, while the visitor’s interpretation was wrong.”
- [Bugs Apple Loves](https://www.bugsappleloves.com/): “Why else would they keep them around for so long?” The AirDrop one? Oooh boy. Interesting list though, because, in a way, these are classic Apple bugs. Bugs that only show up this way in Apple software and that only stay unfixed like this in Apple software.
- It’s from 2023 and, at least on the surface, analyses and judges Musk’s takeover of Twitter, but the more interesting thing to me is how it uses Max Weber to construct this[lens of prophet vs. priest](https://crookedtimber.org/2023/05/06/the-cult-of-the-founders) with which to look at business leaders: “Prophets look to found religions, or radically reform them, root and branch. […] Prophets inspire cults – groups of zealous followers who commit themselves, body and soul to the cause. Prophets who are good, lucky, or both can reshape the world. […] The problem with prophecy is that ecstatic cults don’t scale. If you want your divine revelation to do more than rage through the population like a rapid viral contagion and die out just as quickly, you need all the dull stuff. Organization. Rules. […] Religion becomes a matter not for prophets, but priests – specialized administrators of the divine, who are less about ripping up rule books than writing and enforcing them. Prophets unsurprisingly, hate this transformation into mundanity.” Don’t miss the comments!
- [EU Inc.](https://x.com/andreasklinger/status/2013568714189246525?s=46) Hell yes. Now we just need those words to turn into actions.
- [Heavy Is the Crown: George R.R. Martin on His Triumphs and Torments](https://www.hollywoodreporter.com/tv/tv-features/george-rr-martin-interview-thrones-winds-dragon-knight-1236473519/). Many times over the years have I thought that George R. R. Martin now has one of the worst jobs in the world. Yes, his books have made him rich; yes, they turned into one of the biggest and most successful television shows of all time, but good god, the *expectations!* It’s been years since he published the last book in the series. 15 years! Fans are waiting for how he will finish it and whether and how he will make up for the disappointing finale of the tv show. 15 years, man! 15 years of sitting down in front of your computer running MS DOS, trying to write, knowing that millions of people around the world will read and judge every word you put out. I already have a weird thing with expectations and thinking about George R. R. Martin and the expectations he has to meet makes me think that he lives in writer hell.
- “Here’s a simple test you can apply to any software system you work on:

Imagine deleting the entire implementation. Not refactoring it. Not archiving it. Not putting it behind a feature flag. Deleting it. If that thought makes your stomach drop, pay attention. That reaction is telling you something important.” That’s Chad Fowler in [The Deletion Test](https://aicoding.leaflet.pub/3md5ftetaes2e).
- [Netzbremse](https://netzbremse.de/en/): “Deutsche Telekom is throttling the internet.” I had no clue. I’ve been a customer of Deutsche Telekom for many years and had absolutely zero clue that this was going on, but then this week I had some very peculiar performance issues when talking to something on Cloudflare. 50% packet loss, latency of over a second. What’s going on? Did I misconfigure something? Did Cloudflare? Turns out that it’s Deutsche Telekom, who essentially says to Cloudflare “you have to pay, otherwise it’s slow” and Cloudflare refuses to play along.
- “All of this folds back into a larger point. When attention is fragmented and speed becomes the dominant value, media rearranges itself around that reality. Not because anyone wakes up wanting to mislead people, but because the context makes some paths survivable and others impossible. […] This goes back to my original premise that [when velocity becomes the defining metric, authority is displaced](https://om.co/2026/01/21/velocity-is-the-new-authority-heres-why/). You don’t need to be right; you need to be first in the feed. Generalize this beyond YouTube tech reviews and you see the same pattern everywhere. I’m flabbergasted by how much good journalism goes unnoticed every day.”
- *Easily* [one of the greatest programming tweets of the last ten years](https://x.com/neilzegh/status/2013679440362975315).
- You know those breathing exercises to calm you down? Breathe in for four seconds, hold breath for five, breathe out for seven. There’s around fifteen variations of it and if you believe the Internet then the Navy SEALs use exercises like that to stay calm in combat situations. I’m here to tell you that [I found an alternative](https://www.youtube.com/watch?v=0PsOJ_fRckg).

---

---

# Joy & Curiosity #70

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 18, 2026

---

Here’s a question I think about every day now: what will happen to code?

A year ago I started to build a little Rust program. The plan: I paste an email in, the program sends the email to an LLM inside a specific prompt, I get back a reply. The usecase: sometimes I get emails from people that ask for a discount on [my books](https://interpreterbook.com). I nearly always say yes, go to LemonSqueezy, create a personalized coupon code (think: HEYANNIE), go back to the email and reply with where and how they can use that coupon code.

So I started to build this. Single file, one API call, a few-shot prompt, works if I hardcode an email in. But then I had to figure out what type of interface I want so I can paste the email in and get the response out and I got lazy and gave up on it. I don’t want to build a chat interface and image upload and whatnot. Once I had Amp, though, I came back to the project: maybe Amp can build all of this for me? But while doing that, I realized that, wait a second, why can’t *Amp itself* do what the program’s supposed to do? If I paste an email into Amp, it sure can figure out how to talk to LemonSqueezy, no problem. It can also write the two sentences for the reply email. But because I’m lazy I didn’t even do that, I just marked that as a possibility in the back of my head. Only four weeks ago did I go into that codebase again.

This time I told Amp: analyze what this codebase is supposed to do, here’s the documentation for the LemonSqueezy API, figure out how to create coupons and what type of response emails to write, then put everything you figured out into a SKILL.md file. After a minute it spit out that Markdown file and I asked it: can you create a coupon code for Annie who sent me this email? Yes, Amp said, I sure can. And off it went with curl and created a coupon code and gave me two sentences with instructions to send back to Annie.

No code, only Markdown.

Yes, not every codebase can be turned into instructions for an agent, and yes, it’s inefficient and costs money (even more money than the Rust-harness around a few-shot prompt would cost). But, directionally, there are a quite a few things that can be deconstructed into simply an agent with the right instructions and tools, are there not?

And then you throw things like [exe.dev](https://exe.dev/) and [sprites.dev](https://sprites.dev/) into the mix, where you could run an agent and store some tools and potentially have the agent write some helper code too, and you start to wonder what’ll happen to codebases and code.

Code will always be around and codebases for Serious Programs too, but you have to wonder: how much and which ones?

---

- [Our interview with DHH is now live!](https://www.youtube.com/watch?v=uWqno4HM4xA) Admittedly, we a made the mistake of not releasing it right after recording. In the time since, it seems as if David has (at least slightly) shifted his view on Opus 4.5 and writing code by hand. That being said: many other interesting things came up in the conversation. I especially found his thoughts on marketing & social media and the changing of that landscape to be very interesting.
- If you’re curious about which future we see at Amp: [we’re removing Amp Tab](https://ampcode.com/news/tab-tab-dead). The post also has a video in which Quinn and I go into a little bit more detail about why we’re doing this and how the ratio of hand-written vs. generated code has flipped.
- [A deep dive into ASCII rendering](https://alexharri.com/blog/ascii-rendering). Fantastic. A+. Impressive work and care and great writing too. This is the Gem of the Week (wish I could play a theme song for you right now.)
- Mark my words: this blog post is a gunshot in the quiet night and it’ll ring out for a very long time. [Why We Built Our Own Background Agent](https://builders.ramp.com/post/why-we-built-our-background-agent), by Zach Bruggeman, Jason Quense, and Rahul Sengottuveluramp at ramp. Nearly a year ago I stood on stage and said to a group of engineers that yes, you can ignore the hype, you can ignore AI, you can dig into your text editor and put your fingers in your ears. But not if you’re working in developer tooling, because your field will change like few others. And now here we are and look at what an internal team built.
- antirez is encouraging his readers [to not “fall into the anti-AI hype”](https://antirez.com/news/158): “Anyway, back to programming. I have a single suggestion for you, my friend. Whatever you believe about what the Right Thing should be, you can’t control it by refusing what is happening right now. Skipping AI is not going to help you or your career. Think about it. Test these new tools, with care, with weeks of work, not in a five minutes test where you can just reinforce your own beliefs. Find a way to multiply yourself, and if it does not work for you, try again every few months.” I wrote[a similar thing over a year ago](https://registerspill.thorstenball.com/p/they-all-use-it) and now I can add antirez to the list. The biggest surprise to me is how long it took agents to replace copy-pasting ChatGPT responses.
- Another entry on the list: Linus Torvalds. He used Antigravity to help him fix his audio visualization tool: “It mostly went smoothly, although I had to figure out what the problem with using the builtin rectangle select was.  After telling antigravity to just do a custom RectangleSelector, things went much better. [Is this much better than I could do by hand? Sure is.](https://github.com/torvalds/AudioNoise/commit/93a72563cba609a414297b558cb46ddd3ce9d6b5)”
- The team at ramp also [put Claude Code into Rollercoaster Tycoon](https://labs.ramp.com/rct).
- Now this, *this* is what it’s about, this is *it*, this is why computers have a power-on button and why we get up in the morning and why we have fingers to move the mouse and click and why we have eyes to see: so that someone, somewhere, can create something like this and then shoot it through thousands of miles of undersea cables into our eyeballs, and the only thing they get in return is the chance to have made the tiny muscles in our cheeks pull up the edges of our mouth: [gradient.horse](https://gradient.horse/).
- Wonderful personal blog post:[Paul Stamatiou’s 2025 in review](https://paulstamatiou.com/2025-year-in-review). It’s personal, it’s long, it’s about work (Paul “was Co-Founder and Head of Design at Limitless (née Rewind AI), which was acquired by Meta. Before that I spent 9 years at Twitter”), it’s about computers, about his car, about his home, about books, about design.
- Paul’s post led me to [this one, by Jenny Wen, on design & design process](https://jennywen.ca/notes/dont-trust-the-design-process): “But along the way, we lost something. The actual work we were producing. We spent so much time trying to decode our users in so many ways — a persona! Then a journey! Then a user flow! Then a lo-fi wireframe! Then a concept test! We focused on it so much, that we deemed the pixels unserious and unimportant. We stopped doing the real thing that would be the most empathetic, useful, and that would actually serve business outcomes best: building stuff that worked well and that people would love.” If you’ve never seen it happen, it’s hard to believe how much effort can go into building something without someone saying, “Wait a second, this is dogshit. I would never use this.” But I’ve seen it, I’ve *done it*: it’s tempting and very easy to tell yourself that you’re doing everything right when you’re following the process and doing the capital-I Important things in the order they shall be done, while forgetting that the most important thing is to build something you and others love.
- This post is already worth reading just because of that one gif in here, you’ll know which one: [the struggle of resizing windows on macOS Tahoe](https://noheger.at/blog/2026/01/11/the-struggle-of-resizing-windows-on-macos-tahoe/).
- “[Apple picks Google’s Gemini to run AI-powered Siri coming this year](https://www.cnbc.com/2026/01/12/apple-google-ai-siri-gemini.html)” As someone who thinks that Gemini 3 was the inflection point, not Opus 4.5: hell yes, bring it.
- And [OpenAI is collaborating with Cerebras](https://x.com/cerebras/status/2011531740804964855?s=46). If they can get the speeds out of GPT-5.2 that you’d expect when you hear the name Cerebras then the game will change.
- [Brian Lovin says to give our agents a laboratory](https://brianlovin.com/writing/give-your-agent-a-laboratory). Yes! Let the codebases and the agents melt! This is the year in which they do. Think of your codebase as an application: can the agent use it? If not, what is it missing? These models will get better, it’s time to prepare for the day when you no longer need to babysit them.
- Cursor has been “[experimenting with running coding agents autonomously for weeks.](https://cursor.com/blog/scaling-agents) Our goal is to understand how far we can push the frontier of agentic coding for projects that typically take human teams months to complete.” They didn’t aim low: “To test this system, we pointed it at an ambitious goal: building a web browser from scratch. The agents ran for close to a week, writing over 1 million lines of code across 1,000 files.” They had agents write a whole browser? [On Twitter Michael Truell added](https://x.com/mntruell/status/2011562190286045552): “It’s 3M+ lines of code across thousands of files. The rendering engine is from-scratch in Rust with HTML parsing, CSS cascade, layout, text shaping, paint, and a custom JS VM. It *kind of* works! It still has issues and is of course very far from Webkit/Chromium parity, but we were astonished that simple websites render quickly and largely correctly.” Holy fucking shit, right?[Simon Willison’s 3-year prediction can already be checked off?](https://simonwillison.net/2026/Jan/8/llm-predictions-for-2026/) Eh, [says embedding-shapes](https://embedding-shapes.github.io/cursor-implied-success-without-evidence/), not so fast. And that’s also what [the HackerNews comments say](https://news.ycombinator.com/item?id=46649046). Still, as someone who wants to be an optimist and who works with these agents on a day-to-day basis: maybe a quiet “holy shit” is apt?
- [The Death of Software Development](https://mike.tech/blog/death-of-software-development): “While software development as we know it is dead, software engineering is alive and well. The role has transformed. Engineers are no longer writing software — they’re designing higher-order systems. They’ve moved from crafting code to designing systems that write code. […] This new reality requires rethinking everything. Forty years of best practices are now outdated. The patterns we relied on, the team structures we built, the processes we followed — all of it needs to be reconsidered.”
- Uber blog on [Forecasting Models to Improve Driver Availability at Airports](https://www.uber.com/en-DE/blog/forecasting-models-to-improve-availability-at-airports/). What a read! So many thoughts: how complex the system is (it needs to be, right?), how hard some of these problems are and how easy they would be for a human, how much work went into this, when did they decide it’ll pay off to invest this much effort into optimizing that part of the system, … Real world software, baby.
- Take this and send it to everyone you know who’s switching from a large company to a startup: [no management needed: anti-patterns in early-stage engineering teams](https://www.ablg.io/blog/no-management-needed). It’s spot-on and it’s fascinating how hard it is to rethink this stuff from first principles when you’ve only experienced one side of it.
- “If all you think about is the tools that are available to you, then today is always a better time to start a company than yesterday, and today will always be worse than tomorrow. The cost of doing something with a computer goes one direction: Down. But what if those costs are falling quickly? What if doing things gets 10 percent cheaper every month? [Imagine what you could build if you just wait a year.](https://benn.substack.com/p/will-there-ever-be-a-worse-time-to)”
- [Inside Denmark’s struggle to break up with Silicon Valley](https://www.politico.eu/article/denmark-declared-war-against-big-tech-digital-sovereignty/). I had no clue that’s a thing, fascinating. [Reminded me a lot of LiMux](https://en.wikipedia.org/wiki/LiMux), even though it’s not comparable. But it kinda is.
- Bill Kennedy: “[I need everyone to start focusing on their engineering skills](https://x.com/goinggodotnet/status/2012209293651501069).” Great list.
- Content aside (because I haven’t even read it): [this thing has 82m views right now](https://x.com/thedankoe/status/2010751592346030461). Is that a lot? Is that not a lot? Are articles a thing? Yes, no? To tie this back to the DHH interview: there’s no playbook right now.
- Somehow I’ve come across [this clip of Tom Brady talking about becoming a master of the game](https://x.com/VivaLaStool/status/2011074323877118184) and I’ve now watched it four times and I think what he says in that one minute and fifty-six seconds is exactly what I wanted to say [with this](https://registerspill.thorstenball.com/p/oh-to-turn-off-your-mind) and and [this](https://registerspill.thorstenball.com/p/from-any-spot-on-the-field).

---

---

# Joy & Curiosity #69

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 11, 2026

---

Back to work this week and what a week it’s been! We had [a massive launch](https://ampcode.com/news/amp-free-frontier), we shipped [a lot](https://ampcode.com/news/user-invokable-skills) [of](https://ampcode.com/news/lazy-load-mcp-with-skills) [stuff](https://ampcode.com/news/agents-panel), I felt like I’m entering a new stage of agentic programming and burned more tokens than ever before.

But the week was also full of surprises.

Apparently, [thanks to Anthropic’s crackdown on other clients](https://news.ycombinator.com/item?id=46549823)using the Claude Code subscription for things that aren’t Claude Code, a lot of people realized for the first time that $200 per month isn’t the real price of these tokens. Surprise: I assumed that everybody knew that $200 can’t buy you all the things that people have been doing with those subscriptions; that it’s heavily subsidized (or optimized, I guess that’s what Anthropic would say). Turns out that assumption was wrong. People are shocked. Yes, *that’s* why we’re working so hard to make Amp affordable by leaning on the Internet’s Best Business Model, independent of a model house, not even making a profit on individuals’ consumption, without burning VC money or compromising the quality of the product by doing routing tricks behind the curtain.

The other surprise: people were surprised about the crackdown. I had assumed that everybody knew that you aren’t allowed to reuse the Claude Code subscription. To get one of those $200/month all-you-can-burn API keys with special rate limits, [you have to pretend to be the Claude Code OAuth client](https://github.com/anomalyco/opencode-anthropic-auth/blob/d698a1fa52ea077d81063e26f7a7d7785a282c8f/index.mjs#L3C20-L3C56) (also: [see how many did that](https://sourcegraph.com/search?q=context:global+9d1c250a-e61b-44d9-88ed-5944d1962f5e&patternType=keyword&sm=0)) and, I don’t know man, I was naive enough to think that engineers will understand that this isn’t how it was intended to be used, you know.

What I do know for a fact though: we’ve been told early on — in the middle of last year — that we can’t do that, we can’t reuse these Claude Code subscriptions in Amp, because they’re Claude Code only. And if we were told, I’m pretty sure, then others were told too. 

But now there’s a lot of shocked faces and pearls being clutched and Mr. Officer I didn’t know you need to validate the ticket, I didn’t see the sign, I swear.

---

- Yes, [we launched the next generation of Amp Free this week](https://x.com/sqs/status/2009510406772150599): up to $10 per day in credits, powered by ads, usable with Opus 4.5. Up to $300 per month in Opus 4.5 tokens. Go use it. $10 can get you a lot.
- More spicy news this week: “[Scoop: xAI staff had been using Anthropic’s models internally through Cursor—until Anthropic cut off the startup’s access this week.​​​​​​​​​​​​​​​​](https://x.com/kyliebytes/status/2009686466746822731?s=46)” Feels good to be model-house independent, tell you that.
- ezyang on the [gap between a Helpful Assistant and a Senior Engineer](https://blog.ezyang.com/2026/01/the-gap-between-a-helpful-assistant-and-a-senior-engineer/): “In principle, you could prompt the LLM agent to act like a Senior Engineer. In fact, why stop at Senior, let’s tell the LLM to be a Staff Engineer! Imagine that scaling continues: what would you expect the LLM to do when instructed to act in this way? Well, imagine a human L7 engineer who has just been hired by a big tech company to head up some big, new, multi-year initiative. Will they say, ‘Sure, I can help with that!’ and start busily coding away? Of course not: they will go out and start reviewing code, reading docs, talking to people, asking questions, shadowing oncalls, doing small starter tasks–they will start by going out and building context.” I agree, our analogies don’t fit anymore, because we haven’t had Frankenstein Engineers before.
- Dan Shipper on [Agent-Native Architectures](https://every.to/guides/agent-native). This was very interesting. It’s about building agents into end-user applications, but my current campaign slogan is that 2026 will be the year in which agents and codebases melt and this article made me wonder: what if you see your codebase as an application with which the agent has to interact, which tools can you provide?
- From the same thought-universe: Rijnard [on the Code-Only Agent](https://rijnard.com/blog/the-code-only-agent). “The Code-Only agent produces something more precise than an answer in natural language. It produces a code witness of an answer. The answer is the output from running the code. The agent can interpret that output in natural language (or by writing code), but the “work” is codified in a very literal sense. The Code-Only agent doesn’t respond with something. It produces a code witness that outputs something.”
- [The intro from last week’s issue](https://registerspill.thorstenball.com/p/joy-and-curiosity-68) made it into The Pragmatic Engineer: [when AI writes almost all code, what happens to software engineering?](https://newsletter.pragmaticengineer.com/p/when-ai-writes-almost-all-code-what) Next to it are quotes from DHH, Adam Wathan, Malte Uble. This Holiday season apparently really woke something up. Part of me thinks I need to find a non-arrogant way to say “see! I told you! I told you!” and the other part goes “what for?”
- Kevin Kelly: [How Will the Miracle Happen Today?](https://kk.org/thetechnium/how-will-the-miracle-happen-today/)
- Adam Wathan in his morning walk episode: “[I just had to lay off some of the most talented people I’ve ever worked with and it fucking sucks.](https://adams-morning-walk.transistor.fm/episodes/we-had-six-months-left)” This episode really blew up and resulted in viral tweets and HackerNews threads and apparently corporate sponsorship by companies that want to help Tailwind. The question on everyone’s mind: is this part of a bigger trend? It’s very sad that these layoffs had to happen and I really loved how Adam gave a long, personal referral to all three of the people involved. [Dan Hollick](https://alcohollick.com/) (dude what a URL), [Philipp](https://spiess.dev/), and [Jordan](https://github.com/thecrypticace). I’ve worked with Philipp before — he’s an outstanding, top-1% engineer. And, funnily enough, I’ve interacted with Jordan on GitHub before, because he worked on the Tailwind LSP server and I was working on Zed, trying to get it to work for some user configuration.
- In the wake of Adam’s podcast blowing up, a lot of people commented on Tailwind’s business model. A lot of noise, to be sure, but it also sparked some very interesting comments. [This one](https://dri.es/ai-is-a-business-model-stress-test), for example, is a very interesting lens with which to look at AI: “What I keep coming back to is this: AI commoditizes anything you can fully specify. Documentation, pre-built card components, a CSS library, Open Source plugins. Tailwind’s commercial offering was built on “specifications”. AI made those things trivial to generate. AI can ship a specification but it can’t run a business. So where does value live now? In what requires showing up, not just specifying. Not what you can specify once, but what requires showing up again and again. Value is shifting to operations: deployment, testing, rollbacks, observability. You can’t prompt 99.95% uptime on Black Friday. Neither can you prompt your way to keeping a site secure, updated, and running.” That first sentence — “AI commoditizes anything you can fully specify” — man, isn’t that something to think about.
- Talking about trends: the[number of questions on StackOverflow over time](https://data.stackexchange.com/stackoverflow/query/1926661#graph). Astonishing.
- This week I learned that [Martin Fowler is publishing Fragments](https://martinfowler.com/fragments/2026-01-08.html). And in that issue he links to [this post by Kent Beck](https://www.linkedin.com/feed/update/urn:li:activity:7413956151144542208/) that articulates something I haven’t been able to: “The descriptions of Spec-Driven development that I have seen emphasize writing the whole specification before implementation. This encodes the (to me bizarre) assumption that you aren’t going to learn anything during implementation that would change the specification. I’ve heard this story so many times told so many ways by well-meaning folks--if only we could get the specification “right”, the rest of this would be easy.” I think this is exactly what makes me skeptical of leaning too much into the “write all the PRDs and Plans and then just execute”-agentic-programming-workflows. Of course the devil’s in the “how do you plan?”-details, but Beck has a point: why would this time be different, why would the magic of “just write a really good, detailed plan and then execute” be different with AI? I don’t see a reason. On the contrary, I think the opposite stance — building software *is* learning about the software — is truer than ever: you need more feedback loops, more ways for the agent to hit reality, to learn, to course-correct.
- Fly released Sprites: [Code And Let Live](https://fly.io/blog/code-and-let-live/). This is very, very interesting. I’m starting to think that with agents we might be entering a new neither-cattle-nor-pet era, a time of pet/cattle-hybrids. Admittedly, [Simon Willison’s piece on Sprites helped me make more sense of it](https://simonwillison.net/2026/Jan/9/sprites-dev/) after I had a ton of questions (which I also sent to ChatGPT, like: “so are they saying agents should be always-on in these machines?”)
- Brian Guthrie’s [Move Faster Manifesto](https://brianguthrie.com/p/the-move-faster-manifesto). This is great. This part, on it being a choice, is spot-on: “But the hardest part of moving fast isn’t execution; it’s deciding that it’s necessary, and then convincing people that it’s possible.”
- I’ve become fascinated with [TBPN and their rise](https://www.tbpn.com/) this year, but still didn’t know that much about them, nor their backgrounds. This [Vanity Fair piece](https://archive.ph/2sqZt) filled some gaps — it isn’t just software changing, is it, it’s also media.
- And I really nodded along to [this post by Jordi Hays](https://x.com/jordihays/status/2009704114633298257/?s=12&rw_tt_thread=True), about AI needing a Steve Jobs: “Our AI leaders today seem to have forgotten to include humanity in the AI story. ‘If AI stays on the trajectory that we think it will, then amazing things will be possible. Maybe with 10 gigawatts of compute, AI can figure out how to cure cancer.’ - Sam Altman. I understand what Sam is saying here, and it’s not entirely fair to pick a random quote, but there’s no doubt that this type of phrasing is not what Steve would have done.”
- [Henrik Karlsson](https://www.henrikkarlsson.xyz/p/attention): “And you do the same thing with joy. If you learn to pay sustained attention to your happiness, the pleasant sensation will loop on itself until it explodes and pulls you into a series of almost hallucinogenic states, ending in cessation, where your consciousness lets go and you disappear for a while. This takes practice.” Made me wish I was better at directing my attention and thoughts.
- If you squint really hard and make a face and bend your head, this one is related to the Karlsson piece: “[Willpower Doesn’t Work. This Does.](https://archive.ph/RZxIM#selection-527.0-527.34)” But, hey, even if it isn’t related, it’s another good reminder.
- Max Leiter from Vercel on how they “[made v0 an effective coding agent](https://vercel.com/blog/how-we-made-v0-an-effective-coding-agent)”. The LLM Suspense framework is neat but it made me wonder: which model generation will make it obsolete?
- Jason Cohen [on the value of focus and what that even means](https://longform.asmartbear.com/focus). This is great and something I’ll reshare in the future.
- Nikita Prokopov saying [it’s hard to justify the icons in macOS Tahoe](https://tonsky.me/blog/tahoe-icons/). I can’t say with certainty — none of the machines I have are on Tahoe yet — but it looks like I agree with him. Strange feeling reading this, like finding out at the gate that the plane you’re about to board as a new type of airplane seat that has an average rating of 2 out of 5.
- “[You’re not that guy, Pal](https://www.youtube.com/watch?v=5ufTertgtK4).”

---

---

# Joy & Curiosity #68

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 3, 2026

---

For more than 15 years I thought that I loved writing code, that I loved typing out code by hand, that I loved the “cadence of typing”, as Gary Bernhardt once called it, when sitting in front of my editor and my fingers click-clacking on my keyboard.

Now, I’m not so sure anymore.

2025 was the year in which I deeply reconsidered my relationship to programming. In previous years I had the occasional “should I become a Lisp guy?”, sure, but not the “do I even like typing out code?” from last year.

What I learned over the course of the year is that typing out code by hand now frustrates me. It frustrates me in the same way that filling out a printed form by hand frustrates me. Writing my name and middle name and last name and my street address and my zip code in capital letters with this stupid pencil when all of this could’ve been done by a computer, god, why do I have to do this, why do you punish me? This is so stupid, so laborious, this shouldn’t exist. I once considered not taking the 50 Euros of reimbursement that Deutsche Bahn offered after a train was delayed for two hours because I would have had to fill out a form by hand.

Amp is now faster and better at writing code than I am and whenever I do have to go in and type some code it feels like I’m pulling out the sewing needle after the sewing machine broke down, like hammering nails by hand after the nail gun’s battery died.

And yet it was fun! It *was *fun to write code by hand, for many, many years, and when it stopped being fun I was sad. Do I even love programming and building software if the actual writing of code is now a nuisance?

And the sadness went away when I found my answer to that question. Learning new things, making computers do things, making computers do things in new and fascinating and previously thought impossible ways, sharing what I built, sharing excitement, learning from others, understanding more of the world by putting something and myself out there and seeing how it resonates — that, I realized, is what actually makes me get up in the morning, not the typing, and all of that is still there.

---

- One of the best things I’ve read in the past few weeks: [Two Years After Cormac McCarthy’s Death, Rare Access to His Personal Library Reveals the Man Behind the Myth](https://www.smithsonianmag.com/arts-culture/two-years-cormac-mccarthys-death-rare-access-to-personal-library-reveals-man-behind-myth-180987150/). I’ve only ever read Blood Meridian and All the Pretty Horses by McCarthy, but became fascinated by McCarthy, read his Wikipedia article many times and, wow, does this article deepen the fascination. I mean: “Trying to take it all in, I felt both fascinated and overwhelmed. It seemed almost inconceivable that an author who produced 12 novels, two plays and five screenplays had also found the time, energy and brainpower to master architecture, woodworking, stonemasonry and a wide range of intellectual disciplines. Some of his math books were nearly all equations.” And this part made me really happy: “When I asked Dennis about his brother’s reputation as a recluse, he said it was totally inaccurate. ‘He was very sociable and could get along with anybody. Well, almost anybody. He didn’t suffer fools gladly, or people who rushed up to him gushing about his books. But he had a lot of friends, and he loved dining and conversation, and five-hour lunches that sometimes turned into ten-hour lunches.’”
- [Kent Beck on the changing context around code reviews](https://tidyfirst.substack.com/p/party-of-one-for-code-review). I fully agree with him that the old process was already breaking: “The theory was synchronous-ish collaboration. The practice was PRs sitting for days while context decayed. Reviewers skimming because they had their own work to do. ‘LGTM’ culture—rubber stamping dressed up as process. […] The feedback loop got too slow to catch the things it was supposed to catch. By the time someone noticed a structural problem, three more features had been built on top of it. This isn’t a criticism of any particular team. It’s a recognition that the economics were already strained, the incentives skewed.” It took working at Zed for me and pairing instead of asynchronous code reviews to see it, though. And I very much agree with Beck on all the points he makes after that analysis. Things are changing and all the tooling around code reviews is built on the assumption that the code was written by a human, that it took a lot of time, that it took a lot of effort, that it would be painful to reorder the commits, that it would be demotivating having to redo the whole change, that the change is is very *valuable*. But what if it wasn’t? What if it wasn’t written by a human and what if it’s just one of, say, give proposed changes that all try to do the same thing, because you started five agents and raced them against each other? What if we don’t have to worry about how often someone or something would have to redo a contribution? What if we don’t have to worry about in which order they produced which lines and can change that? We’ve always treated auto-generated code different from typed-out code, is now the time to treat agent-generated PRs and commits different? What would tooling look like then?
- Chris Loy [on the rise of industrial software](https://chrisloy.dev/post/2025/12/30/the-rise-of-industrial-software). The analysis is spot on: “Traditionally, software has been expensive to produce, with expense driven largely by the labour costs of a highly skilled and specialised workforce. This workforce has also constituted a bottleneck for the possible scale of production, making software a valuable commodity to produce effectively.” And now, with AI the “first order effect of this change is a disruption in the supply chain of high quality, working products. Labour is disintermediated, barriers to entry are lowered, competition rises, and rate of change accelerates. All of these effects are starting to be in evidence today, with the traditional software industry grappling with the ramifications.” I think this is happening, 100%, and I also think that most people who disagree are only thinking about the 1% of software, about the 1% of software engineers, but not about the industry, which has been held up [$150/hour](https://davegriffith.substack.com/p/software-development-in-the-time) (“the labour costs of a highly skilled and specialised workforce”). What I don’t agree with is the negative view of industralisation. There’s too many mentions of “slop” and “cheap” in a negative sense. But industrialisation also gave us cheap calories, and fridges, and medicine, and transportation, and to address his point directly: I think paperbacks are great! I only bought paperbacks as a teenager because I couldn’t afford hard-cover books.
- [Aaron Levie on the same point](https://x.com/levie/status/2004654686629163154/): “Jevons paradox is coming to knowledge work. By making it far cheaper to take on any type of task that we can possibly imagine, we’re ultimately going to be doing far more. The vast majority of AI tokens in the future will be used on things we don't even do today as workers.”
- Paul Dix, CTO of InfluxDB, [on how 2026 will be a pivotal year for software engineering](https://x.com/pauldix/status/2006423514446749965): “once coding speed jumps, everything around it becomes the constraint. Your throughput gets capped by whatever is slowest—clarifying requirements, reviewing changes, validating correctness and performance, getting to production safely, and operating what you shipped. In 2026, the great engineering divergence will be determined by who raises that ceiling end-to-end.” Highly recommend reading it. I agree with everything here.
- I always enjoy reading Fogus’ end-of-year lists and this one, in particular, contained a lot of good stuff: [The Best Things and Stuff of 2025](https://blog.fogus.me/2025/12/23/the-best-things-and-stuff-of-2025.html). Quite a few of the things he’s linked to have made it into this list here, but there’s a lot more in the post. In fact, I saved the post for this issue even before I made it to the very smart, very true, very thought-provoking paragraph on LLMs at the end: “I’ve had zero success leveraging it in my work maintaining and evolving Clojure. For problem formation in the face of novelty, LLMs have been more frustrating than helpful and the little gains that I’ve found were in the very early phases of problem solving requiring a bare minimum of experimental code. […] In my work, the bottleneck is absolutely not the code.” I’m glad that he doesn’t fall into the trap that seemingly caught a lot of other programmers and declare that, well, I am a programmer and it can’t help me, so everybody else who is a programmer must also do the same things I do and LLMs can’t help them either. And the bit on LLMs failing as Socratic partners is spot-on.
- And here’s Rich Hickey himself on AI: “[When did we stop considering things failures that create more problems than they solve?](https://gist.github.com/richhickey/ea94e3741ff0a4e3af55b9fe6287887f)” I’m not sure whether I agree with parts of it, but it also seems like Rich Hickey and I have very different views of the world and I’m glad I read this and I think you should too.
- Solidly in the Curiosity column:[I Was Kidnapped by Deutsche Bahn and All I Got Was 1.50 EUR](https://www.theocharis.dev/blog/kidnapped-by-deutsche-bahn/). One hell of a ride. Read through the [HackerNews comments](https://news.ycombinator.com/item?id=46419970) too, there’s more anecdotes in there. I’ll save mine, I’m in too good of a mood today.
- “Google hired Hans-J. Boehm, of the ‘Boehm garbage collector’ fame. They needed an elite coder to fix garbage collection and concurrent programming. He led the effort to define C++ shared variable semantics. [But then they gave him an impossible task: write a calculator app](https://chadnauseam.com/coding/random/calculator-app).” This article made the rounds in February 2025 but I had never read it. Now I did and I’m very, very glad about that. Amazing.
- This was the first Christmas Day I can remember on which we didn’t have any appointments or people to visit or places to be and so while the kids played with their presents, so I sat down, opened up this list, [The Top Twenty-five New Yorker Stories of 2025](https://www.newyorker.com/culture/2025-in-review/the-top-twenty-five-new-yorker-stories-of-2025), and read five or six of them.
- [This one](https://www.newyorker.com/magazine/2025/01/13/why-is-the-american-diet-so-deadly), from the list, was great and finally made me understand the whole idea of “ultra-processed foods” (a term I’ve read and read about many, many times.)
- Here’s another one from the same list that I loved: [the New Yorker profile of Lorne Michaels](https://www.newyorker.com/magazine/2025/01/20/lorne-michaels-profile). It has *so much* in it. Yes, it’s a profile, but, man, it does inspire thoughts about creativity, and comedy, and management, and working with other people, and working with other creative people on the same thing, and processes and decision making,… It’s just very good.
- This one wasn’t on the list, it’s from 2014: [Does It Help to Know History?](https://www.newyorker.com/news/daily-comment/help-know-history) I really don’t know why, but somehow knowing that it’s from 2014 made reading it even better. “But the best argument for reading history is not that it will show us the right thing to do in one case or the other, but rather that it will show us why even doing the right thing rarely works out. The advantage of having a historical sense is not that it will lead you to some quarry of instructions, the way that Superman can regularly return to the Fortress of Solitude to get instructions from his dad, but that it will teach you that no such crystal cave exists. What history generally ‘teaches’ is how hard it is for anyone to control it, including the people who think they’re making it.” (Anecdote: [I wrote a tweet about this article](https://x.com/thorstenball/status/2004256635129418106) in roughly 20 seconds and it ended up being three words and then, while I was sleeping, something happened and I woke up to the tweet having five thousand likes and then Grimes retweeted it and then I muted it and then the whole Internet left weird comments on it and now it has twelve thousands likes and one point two million views. What the fuck.)
- This also wasn’t on the list, but hey, it has my vote to be: [The Real Housewives of Moscow](https://www.newyorker.com/culture/the-weekend-essay/the-real-housewives-of-moscow).
- [Mergiraf](https://mergiraf.org/) is a tool to help with merge conflicts, which is interesting, but, dude, man, click on that link and look at those comics. It’s so absurd — fantastic.
- Great: [Three ways to solve problems](https://andreasfragner.com/writing/three-ways-to-solve-problems).
- [I Program on the Subway](https://www.scd31.com/posts/programming-on-the-subway). As someone who essentially wrote two books while on the train, I enjoyed this a lot. Yes, even though I’d never even consider affixing keyboards to my pants.
- I had a very good time reading this and pasting snippets into ChatGPT and asking it follow-up and side-questions: [I’ve been writing ring buffers wrong all these years](https://www.snellman.net/blog/archive/2016-12-13-ring-buffers/). (Then, the next day, in a restaurant, I played [Hangman](https://en.wikipedia.org/wiki/Hangman_(game)) with my 8-year-old daughter and when it was my turn to guess, I thought, hey why not, and took a photo and asked ChatGPT, just to see whether it could find all the 5 missing letters. And you know what GPT-5.2 Thinking did? It proudly proclaimed that yes, it can solve this, because what we’re looking at — these letters and lines — is clearly a diagram showing a ring buffer! So much for ChatGPT’s memory system, eh?)
- “In the four passages above, the first and fourth were mine; the second and third were A.I.-generated. Dana described an A.I.-produced line that seemed hokey to me as ‘especially your style.’ Another reader referred to an A.I.-generated quip as ‘your distinct style of wry humor.’ I also got plenty of insults about passages that were legitimately mine: ‘verbose and heavy on cliché,’ ‘weirdly elliptical,’ ‘sounds like a book report,’ ‘a lot of extra commas.’ Most hated the passage about writing for an audience; only one attributed it to me. Karan called it ‘some hive mind’s “idea” of literature.’ Surprisingly, I wasn’t hurt that my friends and fans couldn’t tell the difference. [...] Still, I couldn’t avoid the truth. Seven excellent readers had mistaken an A.I. model for me. Seven excellent readers had mistaken me for an A.I. model.” Even a year ago, I’d say, this was unimaginable for everyone except the strongest believers, wasn’t it? And now [this is in The New Yorker](https://www.newyorker.com/culture/the-weekend-essay/what-if-readers-like-ai-generated-fiction). The whole thing is excellent and thought-provoking, especially because it’s much more unpredictable than you would assume.
- [A Call for New Aesthetics](https://newaesthetics.art/) by Patrick Collison and Tyler Cowen.
- [Austin Henley on cancelling the deal he’s had with a publisher to write a book](https://austinhenley.com/blog/canceledbookdeal.html) that’s “a collection of tutorials on building these projects, each self-contained and teach fundamental computing concepts along the way”, where “projects” means “classic programming projects that were relevant 30 years ago and will be just as fun 30 years from now”, like [this list that Austin made](https://austinhenley.com/blog/challengingprojects.html) and that I’ve referred to quite a few times. As someone who’s self-published and who has an allergic reaction to the idea of working with a traditional publisher: quite the interesting post. And as someone who’s thought about releasing a 10-year anniversary editions of his book this year, this paragraph resonates with something I’ve been thinking about: “There was also a daunting voice in the back of my head that LLMs have eliminated the need for books like this. Why buy this book when ChatGPT can generate the same style of tutorial for ANY project that is customized to you?”
- Samuel Albanie’s [Reflections on 2025](https://samuelalbanie.substack.com/p/reflections-on-2025). He’s the Evals Lead for Gemini at DeepMind and, apparently, a very entertaining writer. This was great. For example, this sentence about the bitter lesson, after his explanation of the bitter lesson and how it relates to his work and how it made a lot of the things he previously did invalid, is fantastic and cherry-on-top-y: “The lesson is bitter because it means our most sophisticated ideas often fail to compound.” And then there’s this bit, where he compares his experience of being an assistant professor and grading papers to now doing evals: “The job is effectively the same, except the student has read the entire internet, hallucinates with the confidence of a mid-tier management consultant, and I cannot deduct marks for illegible handwriting. The comfort of my simple handwritten rubrics is behind me. Instead, I find myself staring at a proposed refactor of a distributed training loop, trying to calibrate my skepticism. Is this a brilliant optimization, or a subtle race condition that would only manifest seventy-two hours after deployment, likely on a Sunday evening?” Good writing. Very good.
- “every year i make new years resolutions, the generic fitness, discipline, reading, etc. but really, i can and will trade all of those to be truly, completely, absolutely creatively consumed by something. [there is nothing better](https://x.com/willdepue/status/2005775306943271058)”
- In case your New Year’s resolutions include checking out Jujutsu and being consumed by it, this series by Andre Arko is a good, short intro: [part 1](https://andre.arko.net/2025/09/28/jj-part-1-what-is-it/), [part 2](https://andre.arko.net/2025/10/02/jj-part-2-commands/), [part 3](https://andre.arko.net/2025/10/12/jj-part-3-workflows/), [part 4](https://andre.arko.net/2025/10/15/jj-part-4-configuration/). And then here are “[stupid jj tricks](https://andre.arko.net/2025/09/28/stupid-jj-tricks/)” and here’s [a very sophisticated jj prompt for the shell](https://andre.arko.net/2025/06/20/a-jj-prompt-for-powerlevel10k/) that I’m likely going to steal by pointing Amp at the post and my zshrc. After reading through these posts, I also ended up re-reading [this official primer on working with jj and GitHub](https://docs.jj-vcs.dev/latest/github/), which I find very good, and I also ended up reading through [this jj configuration](https://gist.github.com/thoughtpolice/8f2fd36ae17cd11b8e7bd93a70e31ad6), which contains some very interesting bits.
- [Ian’s Shoelace Site](https://www.fieggen.com/shoelace/knots.htm) made the rounds again and let me tell you something: if you haven’t, click through it! You *must!* This is the Internet at its best. This will make you smile, I promise.
- [what-dan-read.com](https://what-dan-read.com/) — Impressive.
- I managed to catch up at least a little bit with Dan Hollick’s Making Software book and read [the chapter on shaders](https://www.makingsoftware.com/chapters/shaders). Fantastic stuff. The illustrations, the design, the sound effects — go look at it and you’ll end up reading. And while I did that, I kept thinking that it would be nice to play around with some shaders. So I asked Amp to create a shader playground with WebGPU for me and it did and it took 2min and then I had another browser tab open and played around with the concepts explained in the chapter. Wild times. Here’s [the playground](https://thorstenball.com/shader-playground) in case you too want to click around.
- Will Larson on “[Code-driven vs LLM-driven workflows](https://lethain.com/agents-coordinators/)”. Rule of thumb, I’d say: you want your control flow to be deterministic and you want the fuzzy parts to be fuzzy. Don’t make the control flow fuzzy.
- I personally found [this post by Ivan Zhao](https://x.com/ivanhzhao/status/2003192654545539400), CEO of Notion, very, very interesting. Yes, long-form Twitter posts have a certain patina to them that’s hard to overcome, especially when paired with prediciations of the future, *but* it does reveal something about Notion’s strategy, does it not? It reads to me like they (or Zhao, at least) see themselves as the tool for knowledge workers in a future in which AI glues everything together. I wonder what Anthropic would say to that. The other interesting perspective is his view on how AI will change business. There’s been many voices saying that the future belongs to the 1-person startup, which is now feasible thanks to AI, but here’s Zhao saying that, nuh-uh, actually, we can now build *even larger* corporations.
- Peter Steinberger’s [Shipping at Inference-Speed](https://steipete.me/posts/2025/shipping-at-inference-speed) is a great snapshot of what one could do with agents at the end of 2025. And it’s still funny to me that [the oracle](https://ampcode.com/news/oracle) as a name and idea was adopted by him.
- Dan Wang’s [2025 letter](https://danwang.co/2025-letter/). It’s very long and I’ve never read one of his annual letters before so I didn’t know what to expect, but it pulled me right in by asking: “Which of the tech titans are funny?” But the letter is, of course, about a lot more: China, US, China vs. US, Silicon Valley, manufacturing, AI, Europe and its future or non-future, books. I read the whole thing yesterday evening and it’s great, yes, but the analysis of Europe’s state (which I can’t disagree with) is depressing. One for the Curiosity, not the Joy column. This section here, though, I’ll hopefully always remember fondly, I love that picture: “Alexander Grothendieck used an analogy of a walnut to describe different approaches to mathematics, which might also apply to technology development. Some mathematicians crack their problems by finding the right spot to insert a chisel before making a clean strike. Grothendieck described his own approach as coming up with general solutions, as if he were immersing the walnut in a bath for such a long time that mere hand pressure would be enough to open it.” Reminds me of Kent Beck’s “make the change easy, then make the change”, reminds me of some of the best engineer’s I worked with who did so many small, easy-looking things in preparation for the big thing that once they were ready to tackle it, the big thing no longer looked big, but just as small as all the other things they did before. Reminds me of…
- … Aaron Patterson wrote down his answer to: [Can Bundler Be as Fast as uv?](https://tenderlovemaking.com/2025/12/29/can-bundler-be-as-fast-as-uv/) The whole post is great. This is, I’d say, thoughtful engineering. The fake Gemserver he built to test the hypothesis for parallel downloads? He soaked that walnut there, didn’t he?

---

---

# Joy & Curiosity #67

*Interesting & joyful things from the previous week*

By Thorsten Ball • December 21, 2025

---

Last issue of the year, let’s do this!

This week, [Ryan](https://www.ryancarson.com/) and I got to interview [DHH](https://de.wikipedia.org/wiki/David_Heinemeier_Hansson). It’s very rare that I get nervous before an online conversation, but this was one of those times. I mean, that’s the guy who made Rails, man! I wouldn’t be here without Rails. Rails is what I did for the first seven years of my career. Rails is the reason *why* I have a career. I read every book he and Jason have ever written, of course, and 37signals has had as deep an impression as a company can have on probably anybody who’s worked in a startup between 2008 and 2015.

…and then we had a great conversation. It’s been a few days, and different parts of it keep popping back into my head. David said quite a few things that I now feel I *have* to share. Some things about marketing that resonate with what we’ve been talking about internally; some things I want the world to hear; some things that were funny; other things that were very fascinating (he said he still writes 95% of his code by hand); and the rant on cookie banners that I want politicians to hear.

But here’s something that I want to leave you with, in this last edition of the year, this year that brought and announced more change to this profession than any other year I’ve lived through as a working software developer. Here’s something that David said that sums up why I’m excited and so curious about where all of this is going, something that I hope makes you feel something positive too:

“Where does the excitement come from? First and foremost, I love computers and I love to see computers do new things. It’s actually remarkable to me how many people who work in tech don’t particularly like computers. Yes, even programmers who have to interact with them every day and make these computers dance, not all of them like computers. I *love* computers. I love computers just for the— *sheer machine of it*. I’m not just trying to be instrumental about it. I’m not just trying to use computers to accomplish something. There’s a whole class of people who view the computer just as a tool to get somewhere. No, no, no. For me, it’s much deeper. I just love the computer itself and I love to see the computer do new things. And this is the most exciting new thing that computers have been doing, probably in my lifetime. Or at least it’s on level with the network-connected computer. Yes.”

The computer can now do new things.

---

- My teammate Tim wrote about how he ported his TUI framework from Zig to TypeScript and how, in the process of porting it, he noticed that he’s getting in the way of the agent, slowing it down and costing more tokens. So he took his hands off the wheel and what we ended up with is this: [A Codebase by an Agent for an Agent](https://ampcode.com/by-an-agent-for-an-agent). I’ve shared this story quite a few times in person. I’m really happy it’s out now, so we have proof: this is an world-class terminal expert and programmer, letting an agent write 90% of the code, and ending up with something that is *really*, really good. (Also, side note: I contributed the images and, man, it’s so fun to put stuff like this out into the world.)
- This was fantastic: Jeff Dean and Sanjay Ghemawat with [Performance Hints](https://abseil.io/fast/hints.html). When I opened it I thought I’d skim it, but then I read the whole thing, looked at a lot of the examples, asked ChatGPT some questions along with screenshots. The writing is clear and precise and simple, the section with the napkin math is impressive, the emoji map optimization is what made me open ChatGPT, and then at the end there, in the *CLs that demonstrate multiple techniques *section, there’s this header *3.3X performance in index serving speed! *and when you click on it you’ll read that they “found a number of performance issues when planning a switch from on-disk to in-memory index serving in 2001. This change fixed many of these problems and took us from 150 to over 500 in-memory queries per second (for a 2 GB in-memory index on dual processor Pentium III machine)” and then you realize what an impressive cathedral of software engineering Google’s infrastructure is. Click here for a good time, I’m telling you.
- The TUI renaissance isn’t over: [Will McGugan just released Toad](https://willmcgugan.github.io/toad-released/), a “unified experience for AI in the terminal.” Taking inspiration from Jupyter notebooks is very smart and I love those little UI interactions he built. Good stuff.
- The title is “[Prompt caching: 10x cheaper LLM tokens, but how?](https://ngrok.com/blog/prompt-caching/)” so you might think that this is about prompt caching, but, haha, that’s silly. Listen, this is about *everything*. It’s one of the best all-in-one explainers of how transformers work that I’ve come across. It’s by [Sam Rose](https://samwho.dev/), who’s very good at visual explanations, and here he does a full explanation of how text goes into an LLM and text comes out the other end, including visuals, pseudo-code, in-depth explanations. It’s very, very good. If you don’t know how a transformer works, do yourself a favor and read this. If you do know how it works, look at this and smile at the visualizations.
- Imagine you’re holding two rocks. One has written on it: “terminals can display images now, thanks to the [kitty’s terminal graphics protocol](https://sw.kovidgoyal.net/kitty/graphics-protocol/)”. The other: “when you think about it, a GUI framework does nothing but create images and display them, right?” Now the question is: what happens if you smash those two rocks together? This: “[DVTUI](https://github.com/cryptocode/dvui?tab=readme-ov-file)” (note the quotes!), which takes a GUI framework (DVUI), gets it to save PNGs instead of rendering them to the screen, and then uses a TUI framework (libvaxis) to render those images in the terminal. To quote: “All that happens every single frame. And yet it works.”
- As you know, I’m a sucker for lists like this one: Tom Whitwell’s [52 things I learned in 2025](https://medium.com/@tomwhitwell/52-things-i-learned-in-2025-edeca7e3fdd8). Wonderful.
- … and it brought me to this: [write to escape your default setting](https://kupajo.com/write-to-escape-your-default-setting/). “Writing forces you to tidy that mental clutter. To articulate things with a level of context and coherence the mind alone can’t achieve.” Yes. Now, in times of LLMs, it’s probably more apparent than ever before that writing (real writing; writing *you do*) is thinking.
- [How I wrote JustHTML using coding agents](https://friendlybit.com/python/writing-justhtml-with-coding-agents/): “After writing the parser, I still don’t know HTML5 properly. The agent wrote it for me. I guided it when it came to API design and corrected bad decisions at the high level, but it did ALL of the gruntwork and wrote all of the code.” I bet there’s a lot of people who read this and think “*ha! so he doesn’t know HTML5 still!*” And yet I wonder: was that the goal? It’s a very good post. A very calm, practical post, but that raises a fundamental question: JustHTML is now “3,000 lines of Python with 8,500+ tests passing” and “passes 100% of the html5lib test suite, has zero dependencies, and includes a CSS selector query API” — how many more dependencies could we turn into that now?
- [Martin Kleppmann](https://martin.kleppmann.com/2025/12/08/ai-formal-verification.html): “I find it exciting to think that we could just specify in a high-level, declarative way the properties that we want some piece of code to have, and then to vibe code the implementation along with a proof that it satisfies the specification. That would totally change the nature of software development: we wouldn’t even need to bother looking at the AI-generated code any more, just like we don’t bother looking at the machine code generated by a compiler.”
- “[The perfection of snow in the paintings of Danish artist Peder Mørk Mønsted](https://x.com/FedeItaliano76/status/2000953954763727285).”
- Stripe Press: [Tacit](https://www.stripe.press/tacit). “The mechanism for developing tacit knowledge is straightforward but slow: repeated practice that gradually moves skills from conscious effort to automatic execution. The mechanism for transmitting it is even slower: apprenticeship, where a learner works alongside someone experienced, observing and imitating until their own judgment develops. This is why tacit knowledge often concentrates in lineages, unbroken chains of practitioners passing expertise to the next generation. […] AI has elevated the distinction between what is tacit and what is not. Language models can summarize and automate, but when they attempt to create something that carries the signature of human craft, the result is often flat.” In the[words of Tamara Winter](https://x.com/_TamaraWinter/status/2001725441368035349): Tacit is a series of mini-documentaries that are “ vignettes of craftspeople who provide a pretty compelling answer to the question, ‘after AI, does mastery still matter?’”
- I need to try this: [Geoffrey Litt’s JIT Guide Workflow](https://x.com/geoffreylitt/status/1991909304085987366).
- This [fantastic post by Jakob Schwichtenberg](https://blog.jakobschwichtenberg.com/p/slowness-is-a-virtue)shifted something in my head: “Our very definition of intelligence encodes the bias toward speed. The modern definition of intelligence is extremely narrow. It simply describes the speed at which you can solve well-defined problems. Consider this: if you get access to an IQ test weeks in advance, you could slowly work through all the problems and memorize the solutions. The test would then score you as a genius. This reveals what IQ tests actually measure. It’s not whether you can solve problems, but how fast you solve them.” And then: “In fact, it’s not hard to imagine how raw processing speed can be counterproductive. People who excel at quickly solving well-defined problems tend to gravitate toward... well-defined problems. They choose what to work on based on what they’re good at, not necessarily what’s worth doing.”
- … but then there’s James Somers saying “[Speed matters: Why working quickly is more important than it seems](https://jsomers.net/blog/speed-matters).” And [Nat Friedman is saying](https://nat.org/): “It’s important to do things fast. You learn more per unit time because you make contact with reality more frequently. Going fast makes you focus on what’s important; there’s no time for bullshit.” And [Patrick Collison is collecting fast projects](https://patrickcollison.com/fast). Then here I am, wondering, and possibly assuring myself: yeah, we’re not all doing the same things, are we?
- antirez’[Reflections on AI at the end of 2025](https://antirez.com/news/157). “The fundamental challenge in AI for the next 20 years is avoiding extinction.”
- Yes, this is in The New Yorker: “I trust in TextEdit. It doesn’t redesign its interface without warning, the way Spotify does; it doesn’t hawk new features, and it doesn’t demand I update the app every other week, as Google Chrome does. I’ve tried out other software for keeping track of my random thoughts and ideas in progress—the personal note-storage app Evernote; the task-management board Trello; the collaborative digital workspace Notion, which can store and share company information. Each encourages you to adapt to a certain philosophy of organization, with its own formats and filing systems. But nothing has served me better than the brute simplicity of TextEdit, which doesn’t try to help you at all with the process of thinking.” Great title too: [TextEdit and the Relief of Simple Software](https://www.newyorker.com/culture/infinite-scroll/textedit-and-the-relief-of-simple-software).
- Also The New Yorker, on [performative reading](https://www.newyorker.com/culture/the-lede/performative-reading), and reading, and books, and social media: “Reading a book is antithetical to scrolling; online platforms cannot replicate the slow, patient, and complex experience of reading a weighty novel. [...] The only way that an internet mind can understand a person reading a certain kind of book in public is through the prism of how it would appear on a feed: as a grotesquely performative posture, a false and self-flattering manipulation, or a desperate attempt to attract a romantic partner.”
- LLMs and physical laws? [Maybe](https://arxiv.org/abs/2512.10047): “The dynamics of LLM generation are quite unique. Compared to traditional rule-based programs, LLM-based generation exhibits diverse and adaptive outputs. […] To model the dynamic behavior of LLMs, we embed the generative process of LLM within a given agent framework, viewing it as a Markov transition process in its state space. […] Based on this model, we propose a method to measure this underlying potential function based on a least action principle. By experimentally measuring the transition probabilities between states, we statistically discover […] To our knowledge, this is the first discovery of a macroscopic physical law in LLM generative dynamics that does not depend on specific model details.”
- “’Climbing Everest solo without bottled oxygen in 1980 was the hardest thing I’ve done. I was alone up there, completely alone. I fell down a crevasse at night and almost gave up. Only because I had this fantasy - because for two years I had been pregnant with this fantasy of soloing Everest - was I able to continue.’ This is [how Messner talks about how his will was governed](https://kittymayo.substack.com/p/possessed-by-fantasy).”
- I regularly remind myself and sometimes even others of Jason Fried’s [Give it five minutes](https://signalvnoise.com/posts/3124-give-it-five-minutes). It’s one of the most influential things I’ve read in the past ten years. I constantly think of it and I’m convinced it’s improved my mental well-being and my connections to other people like few others things. Yes, I know how this sounds, but, I guess, an idea and a specific phrase that sticks with you can go a long way as far as life-changing is concerned. Now, all of that is just context, because what I want to actually share is this Jason Fried piece here: [Idea protectionism](https://world.hey.com/jason/idea-protectionism-01ef4f59). I re-found and re-read it after sharing the other Jason Fried piece and wanting to share the Jony Ive quote in *this* one and, yup, stumbled across it by chance. Lucky.
- [Reuters reports on China’s Manhattan Project](https://www.reuters.com/world/china/how-china-built-its-manhattan-project-rival-west-ai-chips-2025-12-17/). This is *it, *baby! This has it all: corporate espionage, ASML, lithography, “one veteran Chinese engineer from ASML recruited to the project was surprised to find that his generous signing bonus came with an identification card issued under a false name”, EUV systems that “are roughly the size of a school bus, and weigh 180 tons”, Germany’s Carl Zeiss AG, “networks of intermediary companies are sometimes used to mask the ultimate buyer”, “employees assigned to semiconductor teams often sleep on-site and are barred from returning home during the work week, with phone access restricted for teams handling more sensitive tasks”, and, of course, the tension at the heart of it all: “Starting in 2018, the United States began pressuring the Netherlands to block ASML from selling EUV systems to China. The restrictions expanded in 2022, when the Biden administration imposed sweeping export controls designed to cut off China’s access to advanced semiconductor technology. No EUV system has ever been sold to a customer in China, ASML told Reuters.”
- I didn’t know this is a thing, this was funny: [the Beckham rumour that refuses to die](https://spectator.com/article/the-beckham-rumour-that-refuses-to-die/).
- At work, we ended up talking about Christmas traditions and while I was explaining that where I live the magical entity that makes presents appear is called “christkind” (christ child), I was also trying to find proof on Wikipedia so I’d seem less weird and found [this map](https://en.wikipedia.org/wiki/Christmas_gift-bringer#/media/File:Christmas-gift-bringers-Europe.jpg). Note the filename: Christmas-gift-bringers-Europe.jpg. Great name. But now see where the green and the brown mix, in the middle of Germany? That’s where I live. So not only does one legend say it’s Baby Jesus bringing presents, it’s also that in the next town over it’s the Christmas Man. And that dude looks an awful lot like its American cousin Santa Claus, who has a lot more media appearances and higher popularity in the younger-than-10 demographic. Try to keep your story straight when you talk to a 4-year-old who keeps asking you whether she’ll get a computer for Christmas. How grand it must be to live in Iceland, where, according to that map, the *Christmas Lads* live.
- “[This song is called Red 40. It’s about Hot Cheetos](https://youtu.be/LBuwjdY9GRI?list=RDLBuwjdY9GRI&t=217).”

---

---

# Joy & Curiosity #66

*Interesting & joyful things from the previous week*

By Thorsten Ball • December 14, 2025

---

The number one thing that I keep thinking about these days is how to reconcile the following in my head:

Friends of mine — very experienced and very good programmers — are saying loudly and publicly and in private too that agents are useless. It’s slop, they say. It’s all just averages. No brilliance, no creativity, and half of it doesn’t work. It can’t do what I do. They point out where it failed to make an edit. Where it gave a function a weird name. Where it didn’t run the tests.

Then there’s my experience with using them. I see Amp knock out stuff that would’ve taken me days and, as a junior engineer, possibly weeks, if I had done it myself. I saw Amp built a tiny and *brilliant* renderer for box-drawing characters in my terminal emulator. It does performance optimizations, it builds very good looking animations in our TUI framework. It built [this](https://x.com/thorstenball/status/1996155667418116110) and [this](https://github.com/rockorager/prise) and [this](https://x.com/thorstenball/status/1971526222661423239) with no hands on the wheel. I saw it build a one-off migration tool for our production database, carefully balancing tradeoffs here to build something that’s reliable and inspectable, but also one-off, with as little code as I would’ve written. It helped me deploy and run it and then refine it.  When it can’t find jq on a machine, it uses Python for one-liners, doesn’t matter. Yesterday I had it help me configure Home Assistant on my Raspberry Pi and I just sat there and talked to it like a true assistant.

It’s very good. Very, very, very good. So good that I’m starting to think the whole “we will all just delegate work to agents” might not be as unrealistic as it sounds like.

But then someone writes somewhere that these agents “can barely write code” and I can’t help but silently wonder: what the hell are you talking about man?

---

- My teammate Lewis wrote about how he does context management in Amp and how [200k of tokens is plenty](https://ampcode.com/200k-tokens-is-plenty) if you use handoff, references, and forks. And then he also shipped the [thread map](https://ampcode.com/news/thread-map), which, when [he first showed it off in Tallinn](https://x.com/thorstenball/status/1996155667418116110) a week ago, caused a whole *scene* in the room, with people saying “whoa” and “holy shit” out loud. Not kidding. People literally gathered around Lewis saying *ooh *and *aah* while showed off what he had built. That, in turn, made *me* get up and walk over and also say “holy shit, dude”.
- [Ryan and I talked to Mckay Wrigley about Opus 4.5](https://www.youtube.com/watch?v=fv7zZT9y5FQ) and how we see the future of software development. It’s all happening, isn’t it.
- Obie Fernandez (*the* Obie Fernandez in case you also used Rails between 2010 and 2015) on “[what happens when the coding becomes the least interesting part of the work](https://obie.medium.com/what-happens-when-the-coding-becomes-the-least-interesting-part-of-the-work-ab10c213c660)”. This is some of the realest, truest, most experienced writing on the topic of agents taking over. I agree with nearly everything he writes here.
- Related, Paul Buchheit: “It was always possible to clone software, but doing so was costly and time consuming, and the clone would need to be much cheaper, making any such venture financially non-viable. With AI, that equation is now changing.” Read [the other two paragraphs](https://x.com/paultoo/status/1999245292294803914?s=46).
- Great: [The Resonant Computing Manifesto](https://resonantcomputing.org/). Before I started reading, just by name and context alone, I had assumed this it was going to be another “we have to fight the slop!” chant, but it’s not. It actually sees a chance in AI: “This is where AI provides a missing puzzle piece. Software can now respond fluidly to the context and particularity of each human—at scale. One-size-fits-all is no longer a technological or economic necessity. Where once our digital environments inevitably shaped us against our will, we can now build technology that adaptively shapes itself in service of our individual and collective aspirations. We can build resonant environments that bring out the best in every human who inhabits them.” But it’s a chance we have to take: “Regardless of which path we choose, the future of computing will be hyper-personalized. The question is whether that personalization will be in service of keeping us passively glued to screens—wading around in the shallows, stripped of agency—or whether it will enable us to direct more attention to what matters.”
- [My productivity app is a never-ending .txt file](https://jeffhuang.com/productivity_text_file/). Mine is Apple Notes.
- [How Not to Waste Your Life](https://www.themarginalian.org/2025/10/31/hawthorne-life/): “it is only, in poet Mario Benedetti’s shimmering words, when we cease sparing ourselves and start spending ourselves that we come truly alive.” When we cease sparing ourselves and start spending ourselves. And then: “Because the mind is the crucible of experience and perception, there is no greater waste of life than the waste of mind.” And then, on Hawthorne: “What fortifies the spirit to do its work in the world, be it art or activism, often appears on the surface as wasted time — the hours spent walking in a forest and watching the clouds over the city skyline and pebble-hunting on the beach, the purposeless play of the mind daydreaming and body dancing, all the while ideas and fortitudes fermenting within.” How very hard is it to live your life like that and how very easy it sounds, doesn’t it.
- [How to be exceptional at anything](https://abdulhamidhassan.com/post/802459222214410240/how-to-be-exceptional-at-anything). Alternative name: how to be someone people want to work with.
- [GPT-5.2 came out](https://openai.com/index/introducing-gpt-5-2/). A new frontier model is very interesting, of course, but this part here, in the “economically valuable tasks” section of the post, really stuck with me: “GPT‑5.2 Thinking beats or ties top industry professionals on 70.9% of comparisons on GDPval knowledge work tasks, according to expert human judges. These tasks include making presentations, spreadsheets, and other artifacts. GPT‑5.2 Thinking produced outputs for GDPval tasks at >11x the speed and <1% the cost of expert professionals, suggesting that when paired with human oversight, GPT‑5.2 can help with professional work.” It’s been years since I’ve had to create a spreadsheet or a presentation for work, so it’s a bit of a blind spot for me, but all I could think was: yeah, they’re really going after office work now, just like Anthropic.
- Hacker News [user keepamovin used Gemini 3](https://news.ycombinator.com/item?id=46205632) to hallucinate the Hacker News frontpage ten years from now:[Hacker News frontpage 2035](https://dosaygo-studio.github.io/hn-front-page-2035/news). It’s very good! My favorite: “Show HN: A text editor that doesn’t use AI”
- That Hacker News experiment caused Andrej Karpathy to look *backwards* in time. [He built the Hacker News time capsule](https://karpathy.bearblog.dev/auto-grade-hn/) in which GPT-5.1 grades comments from ten years ago on their prescience.
- Brian Cantrill on [using LLMs at Oxide](https://rfd.shared.oxide.computer/rfd/0576). There’s a lot of good stuff in there, but this, I think, is my favorite distillation: “Finally, LLM-generated prose undermines a social contract of sorts: absent LLMs, it is presumed that of the reader and the writer, it is the writer that has undertaken the greater intellectual exertion. (That is, it is more work to write than to read!) For the reader, this is important: should they struggle with an idea, they can reasonably assume that the writer themselves understands it — and it is the least a reader can do to labor to make sense of it. If, however, prose is LLM-generated, this social contract becomes ripped up: a reader cannot assume that the writer understands their ideas because they might not so much have read the product of the LLM that they tasked to write it.” Makes me think of all the times I’ve asked other engineers to write an RFC about something they propose we should do. Often the goal wasn’t the RFC, but that someone sits down and *thinks*.
- Wish I could remember how I ended up reading [this](https://read.readwise.io/archive/read/01kb0810j3xvtyc8an5ehc71e1): “⁠⁠Sometimes, the most romantic thing a person can do is hand you a thought they’ve been carrying for years. They do so gently, as though it might break in your hands. It could be a memory wrapped in a metaphor or a belief they’ve never said aloud until now. These moments are quiet offerings as invitations to step into their interior world.”
- Daniel Miessler in [The Bubble Is Labor](https://danielmiessler.com/blog/the-real-bubble-is-human-labor): “Companies only hire people because they can’t do all the work themselves. […] In other words, the only reason the current labor market (and our economy that’s based on it) exist at all is because there’s a group of founders/owners who need lots of help producing their goods and services. They are not required by anyone to hire me or you to help them if they don’t need that help. And the exact moment they can do the work themselves, they will, and not a second after.” I really don’t mean this in a smug why-isn’t-everyone-as-smart-as-me way and maybe it’s because I’ve only ever worked in start-ups or small companies or maybe it’s because my parents and grandparents have always been self-employed, but: yeah, of course, and the sooner you figure this out, the better your career will go.
- “[What happens when Cormac McCarthy rewrites your economics paper?](https://substack.com/@michaelnielsen1/note/c-179937886)”
- One of my many computing blind spots comes from the fact that I don’t use a lot of Microsoft products. I have no clue how probably 90% of all office workers in the world use their computers. So [this article here, on Microsoft’s AI offerings failing](https://www.windowscentral.com/artificial-intelligence/microsoft-has-a-problem-nobody-wants-to-buy-or-use-its-shoddy-ai), was very interesting: “Dare I say it, Gemini is actually helpful, and can usually execute tasks you might actually need in a day to day job. ‘Find me a meeting slot on this date to accommodate these timezones’ — Gemini will actually do it. Copilot 365 doesn’t even have the capability to schedule a calendar event with natural language in the Outlook mobile app, or even provide something as basic as clickable links in some cases. At least Xbox’s Gaming Copilot has a beta tag to explain why it fails half of the time. It’s truly absurd how half-baked a lot of these features are, and it’s odd that Microsoft sought to ship them in this state. And Microsoft wants to make Windows 12 AI first? Please.”
- I gave a five minute speech at the pub last night about [this](https://x.com/tomfgoodwin/status/1998415311100641418): “I’ll say it every month. But competent use of Excel or Google Docs could have wiped out 30% of white collar jobs , but that’s not how it works. Heck, 40% of roles could be eliminated if people just knew how to run a meeting better and could prioritize.“ The big question isn’t whether these models are amazing (they are), but whether it’ll matter or not.
- Admittedly, I didn’t get all of it, but this was very interesting: [seeing like an agent](https://www.strangeloopcanon.com/p/seeing-like-an-agent). Good punchline too: “internal markets improve on hierarchy when coordination costs fall - False (GTM dominates Engineering even with full information)” And the article led me to read up on [The Nature of the Firm](https://en.wikipedia.org/wiki/The_Nature_of_the_Firm), which I thought was very handy.
- [Size of Life.](https://neal.fun/size-of-life/)
- Adrien Grand and Morgan Gallant on the turbopuffer blog: [Vectorized MAXSCORE over WAND, especially for long LLM-generated queries](https://turbopuffer.com/blog/fts-v2-maxscore). The conclusion is very interesting: “‘Serial and dumb’ can often beat ‘smart and random’ on modern CPUs. Furthermore, agents write longer queries than humans, so it’s becoming increasingly important for text search to scale well with the number of terms. These factors force us to periodically revisit our choices of algorithms and their implementations. For text search, this means that the cursor has shifted more and more from WAND to MAXSCORE, which scales better with the number of terms and can be tuned to be more CPU-friendly.” (I pair-read this with GPT-5.2 to try it out and asked it about a bunch of the scoring-related algorithms, recommended.)
- [More Nano Banana prompting tips](https://x.com/GoogleAIStudio/status/1994480371061469306), this time straight from Google.
- Talking about that Nano Banana: let’s not forget how confusing and absurd and funny (in the Kafka way) it is t[o even get started with Google models](https://ankursethi.com/blog/gemini-api-key-frustration/). Raise your hand and leave a like if you too thought “what the hell is a model *garden*, man” the first time you saw it.
- I can’t tell you what it’s about, to be honest, and I don’t even know whether this is the right name, but [Shopify Editions Winter ‘26 “The Renaissance Edition”](https://www.shopify.com/editions/winter2026) is a very beautiful and fascinating page. I’m usually a bit meh as soon as scroll effects show up, but this one? Very nice.
- Very often I think of [this pair of Emmett Shear tweets](https://x.com/eshear/status/1760496397424685415): “People who have only ever worked for companies structured into clear hierarchy are missing an entire mode of work and collaboration which is vastly more … alive, for lack of a better word. The trusted-peers-on-a-mission mode it incredible. Early startups, bands, movie crews, sports teams, happy families on vacation…they mostly operate in this mode especially at first. You’re just jamming together, people are looking out for the group and themselves as one.”
- Good reminder: [Notes on Internet Addiction](https://x.com/benroy/status/1999215143729742002?s=46). I’m no saint and I catch myself ending thoughts with “… but it’s also been so good to me!” The only thing that truly has worked: set a 30 minute per day limit for all social media apps on my phone, *lock that limit behind a password, *and — here comes the crucial bit that makes this work — and let my wife set the password. Believe me: you don’t want to ask your wife “can you give me 20 more minutes of Twitter?” very often.
- Hell yes, SVGs rock: [an SVG is all you need](https://jon.recoil.org/blog/2025/12/an-svg-is-all-you-need.html).
- This was inspiring and made me want to build more things and change how I approach building them: [Rebuilding Our Website for the Agent Era](https://www.prefect.io/blog/rebuilding-our-website-for-the-agent-era). “Teams are buying powerful tools and wondering why everything still feels slow. The answer is usually that they’re running agents on infrastructure designed for humans. Once you rebuild the infrastructure, everything becomes this fast.” I’ve been saying this for the past year: for decades developer tooling had to adapt to the codebase. “Oh, your tool doesn’t work in our monorepo? Sorry, no can do.” Now, though, with these agents, the monorepo will adapt, is my bet. The pull is too strong. The big question: what does the codebase of the future look like? That’s what we want to find out at Amp.
- Eli Bendersky is [revisiting Jack Crenshaw’s “Let’s Build a Compiler”](https://eli.thegreenplace.net/2025/revisiting-lets-build-a-compiler/) — lovely!
- My Christmas present to you: [Tinker, Tailor, Soldier, Spy (1979) Edited, HD, English Subtitles](https://www.youtube.com/watch?v=3V3BzelGSPg). Yes, *yes*, this is the BBC Tinker Tailor, the one with Alec Guinness playing George Smiley, all in one video, on YouTube, with freaking subtitles. You know how rare that is? It’s rare, man. I love the 2011 movie and watched it many times and last week I finally had the good sense to just search on YouTube for the BBC version, which I’ve been wanting to watch for years now, but it’s very hard to find in Germany, in English, with subtitles. It’s so good watching this and comparing it to the movie and see what choices they made differently.

---

 

---

# Joy & Curiosity #65

*Interesting & joyful things from the previous week*

By Thorsten Ball • December 7, 2025

---

When we started working on Amp in February, ten months ago, I couldn’t have predicted this. Nor could I have in May, when we released Amp to the world. Nor in the weeks following that. But in the last few months, it began to cross our minds.

Then, suddenly, it changed from a Maybe to an Inevitable, from something that might be a good idea to something we had to do to give it the chance it deserves, the chance it demands. 

On Tuesday, [we announced that Amp is becoming its own company: Amp, Inc.](https://ampcode.com/news/amp-inc)

I’m part of the founding team, one of twenty cofounders of this newly formed research lab that has one big goal: to let software builders harness the full power of artificial intelligence.

A year ago, when I left Zed, I couldn’t have imagined that rejoining Sourcegraph would turn into a new product and a new company.

But, of course, I also couldn’t have imagined how much AI would still change the practice of software development - three years after ChatGPT. Today I’m more convinced than ever that what we’re going through is only in its opening movement.

I’m also more excited than ever to figure out where this will lead. And Amp, Inc. is the vehicle we’re building with which to explore that frontier.

---

- [Bun is joining Anthropic](https://bun.com/blog/bun-joins-anthropic). I was honestly surprised that people were surprised by this and I don’t mean this in a humble-braggy “what, you haven’t figured out the twist of the movie in the first 5min, like I have?” way. I think the kicker is in this line: “But there’s a bigger question behind that: what does software engineering even look like in two to three years?” What *does* software engineering look like in the future? Well, what I do know is that even *right now* it already looks completely different than it did in 2022 when Bun was first released to the world. Now, ask yourself: in 2026, with agents being on the trajectory they are on, would you start to work on a *framework*, in the classic sense, to improve developer productivity? Or are there bigger levers? I’ve been thinking about these questions for the last year and when I saw the news, it wasn’t surprise I felt.
- Maybe related: [Brendan Gregg is leaving Intel](https://www.brendangregg.com/blog//2025-12-05/leaving-intel.html)and “accepted a new opportunity.” He writes: “It’s still early days for AI flame graphs. […] I think as GPU code becomes more complex, with more layers, the need for AI flame graphs will keep increasing.”
- [Daniel Lemire](https://lemire.me/blog/2025/12/03/why-dont-we-get-more-scientific-breakthroughs/): “The tidy, linear model of scientific progress—professors thinking deep thoughts in ivory towers, then handing blueprints to engineers—is indefensible. Fast ships and fast trains are not just consequences of scientific discovery; they are also wellsprings of it. Real progress is messy, iterative, and deeply intertwined with the tools we build. Large language models are the latest, most dramatic example of that truth.” Hard to pick a quote, the whole thing is great and thought-provoking. As is [this yes-and reply to it](https://x.com/halvarflake/status/1996560875592003840): “we often first see something that works, then we understand it”
- Jimmy Miller with the “[easiest way to build a type checker](https://jimmyhmiller.com/easiest-way-to-build-type-checker)”. I’ve done exactly this with [Monkey](https://monkeylang.org/) before, it’s a lot of fun.
- A Senior Staff Engineer at Google on “[Why I Ignore The Spotlight as a Staff Engineer](https://lalitm.com/software-engineering-outside-the-spotlight/)”: “The tech industry loves to tell you to move fast. But there is another path. It is a path where leverage comes from depth, patience, and the quiet satisfaction of building the foundation that others stand on. You don’t have to chase the spotlight to have a meaningful, high-impact career at a big company. Sometimes, the most ambitious thing you can do is stay put, dig in, and build something that lasts. To sit with a problem space for years until you understand it well enough to build a Bigtrace.” I read the whole thing with one eyebrow raised kept thinking of [the distinction between cost centers and profit centers](https://boge.lu/cost-centers-vs-profit-center/).
- A [black hole in 125 bytes of JavaScript](https://aem1k.com/blackhole/).
- “Are you here because you are looking, like I was, for advice? Unfortunately—this is, in a way, the problem—[whatever I could say about parenting](https://feeld.co/magazine/pleasures/essays/mother-maybe-by-hannah-black) is trapped in the soundproof box of cliché. Everything you have heard about having kids, good or bad, is true. Children are blessings and bring blessings. They are exhausting and raise the stakes of all your limitations and flaws to vertiginous heights. Love for children is Love, the romantic kind, the song kind, the ordinary kind. Parenting resembles religious practice in the way it links the broad sweep of the sacred to the smallest of everyday tasks.” As so often: I don’t know how I ended up reading this, but I’m glad I did.
- Lot of talk about [CVE-2025-55182 this week, the “critical-severity vulnerability in React Server Components”](https://vercel.com/changelog/cve-2025-55182). I’m usually not that interested in vulnerabilities (modulo how I’m affected), but I really enjoyed reading through [this proof-of-concept by Moritz Sanft](https://github.com/msanft/CVE-2025-55182). Excellent technical writing and explanations. Also: *jesus.*
- “But during that stretch, a friend and colleague kept repeating one line to me: ‘All it takes is for one to work out.’ He’d say it every time I spiraled. And as much as it made me smile, a big part of me didn’t fully believe it. Still, it became a little maxim between us. And eventually, he was right – that one did work out. [And it changed my life.](https://alearningaday.blog/2025/11/28/all-it-takes-is-for-one-to-work-out-2/)”
- When I first heard that Haribo, the gummy bear company, now sell power banks  and that they’re apparently really good, I couldn’t believe it. Haribo? Power banks? Non-gummy, actual, usable, very good power banks? What? [Turns out there’s issues with it](https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones): “The Haribo power bank weighs roughly 286g and has a capacity of 20,000 mAh. That ratio drew attention because it implied efficient cell packaging. Our scans show that the structure inside the pouch has bigger problems than sheer capacity.” And that’s the way the gummy melts, I suppose.
- Tim Ferriss on [the value of aggression](https://tim.blog/2012/11/11/the-value-of-aggression-ode-to-dan-gable/): “The [above video clip](https://www.youtube.com/watch?v=olpmZTFoAPE) is from Dan Gable – Competitor Supreme, which my mom bought for me when I was 15. It changed my life. I watched it almost every day in high school, and it kept me fighting through all the various losses in life. Didn’t finish the SAT in time? Watch Dan Gable. Have a guidance counselor laugh while telling me I don’t stand a chance of getting into Princeton? More Dan Gable. Lost my first important judo match in 7 seconds? Watch the Iowa Hawkeyes…again and again and again. Then, return to the same tournament six months later and win. In life, there are dog fights. You must learn to enjoy them. Few people look forward to banging heads (literally or metaphorically), and therein lies the golden opportunity.”
- [Dark patterns killed my wife’s Windows 11 installation](https://www.osnews.com/story/143376/dark-patterns-killed-my-wifes-windows-11-installation). Man, I got sweaty hands and flashbacks reading this.
- Very entertaining: [The “Mad Men” in 4K on HBO Max Debacle](https://fxrant.blogspot.com/2025/12/the-mad-men-in-4k-on-hbo-max-debacle.html). I love Mad Men, but this was also a great read because it’s Classic Internet in some sense: someone, somewhere, sits down with enough motivation to pull all those screengrabs together and then posts them on the Internet.
- Matt Godbolt (*the* Matt Godbolt) is currently writing [Advent of Compiler Optimisations 2025](https://xania.org/AoCO2025) and from what I’ve read ([Why xor eax, eax?](https://xania.org/202512/01-xor-eax-eax) and [Addressing the adding situation](https://xania.org/202512/02-adding-integers)) it’s very good.
- [Another guide on how to prompt Nano Banana Pro](https://www.fofr.ai/nano-banana-pro-guide). Nothing groundbreaking, but the prompts are good and, man, Nano Banana Pro is just really good and I like reading more about it.
- [This PDF here](https://readwise-assets.s3.amazonaws.com/media/wisereads/articles/building-an-ai-native-engineer/1040.pdf), by OpenAI, is about how to build “an AI-native engineering team” and, in my opinion, the most interesting and most telling thing in the whole file is that each section has these two headers: “How coding agents help” and “What engineers do instead”. What engineers do instead, indeed.
- Murat Demirbas telling us to [optimize for momentum](https://muratbuffalo.blogspot.com/2025/12/optimize-for-momentum.html): “So the trick is to design your workflow around staying in motion. Don’t wait for the perfect idea or the right mood. Act first. Clarity comes after. If a task feels intimidating, cut it down until it becomes trivial. Open the file. Draft one paragraph. Try freewriting. Run one experiment. Or sketch one figure. You want the smallest possible task that gets the wheel turning. Completion, even on tiny tasks, builds momentum and creates the energy to do the next thing. The goal is to get traction and stop getting blocked on an empty page.” Yes, yes, yes, yes. Momentum is everything. I’d take momentum and mistakes and breakage over slow perfectionism every day.
- The first time I saw [the sunshine map at the top here](https://exclav.es/2023/08/24/sunshine-maps-revisited/) something in me broke: wait, you’re telling me, *all* of the US gets more sun than I do? Including Boston? Boston, the-lake-sometimes-freezes Boston? And freaking Seattle, the place that’s always portrayed as if Drizzle had been a better name for it? And New York? That New York that’s also movie New York where the steam comes out of the manhole covers? That place gets more sun than I do? You’re telling me when they shoot a movie there and it’s blue skies, they didn’t get lucky and picked the one day in the month it’s clear skies, but that they often have blue skies? It’s been at least four years since I first saw that map and I bring it up a lot (*a lot*, sorry). This week, while in Estonia, I brought it up again, of course, and while trying to find that map, I found that page that I linked to here, the one that starts with “I’ve always thought these sunshine maps were a little suspicious.” That sentence made me flinch — uh, oh, did I talk about a hoax all these years? Turns out I didn’t. The map is real. It’s all real. And if you scroll down to the solar power irradiance maps you’ll find that even freaking goddamn Ottawa gets as much sun as northern Italy.
- [Deep, deep dive into how prompt caching works](https://sankalp.bearblog.dev/how-prompt-caching-works/).
- This was good and a great reminder: [ruthless prioritization while the dog pees on the floor](https://longform.asmartbear.com/prioritization/). “In fact we can’t help but prioritize, even if mindlessly. Since we can only do one thing at a time, whatever we’re doing now is definitionally our ‘highest priority.’ Reading this sentence is currently your highest priority.” I once worked in a company that tried to set up a weekly company meeting. One team was always absent. “We just don’t have the time to make it to this meeting,” they said. I ranted about that team to my team lead and he said, “well, everyone has the same amount of time. They *chose* to prioritize it differently. If the CEO would say that everybody who doesn’t show up gets fired, they would have the time to make the meeting.” And the pupil was enlightened, as they say.
- “many large firms are making massive capital commitments behind ai services this year with the hope of lowering cost, increasing scale, and (unsaid) shaving off some of the exuberant hiring of the zirp years. my suggestion is that these firms will see almost zero roi from this spend. why? [because you can instrument capabilities, not competence](https://x.com/WillManidis/status/1995488856750125133?s=20). […] remember: most firms got the internet in the 90s; most did not use it to its full economic potential until 2020. the gap between 1999 and 2020 was not a lack of fiber optic cable. it took thirty years for the ‘competence’ of remote work and digital commerce to catch up to the ‘capability’ of executives can buy all the compute they want. they can instrument the capability until their dashboards overflow. but until they do the messy, un-instrumentable work of rewiring entire organizations to trust and utilize these tools, the long march will drag on.”
- Bouke van der Bijl built [a Rust program that can do rootless pings](https://bou.ke/blog/rust-ping/). One of the first programs I attempted to write as a teenager was a *ping* clone in Python, so when I saw that post fly past, I hopped on. The intro, though, made me pause: “The ping command line tool works without root however, how is that possible? It turns out you can create a UDP socket with a protocol flag, which allows you to send the ping rootless. I couldn’t find any simple examples of this online and LLMs are surprisingly bad at this (probably because of the lack of examples).” LLMs are surprisingly bad at this? At writing a ping? Really? Let’s see. So I asked Amp to build a ping without requiring root. And [it did it, with one prompt from my side](https://ampcode.com/threads/T-24e54d7a-e8bf-4eae-8b10-681a20b4ca50). Then I thought: maybe the challenge is that it *must* use UDP, like Bouke wrote there? So I asked Amp to do it again, this time using UDP. [It did it again](https://ampcode.com/threads/T-a3057eda-3ae9-44bc-b20f-4847738b0f0d) and concludes: “It works! The trick is using socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) instead of SOCK_RAW. This creates an unprivileged ICMP socket that the kernel handles specially - no root required.” And that’s exactly what [a HackerNews commenter also writes](https://news.ycombinator.com/item?id=46119375), criticizing the “trick is to use UDP” line: “This is wrong, despite the Rust library in question’s naming convention. You’re not creating a UDP socket. You’re creating an IP (AF_INET), datagram socket (SOCK_DGRAM), using protocol ICMP (IPPROTO_ICMP). The issue is that the rust library apparently conflates datagram and UDP, when they’re not the same thing.” LLMs are surprisingly something, but not bad at this.
- This is beautiful: [Bootstrapping Computing](https://buddybindery.com/bootstrapping-computing).
- [Stripe City](https://bfcm.stripe.com/)is impressive. This [behind-the-scenes series of posts](https://x.com/devinjacoviello/status/1995911570438979600) is too: “@bits_by_brandon not only built this interaction, he drove the train and recorded every sound.”

---

---

# Joy & Curiosity #64

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 30, 2025

---

I was live on Twitch this week, using Amp to hack on my little side- and toy-project terminal emulator. It’s written in Rust, barely has any third-party dependencies, and does its rendering using Metal and the GPU. 

Without exaggeration (and I know it sounds like exaggeration, but hey, it’s not): this was some of the most magical stuff I’ve ever experienced with agents.

You can still watch [the whole thing here](https://www.twitch.tv/videos/2627706685). If you do, you’ll see how the agent figures out how to render background colors for terminal cells, how it then fixes the wrong struct alignment/padding of the data it sends to the GPU after I show it a screenshot, how it then builds a 2D renderer for box drawing characters, and a feedback loop, and then iterates based on screenshots to render curved and straight characters.

Or you can watch these two highlights: [this one](https://www.twitch.tv/videos/2628414081) in which I guide the agent to build a feedback loop for itself, so it can “see” what the GPU renders; and then [this one](https://www.twitch.tv/videos/2628414080), in which the agent first uses the feedback loop to check which box-drawing characters aren’t rendered properly and then adds the code to render them.

Magical, truly. Rendering the characters — that’s one thing. But how it “understood” how the feedback loop should work and how it builds it — man, that was mind-blowing.

---

- [Claude Opus 4.5](https://www.anthropic.com/news/claude-opus-4-5) was released. A week after Gemini 3 Pro.
- [We switched Amp to Opus 4.5](https://ampcode.com/news/opus-4.5), too. We switched after a lot of user feedback, and back and forth, and evaluations, and testing, and should-we? and could-we? and don’t-we-have-to? and it’s-so-good. There’s more in the post there and I encourage you to use it, but let me say this: I’m rethinking — again — the future of software development.
- On a more practical level: I’m really fascinated by Anthropic’s [Tool Search Tool](https://www.anthropic.com/engineering/advanced-tool-use). This does feel like something really useful. I’ve implemented it in Amp in less than an hour and have been playing around with it. There’s downsides (latency!), but I’m very intrigued.
- This week I learned about [expect(1)](https://linux.die.net/man/1/expect) and [pexpect](https://github.com/pexpect/pexpect), but, never having watched the movie, I don’t know what to make of this warning: [“Don’t do this unless you like being John Malkovich”](https://github.com/pexpect/pexpect/blob/fc8f062518b40bd0862aae870cdedf5d9c0c7fc3/examples/python.py#L31)
- Henrik Karlsson: “Today is my 1 year anniversary of being a full time writer on Substack. [Some reflections.](https://substack.com/@henrikkarlsson/note/c-179211747)” Very interesting.
- Speaking of, I’ve really come to enjoy reading through Substack notes. [Here’s one by the very same Henrik Karlsson](https://substack.com/@henrikkarlsson/note/c-176327685?) that I keep thinking of: “When I have low blood suger, or am in a bad mood because I haven’t exercised in a while, or have some other imbalance in my body, my mind will typically conjure some reason why I’m feeling that way; it will invent a story that explains why I’m feeling sad or frustrated. ‘I feel so trapped in my life.’ ‘X is so selfish.’ Etc. It is rarely productive to pay to much attention to those thoughts in the moment, since they are just made up stories, to explain a negative affect; giving them to much attention just makes my brain elaborate and come up with even fancier (and falser) stories for why I’m feeling bad.” It is incredible, isn’t it, to read something like *that*, in a feed. Like hearing a live orchestra when someone’s phone rings.
- Benedict Evans in [his latest newsletter](https://www.ben-evans.com/newsletter): “Back to 1997: no one knows how this is all going to work. There are capital markets stories (even more for Coreweave and the other neoclouds), and chip stories, but the core I keep coming back to is the level of uncertainty around the actual applications - remember Yahoo, and Netscape, and Pointcast? i-mode and Blackberry? And meanwhile, Google didn’t exist yet and Mark Zuckerberg was 13. Bubble or no bubble, no one knows anything.”
- And Benedict Evans has [a new presentation out](https://www.ben-evans.com/presentations). Highly recommend flipping through it, as always.
- Maybe I’m in a bubble and that’s why I don’t come across these types of posts very often anymore, but this one, [Gunnar Morling’s On Idempotency Keys](https://www.morling.dev/blog/on-idempotency-keys/), was great and made me think of a lot of books and posts I read now many years ago.
- What a read: [Trillions Spent and Big Software Projects Are Still Failing](https://spectrum.ieee.org/it-management-software-failures). The subtitle — “AI won’t solve IT’s management problems” — already contains the clue that this is about “IT” and Big Software in Big Enterprises. That’s a world I’m very much not connected to (and it’s also interested that the world I am in doesn’t even get a mention) and it’s very, very, very interesting. Here’s one of many setup & punchline pairs that I could quote: “Phoenix project executives believed they could deliver a modernized payment system, customizing PeopleSoft’s off-the-shelf payroll package to follow 80,000 pay rules spanning 105 collective agreements with federal public-service unions. It also was attempting to implement 34 human-resource system interfaces across 101 government agencies and departments required for sharing employee data. Further, the government’s developer team thought they could accomplish this for less than 60 percent of the vendor’s proposed budget.” And the punchline: “Phoenix’s payroll meltdown was preordained. As a result, over the past nine years, around 70 percent of the 430,000 current and former Canadian federal government employees paid through Phoenix have endured paycheck errors. Even as recently as fiscal year 2023–2024, a third of all employees experienced paycheck mistakes. The ongoing financial stress and anxieties for thousands of employees and their families have been immeasurable.” But there’s so much more in there. I didn’t know about U.K. Post Office disaster and I had only read something short about the Lidl/SAP failure (“[…] three years of trying to make SAP’s €500 million enterprise resource planning (ERP) system work properly.”) Incredible stuff.
- [Ghostty has search](https://x.com/mitchellh/status/1993735559341121941)!
- Weirdly enough, reading about these big IT projects reminded me of this [2018 Andy Greenberg article in Wired about the NotPetya attack on Maersk](https://cyber-peace.org/wp-content/uploads/2018/10/The-Untold-Story-of-NotPetya-the-Most-Devastating-Cyberattack-in-History-_-WIRED.pdf). Fantastic read: “All across Maersk headquarters, the full scale of the crisis was starting to become clear. Within half an hour, Maersk employees were running down hallways, yelling to their colleagues to turn off computers or disconnect them from Maersk’s network before the malicious software could infect them, as it dawned on them that every minute could mean dozens or hundreds more corrupted PCs. Tech workers ran into conference rooms and unplugged machines in the middle of meetings. Soon staffers were hurdling over locked key-card gates, which had been paralyzed by the still-mysterious malware, to spread the warning to other sections of the building.” I’m pretty sure that I read this when it came out and in the seven years since, I’ve thought of this scene many times: “When the tense engineers in Maidenhead set up a connection to the Ghana office, however, they found its bandwidth was so thin that it would take days to transmit the several-hundred-gigabyte domain controller backup to the UK. Their next idea: put a Ghanaian staffer on the next plane to London. But none of the West African office’s employees had a British visa. So the Maidenhead operation arranged for a kind of relay race: One staffer from the Ghana office flew to Nigeria to meet another Maersk employee in the airport to hand off the very precious hard drive. That staffer then boarded the six-and-a-half-hour flight to Heathrow, carrying the keystone of Maersk’s entire recovery process.”
- Ethan Mollick on the [Three Years from GPT-3 to Gemini 3](https://www.oneusefulthing.org/p/three-years-from-gpt-3-to-gemini): “Three years ago, we were impressed that a machine could write a poem about otters. Less than 1.000 days later, I am debating statistical methodology with an agent that built its own research environment. The era of the chatbot is turning into the era of the digital coworker. To be very clear, Gemini 3 isn’t perfect, and it still needs a manager who can guide and check it. But it suggests that ‘human in the loop’ is evolving from ‘human who fixes AI mistakes’ to ‘human who directs AI work.’ And that may be the biggest change since the release of ChatGPT.”
- swyx [on Agent Labs](https://www.latent.space/p/agent-labs).
- Compare: [Bavarian Forest 2022](https://www.bernhardlang.de/bavarianforest) and [Forests in Formation 2025](https://www.bernhardlang.de/forestsinformation2025). (If you like Factorio, you should also look at [Stahlwerk](https://www.bernhardlang.de/stahlwerk) and [Chemiefabrik](https://www.bernhardlang.de/chemiefabrik).)
- According to [this Harvard Business School paper](https://www.hbs.edu/faculty/Pages/item.aspx?num=68094), Acquired.fm (love them) [now makes $2.5m per episode](https://x.com/jryedinak/status/1993362431066919217?s=46). They’re the best in the game, so: congratulations!
- [We’re Losing Our Voice to LLMs](https://tonyalicea.dev/blog/were-losing-our-voice-to-llms/). I don’t use LLMs to write prose for me and can’t imagine ever wanting to, but lately, with Gemini 3 and now with Opus 4.5, what I’ve done is to hand them a collection of my writing that I want to emulate in a new thing and say “This is how I wrote, analyze the writing style.” They then come back with an eerily good analysis and then I tell them: “Imagine you’re [Robert Gottlieb](https://www.theparisreview.org/interviews/1760/the-art-of-editing-no-1-robert-gottlieb), how would you edit this?” And what they send back is not what I’d do, but it’s enough of a push to keep me rolling down the hill.
- Beautiful personal website: [alanagoyal.com](https://www.alanagoyal.com/)
- My ex-colleague Piotr, over at Zed Industries, wrote about making the project search in Zed a lot faster. [Nerd-sniped: Project Search](https://zed.dev/blog/nerd-sniped-project-search). That’s a great post. Perfect hook, carefully chosen code examples, great tone (“For a mix of reasons (including hubris), we never truly loved the idea of blindly going with ripgrep.”), good length. Now *this* is how it’s done.
- Also, by the way, since we’re on the topic of Zed, I want you all to know that Zed’s [editor/editor.rs](https://github.com/zed-industries/zed/blob/c18481ed13f6c0024b9b78ad1e4664c49100791f/crates/editor/src/editor.rs) has around 25k lines of code. It’s the heart of the editor. And guess what? It’s not a problem. Yes, it could be shorter, but also: it’s not a problem. I think working with that file has made me ignore every comment around lines of code for all eternity.
- I’ve been meaning to write about how I changed my view on code reviews in the past two years, but then, while talking about it, Patrick sent me this post from the Raycast CEO and founder Thomas Paul Mann: [no code reviews by default](https://www.raycast.com/blog/no-code-reviews-by-default). It’s all in there. I’d sign every paragraph in there. Now, maybe the thing that I need to write is about how I changed my view on pull requests…
- “[This MacOS (APFS?) quirk](https://benjojo.co.uk/u/benjojo/h/h4N78m1PjXYsYfzkGV)was mentioned at the pub last night, and I still cannot believe this actually works when I tried it myself”
- “[‘Everything’ is search engine](https://www.voidtools.com/faq/#what_is_everything) that locates files and folders by filename instantly for Windows. Unlike Windows search ‘Everything’ initially displays every file and folder on your computer (hence the name ‘Everything’). […] ‘Everything’ only indexes file and folder names and generally takes a few seconds to build its database. A fresh install of Windows 10 (about 120,000 files) will take about 1 second to index. 1,000,000 files will take about 1 minute.”
- I had no idea that Charli xcx had a Substack, but apparently she does and this post I found very good: [The realities of being a pop star.](https://itscharlibb.substack.com/p/the-realities-of-being-a-pop-star) It’s weird, isn’t it, how odd it feels when an artist crosses from one medium to another like that, but when you say it out loud, it does seem obvious. “All my favorite artists are absolutely not role models nor would I want them to be, but maybe that’s just me. I want hedonism, danger and a sense of anti establishment to come along with my artists because when I was younger I wanted to escape through them. I don’t care if they tell the truth or lie or play a character or adopt a persona or fabricate entire scenarios and worlds. To me that’s the point, that’s the drama, that’s the fun, that’s the FANTASY.”
- Benjamin Anderson: “This is what I’m calling technical deflation: it’s getting easier and easier for startups to do stuff, and this seems likely continue at least for the next few years. (Importantly, this is true regardless of whether you think pretraining or RLVR have “hit a wall”—improvements on speed, cost, context length, tool use, etc. are all sufficient to keep the trend going.) So what are the consequences of [technical deflation?](https://benanderson.work/blog/technical-deflation/)”
- Oh do I love [these indicators in the Quake Engine](https://fabiensanglard.net/quake_indicators/index.html)! Give me [all the indicators](https://registerspill.thorstenball.com/p/the-hum-of-the-machine)!
- “If you physically need gear to do the thing, [start with cheap gear and keep research to the minimum](https://blog.ielliott.io/gear-acquisition-syndrome). As a beginner you can’t percieve most of the differences between similar tools. Perceptual ability and taste only develop as your skills improve.” Having had GAS in multiple different hobbies, this one of the best things said about it.
- My wife and I are watching our way through Variety’s [100 Best Comedy Movies of All Time](https://variety.com/lists/best-comedy-movies-all-time) and on Friday we saw [Eddie Murphy’s Raw](https://www.imdb.com/title/tt0092948). I’ve seen bits of Raw many times over the years, but never the whole thing and, man, he was so good. So good. (Good pairing: I saw [Being Eddie](https://www.imdb.com/title/tt35627915/) on the plane last week and it sets up the hype around Eddie in the 80s really well, but Raw then manages to match and surpass the hype.) I also asked ChatGPT to create a spreadsheet of the list, so, [here you go](https://docs.google.com/spreadsheets/d/16_pLQoDhieSlAKm2zyi2mGJpTm3ZvWdYY7FaPrxvik8/edit?usp=sharing).

---

---

# Joy & Curiosity #63

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 23, 2025

---

This was the second time in four months that I happened to be in San Francisco when a new model was released by a major provider. “Gemini 3 just dropped” was overheard in the coffee shop.

Very busy but fantastic week.

---

- We [switched Amp to Gemini 3 Pro](https://ampcode.com/news/gemini-3). I know that for some people Gemini 3 feels off, but I honestly think it’s the best model I’ve used as an agent so far. It’s fantastic.
- I’m still holding my breath and I’m pessimistic, but *hallelujah!* if this actually happens in a way that’s noticeable: [Europe is scaling back its landmark privacy and AI laws](https://www.theverge.com/news/823750/european-union-ai-act-gdpr-changes).
- What I found the most surprising about Every’s [Vibe Check on Gemini 3](https://every.to/vibe-check/vibe-check-gemini-3-pro-a-reliable-workhorse-with-surprising-flair) is that they’re saying it’s “not yet a writing champ”. Maybe I can’t judge it on that, I very rarely use LLMs to generate more than a single sentence of prose, but I thought Gemini 3’s descriptions of bugs, its summaries of what it did, its investigations — I thought those were well-written and surprisingly well-formatted too. I actually said out loud: “if I would see a PR description written like *that*, I’d try to hire the person who wrote it.”
- [Paul Dix, CTO of InfluxDB](https://x.com/pauldix/status/1990434650863399307?s=46): “I believe the next year will show that the role of the traditional software engineer is dead. If you got into this career because you love writing lines of code, I have some bad news for you: it’s over. The machines will be writing most of the code from here on out. Although there is some artisanal stuff that will remain in the realm of hand written code, it will be deeply in the minority of what gets produced.”
- “Older programs were all about what you need: you can do this, that, whatever you want, just let me know. You were in control, you were giving orders, and programs obeyed. But recently (a decade, more or less), this relationship has subtly changed. Newer programs (which are called apps now, yes, I know) [started to want things from you](https://tonsky.me/blog/needy-programs/).”
- [Are You Playing to Play, or Playing to Win?](https://commoncog.com/playing-to-play-playing-to-win) Read it two days ago and already think that these definitions of scrub and maestro will stick with me. “One time I played a scrub who was pretty good at many aspects of Street Fighter, but he cried cheap as I beat him with ‘no skill moves’ while he performed many difficult dragon punches. He cried cheap when I threw him 5 times in a row asking, ‘is that all you know how to do? throw?’ I told him, ‘Play to win, not to do ‘difficult moves.’‘ He would never reach the next level of play without shedding those extra rules in his head”. Can’t help but think of programming and typing code by hand.
- “#! was a great hack to make scripts look and feel like real executable binaries.”, from: [#! magic, details about the shebang/hash-bang mechanism on various Unix flavours](https://www.in-ulm.de/~mascheck/various/shebang).
- “A friend of mine tells Claude to always address him as ‘Mr Tinkleberry’, he says he can tell when Claude is not paying attention to the instructions on CLAUDE.md when Claude stops calling him ‘[Mr Tinkleberry](https://news.ycombinator.com/item?id=45983698)’ consistently”
- This is from all the way back in April and you actually notice that when reading, I’d say, which is interesting in itself, but the whole piece is great and contains a lot of gems: [Will the Humanities Survive Artificial Intelligence?](https://www.newyorker.com/culture/the-weekend-essay/will-the-humanities-survive-artificial-intelligence)
- “I’ve started a company in this space about 2 years ago. We are doing fine. What we’ve learned so far is that a lot of these techniques are simply optimisations to tackle some deficiency in LLMs that is a problem “today”. These are not going to be problems tomorrow because the technology will shift. As it happened many time in the span of the last 2 years. So yah, cool, caching all of that... but give it a couple of months and a better technique will come out - or more capable models. [...] What I’ve learned from this is that [often times it is better to do absolutely nothing](https://news.ycombinator.com/item?id=46014987).”
- Joan Didion, [On Self-Respect](https://gist.github.com/rebeccawilliams/375db69a69a70565d7e1e7a8ced35ae3): “In brief, people with self-respect exhibit a certain toughness, a kind of moral nerve; they display what was once called character, a quality which, although approved in the abstract, sometimes loses ground to other, more instantly negotiable virtues. The measure of its slipping prestige is that one tends to think of it only in connection with homely children and with United States senators who have been defeated, preferably in the primary, for re-election. Nonetheless, character—the willingness to accept responsibility for one’s own life—is the source from which self-respect springs.”

---

---

# Joy & Curiosity #62

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 16, 2025

---

Here we go again, packing for a trip. I’m flying to San Francisco for the week. Or as my dad, who’s never been to the U.S., and nobody else I’ve spoken to in the last decade, calls it: Frisco.

And this [time](https://registerspill.thorstenball.com/p/joy-and-curiosity-55)? Hand luggage only. But I’m bringing the black shirt.

---

- Incredible: [Dithering, Part 1](https://visualrambling.space/dithering-part-1/). Incredible in the literal sense: after the tenth or so  illustration you start to think, *no way*, *no way they built all of this*. But yes they did, they did. What a gem! And exactly like [a Bartosz Ciechanowski post](https://ciechanow.ski/mechanical-watch/), this also made me wonder: imagine if all learning could look like this.
- Yours truly wrote about the context window and [context management in Amp](https://ampcode.com/guides/context-management). I had a lot of fun with this: making the diagrams in Monodraw was fun, creating the orbs with Midjourney and GPT-5 was fun, using this one model that I’m falling in love with to add the orbs was fun, building a script to invert the colors of the diagrams was fun. Hope you have fun reading it.
- “People wouldn’t watch the robot Olympics, for example. People don’t watch the chess computer world championships. They watch the chess world championships because they’re interested in other people going through the journey of life and wrestling with the same things they’re wrestling with.” This is from [this interview with comedy writer Madeleine Brettingham](https://chiefwordofficer.substack.com/p/an-ai-walks-into-a-bar). And here’s one of [Drew Breunig’s thoughts](https://www.dbreunig.com/2025/07/25/a-comedy-writer-on-how-ai-changes-her-field.html) on the interview: “I had never really thought about what virtuosity meant as a concept, but the way it was discussed in this forum has since solidified the idea of it in my brain: virtuosity can only be achieved when the audience can perceive the risks being taken by the performer.” Both are worth reading.
- *Yes: “*The fundamental number that has defined software development is a simple one: $150/hour. $150/hour is a reasonable approximation of the cost of a professional senior software developer in the United States at this time. That number is large, and the reasons for it are many, but fundamentally it is a simple question of supply and demand. [...] Virtually every aspect of how software development is done has evolved around that $150/hour number. With developers being rare and expensive, every line of code has to justify a very high cost. Decisions around how software should be designed, built, and tested are made not with respect to how to make the software the best it can be, but rather to optimize around that grinding $150/hour number. [...] So what happens when that brutal economics changes? Five months ago, it did, with the initial release of agentic AI for software development. While software developers have to do many more things at their jobs than coding, that $150/hour was justified purely by the fact that only software developers could create code. Worse they could only create it through essentially handcrafted processes that were only some constant factor better than scribing it into punch cards. As of five months ago, that justification became false.” This is from [Software Development in the Time of Strange New Angels](https://davegriffith.substack.com/p/software-development-in-the-time). Read the whole thing. It’s very good. If you scoffed at that quote: yes, read it.
- [Nano Banana can be prompt engineered for extremely nuanced AI image generation.](https://minimaxir.com/2025/11/nano-banana-prompts/) As someone who has only recently started to dive into Midjourney and is now using Midjourney and ChatGPT to generate images and send them back and forth between models: this was *fantastic! *But even as someone who’s generated a few images, the kicker at the end, when the model takes HTML and produces a render of the page… Well, that’s something else entirely. Wow.
- I’ve heard Tyler Cowen say we “should write for the AIs” before, but I could never really make sense of it — I’m writing on the Internet, aren’t it? Isn’t that writing for the AIs? Should I address them? Say hello and thank you? This article here — [Baby Shoggoth Is Listening](https://theamericanscholar.org/baby-shoggoth-is-listening/) — digs into the idea. Gwern is quoted too. But… I don’t know, I don’t know. I still don’t think I know what it means. But it’s an interesting thought, so here we are.
- “[Personality basins](https://near.blog/personality-basins/) are a mental model that I use to reason about humans within their environment: from modelling why people are they way they are, how they change over time, how mental illnesses and addiction function along with how we should look for their cures, and how the attention economy optimizes itself to consume all of your free time.”
- “Google are killing XSLT!” is the headline at [xlst.rip](https://xslt.rip/) and… Look, I didn’t know what XSLT was, and now that I do I’m not sure whether it’s a bad thing to kill? But what I am sure about is this: that website is amazing. Click on that link.
- Funny: [Unexpected Things that are People](https://bengoldhaber.substack.com/p/unexpected-things-that-are-people).
- Here’s another amazing website with a URL to match: [how-did-i-get-here.net](https://how-did-i-get-here.net/). Very well done. And the writing, too: “The Internet is often described as an open, almost anarchistic network connecting computers, some owned by people like you and me, and some owned by companies. In reality, the Internet is a network of corporation-owned networks, access and control to which is governed by financial transactions and dripping with bureaucracy.” And now I’m [listening to this again](https://www.youtube.com/watch?v=TGofoH9RDEA).
- Tom MacWright, one of the co-founders and the CTO of [val.town](https://www.val.town/), wrote this honest, direct, unfluffly, can’t-believe-how-honest-actually retrospective on [Val Town 2023-2025](https://macwright.com/2025/11/11/val-town). “One thing I’ve thought for a long time is that people building startups are building complicated machines. They carry out a bunch of functions, maybe they proofread your documents or produce widgets, or whatever, but the machine also has a button on it that says ‘make money.’ And everything kind of relates to that button as you’re building it, but you don’t really press it.”
- I really, really, really wanted to scoff at [curated.supply](https://www.curated.supply/) and say something like “who the hell puts a Porsche 911 and a Rolex and a freaking tea kettle on the same page?” but then I got sucked in and now I want to kind of buy this [orb lamp](https://bangoibanga.com/products/lop-small-square-in-orange-acrylic).
- “If you are having a problem with some code and seeking help, preparing a Short, Self Contained, Correct Example (SSCCE) is very useful. But what is an [SSCCE](https://sscce.org/)?” If you haven’t worked on a popular open-source project your guess as to how many people struggle with producing a proper bug report is likely off, very off. I had always assumed everyone knows what a good ticket looks like — until I worked on Zed. Now, if someone submits a bug report with an SSCCE I treat as if I had found a gold coin in the pocket of my jacket.
- [When Your Hash Becomes a String: Hunting Ruby’s Million-to-One Memory Bug](https://mensfeld.pl/2025/11/ruby-ffi-gc-bug-hash-becomes-string/). This was great. I’m fascinated that they even managed to reproduce it. I guess at some point you’d run into it, but, wow, someone got lucky there in a very unlucky situation.
- I always love listening to comedians talk shop and this one was great: [Louis C.K. on a podcast with David Spade and Dana Carvey](https://www.youtube.com/watch?v=n0FBphnBGxY).
- “[The AI water issue is fake](https://andymasley.substack.com/p/the-ai-water-issue-is-fake)”
- [This post about lazygit](https://www.bwplotka.dev/2025/lazygit/) was very interesting. I’ve not really used it, except for starting it a handful of times, but the section “What’s amazing in lazygit?” is interesting because, yes, it’s about lazygit, but it’s also about TUIs and terminal programs in general and right now a lot of coding agents are in the terminal and… well, it’s interesting, isn’t it?
- Anthropic is reporting that they have been “[disrupting the first reported AI-orchestrated cyber espionage campaign](https://www.anthropic.com/news/disrupting-AI-espionage)” and while, as you know, I love to read “state-sponsored group” in connection with cyber attacks, this one was… *strange. *Take these two paragraphs: “At this point they had to convince Claude—which is extensively trained to avoid harmful behaviors—to engage in the attack. They did so by jailbreaking it, effectively tricking it to bypass its guardrails. They broke down their attacks into small, seemingly innocent tasks that Claude would execute without being provided the full context of their malicious purpose. They also told Claude that it was an employee of a legitimate cybersecurity firm, and was being used in defensive testing. The attackers then initiated the second phase of the attack, which involved Claude Code inspecting the target organization’s systems and infrastructure and spotting the highest-value databases. Claude was able to perform this reconnaissance in a fraction of the time it would’ve taken a team of human hackers. It then reported back to the human operators with a summary of its findings.” Now, tell me, why did they put this sentence in: *Claude was able to perform this reconnaissance in a fraction of the time it would’ve taken a team of human hackers. *Are you reporting on an attack that you averted, while telling us that your “extensively trained” model has been jailbroken, and then, kind of, brag? Is this a security report, or an advertisement? I was asking myself that until I made it to this paragraph: “Overall, the threat actor was able to use AI to perform 80-90% of the campaign, with human intervention required only sporadically (perhaps 4-6 critical decision points per hacking campaign). The sheer amount of work performed by the AI would have taken vast amounts of time for a human team. At the peak of its attack, the AI made thousands of requests, often multiple per second—an attack speed that would have been, for human hackers, simply impossible to match.”
- Jason Bateman talking to Marc Maron [about being a director](https://www.smartless.com/episodes/episode/470387a9/marc-maron): “Just exercise taste. Just sit there and watch the results of other people’s work and say yes to this, no to that, a little more of this, a little less of that. It’s the one person on the set who doesn’t have a job. So you don’t actually need to do anything. I’m not suggesting that’s the right way to be a director but I worked with a million who worked that way. It’s very common. You need not be overwhelmed by ‘I gotta do a bunch of shit.’ Walk before you run. So just sit there and be the arbiter of taste.”
- “Yes: [the Referendum](https://archive.nytimes.com/opinionator.blogs.nytimes.com/2009/09/17/the-referendum/) gets unattractively self-righteous and judgmental. Quite a lot of what passes itself off as a dialogue about our society consists of people trying to justify their own choices as the only right or natural ones by denouncing others’ as selfish or pathological or wrong. So it’s easy to overlook that hidden beneath all this smug certainty is a poignant insecurity, and the naked 3 A.M. terror of regret. The problem is, we only get one chance at this, with no do-overs. Life is, in effect, a non-repeatable experiment with no control.”
- I’ve had thoughts similar to those expressed here — things have changed dramatically in the last two years, most people apparently haven’t realized it yet, and things will change even more — but, man, was I surprised that [it’s Will Larson writing this](https://lethain.com/good-eng-mgmt-is-a-fad/): “In the 2010s, the morality tale was that it was all about empowering engineers as a fundamental good. Sure, I can get excited for that, but I don’t really believe that narrative: it happened because hiring was competitive. In the 2020s, the morality tale is that bureaucratic middle management have made organizations stale and inefficient. The lack of experts has crippled organizational efficiency. Once again, I can get behind that–there’s truth here–but the much larger drivers aren’t about morality, it’s about ZIRP-ending and optimism about productivity gains from AI tooling.” Highly, highly recommend reading this. If you haven’t noticed the shift yet, I hope this gives you a glimpse.

---

---

# Joy & Curiosity #61

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 9, 2025

---

Here’s a puzzle I’m wrestling with this week: I do my best work when it doesn’t feel like work, when, instead, it feels like play. And yet my mind tells me, *strains* to tell me, that I must do work that feels like work in order to be productive. How do you solve a puzzle when you have all the pieces in your hand but you won’t let yourself put them together?

---

- This is the best thing I read this week: [The Tinkerings of Robert Noyce](https://web.stanford.edu/class/e145/2007_fall/materials/noyce.html), by Tom Wolfe. It’s from 1983, published in Esquire; it’s about, you guessed it, a guy named Robert Noyce, who was part of the [Traitorous Eight](https://en.wikipedia.org/wiki/Traitorous_eight), who co-invented the integrated circuit, who co-founded Fairchild Semiconductor and Intel (the other founder is Gordon Moore), who quite literally put the silicon into Silicon Valley, who came from the midwest and became richer than a small god; it’s about Silicon Valley and the West and the Midwest and how the West isn’t the East. If you work in tech, if you work in a startup, or if you’re even remotely interested in this industry we’re in, you should read it. And in order to convince you to read it, let me tell you about a roommate I once had. He and I had been, separately, with a different cadence, watching [Battlestar Galactica](https://en.wikipedia.org/wiki/Battlestar_Galactica_(2004_TV_series)), the 2004 TV show. The premise of the show can be condensed as follows: humans create androids called Cylons, humans and Cylons go to war, Cylons launch surprise attack on humans with the help of a human traitor called Gaius Baltar, surprise attack kills most humans and makes human colonies inhabitable, surviving humans flee on battleship Galactica, in search of a new Earth. Now, *all of that* — the background explanation on the war, the attack, the battles following the attack, the reveal of the traitor, the escape of all remaining humans on a single ship — is shown in the first two episodes of the show. But these two very crucial first episodes aren’t part of the first season. They are, technically, a separate miniseries that was aired before the first season. They’re not S01, but S00. Which is exactly why my roommate, who watched the show in the order the files appeared on disk, watched all 53 episodes of Battlestar Galactica *without having watched the miniseries first*, *without knowing why they’re even on the god damn battleship.* Yes, he was very surprised when he got to “the end” and figured out who the traitor is. Now, here’s my point: The Tinkerings of Robert Noyce — that’s the two episodes *I* hadn’t watched. And now that I *have* read it, all of it — Silicon Valley, startups, tech, everything I have ever read about it — makes a lot more sense.
- Mary Rose Cook: “Dozens of new tests and [four new techniques](https://maryrosecook.com/blog/post/pressure-to-change) to carry into the future. Or, rather, to carry until they’re superseded next week.”
- From the always fantastic James Somers, in The New Yorker: [The Case That A.I. Is Thinking](https://www.newyorker.com/magazine/2025/11/10/the-case-that-ai-is-thinking). Marvelous writing and it’s all in here: the stochastic parrot argument, Hofstadter, Ted Chiang, Geoffrey Hinton, neuroscientists. I highly recommend you read it. (I actually *listened* to it, which is rare for me, and I was surprised by how good the production quality is and thought that the setting in which I listened — a dark, very cold, November evening walk through an empty-seeming town — was great for this.)
- On the surface, this is about a homelab and infrastructure and, if we stretch it, it’s about developer tools too, but I’d argue there’s even more: [a prison of my own making](https://jsteuernagel.de/posts/a-prison-of-my-own-making/). I actually read this a few hours after I had woken up and found out that my UniFi controller no longer works and that I can’t access my network’s admin area anymore.
- So while researching UniFi stuff, I came across this: [UniFi Network Comparison Charts](https://evanmccann.net/blog/ubiquiti/unifi-comparison-charts). Not particularly interesting, if you’re not into UniFi gear, but doesn’t this feel like a page out of a different era of the Internet? I think it’s great.
- “Terminal emulators face a fundamental challenge: mapping the vast breadth of Unicode scripts into a fixed-width grid while maintaining legibility. A terminal must predict whether each character occupies one cell or two, whether combining marks overlay previous characters, and how emoji sequences collapse into single glyphs. These predictions fail routinely.” This is from [State of Terminal Emulators in 2025](https://www.jeffquast.com/post/state-of-terminal-emulation-2025/), which is very interesting, especially the section on performance. If you want to get a glimpse and have never thought about width of Unicode characters, look through the author’s [wcwidth](https://github.com/jquast/wcwidth/blob/master/wcwidth/table_zero.py). And if you want to understand what’s going on there, this is [a good intro](https://tomdebruijn.com/posts/rust-string-length-width-calculations/).
- Thomas Ptacek: [You Should Write An Agent](https://fly.io/blog/everyone-write-an-agent/). I mean: *[yeah](https://ampcode.com/how-to-build-an-agent)*.
- Amazing: [a “jelly slider” built with TypeGPU](https://docs.swmansion.com/TypeGPU/examples/#example=rendering--jelly-slider). As far as I understand it, the “jelly slider” was a joke someone made somewhere, but then someone else, of course, thought: I should built this. And here we are.
- [Your URL is your state.](https://alfy.blog/2025/10/31/your-url-is-your-state.html) I love a clean URL and I love when I can copy a URL and it reconstructs the complete state.
- So, apparently [there’s a thermal printer](https://guestbook.goodenough.us/info), hooked up to a Raspberry Pi, which is connected to the Internet, where everybody can submit print jobs to this printer, and a camera records and streams when the printer prints, and you can see all the wonderful little drawings that the printer has printed in this[gallery](https://guestbook.goodenough.us/). Lovely.
- [Kimi K2 Thinking is out](https://moonshotai.github.io/Kimi-K2/thinking.html).
- Did you know that there’s a framework for building TUI applications in Rust and it’s called [Ratatui](https://ratatui.rs/)? Isn’t that the most amazing name? So if you did know, why didn’t you tell me? What a [name](https://thorstenball.com/names/)!
- Talking about names: ever heard of Bending Spoons? That’s the Italian startup that’s acquired Evernote, Meetup, and, very recently, AOL. Bending Spoons itself is now valued at $11 billion. $11 billion! But the thing I couldn’t believe while reading [this company profile](https://www.forbes.com/sites/iainmartin/2025/10/30/bending-spoons-cofounders-become-billionaire-after-italian-startup-raises-at-11-billion-valuation/) was the CEO’s name: Luca Ferrari! What a name. I’m jealous.
- This is a bit left field, but since I am fascinated by what’s colloquially and often without the proper respect described as *tech wear*, [this website by Nike about the jersey they made for Eliud Kipchoge](https://about.nike.com/en/magazine/eliud-kipchoge-radical-airflow-new-york-city-marathon) was interesting. It’s more than a pat on the back that Nike is giving themselves here — more like two big hands massaging the shoulders, saying “well done, you, well done” — but interesting, still.
- [A YouTube Education](https://jmarriott.substack.com/p/a-youtube-education). This made me feel pretty dumb about how I use YouTube. Good stuff.
- In case you’ve never used git bisect: you need to [read this](https://kevin3010.github.io/git/2025/11/02/At-the-end-you-use-git-bisect.html)! Then go and try it. The first time you experience the power of binary search is magical. git bisect is magical. I use it a ton. I’ll jump on the chance to try it. When others go “let me check out these 4 commits that could be the cause of the bug”, I’ll get out git bisect, even if it might take longer. It’s so good and it gave me a hope-to-do-this-before-my-time-here-ends wish I threw on the pile: I really, really want the chance to run git bisect in the *automated* way, where you give it a script and then it goes and finds the command on its own. That’d be something.
- rands: [Become the Consequence](https://randsinrepose.com/archives/become-the-consequence). “Welcome to Senior Leadership! You made it! There’s no delegating this task, but it’s not a task. It’s a strategy, and you don’t delegate strategy; you explain it loudly, repeatedly, and then you become The Consequence.” It’s possibly a bit too abstract to be useful if you haven’t lived through the exact problems described here, but I found the example of how to increase the quality (reduce bugs) interesting and the whole thing is a good lens to look through.
- A bit clickbaity, a bit shallow, but still thought-provoking, at least for me: [Notes after listening to CEO of Vercel for 2.5 hours straight](https://x.com/Thomas_jebarsan/status/1985545034322870614). What I got stuck on was #16: “Reveal complexity gradually: simple first, power later.” It sounds right, doesn’t it? And I think I agree, but then, arguably, two of the most successful and beloved developer tools of all time, Vim and Emacs, do the exact opposite, don’t they? Or at least that’s the first two I thought of. And it got me thinking: wait a second, both editors are great pieces of software, yes, but are they great *products?* I honestly don’t know.
- Talking about Emacs: [How I am deeply integrating emacs](https://joshblais.com/blog/how-i-am-deeply-integrating-emacs/). I read this, thinking: yeah, I had the same dream once too, but now it’s dead and I can’t believed I ever dreamt it. I do love reading about it though.
- [The 512KB Club](https://512kb.club/), “a collection of performance-focused web pages from across the Internet”. There’s some real gems in that club. Lots of lovely, little, personal websites.
- [This](https://andreasmoser.blog/support-this-blog/books-my-wishlist/) made me want to create my own book wishlist.
- Was reminded of Hillel Wayne’s [Are We Really Engineers?](https://hillelwayne.com/post/are-we-really-engineers/) this week. In my head, this article is always in the background, always hovering somewhere when the word *engineering* is used. “Most people don’t consider a website ‘engineered’. However, and this is a big however, there’s a much smaller gap between ‘software development’ and ‘software engineering’ than there is between ‘electrician’ and ‘electrical engineer’, or between ‘trade’ and ‘engineering’ in all other fields. Most people can go between ‘software craft’ and ‘software engineering’ without significant retraining. We are separated from engineering by circumstance, not by essence, and we can choose to bridge that gap at will.”
- Jean Yang, founder of Akita (acquired by Postman): [Angel Investors, A Field Guide](https://www.jeanyang.com/posts/angel-investors-a-field-guide/). I barely know anything about angel investing, except that if “angel investor” shows up on someone’s bio it’s likely they’ve recently made some money. So this was very interesting. And this bit has to be highlighted: “I was at dinner with my a16z investor Martin Casado when I told him I wanted investment from Kevin Durant. It was fall 2018, KD was playing for the Warriors, and he had won Finals MVP earlier that year. I was a KD fan and had heard he did tech investing. Martin said, ‘How sure are you that you want him?’ He sent one text to someone who happened to be walking into KD’s house at that very moment. KD said congratulations and the following week I had Thirty-Five Ventures on my cap table.”
- [21 Facts About Throwing Good Parties](https://www.atvbt.com/21-facts-about-throwing-good-parties/). I don’t throw a lot of parties and neither do I wonder about how to throw a good party, but this was good.
- The [new Siri will use Gemini models](https://www.macrumors.com/2025/11/05/apple-siri-google-gemini-partnership/), it seems.
- “I have [AiDHD](https://www.josh.ing/blog/aidhd). It has never been easier to build an MVP and in turn, it has never been harder to keep focus. When new features always feel like they’re just a prompt away, feature creep feels like a never ending battle. Being disciplined is more important than ever.”
- [The Best Way to Use AI for Learning](https://medium.com/heptabase/the-best-way-to-use-ai-for-learning-762c3467bdf1). I started reading this without knowing that it’s essentially a sales pitch for the app the author built, but still walked away with some ideas. I wish I was this structured when learning new things.

---

---

# Joy & Curiosity #60

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 2, 2025

---

Yesterday morning, the day after Halloween, I went rucking. Quite the word, and it’s not a typo. It comes from rucksack and means to walk or hike with a heavy backpack or weights on your back. I like to use the weighted vest my wife got me for my birthday a few years ago. It weighs 30kg/60lbs. Its appearance has made other people stop and ask me things like: *are you police? is that a bulletproof vest?* 

No comments like that yesterday. And I was ready for comments when I said hello to the older couple I passed, or when I talked to the guy who was lost with his bike and wanted directions. Maybe I detected a funny look — a barely noticeable shift in facial features?

Back home, I went to get a shower and right before, in the mirror, I saw what my fellow walkers and riders in the woods must’ve seen: I still had my Halloween vampire costume’s blood-dripping-from-edges-of-mouth makeup on.

---

- “[My tinkering habits](https://seated.ro/blog/tinkering-a-lost-art) picked up very late, and now I cannot go by without picking up new things in one form or another. It’s how I learn. I wish I did it sooner. It’s a major part of my learning process now, and I would never be the programmer person I am today.”
- I agree with this, in that I think what he said will be misinterpreted: “[Karpathy is wrong. Write that post, build that slide deck!](https://world.hey.com/joaoqalves/karpathy-is-wrong-write-that-post-build-that-slide-deck-9d1a6893)” And I certainly agree with this too: “if you’re an engineer, writing — or creating a slide deck, or teaching something — is one of the most powerful ways to build understanding. Why? Because explaining something forces clarity. You can’t hide behind hand-wavy intuition when your audience knows the topic. You have to go deep. You have to really understand it.”
- Linked to in that post is this one here: [How to Increase Your Luck Surface Area](https://www.codusoperandi.com/posts/increasing-your-luck-surface-area). I’ve known about this idea of luck surface area for a few years, but I can’t remember where I came across it for the first time and now I think it might have been this post. Very good.
- [Jeremy Howard talking to Chris Lattner](https://www.fast.ai/posts/2025-10-30-build-to-last.html), about software craftsmanship, an AI, and the former in times of the latter. To quote just one quote-worthy paragraph, let’s use this one here, with which I agree fully (especially that last sentence), even though I think it’s useful for more than what he alludes to: “It’s amazing for learning a codebase you’re not familiar with, so it’s great for discovery. The automation features of AI are super important. Getting us out of writing boilerplate, getting us out of memorizing APIs, getting us out of looking up that thing from Stack Overflow; I think this is really profound. This is a good use. The thing that I get concerned about is if you go so far as to not care about what you’re looking up on Stack Overflow and why it works that way and not learning from it.”
- Agents are now [breaking the fourth wall](https://x.com/darrenangle/status/1982509166255391080).
- Nathan Lambert: [Burning out, an “essay on overworking in AI.”](https://www.interconnects.ai/p/burning-out)
- Cursor released their own model this week: Composer-1. Here’s [Simon Willison’s take on it](https://simonwillison.net/2025/Oct/29/cursor-composer/). Personally, I’ve played around with it and while the speed is *impressive* it also isn’t that smart and I wonder how that will shake out. We’ve done experiments with fast-but-not-as-smart models in Amp and when I went to measure the difference between a slow-but-smart and a fast-but-dumb model, the slow model turned out to be faster every time, when measuring prompt-to-result time, because the fast-but-not-as-smart model had to retry and sometimes did the wrong thing. But, I’m wondering, what if that comparison is wrong? What if a fast-but-not-as-smart model works better if not used like a smart model, what if it’s not suited to be an assistant that you pair with, what if…? Lots of things to try.
- Yew Jin Lim: [Note to my slightly older self](https://yewjin.substack.com/p/note-to-my-slightly-older-self).
- A comment that’s deserves a better classification than that, by dang, Hacker News moderator, on going “down an epic rabbit hole the other day—a rabbit labyrinth really—learning about [what happened to the children of the Beats](https://news.ycombinator.com/item?id=45767797).”
- Here’s a heavy triplet for you, on media, society, the Internet, all of it. Start here, by reading [The Goon Squad](https://harpers.org/archive/2025/11/the-goon-squad-daniel-kolitz-porn-masturbation-loneliness/), whose subtitle — “Loneliness, porn’s next frontier, and the dream of endless masturbation” — won’t prepare you. But don’t let the subject matter scare you away. The writing is good and, I tell myself, sometimes it’s good to stare into the abyss.
- Once you’re done with that, go and read [this excerpt of David Foster Wallace interview from 1996](https://www.reddit.com/r/nosurf/comments/1lt55t3/excerpt_of_david_foster_wallace_interview_from/). “And that as the Internet grows, and as our ability to be linked up, like—I mean, you and I coulda done this through e-mail, and I never woulda had to meet you, and that woulda been easier for me. Right? Like, at a certain point, we’re gonna have to build some machinery, inside our guts, to help us deal with this. Because the technology is just gonna get better and better and better and better. And it’s gonna get easier and easier, and more and more convenient, and more and more pleasurable, to be alone with images on a screen, given to us by people who do not love us but want our money. Which is all right. In low doses, right? But if that’s the basic main staple of your diet, you’re gonna die. In a meaningful way, you’re going to die.” Don’t forget to note the name of the subreddit.
- And now, number three: Seth Godin saying that “[attention is a luxury good](https://seths.blog/2025/10/attention-is-a-luxury-good/).” I won’t quote it here, because it’s eight sentences and pulling one out is playing Jenga.
- Joy Scrolling: [We Traveled the Real California That ‘One Battle After Another’ Imagined.](https://www.nytimes.com/2025/10/24/movies/one-battle-after-another-filming-location-california.html?unlocked_article_code=1.wU8.a7VR.5TaU5I8eU6A0&smid=url-share)
- [Amazing experiment](https://news.ycombinator.com/item?id=45783640): “I spent a few hours last weekend testing whether AI can replace code by executing directly. Built a contact manager where every HTTP request goes to an LLM with three tools: database (SQLite), webResponse (HTML/JSON/JS), and updateMemory (feedback). No routes, no controllers, no business logic. The AI designs schemas on first request, generates UIs from paths alone, and evolves based on natural language feedback. It works—forms submit, data persists, APIs return JSON—but it’s catastrophically slow (30-60s per request), absurdly expensive (€0,05/request), and has zero UI consistency between requests. The capability exists; performance is the problem. When inference gets 10x faster, maybe the question shifts from ‘how do we generate better code?’ to ‘why generate code at all?’” Comments are divided, as expected.
- “‘Fake it until you make it’ is often dismissed as shallow, but it’s closer to Franklin’s truth. Faking it long enough is making it. The repetition of behavior, not the sincerity of belief, is what shapes character. You become the kind of person [who does the things you repeatedly do](https://boz.com/articles/you-are-how-you-act).”
- This generated a lot of thoughts and one longer-ish internal Slack message days after reading it: [your data model is your destiny](https://notes.mtb.xyz/p/your-data-model-is-your-destiny?hide_intro_popup=true).
- [192 Weeks](https://notes.ekzhang.com/reflections/192-weeks). Eric Zhang on working at Modal, going back to school, working at Modal again, and leaving Modal, all while moving to and from New York, and growing up.
- Somehow I ended up reading [the Wikipedia article on Adam Gopnik](https://en.wikipedia.org/wiki/Adam_Gopnik), a staff writer for The New Yorker, and got stuck right there at the top, in the second paragraph, due to this: “In 2020, his essay ‘The Driver’s Seat’ was cited as the most-assigned piece of contemporary nonfiction in the English-language syllabus.” Wait, what, really? And the essay’s from 2015! So is it good or is it it’s-assigned-reading-good? But then again, Bill Bryson was assigned reading for me at some point and it might have been what made me fall in love with the English language. So I read [The Driver’s Seat](https://www.newyorker.com/magazine/2015/02/02/drivers-seat). It’s great.
- “Man, I love The New Yorker,” I thought and went to check up on [Alice Gregory](https://www.alice-gregory.com/articles), who’s also a staff writer there. I then read [her piece on the philosopher L. A. Paul](https://www.newyorker.com/magazine/2024/12/09/the-philosopher-l-a-paul-wants-us-to-think-about-our-selves). Fantastic writing and it contains this gem, which I’ll pull out next time someone says that something that’s longer than a b log post could’ve been a blog post: “Paul considers the repetition necessary and has compared it to examining a cut gemstone—holding it up to the light and turning it slowly to see every all-but-identical facet.” (See also: [Matrix Theory of Mind](https://registerspill.thorstenball.com/p/matrix-theory-of-mind))
- If you do know what the words “tender offer” and “secondary” mean in the context of stock options, you might find this post by Zach Holman interesting: [Taking Money off the Table](https://zachholman.com/posts/money-off-the-table).
- This seems like it will have a huge impact: Bill Gates with “[three tough truths about climate change](https://www.gatesnotes.com/three-tough-truths-about-climate)”.
- It’s a 32 second video, but I’m telling you: [this is one of the best demos I’ve ever seen](https://x.com/arktypeio/status/1983210635266498649). It’s so good. *So good!* The chosen example code, the diagnostics, the TODO comment there, the way it shows how easy it is to migrate — incredible.
- This seems like a very, very good idea: [a heatmap diff viewer for code reviews](https://0github.com/).
- Reminder: “[Computer science is a terrible name for this business. First of all, it’s not a science.](https://www.youtube.com/watch?v=-J_xL4IGhJA)”
- “[one of my most productive work days](https://x.com/alicemazzy/status/1983134649409781887) ever when I decided I was sick of dealing with an intractable perf problem, took an uber to get ramen, had three beers with lunch, decided to walk the two or three miles back, and realized a redesign that would trivially parallelize 95% of it”

---

---

# Joy & Curiosity #59

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 26, 2025

---

There’s one thing from [the second Acquired episode on Google](https://www.acquired.fm/episodes/google) that I keep thinking of. They mention how, in 2019, Chrome started to hide the protocol in the address bar. No more http and https. Both Acquired hosts agree that this was obviously the right choice. No user should’ve ever had to worry about typing http colon slash slash.

And, man, now, six years later, I agree. I think it was the right call. And I think they nailed it. Lots of small details: you don’t see the protocol by default, but when you hit Cmd-L to select the URL the protocol is shown and selected too. If you *click* on it though, you don’t see the protocol, but if you click and copy, it is copied too. And so on.

But what I keep thinking of: it was the right call and I, someone who likes to think of himself as a person who has some product taste, 100% would not have made it. It haunts me.

---

- Very, very impressive and very, very good: [Build Your Own Database](https://www.nan.fyi/database), a “step-by-step guide to building a key-value database from scratch”, which really undersells it. To use some words that I heard as a kid when grown-ups would talk about the Information Superhighway: it’s *interactive, *it’s *visual*, it’s *multi-media. *Okay, maybe it’s not multi-media, who knows, but it’s *very good.*
- Vicki Boykis [on mastery](https://vickiboykis.com/2025/10/20/i-want-to-see-the-claw/): “There is no single element that comprises this quality of care, the striving towards excellence and mastery. But, as Bernoulli said when he received an anonymous solution to the brachistochrone problem that turned out to be Isaac Newton, ‘I recognize the lion by its claw.’ […] I recognize the claw of the lion in software like Redis, cURL, uv, Ghostty, sqlite, llama.cpp - software that is elegant, well-built, considered and thoughtful. Software that is joyful to use. Software that helps me. I want to write software like this, and I want to use software like this, and I want us as programming people to be incentivized to value the process that creates software like this.” Loved it. Even though I disagree with the pessimistic assessment that “[we] are being overrun by mediocrity and sloppiness” — reminds me of what “real programmers” said about “web developers” 15 years ago.
- Linked in Vicki’s post is [this wonderful article](https://jacobian.org/2017/nov/1/you-have-two-jobs/) by Jacob Kaplan-Moss: “You were hired to write code. Many developers make the mistake and think that their job stops there. That’s not true. In fact, you have two jobs: (1) Write good code. (2) Be easy to work with.” (That’s exactly what I meant to say [with the last sentence here](https://registerspill.thorstenball.com/p/the-basics).)
- Some described it as “glazing”, others made fun of some phrases in it, but, I don’t know man, I really enjoyed reading this: [The New World](https://joincolossus.com/article/joshua-kushner-thrive-new-world/). It’s a long-form profile of [Joshua Kushner](https://en.wikipedia.org/wiki/Joshua_Kushner), who I didn’t even know existed, and who’s the founder of [Thrive Capital](https://en.wikipedia.org/wiki/Thrive_Capital), which I also didn’t know. But it’s also about the Holocaust, and the American Dream, and a family, and it mentions [Linus Lee](https://thesephist.com/https://thesephist.com/), and mini-profiles other people at Thrive, and goes into the The Week Sam Altman Was Fired, and how Thrive invested in GitHub, and how they invested in Stripe, and… yes, I really enjoyed reading it.
- Wonderful: [Programming With Less Than Nothing](https://joshmoody.org/blog/programming-with-less-than-nothing/).
- As are the [Aphyr posts on interviews](https://aphyr.com/tags/interviews). Often think of them, believe it or not.
- My teammate Nicolay: [Don’t delegate thinking, delegate work](https://howtobuildwithai.substack.com/p/dont-delegate-thinking-delegate-work). “The bottleneck now isn’t typing, it is understanding and problem solving, it is the thinking that happens before and after the code appears. What problem am I actually solving? Does this approach make sense given what already exists? Will this make the codebase more comprehensible or less? Those questions don’t get faster to answer just because the code appears faster. If anything, they get harder, because now you’re reviewing 500 lines instead of 50.”
- Did you wake up this morning wishing you could read something about salamis, mold, humidifiers, fridges, Home Assistant, and “food industry framework for identifying what can go wrong and how to monitor it”? I got something for you: [Designing Software for Things that Rot](https://drobinin.com/posts/designing-software-for-things-that-rot/). This was great.
- So, last week we launched [Amp Free](https://ampcode.com/free). Someone (but not one of us) posted us to Product Hunt. And ever since then my inboxes — email, LinkedIn, Twitter — have been full of people offering me Product Hunt-upvote-armies and other scammy-sounding services related to Product Hunt. In a tweet, I wondered whether Product Hunt has become a zombie town. In the replies, people told me: yes, yes it is. Some even said Product Hunt might be the biggest argument in favor of the [Dead Internet Theory](https://en.wikipedia.org/wiki/Dead_Internet_theory) and then someone linked me to this post on [the “brutal reality” of a Product Hunt launch](https://www.openstatus.dev/blog/our-producthunt-launch-brutal-reality) and, well, I can’t dispute it.
- [Turn off Cursor, turn on your mind.](https://allvpv.org/turn-off-cursor/) I agree that the risk is there. I’ve been there. But I don’t agree with the blanket statement. Not all code is worth the understanding.
- [Scripts I wrote that I use all the time](https://evanhahn.com/scripts-i-wrote-that-i-use-all-the-time/) by [Evan Hahn](https://evanhahn.com/). I feel inspired and lazy at the same time reading this. I have maybe three or four homemade scripts that I use semi-regularly and I somehow really wish that was different. Time to change it. (Make sure to click that second link too, that photo is worth it.)
- [Patrick](https://dubroy.com/blog/) sent this to me, asking whether I’ve seen it. I hadn’t. I constantly forget that George Saunders (George Saunders!) has a Substack. And, wow, am I glad he reminded me of it. This post is wonderful: [A Tough Question Indeed](https://georgesaunders.substack.com/p/a-tough-question-indeed). Here: “Only later (years later) did I find out that Celine was a bit of a turd – a collaborationist and an anti-Semite. But…those five pages had changed the trajectory of my life, regardless of their source. Would I ‘unread’ them, if I could? Absolutely not. So, it seems to me, two thoughts can co-exist: 1) I like this writing, and 2) I don’t like the person who wrote it.” What a wonderful writer.
- In case you’ve never read anything by George Saunders, maybe start here: [what writers really do when they write](https://www.theguardian.com/books/2017/mar/04/what-writers-really-do-when-they-write). It’s… wonderful (and, yes, I know, I overuse that word, but I had “divine” here and then I thought: what do I know about the divine? So, wonderful it is, because *it is.*)
- A Simon Willison talk turned into blog post: [Living dangerously with Claude](https://simonwillison.net/2025/Oct/22/living-dangerously-with-claude/). Something that I never considered until reading it here and that blew my mind: “In YOLO mode you can leave Claude alone to solve all manner of hairy problems while you go and do something else entirely. I have a suspicion that many people who don’t appreciate the value of coding agents have never experienced YOLO mode in all of its glory.” Can that be true? People have tried coding agents but only in the mode where they accept or reject every change and command? Wow.
- OpenAI [released Atlas](https://openai.com/index/introducing-chatgpt-atlas/), their own browser. The onboarding has some delightful moments. Maybe I’m totally off here, but to me this looks like the work of all the ex-Meta people that have joined OpenAI. I’ve played around with it a bit, but not too much. Very curious to see where this all goes and whether this means “computer use” (in the sense of moving a cursor across a screen) is dead and that agents/models will live on the web.
- Man, [Greenland sounds bad](https://matduggan.com/greenland-is-a-beautiful-nightmare/): “I have been to the jungles of Vietnam, the swamps of Florida and the Canadian countryside. This was beyond anything I’ve ever experienced. There are bugs in my mouth, ears, eyes and nose almost immediately.”
- Then again, OpenAI also [acquired Sky](https://openai.com/index/openai-acquires-software-applications-incorporated/) and the PR statement contains this: “Sky’s deep integration with the Mac accelerates our vision of bringing AI directly into the tools people use every day.” Why integrate with the Mac if you care about the web? Wild times.
- This was interesting: [Everything Is Television](https://www.derekthompson.org/p/why-everything-became-television), by Derek Thompson. “Television speaks to us in a particular dialect, Postman argued. When everything turns into television, every form of communication starts to adopt television’s values: immediacy, emotion, spectacle, brevity. In the glow of a local news program, or an outraged news feed, the viewer bathes in a vat of their own cortisol. When everything is urgent, nothing is truly important. Politics becomes theater. Science becomes storytelling. News becomes performance. The result, Postman warned, is a society that forgets how to think in paragraphs, and learns instead to think in scenes.”
- David Friedman [built Doomscrolling, the game](https://ironicsans.ghost.io/doomscrolling-the-game/). “As readers know, I’m not a coder, but I enjoy how vibe coding lets me turn an idea into something real. So naturally, I turned to vibe coding for this. It didn’t work. [...] But then GPT-5 came out a few weeks ago, and I tried again to see how much better it might be at coding. In just two hours I had a very good prototype.” So far, so familiar, but this here is very interesting and real: “If you’ve ever tried to work with AI, you’ve likely run into a roadblock where you’re describing something over and over and it’s simply not getting it. ‘No, don’t do it that way, for the umpteenth time, do it this way.’ So I simplified things. I had the AI set up simple ‘labs,’ standalone test pages where we could work on different designs, using the style from the game.” And that’s exactly the kind of code I had in mind [when I wrote this](https://registerspill.thorstenball.com/p/a-new-kind-of-code).
- [AI is Making Us Work More](https://tawandamunongo.dev/posts/2025/10/ai-work-more): “Where feeling tired used to be a signal to rest, now it’s a sign of weakness. Every break you take feels like a gap in your potential productivity.” Yes. Something changed this year in software and I’d argue that if you haven’t felt it, it’s not because it didn’t happen, but because it hasn’t reached you yet.
- [Geoffrey Litt](https://www.geoffreylitt.com/2025/10/24/code-like-a-surgeon): “Personally, I’m trying to code like a surgeon. A surgeon isn’t a manager, they do the actual work! But their skills and time are highly leveraged with a support team that handles prep, secondary tasks, admin. The surgeon focuses on the important stuff they are uniquely good at. My current goal with AI coding tools is to spend ~100% of my time doing stuff that matters.”
- “We’re past the ‘wow, it writes code’ phase. [The interesting work now is shaping how these assistants fit real workflows](https://austinhenley.com/blog/aidesignspace.html): deciding when to be fast and when to be careful, what context to include, and how to keep humans in the loop without overwhelming them.”
- Simon Willison [again](https://simonwillison.net/2025/Oct/25/coding-agent-tips/): “I actually don’t think documentation is too important: LLMs can read the code a lot faster than you to figure out how to use it.” And other thoughts on how to make agents productive. My hypothesis: the best codebase for agents doesn’t look like the best codebase for humans. At least not short-term.
- [John Collison in The Irish Times](https://www.irishtimes.com/life-style/people/2025/10/25/john-collison-of-stripe-ireland-is-going-backwards-heres-how-to-get-it-moving/): “This phenomenon is not just Irish. Around the developed world, power has shifted from politicians to officials. The book Why Nothing Works* *by Marc Dunkelman divided US political history into the period before 1970 and the period after. The period before 1970 it said was focused on building capacity, the period afterwards on *constraining*capacity: ‘If progressivism had once been focused on building up centralized institutions, the new goal was to tear them down.’”
- “[quit brainrot.](https://x.com/gaxrav/status/1846226808112353597)”

---

---

# Joy & Curiosity #58

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 19, 2025

---

Light issue after this busy, busy, busy week. We launched [Amp Free](https://ampcode.com/free) on Wednesday. Monday already had excitement in the air, Tuesday the last-minute fixes, Wednesday the double-checks and this-really-is-the-last-minute fixes and the launch, Thursday the very positive feedback (people *love* good looking ads in the terminal!), Friday was back to building. Yesterday I was barely online, but on my bike. Great week.
[![](https://archive.thorstenball.com/data/images/176543936.joy-and-curiosity-58/ad873cd8-01ec-4cab-9e00-2eb708c0f0e2.png)](https://archive.thorstenball.com/data/images/176543936.joy-and-curiosity-58/ad873cd8-01ec-4cab-9e00-2eb708c0f0e2.png)
- “It takes a while for this to sink in, and your first reaction is always to lead with the counter-argument. I know it seems like this app has just gotten buggier but that’s not what they’re trying to do. I know it seems like we’re producing features no one uses but that’s not what we’re trying to do. I know that it seems like we’re just adding headcount here with zero impact but that’s not what we’re trying to do. But [the purpose of a system is what it does](https://destraynor.com/writing/the-purpose-of-a-system-is-what-it-does/), not what it’s trying to do. And if you evaluate the world around you like that, you’ll come to clarity quicker.” From Des Traynor, one of the co-founders of Intercom. I also really enjoyed [his Cheeky Pint appearance](https://www.youtube.com/watch?v=2SEgQiu8XaU).
- [Nine short paragraphs](https://boz.com/articles/self-actualization) and I don’t think I’ll ever forget this thought: “When I started Bootcamp — and was, for the first year, everyone’s mentor — I didn’t teach the culture as it was. I taught the culture as I wished it were. The new engineers didn’t know the difference. They had no baseline for what was ‘true,’ only for what was taught. And because the company was growing so fast, within a year more than half of the engineering team had learned about the culture from me. By then, the story I had been telling about our culture had become the culture.”
- [Zed for Windows is here](https://zed.dev/blog/zed-for-windows-is-here). Impressive effort. And, man, what a nice piece of software.
- v8’s [GEMINI.md](https://github.com/v8/v8/blob/f7c2751ff9e362b668f6c0fbbcf2df2fe68f1635/GEMINI.md): “Some hints: You are an expert C++ developer.” Some hints! *Oh, btw., you are an expert, make no mistakes. *Man, what a world we live in. And then there’s, of course, the plea to not waste tokens: “Make sure to pass the `quiet` keyword unless told to otherwise, so that you don’t waste tokens on compilation progress. Errors will still be reported.”
- Did you know [the Bloomberg terminal has ads](https://assets.bbhub.io/media/sites/2/2022/09/Bloomberg-Terminal-Banner-Specification.pdf)?
- But you do know about the history of [Bloomberg terminal keyboards](https://www.bloomberg.com/professional/insights/trading/look-back-bloomberg-keyboard/), right? No? Enjoy!
- Interesting: Cognition [trained their own model to be faster at search](https://cognition.ai/blog/swe-grep).
- “Reminded me of a software tournament in 1999, a high school student showed me a stunning Civilization clone, complete with shiny ui, simple but working AI, isometric tiles, and sprite animations... All in one massive Pascal program, thousands of lines between a single begin and end, full of gotos and labels, not readable at all, but just working. When I asked why he didn’t use any procedures or functions, he replied they slowed him and the main loop down on his 386🤯 In early crazy expensive internet days, with coding books too costly for most students in Turkey, he taught himself coding through trial and error on an offline school computer. [I wonder where you are now, Turkish Carmack](https://x.com/muskirac/status/1978540726750237030).”
- Bill Gurley wrote a book: [Runnin’ Down A Dream](https://www.amazon.com/dp/0593799666). I linked to it before, but if this isn’t the chance to relink, I don’t know what is: watch [the talk he gave with the same title](https://www.youtube.com/watch?v=xmYekD6-PZ8)!
- You think you know command palettes (I mean: who doesn’t use them every single day by now?), but then you read this and realize how much detail goes into it: [how to build a remarkable command palette](https://blog.superhuman.com/how-to-build-a-remarkable-command-palette/). Great post.

---

---

# Joy & Curiosity #57

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 12, 2025

---

Good news after [last week’s](https://registerspill.thorstenball.com/p/joy-and-curiosity-56)edition: I can stand up straight again!

But, more interesting than that, did you know that what in English you’d call a lumbago, or sudden back spasm, or “throwing your back out”, is called in German a *Hexenschuss? *That literally translates to *witch’s shot*.

As if a witch had shot your back with something.

Well, now you know!

---

- Inspiration, I found, will never appear when you look for it. It only ever shows up by surprise. Heisenbergian in nature, if you will. Strain to find it and it’ll never appear. But then you sit down and open an article on your phone that a reader of this very newsletter sent you because they thought you might enjoy it, and you see that it’s called “[Me, U, Baku, Quba](https://www.tabletmag.com/sections/arts-letters/articles/baku-joshua-cohen)” which — *okay, weird title —*  is subtitled with “*How a tiny enclave of Mountain Jews in Azerbaijan produced some of the former Soviet world’s richest men*”. Yes, that might be right up your alley, you think, but is that where inspiration comes from, I don’t thi— *surprise!* there it is! Right there, in the first paragraph, someone’s going for it, *this is it*, this is the good stuff: “One thing about dictatorships, they’re either very expensive or very cheap to fly to. There’s no such thing as a midrange regime: Extremities charge extremities. I know a guy, it cost him $4,600 just to get to North Korea (Newark-Beijing-Dandong, and then across the DPRK border in a Jeep). I know another guy, it cost him $2,800 just to get to Laos (Newark-Tokyo-Bangkok-Vientiane). I flew nonstop from JFK to Baku, Azerbaijan, visa included, for all of $500.” Absolutely fantastic stuff.
- There’s nothing I don’t love about this: [My First Contribution to Linux](https://vkoskiv.com/first-linux-patch/). This is blogging at its finest. It’s great writing, it’s casual, it’s technical, it has a nice hook (look at that old Fujitsu laptop, and those specialized keys! we all had those and they never worked!), it’s humble. It’s a walkthrough of “here’s the problem” to “here’s the patch.” I love it.
- Thomas Ptacek, from Fly.io, on his boss and CEO getting phished: [Kurt Got Got](https://fly.io/blog/kurt-got-got/). What a title! And I should rewatch The Wire. I really liked this: “Contrary to one popular opinion, you don’t defeat phishing by training people not to click on things. I mean, tell them not to, sure! But eventually, under continued pressure, everybody clicks. […] What you’re supposed to do instead is use phishing-resistant authentication.” I guess this is a good place as any to tell the story of how I got got too. Last week I woke up to a thousand new subscribers of this newsletter. You’d think that constantly happens, but it doesn’t. So I spot-checked the email addresses to find out who and why and where from. Most of them looked Indian to me. Huh. Where was I linked? No referrer. Nothing. An hour later, I get an email: “Your X account was last used in New Delhi. Is that you? If not, click here.” Oh shit, I got got! “Something something India subscribers bait Twitter” was the elaborate theory my fast-working mind threw together before I clicked that button to say that it wasn’t me. My mind had the *tiniest* bit of resistance when I was presented with an OAuth dialog to give “X Account Support” access to my account before resetting password. Too tiny to have an effect, so I clicked. Once in, I changed my password, logged out every session, and with my cursor lingering, I realized: oh shit, I got *got, *the OAuth application was the hack! It’s fake, fuck. And I do have 2FA, how could someone in New Delhi log in? So I removed all OAuth applications, all sessions again, checked that my profile hasn’t posted anything, and then went back to look at the email and, yes, it wasn’t even a good email. The sender was big number at fake domain. Styling was off. But I ran right into it. Moral of the story: use 2FA.
- Mitchell on [Vibing A Non-Trivial Ghostty Feature](https://mitchellh.com/writing/non-trivial-vibing). He built the whole feature in “16 separate sessions”, that end up “totalling $15.98 in token spend on Amp. I won’t try to speculate whether this is expensive or cheap in general, but I will say for me personally I spent more than that in coffee shops in the two calendar days I spent on this feature.” We need more content like this (I’m thinking about recording myself implementing a whole feature), because look: 16 threads! That’s at least 16 times when Mitchell decides to put the hands back on the wheel, or adjust the wheel. Look at the prompts and how deliberately he mentions specific files. Look at how he already roughly knows what to build. That’s how you do it.
- [Always invite Anna](https://sharif.io/anna-alexei).
- I’ve heard about [Magic-Wormhole](https://magic-wormhole.readthedocs.io/en/latest/welcome.html) before, but came across the website again this week. It promises to “get things from one computer to another, safely”, which is still surprisingly hard for many variations of “things”, including “many small directories” or “one large, multi-gigabyte file”. It’s a lovely website. So, here’s my reminder to you and myself: next time, try this out.
- Listened to the [Cheeky Pint episode with Tobi Lütke](https://cheekypint.transistor.fm/13), CEO of Shopify, and was reminded of this blog post of his, that I read back when it came out, in 2013. I think of it many times per year and every time Lütke comes up:[The Apprentice Programmer](https://tobi.lutke.com/blogs/news/11280301-the-apprentice-programmer).
- Aaron Francis went on [a Vision Quest and wrote about it](https://app.bentonow.com/share/poJ1zxVWEQN3dR): “I’m writing this email from a little AirBnB in East Texas. I gotta check out in a few minutes, but wanted to send this before I go. I’ve been here since Wednesday afternoon, and weirdly, haven’t looked at Twitter once since I’ve been here. To be honest, I’ve done next to nothing for the past 2 days. I just sat on the back porch and looked at the trees. For like hours at a time. Went for a few walks through the woods. Saw a deer, scared both of us. Did a lot of thinking, a bit of writing, a bit of voice memo’ing.” Alluring, but also scary.
- Open this, look at the address bar and use your arrow keys: it’s [a Snake game in the URL, yes](https://demian.ferrei.ro/snake).
- Turns out that [Secret Service SIM farm](https://cybersect.substack.com/p/that-secret-service-sim-farm-story) might not be nation-state actors after all.
- I’m so late to the party that it’s probably over, but hey, at least I showed up: this week I tried [the web interface of Midjourney](https://www.midjourney.com/) for the very first time and, *man, *it’s so good! The UI, all the interactions, how it just lets you smash buttons and enqueue stuff, there’s nothing between you and trying stuff out — so good!
- “one of the things about spending a lot of time with small children is i[t is so much fun](https://x.com/maiab/status/1975203945577595240). I have more fun in hours now than I used to have in months. the amount of fun we have with small everyday things is so extreme. we spend so much time laughing” Before I had kids, a friend, who at the time was pregnant with her second one, told me: “Thorsten, if you have kids, you get to laugh until you cry every day.” There’s a Comedians in Cars Getting Coffee episode in which Jerry Seinfeld is asked: “Should I have kids or not?” Seinfeld replies: “You’re standing in front of the amusement park and you’re asking me whether you should go in or not!” Then again, Seinfeld also said that kids are the only ones that, when they’re on the toilet and someone knocks on the bathroom door, say, “Come in!”
- For no particular reason, I need you to read (or re-read) James Mickens’ [The Night Watch](https://scholar.harvard.edu/files/mickens/files/thenightwatch.pdf). Why? “Here’s the answer: Pointers are real. They’re what the hardware understands. Somebody has to deal with them. You can’t just place a LISP book on top of an x86 chip and hope that the hardware learns about lambda calculus by osmosis. Denying the existence of pointers is like living in ancient Greece and denying the existence of Krackens and then being confused about why none of your ships ever make it to Morocco, or Ur-Morocco, or whatever Morocco was called back then. Pointers are like Krackens—real, living things that must be dealt with so that polite society can exist “ The phrase “learns about lambda calculus by osmosis” has been stuck in my head for a very long time now.
- Nice, nice, nice: [Multi-Core by Default](https://www.rfleury.com/p/multi-core-by-default).
- Paul Thomas Anderson’s new movie One Battle After Another is based on the Thomas Pynchon novel Vineland. I’ve never read anything by Pynchon, but his Wikipedia page many times, always intrigued. With the movie coming out and Pynchon being in the news again, I read it again, and again I’m intrigued. And then I found this: [Pynchon: An Introduction](https://registerspill.thorstenball.com/publish/post/175820745). It’s a great introduction but I’m not sure I’ll dare to read one of his books. (And I got a lot of Robert Caro books to read anyway.)
- David Senra, creator of the[Founders podcast](https://open.spotify.com/show/7txiovdzPARhjm18NwMUYj), has a new podcast, a self-titled one, and [the first episode is an interview with Daniel Ek](https://www.davidsenra.com/episode/daniel-ek-spotify), the CEO (or, now: ex-CEO) of Spotify. Not only did I enjoy the episode (Ek says quite a few things you don’t hear in many interviews with founders and CEOs), but this here, when Ek talks about his thinking on big companies, this made something click in my head and that click I don’t think can be undone: “I’ve sort of revised my view, and now I think they’re really good at doing what they’re already doing and doing it better. So, back to that point, a large-scale corporation, what they do is they just get better and better and better at doing what they already do, and the way to do that is obviously to minimize mistakes. So, you know, that also means minimize brilliance, minimize waste, minimize all these other things.”
- I’m sure you know what a Heisenbug is, right? In case you don’t, today’s your lucky day. A [Heisenbug](https://en.wikipedia.org/wiki/Heisenbug) is “a software bug that seems to disappear or alter its behavior when one attempts to study it.” Fingers crossed that the knowledge of its existence doesn’t curse your future. But I’m not here to tell you about the Heisenbug. What I want to ask you is: have you ever looked at the [Related Terms](https://en.wikipedia.org/wiki/Heisenbug#Related_terms) section of that Wikipedia article? No? Go! Bohrbug, Mandelbug, Schrödinbug are waiting for you!
- One hundred percent: [Examples are the best documentation](https://rakhim.exotext.com/examples-are-the-best-documentation). I’ll take five examples over five paragraphs of technical writing every time. Shout-out to the PHP docs for having had [examples](https://www.php.net/manual/en/function.array-push.php) for over two decades now. And while I’m here on stage talking about examples, let me give a shout-out to [Learn X in Y Minutes](https://learnxinyminutes.com/).
- While reading the previous link here, I was wondering: how and why did I fall in love with examples? I have this deep conviction that examples are probably better than 90% of explanations, or guides — but why? Then it hit me: Kathy Sierra. Her talk [Making Badass Developers](https://www.youtube.com/watch?v=FKTxC9pl-WM) is where I got this from, that must be it. So I rewatched the talk (it’s only 23min and easy to watch on 1.5x or even 2x) and, hell yes, examples! Watch the talk. It’s very good. And then take what she said about examples and learning and multiply it with what Nat Friedman says on [his website](https://nat.org/) about being fast: “It’s important to do things fast. You learn more per unit time because you make contact with reality more frequently.”
- And *that*, in turn, made me think of Peter Norvig’s [Teach Yourself Programming in Ten Years](https://norvig.com/21-days.html). I think Kathy would say that you don’t need ten years.
- Remember [Light Table](http://lighttable.com/)? The “next generation code editor” that was also a Kickstart project and reached “7,317 backers and over $316,000”? I didn’t until I randomly came across the page again. I also ended up on the website of the Light Table creator, Chris Granger, and, well, everything so far was just an intro because what I want to show you is probably [one of the hardest-hitting lines in a resume every](https://chris-granger.com/resume/): “Implemented 24 compilers, 34 environments/IDEs, 25 relational engines, 16 storage engines, 9 interpreters, dozens of parsers, and numerous standard libraries based on state of the art research.”
- I’m currently listening to [episode #2 of 3 of the Acquired episodes on Google](https://www.acquired.fm/episodes/alphabet-inc). It’s — like all things from Acquired — very good. Surprisingly, it’s starting to put Google in a different light for me. Maybe that’s just because it’s a good retelling, a good sounding history, or maybe it’s because I missed things back when they were happening. Example: back when they released Chrome, I thought of it as “of course does this company full of hackers release a browser, of course, what else would they do? they ship so many things, why wouldn’t they ship a browser?” But now, in hindsight, it looks like a genius business move to establish their own platform. Highly recommend listening. And, also, if you haven’t, read the 2018 James Somers article in The New Yorker on Jeff Dean and Sanjay Ghemawat:[The Friendship That Made Google Huge](https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge).
- I’ve linked to this one before, probably multiple times, but it’s time again to link to Pieter Hintjens’ [Why Optimistic Merging Works Better](http://hintjens.com/blog:106). It’s so, so, so good. I clearly remember how every fiber in my body thought it was wrong the first time I read it. “This guy’s mad”, was a thought I had. Then, slowly, I saw the problems he described in other domains, when consensus was put before progress and both didn’t happen, and started to realize how right he is and how little my objections mattered. Great post.
- This was great: [Does our “need for speed” make our Wi-Fi suck?](https://orb.net/blog/does-speed-make-wifi-suck)
- LLMs are funny. Anthropic: [a small number of samples can poison LLMs of any size](https://www.anthropic.com/research/small-samples-poison). Pre-print of a Meta paper: [a single character can make or break your LLM evals](https://arxiv.org/abs/2510.05152). “In evaluation protocols and real world usage, users face the choice how to separate in-context examples: use a comma? new line? semi-colon? hashtag? etc.? Surprisingly, we find this seemingly minor choice can dramatically alter model response quality. Across leading model families (Llama, Qwen, Gemma), performance on MMLU for example can vary by ±23% depending on the choice of delimiter.”

---

---

# Joy & Curiosity #56

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 5, 2025

---

There’s a certain category of often repeated sayings that, even though you’ve heard them all your life, only truly make sense many years after you first heard them. “Life’s not fair”, or “money doesn’t buy happiness”, or, hey: meta, “you’ll understand when you’re older”. As a six-year-old, you say “totally” when someone says “money doesn’t buy happiness”, but only when you have or earn money do you start to see what the phrase wants to say.

One of them, for me, was “don’t lie to yourself.” As a six-year-old, I went “roger that, why would I?” and shrugged it off. It took me about twenty-five more years and starting to lift weights to understand what it means. Because when you have 150kg on your back and someone tells you to do as many reps as you can, it’s *very* tempting to tell yourself "that’s it, two reps, can’t do more.” It’s very easy to tell yourself you did something with good form. It’s very comfortable to believe that you did as much as you could. It’s convenient to say “no, I’m not ready for this weight today, can’t do it, let’s drop the weight down” when, in fact, you were ready, but scared.

So, yes, even though this will cause many eyes to be rolled, I recommend lifting, even for no other reason than the fact that there’s nothing but you, the bar, the weights, and what you tell yourself, and that combination will make you grow, not just in size.

But the reason I bring this is up: two days ago, when deadlifting, I *did* lie to myself by believing that I’m in good form (even though I hadn’t slept that well), that I can do the three reps, easily (even though the first few sets weren’t smooth). Then, on the second rep, I felt the tiniest of all twinges in my lower back, and, having felt it before, immediately knew that I lied to myself and knew it was over. I woke up yesterday unable to stand up straight, because my whole back had locked up.

So, take it with a grain of salt.

---

- My favorite piece of writing this week: [Thank you for being annoying](https://www.experimental-history.com/p/thank-you-for-being-annoying), by Adam Mastroianni. There are too many things to quote here. So, please, read the whole thing. It’s very good.
- And this is the most impressive piece of meta-writing I came across in a long time: Wikipedia’s [Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing). It’s fascinating to read through the examples and remember some you’ve already clearly identified as signs of AI, but then also find new ones and go “ahh, yes, that one!” In my case, it was the negative parallelisms (“it’s not just about …, it’s …”) that have made me mad for a long time, but only now have a name.
- I finally watched [the General Magic movie](https://vimeo.com/ondemand/generalmagic) and it was great. Highly recommend it.
- Wonderful Michael Lynch writing about [The Software Essays that Shaped [Him]](https://refactoringenglish.com/blog/software-essays-that-shaped-me/). Great list. Some of them I hadn’t read and this one, [Choices](https://www.joelonsoftware.com/2000/04/12/choices/) by Joel Spolsky, made me think all kinds of thoughts on software developers and designers and product managers.
- Good pairing would be to read the Choices article first, then this one: [You Want Technology With Warts](https://entropicthoughts.com/you-want-technology-with-warts). And then ponder the difference between users and software developers as users.
- I learned about [Progress Quest](http://progressquest.com/play/), a game that apparently only consists of the player watching fancy progress bars. Yup, that’s it, but, still: try it. And then read the [FAQ](http://progressquest.com/faq.php). And then read the [Manual](http://progressquest.com/info.php): “Progress Quest belongs to a new breed of ‘fire and forget’ RPG’s. There is no need to interact with Progress Quest at all; it will make progress with you or without you.”
- Incredible blog post that immediately went on my ever-growing list of “things to work through once I do that sabbatical where I go into a shed in the woods for eight months and are magically not distracted by anything”: [Inside NVIDIA GPUs: Anatomy of high performance matmul kernel](https://www.aleksagordic.com/blog/matmul).
- “Some people have called into question whether AI coding agents are actually increasing developer productivity. It even led one person to ask, ‘Where’s the shovelware?’ in a widely circulated blog post. [...] Because I keep running into people in apparent disbelief that coding agents can do Real Programming, I decided to wear it loud and proud by creating a GitHub badge for all my projects that wouldn’t have existed without coding agents as [Certified Shovelware](https://justin.searls.co/shovelware/).”
- [Domenic Denicola is retiring](https://domenic.me/retirement/), which not only makes me feel old (I’ve been following him for well over a decade) but also poor (I [think of Dune](https://www.imdb.com/title/tt1160419/characters/nm0000982/) every time I see an Ex-Googler retire after a decade: “Eighty years of owning the spice fields. Can you imagine the wealth?”). But it also made me amazed, yet again, that the Internet, and the Web, are a thing at all: “Just like I was thrilled to learn after university that people will pay well for something as fun as programming, I’m amazed that we’ve managed to harness the will of the market and large corporate budgets to nurture an artifact as impressive as the web.”
- I didn’t know who [Scott Aaronson](https://en.wikipedia.org/wiki/Scott_Aaronson) is before [this tweet](https://x.com/sebastienbubeck/status/1972368891239375078?s=46) about one of this blog posts made me the rounds with the caption: “Yet more evidence that a pretty major shift is happening, this time by Scott Aaronson” Here’s what Scott wrote: “Instead, though, I simply asked GPT5-Thinking. After five minutes, it gave me something confident, plausible-looking, and (I could tell) wrong. But rather than laughing at the silly AI like a skeptic might do, I *told* GPT5 how I knew it was wrong. It thought some more, apologized, and tried again, and gave me something better. So it went for a few iterations, much like interacting with a grad student or colleague. Within a half hour, it had suggested to look at the function […] And this … *worked*, as we could easily check ourselves with no AI assistance. And I mean, maybe GPT5 had seen this or a similar construction somewhere in its training data. But there’s not the slightest doubt that, if a student had given it to me, I would’ve called it clever.” Wild times.
- And [here’s Terrence Tao](https://mathstodon.xyz/@tao/115306424727150237), who I know: “Here, the AI tool use was a significant time saver - doing the same task unassisted would likely have required multiple hours of manual code and debugging (the AI was able to use the provided context to spot several mathematical mistakes in my requests, and fix them before generating code). Indeed I would have been very unlikely to even attempt this numerical search without AI assistance (and would have sought a theoretical asymptotic analysis instead).” One thing that kept coming up in conversations I had in the last few weeks is that this is just the start.
- But then here’s some cold water: [AI isn’t replacing radiologists](https://www.worksinprogress.news/p/why-ai-isnt-replacing-radiologists). Cold, and interesting, and nuanced water. It’s a very good article that shows how you can’t just inject “intelligence” into the real world.
- [And more cold water](https://codemanship.wordpress.com/2025/09/30/comprehension-debt-the-ticking-time-bomb-of-llm-generated-code/): “’Doom loops’, when we go round and round in circles trying to get an LLM, or a bunch of different LLMs, to fix a problem that it just doesn’t seem to be able to, are an everyday experience using this technology. Anyone claiming it doesn’t happen to them has either been extremely lucky, or is fibbing.It’s pretty much guaranteed that there will be many times when we have to edit the code ourselves. The ‘comprehension debt’ is the extra time it’s going to take us to understand it first.And we’re sitting on a rapidly growing mountain of it.”
- Even if you don’t know any of the words involved here (including Minecraft, including redstone), you *will* be impressed, I guarantee it: “[I built ChatGPT with Minecraft redstone!](https://www.youtube.com/watch?v=VaeI9YgE1o8)”
- “Is 90% of code going to be written by AI? I don’t know. [What I do know is, that for me, on this project, the answer is already yes](https://lucumr.pocoo.org/2025/9/29/90-percent/).”
- As someone who once tried to make it as a musician, I’ve read my fair share about the music industry, and streaming, and the collapse of this and the rise of that in the last twenty years, and [these numbers were very surprising](https://www.forbes.com/sites/stevenbertoni/2025/09/30/why-spotify-ceo-daniel-ek-is-stepping-down-after-nearly-two-decades/): “In 2011, the same year Spotify debuted in U.S. markets, the music recording industry’s revenue was around $15 billion—40% less than the $24 billion in sales it logged ten years earlier. Fast forward to 2025, thanks to streamers like Spotify, annual recording sales are near $30 billion, with streaming accounting for $20 billion of the total. Spotify pays 70% of its revenue to musicians and rights holders. In 2024, it paid out $10 billion.” I wonder when the narrative will shift, though.
- Marc Brooker: “The current generation of LLMs can’t do this type of reasoning alone, but systems composed of LLMs and other tools (SMT solvers in this case) can do it. The hype and buzz around LLMs makes it easy to forget this point, but it’s a critical one. LLMs are more powerful, more dependable, more efficient, and more flexible when deployed [as a component of a carefully designed system.](https://brooker.co.za/blog/2025/08/12/llms-as-components.html)”

---

---

# Joy & Curiosity #55

*Interesting & joyful things from the previous week*

By Thorsten Ball • September 28, 2025

---

Remember when, two weeks ago, I [told you about my internal struggle](https://registerspill.thorstenball.com/p/joy-and-curiosity-54) when packing for trips? Remember when I said that I always pack too much and yet still envy the carry-on-only people? Well, right after I told you about it, I hopped on a plane and arrived in Mexico… without my luggage. That only arrived a day later. 

Remember, when 6 weeks ago, I [told you about the black shirt I bought twice](https://registerspill.thorstenball.com/p/joy-and-curiosity-50) and lost twice in San Francisco? Well. I was in San Francisco again and, again, brought the black shirt and — I didn’t lose it. I still have it. But! On the way back, I boarded the plane, sat down, was told to get up again because we had to deplane, waited for two hours, boarded another plane and realized I forgot my hoodie on that first plane.

What I’m trying to ell you is this: if you haven’t, you should subscribe to this newsletter. Only to keep up with the high-stakes lost-and-found drama in my life.

---

- Quinn and I were guests on the Latent Space podcast. We recorded last Monday, in San Francisco, and I think it’s going to be one of the things I’ll tell my grandchildren about: in the 2020s, I was a guest a podcast, in San Francisco, talking about AI, and a coding agent I was building, and, yes, you read that right, the thumbnail says that we were “[building the coding agent god](https://www.youtube.com/watch?v=b4rOVZWLW6E)” and, I swear to you my grandchild, we never mentioned the word god in this conversation, but it was a lovely and enjoyable conversation and, man, I’m telling you, I had a ton of fun.
- Amazing: [The Making of a Market Maker](https://joincolossus.com/article/thomas-peterffy-market-maker/). Started off all the things one can find in other rich-business-men profiles too, but then there’s this: “In the corner of the office sat a $3,000 solution nobody wanted to touch. The Olivetti Programma 101 weighed 20 pounds and looked like an oversized cash register. It had a numerical keypad, a slot for magnetic cards, and a built-in printer. […] When Peterffy volunteered to tackle the unused machine, nobody objected.” And then there’s this: “Most clients wanted the same reports that compared securities across various metrics like price-to-earnings, book value, and earnings growth rates. Peterffy wrote programs in Fortran, fed stacks of punched cards into room-sized IBM mainframes, and waited as the machine hummed and clicked through calculations.” And it kept getting better: “By 1976, he commanded a team of 80 programmers—one of the largest financial coding operations in the world—and Jarecki began bringing him into meetings that had nothing to do with software.” Very fun read. Highly recommend it.
- Brandon Smith with [Thoughts on Testing](https://www.brandons.me/blog/thoughts-on-testing). Reasonably sure that I linked to this last year, but I re-read it and nodded (presumably again). I’ve said it here before: I did a 180 on tests in the past few years and now they’re just something I might do.
- This website is a statement: [News Minimalist](https://www.newsminimalist.com/). What does it do? “Today ChatGPT read 30082 news articles and gave 22 of them a significance score over 5.5.” Trying to filter out the noise of daily news. I’d love the see the same statement, but made from the other side: it should look back at the last four weeks, four months, four years and flag how much of the daily news turned out to be insignificant and just noise that was drowned out a couple days later.
- “Nowadays, you can specify the task you want to automate, fire off Codex or Claude Code, check back in 30 mins and have an almost-perfect result. To give you some ideas, some things I have automated or do regularly using LLMs: […]” from [You’re not using LLMs enough](https://florianbrand.de/posts/use-llms-more). I’d love to do more like this, but I have to admit that I get lazy whenever it gets to deployment.
- This should be some sort of official personality test: [I’m Not a Robot](https://neal.fun/not-a-robot/). Hats off, but I only made it to level 5.
- [How to build your first forward deployed engineering team](https://www.peraspera.us/p/forward-deployed): “And remember: this is painful. In McGrew’s recent appearance on the YC pod, we counted eight mentions of ‘pain.’ If you master the loop, you can achieve power-law outcomes. But it’s painful and hard to pull off. You can easily veer into customer support or consulting, which dilutes the strategy and balloons your cost structure.”
- I’ve never worked with R but I sat next to people working with R and what I heard didn’t exactly convince me to never trying it, but it also kinda made me think that I’ve heard enough. So when I started reading this — [If all the world were a monorepo](https://jtibs.substack.com/p/if-all-the-world-were-a-monorepo) — I thought: ahh, R. But I ended up being fascinated. (And surprised! Only after reading did I realize it was written by my ex-colleague Julie!)
- “[How I, a non-developer, read the tutorial you, a developer, wrote for me, a beginner](https://anniemueller.com/posts/how-i-a-non-developer-read-the-tutorial-you-a-developer-wrote-for-me-a-beginner)”
- Fascinating piece of writing: “[I ran out of money a year ago, spent the last of my savings on a prostitute in Hong Kong, and became a commie.](https://docs.google.com/document/d/1Am8bYA1aoXuSGFg7w7NjlHXFZiSAEt_oAVITPYdNRGo/mobilebasic)” It’s well-written, isn’t it, and also odd, strange. I bet that in ten years you can point at it to explain the San Francisco Artificial Intelligence Zeitgeist of the Early 2020s.
- And when you do point back, make sure to [point them at this piece too](https://jasmi.news/p/dictionary): “The AI gold rush has sparked a vibe shift in San Francisco. The city is flush with money again after the post-ZIRP recession of 2022. Cracked 22-year-old coders are telling the world they’re going to ‘solve hurricanes’ and the ‘national debt.’ Lurie is mayor, nature is healing, the technology brothers are back with a vengeance. Take a look—$100 million salaries, glitzy hype videos for fundraises, lavish parties with dress codes—Silicon Valley is swelling with Trump-era opulence—blustery, spendy, and male.”
- It made me think of [this passage from Hunter S. Thompson’s Fear and Loathing in Las Vegas](https://www.goodreads.com/quotes/1074-strange-memories-on-this-nervous-night-in-las-vegas-five): “Strange memories on this nervous night in Las Vegas. Five years later? Six? It seems like a lifetime, or at least a Main Era—the kind of peak that never comes again. San Francisco in the middle sixties was a very special time and place to be a part of. Maybe it meant something. Maybe not, in the long run . . . but no explanation, no mix of words or music or memories can touch that sense of knowing that you were there and alive in that corner of time and the world. Whatever it meant. […] There was madness in any direction, at any hour. If not across the Bay, then up the Golden Gate or down 101 to Los Altos or La Honda. … You could strike sparks anywhere. There was a fantastic universal sense that whatever we were doing was right, that we were winning. […] So now, less than five years later, you can go up on a steep hill in Las Vegas and look West, and with the right kind of eyes you can almost see the high-water mark—that place where the wave finally broke and rolled back.” Then again, there’s few other pieces of writing I think of as often.
- Lee Robinson: [Things I Believe](https://leerob.com/beliefs). Very good.
- I’ve read this one before, a few years ago, but ended up re-reading the whole thing again: Tim Ferriss with [11 Reasons Not to Become Famous (or “A Few Lessons Learned Since 2007”)](https://tim.blog/2020/02/02/reasons-to-not-become-famous/).
- “The U.S. Secret Service has announced that, following a monthlong investigation, it has carried out an operation which resulted in the dismantling of a network consisting of more than 300 SIM Servers and 100,000 SIM Cards at multiple sites across New York and New York City, all within a 35-mile radius of this week’s United Nations General Assembly.” Dude. [Look at the photos](https://x.com/sentdefender/status/1970470725677883797?s=46). It’s “capable of sending over thirty-million text messages per minute, anonymously[.”](https://mitchellh.com/writing/libghostty-is-coming)
- [libghostty is coming](https://mitchellh.com/writing/libghostty-is-coming). Hell yes.
- “It seems pretty well-accepted that AI coding tools struggle with real production codebases. [...] The common response is somewhere between the pessimist ‘this will never work’ and the more measured ‘maybe someday when there are smarter models.’ After several months of tinkering, I’ve found that you can get really far with today’s models if you embrace core context engineering principles. This isn’t another ‘10x your productivity’ pitch. I tend to be pretty measured when it comes to interfacing with the ai hype machine. [But we’ve stumbled into workflows that leave me with considerable optimism for what’s possible](https://github.com/humanlayer/advanced-context-engineering-for-coding-agents/blob/main/ace-fca.md).” I’ve become skeptical of subagents and I’m also very skeptical of encoding these workflows in hard UIs, but there’s so much other practical, true things in here. Very good.
- When I saved [this link](https://walzr.com/sf-parking/) it said “I reverse engineered San Francisco’s parking ticket system to show you exactly where each parking cop last wrote a ticket.” It still does that. But now it also says “In rare lightning speed, the SF government changed their site within hours of this site going live. I can’t get data from it anymore.” I’ll see you, Icarus.
- Please read [the Google section in the Steve Ballmer Wikipedia entry](https://en.wikipedia.org/wiki/Steve_Ballmer#Google): “At some point in the conversation Mr. Ballmer said: ‘Just tell me it’s not Google.’ I told him it was Google. At that point, Mr. Ballmer picked up a chair and threw it across the room hitting a table in his office. Mr. Ballmer then said: ‘Fucking Eric Schmidt is a fucking pussy. I’m going to fucking bury that guy, I have done it before, and I will do it again. I’m going to fucking kill Google.’”

---

---

# A New Kind of Code

*A button that produces code?*

By Thorsten Ball • September 21, 2025

---

Imagine this: a button that, when pressed, produces 500 lines of working, mostly dumb code in, say, a minute.

You get to choose. 500 lines of JavaScript, or Python, or Go, or Ruby. 500 lines of a script that processes some files and turns them from before into after. 500 lines of a web application that lets you view and manipulate data. 500 lines that make it easier to work with four other tools you previously had to manually invoke. 500 lines of tests and test helpers. 500 lines of working, helpful, time saving, but not that smart code.

I think we have that button now. It’s called coding agents. 

---

Yes, agents might not be great at everything great engineers are great at. You can’t drop them in the v8 codebase and tell them to fix branch prediction misses in the JIT compiler. But ask them to build a little web app that lets you browse through the 232 crash dumps you collected to analyze a memory leak? They’ll do it. 90% of the time on first try.

It might not turn out to be the greatest code of all time. But it works and all you had to do was type a prompt, hit that button, and wait a minute or two.

I think there’s an opportunity lost in the many (loud, confident) comparisons between agents and humans in which the agent loses because “it can’t do what I do, it can’t write the code I write”.

An agent doesn’t have to be able to write code like a human to be useful.

---

Here’s how I think about it. Code has always been precious — hard, expensive and time-consuming to write. Consider how much of software development and developer tooling in the last thirty years was about reducing the need to write code.

But now we have these tools, these agents, that can produce mostly working, but maybe not super smart code, yet mostly on first try: what can we do with that? What can we do with that button? There has to be something, right? Yes, even if maybe (and that’s a maybe on shaky foundations) it can’t write code like you can.

If code up until this year has been bolts and screws, with agents, with this button that produces 500 lines of code, we now have glue. What can we build with glue?

Glue is useful, even if you won’t use it in the same place you would use a screw or a bolt.

So instead of asking: can it write the code that I would write? I think it’s more useful to wonder: what can we do with this new kind of code?

---

---

# Joy & Curiosity #54

*Interesting & joyful things from the previous week*

By Thorsten Ball • September 14, 2025

---

As I’m standing here and packing for a ten day trip, first to Mexico and then to San Francisco, I can hear the three hearts beating in my chest again.

The first one, with its ba-dum ba-dum ba-dum spelling out its wishes in morse code, tells me that I should be envious of those hand-luggage-only people. True travellers; agile, light, flexible; their whole life in the overhead compartment; they probably laugh at those *idiots* standing around the luggage carousel when they walk past. Actually, they probably are somewhere else already.

My second heart, its rhythm clashing, instead *laughs* at the hand-luggage-only people. “Just wait until they get cholocate ice cream all over their white t-shirts,” it assures me, “and then sit down into some jam-filled pastry someone dropped on a chair at breakfast, right before someone tells them they can’t wear those shoes to dinner, which comes right before the rain, for which they’re unprepared. What if they pee their pants, dude?” It tells me to take the bigger suitcase.

The miraculous third heart is wise. It’s calm. Its ba-dum whispers and says “it’s fine, they’re both right, let’s do what we always do.” What it means, of course, is that I should do *both*. Pack *a *lot (*a lot*) but then *also* get stressed out about not having enough clothes (*watch out for those pastries…) *and obsessively ration the clothes I brought — like wearing the same shorts for an amount of time that’s barely accepted by society while telling myself that no one will notice that stain anyway. It'll come right out if you just, see, brush over it like this.

---

- Really, really, *really* good: [Behind the Scenes of Bun Install](https://bun.com/blog/behind-the-scenes-of-bun-install). Clear writing based on clear thoughts with explanations on just the right level of abstraction, consistently so, this is what technical writing should be. Oh, and, of course, it’s a lot of fun and makes me want to make things faster.
- Also really, really, *really* good: [Defeating Nondeterminism in LLM Inference](https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/). I’ve always been curious about why even at temperature 0 some LLMs can be non-deterministic and when, a few weeks back, I’ve [tweeted about LLMs being non-deterministic](https://x.com/thorstenball/status/1956017792484040731) people in the replies fought over not only over whether they are non-deterministic, but also what the source of that non-determinism could be. Floating point operations? The hardware, GPUs? Here’s the answer. It’s both, but not really: “In other words, the primary reason nearly all LLM inference endpoints are nondeterministic is that the load (and thus batch-size) nondeterministically varies!” They are ultimately non-deterministic because multiple requests are being sent through the model at the same time. Again: very good blog post! And also, note that this is Thinking Machines, the startup founded by Mira Murati, the ex-CTO of OpenAI; the startup that’s raised $2 billion; the startup that, so far, hasn’t published anything else yet. As far as I know, this post is the first thing they put out into the world. Well done.
- You have to watch this and I’m sorry but not really and[I’m not going to tell you what it is before you click, so just click here](https://x.com/iannuttall/status/1966074800595698131). I have to admit that I [also cloned the code](https://github.com/iannuttall/fartscroll-lid) and tried to make it work for our Amp TUI. Admission #2: I didn’t know about [the “classic” script that was referenced and that’s apparently by The Onion](https://theonion.github.io/fartscroll.js/).
- “I believe we have both the power and the responsibility to shape this technology’s future. That begins with a clear-eyed diagnosis of the present. One of the most useful diagnostic tools I've found for this comes from computer scientist Melanie Mitchell. In a seminal paper back in 2021, [she identified what she claims are four foundational fallacies](https://blog.apiad.net/p/the-four-fallacies-of-modern-ai?hide_intro_popup=true), four deeply embedded assumptions that explain to a large extent our collective confusion about AI, and what it can and cannot do.”
- PostHog has [a new homepage](https://posthog.com/)and it looks like an operating system in the browser. That in itself isn’t new, but this one’s very cute *and* it’s now the homepage of a company that’s raised a Series D this year and is valued at $920M. Let’s see how long it stays. But I guess even if they rip it out in 4 weeks, they’ve created some buzz. Good move.
- [Term.Everything](https://github.com/mmulet/term.everything) allows you to run “every GUI app in the terminal!” The demos look very cool and the README is cool and[the description of how it works](https://github.com/mmulet/term.everything/blob/main/resources/HowIDidIt.md) is very inspiring. I want to play around with [chafa](https://hpjansson.org/chafa/download/) now.
- In February, Apple released the iPhone 16e, including the C1 modem, about which Mark Gurman wrote: “The C1 Apple modem is a monumental technical achievement. A several billion dollar effort that has been in the works for 7 years. In the end it gets two sentences in the press release and 15 seconds in the announcement video. Apple is clearly downplaying this intentionally.” I quoted Gurman [here, back in February](https://registerspill.thorstenball.com/p/joy-and-curiosity-28), and provided some more links to more comments that described what an achievement it is. Now, this week, Apple released the iPhone Air, that comes with “N1, a new Apple-designed wireless networking chip that enables Wi-Fi 7, Bluetooth 6, and Thread.” A[HackerNews comment](https://news.ycombinator.com/item?id=45186015) says: “Congrats to Apple for finally designing out Broadcom and vertically integrating the wireless chip.” I have to admit that I’m essentially clueless when it comes to global hardware manufacturing, but, man, I’m intrigued.
- Talking about HackerNews: I found [this whole discussion interesting](https://news.ycombinator.com/item?id=45199760). Linked article states that we’re all being sucked into the hole of short-form video but the [top comment says](https://news.ycombinator.com/item?id=45200147): “Too simple of a narrative. At the same time, YouTube videos are getting longer, and people are watching more YouTube videos on TVs than on mobile devices. […] So I think we're seeing more of a bifurcation: in-depth longform videos are becoming 30, 40, 60, even 90 minutes long, whereas anything shorter than 10 minutes is being compressed to 30-60 seconds.” I’ve never installed TikTok on my phone, so I can’t comment on that, but I can say that my brain seems to be immune to YouTube Shorts, they just don’t do anything to me. I can watch one and stop. Twitter, on the other hand, well…
- [Another good comment](https://news.ycombinator.com/item?id=45163945): “Saying boilerplate shouldn’t exist is like saying we shouldn’t need nails or screws if we just designed furniture to be cut perfectly as one piece from the tree. The response is ‘I mean, sure, that’d be great, not sure how you’ll actually accomplish that though’.”
- But back to Apple. Here’s some engineering porn for you: “[Memory Integrity Enforcement (MIE)](https://security.apple.com/blog/memory-integrity-enforcement/) is the culmination of an unprecedented design and engineering effort, spanning half a decade, that combines the unique strengths of Apple silicon hardware with our advanced operating system security to provide industry-first, always-on memory safety protection across our devices.” But what is it? In their bombastic words, it’s “the industry’s first ever, comprehensive, always-on memory-safety protection covering key attack surfaces — including the kernel and over 70 userland processes — built on the Enhanced Memory Tagging Extension (EMTE) and supported by secure typed allocators and tag confidentiality protections.” But then you read it and think, god damn, that’s impressive, I’d be bombastic about this too.
- [Things you can do with a debugger but not with print debugging](https://mahesh-hegde.github.io/posts/what_debugger_can/). 2025 is the year in which I discovered debuggers for myself and after feeling pretty snobby about it for the first few weeks, I’m now back down on earth and use both, print debugging and the debugger.
- “My heart goes out to the man who does his work when the ‘boss’ is away, as well as when he is home. And the man who, when given a letter for Garcia, quietly takes the missive, without asking any idiotic questions, and with no lurking intention of chucking it into the nearest sewer, or of doing aught else but deliver it, never gets “laid off,” nor has to go on strike for higher wages. Civilization is one long anxious search for just such individuals. Anything such a man asks will be granted; his kind is so rare that no employer can afford to let him go. He is wanted in every city, town, and village - in every office, shop, store and factory. The world

cries out for such; he is needed, and needed badly—the man who can [Carry a message to Garcia](https://www.benning.army.mil/infantry/199th/ocs/content/pdf/Message%20to%20Garcia.pdf).”
- [My iPhone 8 Refuses to Die: Now It’s a Solar-Powered Vision OCR Server](https://terminalbytes.com/iphone-8-solar-powered-vision-ocr-server/#my-iphone-8-refuses-to-die-now-its-a-solar-powered-vision-ocr-server). Sounds like a ton of fun and I have a very old iPad lying around here…
- Some very popular NPM packages got compromised, but it seems like [we all got lucky](https://xeiaso.net/notes/2025/we-dodged-a-bullet/), since the attackers only wanted to steal crypto stuff. That phishing email looks impressively real though.
- “The [Babel fish](https://hitchhikers.fandom.com/wiki/Babel_Fish) is a small, bright yellow fish, which can be placed in someone's ear in order for them to be able to hear any language translated into their first language.” And [now it’s here](https://www.macrumors.com/2025/09/11/airpods-live-translation-eu-restricted/). Well, not *here* here, if you’re in the EU, but here. Isn’t that, scusa, fucking crazy?
- [Being good isn’t enough](https://joshs.bearblog.dev/being-good-isnt-enough/). I think this is directionally correct, but I’d make two changes: I think technical skills, in this industry, are the *foundation* on which everything else needs to rest. When they write that “the biggest gains come from combining disciplines. […] technical skill, product thinking, project execution, and people skills”, I’d argue that you shouldn’t think of a pie chart, but a pyramid and the base layer is very thick and has the “technical skill” label. The other change: I’d underline, three times, the part about agency. I agree that it’s “more powerful than smarts or credentials or luck”, but if, years ago, you’d told me that you had seen programmers from bumfuck nowhere outwork Stanford graduates, not with “smarts or credentials”, but with grit, discipline, humility, reliability, and attention to detail? I guess I still wouldn’t have believed you.
- I remember when people got pissed off at Sublime Text for showing “How about you pay us some money for this software?” every few restarts. Now? “[The ROI is obvious](https://www.sanity.io/blog/first-attempt-will-be-95-garbage), but budget for $1000-1500/month for a senior engineer going all-in on AI development. It's also reasonable to expect engineers to get more efficient with AI spend as they get good with it, but give them time.” Wild times.
- “The real risk is not taking a risk. The scaling maximalism of the last decade allowed us to avoid many hard choices — now, we have to think strategically. […] The tragedy is that most teams are still fighting the wrong battle. They’re running the ‘more GPUs’ playbook in a world where the real bottleneck is the data supply chain. If your team is asking for more compute but can’t explain their data roadmap, send them back to the drawing board.”

---

---

# Joy & Curiosity #53

*Interesting & joyful things from the previous week*

By Thorsten Ball • September 7, 2025

---

It’s been three weeks now since I got my new gravel bike. And not only did I learn how to ride it hands-free, but I also learned how amazing padded bike shorts are. I’ve heard “you should get proper bike shorts, padded ones” for years now, but something in me makes me want to ignore shorts-related advice from others. However, just like rubber and the road, my butt and the new saddle met and decided: padding would be nice. 

So I’m now here to give you shorts-related advice: get padded bike shorts! Not only do they give you that look that makes you wonder “aren’t these too tight?” every time you stand in front of a mirror, they *also* make you feel like your wearing diapers. Amazing.

---

- This is a funny article. Interesting tone, interesting perspective. It’s not what I would’ve written about the topic, but I agree with the idea: [you can try to like stuff](https://dynomight.net/liking/). It’s very easy to dunk on stuff, to hate, to have “strong opinions”. I found it’s much harder and more rewarding trying to like things.
- We shipped a new Amp CLI. It’s [now a full-fledged TUI](https://x.com/thorstenball/status/1962892799767883812). It’s “[95% written by Amp](https://x.com/rockorager/status/1962902436546285688)” (and that’s a whole different, interesting tangent we could go on: Amp is *really* good at building with the Amp-generated TUI framework) and [it can easily run at 120 FPS](https://x.com/rockorager/status/1963639060351574404) and… it’s a lot of fun, man. To use, to work on. It’s good stuff. [I recorded a little video with thoughts](https://x.com/thorstenball/status/1963248541742051578) on whether a TUI application is *it *or whether a desktop application wouldn’t be better — it’s a fascinating question and 6 months ago I wouldn’t have had an answer.
- I have, among many others, two niche reading hobbies: New Yorker articles about expensive art and New Yorker profiles of business people. This week I got really lucky: [How a Billionaire Owner Brought Turmoil and Trouble to Sotheby’s](https://www.newyorker.com/magazine/2025/09/01/how-a-billionaire-owner-brought-turmoil-and-trouble-to-sothebys).
- You’ve probably already seen this, because 213k likes and it made the rounds on every other network, but it’s worth pointing out again: “[sky the time picker on iphones alarm app isn’t actually circular it’s just a really long list](https://x.com/skydotcs/status/1962160670134444283)” I love this so much. This is proper software engineering to me. I like to think that if I had sat in the meeting in which someone proposed this, I would’ve laughed out loud and then said “you’re a genius, let’s do it!” Of course, what I like to think even more is that there never was a meeting and the genius just shipped it.
- Linear’s [Conversations on Quality](https://linear.app/quality). I’ve only watched half an episode, the one with Jeff Weinstein, and I’m here to tell you: watch it. What Jeff says about solving problems that are big enough, problems that *burn*, problems that customers want someone to solve for them so badly that the problems *pull*, and you don’t have to pitch and push your solution. Man, that’s real stuff. “Polishing things that shouldn’t exist,” he says, and a thousand companies scream in agony.
- First you roll your eyes because it has a cliché-ness to it, but then you go “that’s actually neat” and then you keep watching: [Eternal Struggle](https://yoavg.github.io/eternal/#).
- At work we started talking about assertions, runtime assertions, and someone who hasn’t used them a lot was curious about what the advantages are and why one should use them. Immediately, links were pulled and posted. [TigerBeetle’s Tiger Style](https://tigerstyle.dev/) is a good introduction to the mindset. And matklad’s [It Takes Two to Contract](https://tigerbeetle.com/blog/2023-12-27-it-takes-two-to-contract/) expands on it, or puts some more meat around it. Tiger meat, I guess. And this one here, [Jim Shore’s Fail Fast](https://martinfowler.com/ieeeSoftware/failFast.pdf), is also a great introduction. And yet the first thing I said about assertions was: “it’s about accepting the Fallability of Man, that we won’t always get it right, and embracing that” And I stand by that.
- What I learned this week: “In South Africa, the phrases 'now now', 'just now', and 'right now'[all have differing connotations](https://en.wikipedia.org/wiki/List_of_South_African_slang_words): 'Now now' often means minutes later; 'just now' means hours later; and 'right now' actually means now.”
- Wonderful: [30 minutes with a stranger](https://pudding.cool/2025/06/hello-stranger/).
- “A good talk should entertain the audience. As I write this, I can already hear the ‘tut-tutting’: isn’t entertainment frivolous? Aren’t we serious academics? I’ve gotten reviews asking me to remove contractions from my writing—if ‘can’t’ isn’t okay, surely having fun is out of bounds! Claptrap! Balderdash! Utter nonsense. If the human has to be left out of the academic endeavor, then let me off the ride. I don’t want to be part of a PL community that that doesn’t value the humanity of its members. […] [Talks are performances, and performances should entertain.](https://blog.sigplan.org/2025/03/31/how-to-give-a-good-talk/)” And it’s not just talks. It’s papers, RFCs, blog posts, Slack messages, demos — they need to be entertaining and entertaining here means: get your audience to give a shit.
- “every monday morning, the team would get on a call together, one of us would screenshare trying to sign up and the rest of us would write down what was wrong. for a good couple of months, this was excruciating and embarrassing. most of it was broken, a lot of lofty ideas we had for special details or clever animations felt awkward or silly. it felt pointless to do as a group because so little of the prod experience matched what we had in our heads, I think most of us wanted to go back to the drawing board and think of a better flow in our heads. but we filed dozens of tickets for ourselves, and then got back to work. all week eng and design would be running through the entire flow over and over again as they fixed those issues. rinse and repeat, for I don’t remember, maybe twenty weeks. until the real thing was as good as what we had in our heads. [that’s it, that’s the secret.](https://x.com/kristinatastic/status/1958523727026516253) you have to actually use your product, more than your users ever will, and then fix everything that feels bad instead of letting it slide.”
- Sean Goedecke may well be the best writer today on what it actually means to develop software in a software company. Nothing but net for the past year and this isn’t an exception: [seeing like a software company](https://www.seangoedecke.com/seeing-like-a-software-company).

---

---

# Joy & Curiosity #52

*Interesting & joyful things from the previous week*

By Thorsten Ball • August 31, 2025

---

Fifty two! Fifty two issues of Joy & Curiosity! Taking the small breaks into account, that’s more than a year of me writing this weekly newsletter and you reading it — thank you. The lines are still hand-drawn, by the way. Look at these beauties. That’s how you know that it’s an original J&C. It makes you go “wait, how does he draw them? With his mouse or what? Sometimes they look weirder is that when he uses the touchpad or something?” And the real beauty is that these question will never be answered.
[![](https://archive.thorstenball.com/data/images/172341724.joy-and-curiosity-52/51f5aae7-e27b-4d78-8c80-c92cf00f9959.png)](https://archive.thorstenball.com/data/images/172341724.joy-and-curiosity-52/51f5aae7-e27b-4d78-8c80-c92cf00f9959.png)
- By far, my favorite thing I read this week: James Somers on [The McPhee method](https://jsomers.net/blog/the-mcphee-method). I love James Somers and all his writing (start with [this one](https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge) and then read [the rest](https://jsomers.net/)) and I have a tremendous respect for John McPhee, even though, so far, I haven’t made it through one of his books and… well, this is Somers on McPhee and how McPhee influenced Somers. I love it.
- Lovely: [David Klein’s Magnificent TWA Posters](https://flashbak.com/david-kleins-magnificent-twa-posters-404428/). I didn’t know about [Trans World Airliens (TWA)](https://en.wikipedia.org/wiki/Trans_World_Airlines) nor David Klein, so maybe I missed some cultural significance that comes from having heard about these posters before and now seeing them all together, but all I could think was: wow, this is… different, *interesting*, different from what I expected. You start to look at one poster and go “ah, retro”, and then, “no, wait a second… this is… different.”
- Also lovely: Wil wrote about[6 surprising things about life in SF](https://wilhelm.substack.com/p/6-surprising-things-about-life-in?utm_medium=web). Nice to read this after having spent two weeks in SF.
- My teammate Oskar wrote about building a fuzzer for a central piece in the Amp codebase: [Finding Bugs in a Coding Agent with Lightweight DST](https://wickstrom.tech/2025-08-28-findings-bugs-coding-agent-lightweight-dst.html).
- Ben Thompson, in Stratechery, on the U.S. goverment taking an equity stake in Intel: [U.S. Intel](https://stratechery.com/2025/u-s-intel/). The technology, the time horizons, the geopolitics, and the *politics* involved here are impressive: “That, by extension, is why the stakes today are so high. The problem facing the U.S. is not simply the short-term: the real problems will arise in the 2030s and beyond. Semiconductor manufacturing decision-making does not require nimbleness; it requires gravity and the knowledge that abandoning the leading edge entails never regaining it.”
- Kovid Goyal, the developer behind Calibre and Kitty, published [the multiple cursors protocol](https://github.com/kovidgoyal/kitty/blob/master/docs/multiple-cursors-protocol.rst) for terminal emulators. So much fun stuff happening in terminals in the last five years and I’m excited to see where this one will go — multiple cursors everywhere or nowhere?
- I’m not really a security person, nor am I a privacy person (I told you last time, in a public newsletter, that for 37 years I couldn’t ride my bike without my hands, so…), but I do have one fantasy: a burner phone. Every 17 weeks or so I try to figure out where I could get one without it being traceable back to me. I never acted on it, I’m far too lazy, but I *have* brought it up as a discussion topic at parties. Would I have a use for a burner phone? 100% not. But… imagine! A burner phone! You could walk through a public square, receive a call on your *burner phone*, and just say “the eagle has landed” before you throw it in the trash. Imagine! Anyway, I thought this was interesting: “[this Burner Phone 101 workshop](https://rebeccawilliams.info/burner-phone-101/) introduced participants to phone-related risk modeling, privacy-protective smartphone practices, the full spectrum of burner phone options, and when to leave phones behind entirely”
- This was interesting: [Why German Strings are Everywhere](https://cedardb.com/blog/german_strings/). I had no idea that German Strings (“each string is represented by a single 128-bit struct”) are a thing. Neat!
- “Air conditioning was a most important invention for us, perhaps one of the signal inventions of history. […] Without air conditioning you can work only in the cool early-morning hours or at dusk. The first thing I did upon becoming prime minister was to [install air conditioners](https://www.noahpinion.blog/p/europes-crusade-against-air-conditioning) in buildings where the civil service worked.”
- Excellent: [Nine Ways to Improve an Ad](https://www.draytonbird.net/files/ninewaystoimproveanad.pdf). At first I wasn’t sure: wait, are they serious? But then… Well. You’ll see. “There you have it. No clever, precious, self-conscious waste of space like the ad we started with; but an honest hard-hitting, two-fisted ad like this that really sells. I said ‘sells.’“
- [The index mindset](https://blog.johnluttig.com/p/indexmindset?hide_intro_popup=true): “The index mindset has pervaded startups, too. Employee tenure is short and shortening, with many employees opting to collect a portfolio of equity across several companies, hedging their downside along the way.” But the stickiest part is the section about indexing in culture.
- Look, I don’t know how to start this one, so let’s use the classic chronological intro: a year or so ago I discovered [Bird Buddy](https://mybirdbuddy.eu/), a “Smart Bird Feeder”, that takes a picture and sends it to your phone whenever a bird is eating something in your garden. I’m not a bird watching guy, I’m not a bird guy, I’m not even a “smart” guy, but I have to admit that in four years of having a garden, I said “look! It’s a green woodpecker!” probably five times and there’s a hard to explain joy in having birds pick up the seed that you put in those stupid tiny houses. Naturally, when I first heard about Bird Buddy I thought: that’s dumb. And yet, mysteriously, I put it in the shopping cart. And then my finger hovered over the Pay button for a long time. And I nearly did it. And then… well, I think you call it “follow-up campaign”: Bird Buddy would occasionally send me emails about their product and every time, *every god damn time*, I was tempted to buy this smart bird feeder, because their emails are so good. But then this week they sent me an email that starts with the following Maya Angelou quote: “A bird doesn’t sing because it has an answer, it sings because it has a song.” How can I resist? They just sent me an email that Birdbuddy 2 is out.
- Discovered [SteerMouse](https://plentycom.jp/en/steermouse/) and its claim that you can use “24 Functions per Button & Chording Operations” and am now restless, confused, wondering: what could my life be if I would assign 24 functions to each mouse button?
- Google released [Gemini 2.5 Flash Image](https://aistudio.google.com/prompts/new_chat?model=gemini-2.5-flash-image-preview) and called it Nano Banana. That’s [a very good name](https://thorstenball.com/names/).
- “You can't stop at checking the boxes on paper. You have to sit with it, use it, live with it. [You have to feel it.](https://mitchellh.com/writing/feel-it)”
- This — the metaphor and the fact he used it — has been stuck in my head: “There's two different ways you could describe what's happening in the model business right now. So, let's say in 2023, you train a model that costs $100 million, and then you deploy it in 2024, and it makes $200 million of revenue. Meanwhile, because of the scaling laws, in 2024, you also train a model that costs $1 billion. And then in 2025, you get $2 billion of revenue from that $1 billion, and you've spent $10 billion to train the model. So, if you look in a conventional way at the profit and loss of the company, you've lost $100 million the first year, you've lost $800 million the second year, and you've lost $8 billion in the third year, so it looks like it's getting worse and worse. If you consider each model to be a company, the model that was trained in 2023 was profitable. You paid $100 million, and then it made $200 million of revenue. There's some cost to inference with the model, but let's just assume, in this cartoonish cartoon example, that even if you add those two up, you're kind of in a good state. So, if every model was a company, the model, in this example, is actually profitable. What's going on is that at the same time as you're reaping the benefits from one company, you're founding another company that's much more expensive and requires much more upfront R&D investment. And so the way that it's going to shake out is this will keep going up until the numbers go very large and the models can't get larger, [and then it'll be a large, very profitable business, or, at some point, the models will stop getting better, right?](https://cheekypint.substack.com/p/a-cheeky-pint-with-anthropic-ceo)”
- “Don’t be sad. You are in the business of heavy tails. New Yorker cartoonists, great physicists, famous poets and degen gamblers are your brethren. [Not dentists and line order cooks.](https://x.com/__paleologo/status/1874676539083678153)”
- Pretty sure I’ve linked to it before, but in case I haven’t, you need to read this: [Fuck Everything, We're Doing Five Blades](https://theonion.com/fuck-everything-were-doing-five-blades-1819584036/). This could be chiseled in stone, because every word is perfect. It’s sublime. If someone knows how to get in touch with Alec Baldwin, so I can get him to do a one-man performance of this piece, let me know. Alec, if you’re reading this, please reply to this email.

---

---

# Joy & Curiosity #51

*Interesting & joyful things from the previous week*

By Thorsten Ball • August 24, 2025

---

I’m happy to report that I’ve reached a new milestone in my life: I can now ride my bike with no hands.

For all my life I thought that it’s something incredible hard. I thought of it like I thought of the ability to juggle three balls. It’s something you have to practice and only people with serious dedication end up being able to do it. But then, last week, my friend said he bikes to work without his hands on the bars. Huh. Then I told my wife about it, saying that’s incredible. She said, “why? Everybody can do it, right? I can do it.” What? My wife, who (and let me say: I love her) has managed to bump into every wall of this house, forwards and backwards, just by trying to walk here, can ride her bike with no hands? Maybe… Maybe I can do it?

Yesterday I did it. On a bike ride with my wife, who immediately taunted me by taking her hands off the bars and waving them around, I did it. Took my hands off the handlebars and rode my bike for a few hundred meters. “You look so happy,” she said.

---

- [This is one of those posts](https://medium.com/@jamesacowling/stepping-stones-not-milestones-e6be0073563f) that immediately make me think: “I’m going to reference this a lot in the future.” I sent the author, James, a note to thank him for writing it and told him: “I recognise a lot of stuff in there that I've seen or done or know to do, but lacked the words for.” I read the book [The Nature of Software Development](https://pragprog.com/titles/rjnsd/the-nature-of-software-development/) many, many years ago and, to this day, I think it’s one of the best things that have been written about agile (lower-case) software development. And a lot of what Ron Jeffries wrote in his book is echoed in James’ piece here: the “Strategy is a Cone” framing, the stepping stones (obviously), the acceptance of unknown unknowns, the “you can’t just sit there and scratch your chin and figure it out” — highly recommended.
- Very important post that I recommend reading: [Building AI Products In The Probabilistic Era](https://giansegato.com/essays/probabilistic-era). It touches on a lot of things that are changing, fundamentally. “Stop for a moment to realize what this means. When building on top of this technology, our products can now succeed in ways we’ve never even imagined, and fail in ways we never intended.” And then there’s this: “With AI products, all this is no longer true. These models are discovered, not engineered. There's some deep unknowability about them that is both powerful and scary. Not even model makers know exactly what their creations can fully do when they train them. It's why ‘vibe’ is such an apt word: faced with this inherent uncertainty, we're left to trust our own gut and intuition when judging what these models are truly capable of.” And here’s something that I’ve felt too but that’s very hard to explain: “⁠⁠This doesn’t work anymore. The more you try to control the model, the more you’ll nerf it, ultimately damaging the product itself. Past a certain point, intelligence and control start becoming opposing needs.” Very good post.
- “What if your agent uses a different LM at every turn? [We let mini-SWE-agent randomly switch between GPT-5 and Sonnet 4](https://www.swebench.com/SWE-bench/blog/2025/08/19/mini-roulette/) and it scored higher on SWE-bench than with either model separately.” The era of [model alloys](https://xbow.com/blog/alloy-agents) is upon us, I think. (My teammate [Camden talked to Beyang about this exact topic](https://www.youtube.com/watch?v=ojAdu4vGYyI), in case you’re interested in his and our thinking on the topic.)
- [SolveIt](https://solveit.fast.ai/) looks interesting. I found out about it through [this video](https://www.youtube.com/watch?v=DgPr3HVp0eg), which I haven’t watched in full, but in the video you can see “Jeremy Howard and Johno Whitaker present SolveIt, a development environment designed to mitigate the downsides of ‘vibe coding’ by encouraging deliberate, step-by-step problem-solving.” And if you click around at [this timestamp here](https://youtu.be/DgPr3HVp0eg?t=1646) you can see that in action. If nothing else, it’s an interesting idea.
- “Existing search tools on Windows suck. Even with an SSD, it’s painfully slow. [So I built a prototype of Nowgrep.](https://x.com/CharlieMQV/status/1957552694186418228) It bypasses most of the slow Windows nonsense, and just parses the raw NTFS.” I had no clue that there’s more greps being worked on. I thought ripgrep won the game and the game’s over. But maybe not on Windows? (Also: I had never heard of [BareGrep](https://www.baremetalsoft.com/baregrep/) and just the screenshots alone bring back memories.)
- As some of you know, some of my pet interests are espionage and corporate espionage (the whole Deel vs. Rippling thing was *my jam*, as they say) but also cybercrime with state actors, and so when John Collison asked Brian Armstrong in this episode of the Stripe podcast Cheeky Pint “[what does the general tech public not appreciate about the cyber crime landscape?](https://youtu.be/JeVny5KHj4g?t=659)” and Brian Armstrong replied with “there’s a lot of North Korean agents trying to work at these companies” my heart started to beat a little faster. Very interesting 5 minute section in that episode.
- This was a ton of fun and made me think (like I did many times before, probably naively) that this is how complex topics should be taught in school: [Moving Objects in 3D space](https://visualrambling.space/moving-objects-in-3d/).
- Do you know who Eoghan McCabe is? He’s the CEO of Intercom. And this, as I found out yesterday, is his personal homepage: [eoghanmccabe.com](https://eoghanmccabe.com/). It’s fantastic on many levels, the styling is just one thing, but look at it: this is truly a *personal* homepage. There’s a bio, there’s some thoughts, there’s interests, there’s hobbies, there’s photos, there’s links. So good.
- Very, very interesting: “[Tidewave Web for Rails and Phoenix](https://tidewave.ai/blog/tidewave-web-phoenix-rails): a coding agent that runs directly in the browser alongside your web application, in your own development environment, with full page and code context.” I think this is only the start of frameworks and models melting, because, at the end of the day, I think, agents and frameworks try to solve the same thing: reduce the amount of code that has to be written.
- [Jujutsu For Busy Devs](https://maddie.wtf/posts/2025-07-21-jujutsu-for-busy-devs) — very, very good. Finally learned about `mine()` being a valid revset (which is exactly what I was looking for earlier today).
- “[In a manner of speaking](https://jyn.dev/the-core-of-rust/), that smaller Rust is the language I fell in love with when I first learned it in 2018. Rust is a lot bigger today, in many ways, and the smaller Rust is just a nostalgic rose-tinted memory. But I think it's worth studying as an example of how well orthogonal features can compose when they're designed as one cohesive whole.” (Side-note: I didn’t know that you could use a hashbang cargo invocation to run Rust programs like that, including TOML and all)
- matklad on the TigerBeetle blog: [Code Review Can Be Better](https://tigerbeetle.com/blog/2025-08-04-code-review-can-be-better/). Most review tools nowadays I don’t find that interesting anymore (I also did a near 180 on code reviews in the last one and a half years and am now less enthused about it), but this paragraph stood out to me: “When I review code, I like to pull the source branch locally. Then I soft-reset the code to mere base, so that the code looks as if it was written by me. Then I fire up magit, which allows me to effectively navigate both through the diff, and through the actual code. And I even use git staging area to mark files I’ve already reviewed” Now, *that*’s how you should probably review code. I’ve never done the unstaging before, but a proper, *proper* review requires checking out the code, I think, and the unstaging/staging is very smart.
- [Levon Helm](https://theband.hiof.no/articles/modern_drummer_08_1984_lh_interview.html): “I don't know. I guess it's from being born in Helena, Arkansas. That's a pretty basic part of America where there's a lot of good basic music. Drums just always sounded like the most fun part of that good music for me. I had the opportunity to see some of the traveling minstrel shows years ago, with the house band, the chorus line, the comedians and singers. [In those kinds of shows, with horns and a full rhythm section, the drums always looked like the best seat in the house.](https://youtu.be/ZjbAppJtx7E?list=RDZjbAppJtx7E&t=103)”

---

---

# Joy & Curiosity #50

*Interesting & joyful things from the previous week*

By Thorsten Ball • August 17, 2025

---

Back in Germany, after two weeks in the bay area with my wife and kids. What a trip! Here are the important bits:

- Apparently I made a huge mistake by [eating a corndog without dipping it into something](https://x.com/thorstenball/status/1955733956378419341). (Most people say ketchup is the way to go, others, controversially, say mustard.)
- Mill Valley and Marin are brain-breaking (“such a place exists?!”) beautiful.
- Peanut Butter Pretzels are still amazing. Unrelated: I’m dieting now.
- When I was in SF in February I brought a new shirt. An overshirt, I think you call it. The first day I wore it, I received two compliments from male colleagues (“that’s a nice shirt”), both of which have *never* complimented or even commented on anything I’ve worn before. And, generally speaking, male colleagues commenting on your fashion choices in a positive way is incredibly rare, isn’t it? “wow,” I wrote to my wife, knowing that she’d probably be sitting at home, hands folded, waiting eagerly for News on the Shirt, “I got two compliments on my new shirt. it’s a hit.” And then, guess what, when I travelled back to Germany, I forgot the shirt in the closet in the hotel. Big hit it was, though, I purchased it again, and brought it to SF again. And… now guess what. Yes. Exactly. *SOMEWHERE* between Twin Peaks and Noe Valley and our Airbnb I must’ve lost it again.
- Speaking of loss: on the last day in SF, in the last Uber ride, my bluetooth headphones must’ve slipped out of my pockets and I forgot them in the car.
- Stanford campus made me want to be 21 and a student there.
- Muir Woods is beautiful. The Presidio still feels magical to me.
- I really like San Francisco.
- Having coffee with really smart people who think about software as much as you do and know every reference you bring up is beautiful. (Admittedly, I also enjoy having coffee with people who think I “do something with computers.”)

And here, shorter than usual, because I was travelling and half on vacation: some links for you!

---

- New addition to my personal *Now this is what I call engineering* collection: this GitHub post by Michael Knyszek and Austin Clements [on the new “green tea garbage collector” in Go](https://github.com/golang/go/issues/73581). Technical writing of the highest quality about very proper software engineering. Imagine if all technical papers were written like this. “The core idea behind the new parallel marking algorithm is simple. Instead of scanning individual objects, the garbage collector scans memory in much larger, contiguous blocks. The shared work queue tracks these coarse blocks instead of individual objects, and the individual objects waiting to be scanned in a block are tracked in that block itself. The core hypothesis is that while a block waits on the queue to be scanned, it will accumulate more objects to be scanned within that block, such that when a block does get dequeued, it’s likely that scanning will be able to scan more than one object in that block. This, in turn, improves locality of memory access, in addition to better amortizing per-scan costs.”
- So, so, so good: [What if you could search every visible word on New York City’s streets?](https://pudding.cool/2025/07/street-view/) One of the handful of pages where I’m delighted that it makes use of scrolling. And then there’s the beautiful visualizations! And, of course, the content!
- Told you before: I’m a sucker for lists like this one, [50 things I know](https://usefulfictions.substack.com/p/50-things-i-know). It has writing on it (“Writing defensively is a loser’s game. It lets people who won’t like your writing anyway win in advance.”), life (“It’s possible for someone to have a motivational system very different from your own and still be a force for good in the world. I’m turned off when people are motivated primarily by prestige, but many great works have been produced at the altar of social status.”), self-knowledge (“the traits that make you exceptional are the very same traits that show up in your neuroses and limitations”), a bit cheesy in some lines, funny in others. Good read.
- Mitchell and the Ghostty contributors (great band name) rewrote [the Ghostty GTK application](https://mitchellh.com/writing/ghostty-gtk-rewrite). Interesting, technical read, but this is, to me, the most interesting point: “This is now my 5th time writing the GUI part of Ghostty from scratch: once with GLFW, once on macOS with SwiftUI, then on macOS with AppKit plus SwiftUI, once on Linux with GTK procedurally, and now on Linux with GTK and the full GObject type system. Each time, I've learned something new and valuable, and I've carried that experience into each iteration (and across platforms). Even this time, I've learned some new tricks that I plan on taking back over to macOS.”
- Somehow ended up reading this François Chollet article from 2023, about [how Chollet thinks about prompt engineering](https://fchollet.substack.com/p/how-i-think-about-llm-prompt-engineering), and man, I don’t know whether I read that article two years ago or not, but[it’s how I think about it](https://registerspill.thorstenball.com/p/theres-beauty-in-ai), too, except my thinking is less sophisticated, of course: “The first difference is that a LLM is a continuous, interpolative kind of database. Instead of being stored as a set of discrete entries, your data is stored as a vector space — a curve. You can move around on the curve (it’s semantically continuous, as we discussed) to explore nearby, related points. And you can interpolate on the curve between different data points to find their in-between. This means that you can retrieve from your database a lot more than you put into it — though not all of it is going to be accurate or even meaningful. Interpolation can lead to generalization, but it can also lead to hallucinations.”
- Really enjoyed Robin Sloan’s musings here, [in this part of his newsletter](https://www.robinsloan.com/newsletters/inevitable-technologies), on whether “with the arrival of the AI language models, we have entered a new era of technological change”. I’ll spoil it for you (he doesn’t think so), but that also doesn’t make it less interesting.
- Derek Thompson on how “[AI Conquered the US Economy](https://www.derekthompson.org/p/how-ai-conquered-the-us-economy-a)”.
- This post, stating that “[vibe coding is the fast fashion industry of software engineering](https://pdelboca.me/writings/2025/08/01/vibe-coding-fast-fashion.html)”, was very interesting. I don’t agree with the, say, moral indictment here, and I think it missed the most interesting question that this realization results in: “As code production cheapens, we should examine parallels in other industries and my mind automatically goes to fast fashion: cheaper production led to affordable but low-quality clothes that are cheaper to discard than reuse or even repair.” My mind didn’t jump to the author’s next sentence (“Similarly, I foresee a future of cheap software flooding the market, polluting ecosystems, and harming users.”), but rather wondered, once again: if we can now have code that’s “affordable but low-quality” and “cheaper to discard than reuse or even repair” — what can we build with that? how does it change what we build? Because I don’t think we should keep building the way we have.
- My colleague Matt sent me a link to one of his blog posts last week, while we were talking about trying something new: [a culture of experimentation](https://matthewmanela.com/blog/a-culture-of-experimentation/). It’s a great post that will stick with me (“In metal working there is a process called annealing where cycles of heating and cooling are used to modify the chemical structure of the metal to achieve desired properties. […] What does this exploration of annealing have to do with running a software team? The connection is that a software team may be stuck in a local optimum.”) and, man, I love it when someone pulls out a URL in a discussion.
- And my ex-colleague at Zed, Conrad, wrote about [why LLMs Can't Really Build Software](https://zed.dev/blog/why-llms-cant-build-software) and while I do think he has some good points (“When a person runs into a problem, they are able to temporarily stash the full context, focus on resolving the issue, and then pop their mental stack to get back to the problem in hand. […] We don't just keep adding more words to our context window, because it would drive us mad.”) I also can’t help but think: well, if it quacks like a duck…? Two weeks ago, I found a bug in Amp, a regression. I was jetlagged, sitting in the office, trying to get into the zone, hoping to find the bug. Right after sitting down, kinda as a too-early Hail Mary pass, I sent off Amp and asked it to figure out where the bug comes from. I also told the agent that it should consult [the oracle](https://ampcode.com/news/oracle), knowing that I need all the help I can get. While Amp ran, I also looked into the code, ignoring it, essentially, racing it, effectively. At some point, after a few minutes, it looked like it was stuck. I decided to maybe give it a few more minutes, because I was pulled into an actual real-life, in-person discussion in the office. So for the next 30-40 minutes or so, I sat there talking, and continuously side-eyed Amp, trying to see whether it still runs or doesn’t (note: the oracle has been improved by now and shows better progress). Once I dove back into the code, I noticed that the oracle still runs (“wow, it must’ve been running for 45min now”), but had a hunch that I’m now also close to finding the bug. So I dug in some more, added logging, reran the program, came up with 3 different hypothesis and threw them away again, then began to think “huh, the code is correct, it has to be something that’s wired up the wrong way” and — ding! — Amp was done. The oracle had come up with an answer. It took[61min and 108 inference calls](https://x.com/thorstenball/status/1952732536288969161) and when I read the first line of its hypothesis I knew it was right. The main agent changed one line, I tested it, and the bug was fixed. 61min, more than half of which I spent doing something else. Millions of tokens. Not cheap, but the bug was fixed. Now… Maybe LLMs can’t really build software, like Conrad says, who knows, but I think the more interesting question is: does it matter?
- I honestly don’t know what to make of it — how and whether it should influence frameworks — but what I do know is that I think it’s important for developers to know that this exists, that *this is an option*, that there’s this way to do it too: [The Best "Hello World" in Web Development](https://unplannedobsolescence.com/blog/best-hello-world-web-development/).
- Neat: [is OpenBSD 10x faster than Linux?](https://flak.tedunangst.com/post/is-OpenBSD-10x-faster-than-Linux) (Had[a similar moment years ago](https://thorstenball.com/benchmarking-process-startup-time/).)

---

---

# Joy & Curiosity #49

*Interesting & joyful things from the previous week*

By Thorsten Ball • August 10, 2025

---

I’ve had two Peak San Francisco moments this week:

1. I saw four Waymos get stuck at an intersection, after a human-driven bus got stuck there. The Waymos didn’t dare to cross and just inched forwards and backwards, while the shouting from the humans waiting for them got louder and louder. Then a taxi driver got out of his car, stood in front of the Waymos, and waved them across the street, shouting “go, Waymo, go!” It worked. The waved-at Waymo got its courage together and started driving. (And to answer two questions you might have: he didn’t have a special wave, he waved like you’d wave at a cow if you want it to move, if you can imagine that, city people; no, I do not know whether a human driver didn’t take over remotely.)
1. Being in Sourcegraph office, in the middle of San Francisco, shipping Amp releases, while watching the GPT-5 release livestream, turning internal model codenames into the official ones, waiting for the public API to be accessible.

I’ll be in SF until Friday. Let’s see what this week will bring.

---

- This article here, about “[how we built Bluey’s world](https://www.itsnicethat.com/features/how-we-built-bluey-s-world-cartoon-background-scenery-art-director-catriona-drummond-animation-090725)”, containing “tales from original series art director, Catriona Drummond”, is probably the most Joy & Curiosity entry this week. It’s… lovely. My kids love Bluey, I love Bluey, I think it’s an incredibly well-made, charming, joyful show that’s full of heart and when reading the article I went “ah, yes, that explains it.” The references she pulls out make you realize, again, how much *any* of it comes down to influences; the parts about lighting are impressive; the thing about the kettle is so obvious in hindsight but gave me so many ideas for how to direct ideas in the future… Highly recommend you read it.
- “It's a physical display sitting in my office in Wisconsin, USA. Each pixel is a cube of wood, painted on two sides, that rotates to be on or off. There are 40 columns and 25 rows, for a total of 1000 pixels - thus the name, [kilopixel](https://kilopx.com/).”
- Cynthia Dunlop, author of [Writing For Developers: Blogs That Get Read](https://github.com/scynthiadunlop/WritingForDevelopersBook), interviewed me, the guy writing this sentence, about writing blogs, which I took to mean “you can also talk about your newsletter”. You can read it here: [Thorsten Ball on Technical Blogging](https://writethatblog.substack.com/p/thorsten-ball-on-technical-blogging). I’m usually not a big procrastinator (too much guilt) but I kept Cynthia waiting and waiting until I finally sat down one morning and wrote the whole thing down in an hour and, to my surprise, this was actually a lot of fun to write. I like writing (well, long story) and I like writing about writing.
- [I shipped an orb](https://x.com/thorstenball/status/1953239306749001742) in the Amp CLI. I love it. I’ve stared at it for… well, no need to use numbers here. I also love the word: orb. Orb, orb, orb. Still, I was surprised by how many other people loved it. Sure, who wouldn’t love an orb? That’s what you tell yourself, but when someone else says “I love the orb” you still are surprised. ([Get your orb now](https://ampcode.com/manual#getting-started-command-line-interface).)
- As a response to the orb, someone then linked to this: [Donut math: how donut.c works](https://www.a1k0n.net/2011/07/20/donut-math.html). I can’t find who linked to it where, but: very neat.
- Did you know that you can talk to an LLM via *DNS?* [Like this](https://x.com/Arxiv_Daily/status/1952452878716805172): “dig @ch.at ‘what is golang’ TXT +short” I didn’t. Very cool. They also allow you to use curl and SSH, very neat: [ch.at](https://ch.at).
- Simon Willison’s [write-up on the GPT-5 release is good](https://simonwillison.net/2025/Aug/7/gpt-5/) and gives a better overview than most of the official OpenAI documentation (which *does* contain all this information, but not on a single page.)
- We also posted something: [Model Evaluation](https://ampcode.com/news/model-evaluation). It contains some first impressions of GPT-5 as a coding agent from yours truly.
- The GPT-5 release created at least one very, very good meme: [vibechart](https://www.vibechart.net/).
- I can’t comment on the math, because it goes over my head, but the writing kept me reading the thing until the end: [Attention Is Off By One](https://www.evanmiller.org/attention-is-off-by-one.html). “This is what’s been happening in LLMs – for reasons that are only partially understood, Transformer models contain these outlier weights and are emitting Black Swan mega-activations that are much, much, much larger, like orders of magnitude larger, than their peers. But no one can get rid of them; the megalodons seem to be critical to the operation of these models, and their existence is contrary to everything we thought we knew about neural networks prior to building ones that worked so well.”
- OpenAI released open weight models this week. Here’s [Simon Willison’s very good writeup](https://simonwillison.net/2025/Aug/5/gpt-oss/). I used Amp to build an agent for gpt-oss-20b, to see what it can do. It’s based on my [How to Build an Agent](https://ampcode.com/how-to-build-an-agent) post and I didn’t write a single line by hand. It works, but I haven’t really tested it (busy week). What I can say is that the new [Harmony format from OpenAI](https://cookbook.openai.com/articles/openai-harmony) is a bit confusing. Maybe I need to spend more time with it, but it felt weird having to use libraries to parse the agent’s response (or writing my own, of course.) The [agent is on GitHub](https://github.com/mrnugget/agent-openai-gpt-oss-20b), if you want to take a look.
- Andy Hertzfeld took notes at [Alan Kay's talk at Creative Think seminar, July 20, 1982](https://folklore.org/Creative_Think.html) and it has some good lines in it: “Turn up your nose at good ideas. You must work on great ideas, not good ones.” (this is the line [that made me find the URL](https://x.com/andy_matuschak/status/1952593458385821833)), “Better is the enemy of best”, “content over form, go for fun.”
- I’ve been on the Internet since, I think, 1997. I’ve had unsupervised access to the very same Internet since the year 2000. I’ve seen more things on the Internet that I can remember and some of it I very much shouldn’t have seen. And yet. And yet [this made me go “uhhhh what”](https://www.seangoedecke.com/gpt-oss-is-phi-5/): “It’s not discussed publically very often, but the main use-case for fine-tuning small language models is for erotic role-play, and there’s a serious demand. Any small online community for people who run local models is at least 50% perverts.”
- Missed this in July (ages ago) but, man, this is so interesting and so inside baseball: [windsurf gets margin called](https://ethanding.substack.com/p/windsurf-gets-margin-called).
- I also missed this, in 2020, when Alexandr Wang wrote: [Hire people who give a shit](https://alexw.substack.com/p/hire). It’s easy to dismiss, but I don’t think one should. I like this post. Hiring is very hard and hiring for “who gives a shit” seems, in hindsight, when looking back at a lot of hiring decisions, like an obvious-but-very-hard-to-pull-off-but-good-if-you-can idea.
- Apple released [Embedding Atlas](https://apple.github.io/embedding-atlas/). I now want to play around with it to see whether you can *see* the “king - queen = man - woman” equation.
- “That understands how capitalism doles out prizes for visibility and speed—even when [those very forces stifle the creative process](https://theisolationjournals.substack.com/p/self-employed-self-exhausted) and are at odds with what it takes to make something daring, unruly, and true”

---

---

# Joy & Curiosity #48

*Interesting & joyful things from the previous week*

By Thorsten Ball • August 2, 2025

---

Hello and Good Morning from San Francisco! I’ll be in the bay area for the next two weeks. One week of work (and[giving a talk, come by!](https://x.com/Sourcegraph/status/1949117994640306614)), then one week of vacation (my family’s here with me). Should be a lot of fun — that is, if we make it through this day, on which every family member woke up before 4am.

---

- The title of the video is “[I Saved a PNG Image To A Bird](https://www.youtube.com/watch?v=hCQCP-5g5bo&t=1019s)”, the description starts with “I got a bit concerningly obsessed with birds for a few months”, and someone [tweeted about it](https://x.com/sterlingcrispin/status/1949541268872446377): “This is one of the craziest ideas I've ever seen. He converted a drawing of a bird into a spectrogram (PNG -> Soundwave) then played it to a Starling who sung it back reproducing the PNG.”
- This, [here](https://rgoldfinger.com/blog/2025-07-26-claude-code-is-a-slot-machine/), is very true: “But the real skill, the real thing that makes you effective, is knowing when to use one mode or the other, and being able to switch between them as needed.” I use Amp a lot. *A lot*. But I also have days when I write 90% of the code I commit by hand, and days when 80% is written by the agent. Why? From the same article: “AI coding tools supercharge this, allowing you to bring whole machineries to life by waving your hands around, offloading the understanding for much longer, but if you want it all to actually *work*, you'll need to dive into the details eventually.” It takes a lot of practice to know when you will be able to skip understanding something and when not to.
- This will hopefully put a smile on your face: [What’s Not to Like?](https://theamericanscholar.org/whats-not-to-like/) It’s about “similes, good and bad” and contains smile-inducing representatives of both categories. Just wait until you get the one introduced with “(my eyes are closed as I type)”. And then, there, at the end, there’s James Joyce. “A girl stood before him in midstream, alone and still, gazing out to sea. She seemed like one whom magic had changed into the likeness of a strange and beautiful seabird.” So, maybe I should read Ulysses, huh?
- Armin Ronacher on [Agentic Coding Things That Didn’t Work](https://lucumr.pocoo.org/2025/7/30/things-that-didnt-work/). Very interesting. And I think it also maps *in general *how we think about developing Amp: do not pretend the model isn’t an unreliable narrator, do not pretend there’s determinism. It’s incredibly tempting to do so. Just add this feature on top, that feature here, don’t expose this, add a UI button that suggests you can always click it and, there you go, users now think the magic always-right machine powers this tool.
- The title already tells you — it’s called: [The many, many, many JavaScript runtimes of the last decade](https://buttondown.com/whatever_jamie/archive/the-many-many-many-javascript-runtimes-of-the-last-decade/) — but still: wow. So many runtimes! So. many. On top of the wow-factor: it’s a very interesting read that brought back some names I’ve long forgotten.
- Seth Godin’s [65 notes to himself](https://seths.blog/2025/07/65-thoughts/). Some of them are cryptic, others apparently personal and unknowable, but, man, I’m a sucker for lists like these. I mean, I’m not really sure what it’s supposed to mean, but I get fired up when I read “People like us do things like this” or “Take responsibility, demand freedom, don’t seek authority”. Good stuff.
- Curious article about the “[the sale of the popular route-planning platform Komoot to private equity](https://bikepacking.com/plog/when-we-get-komooted/)”. I had zero clue that there was such a big community behind Komoot, which I’ve used to plan hikes before. Or at least tried to use, since the only real distinct memory I had of Komoot was that it felt full of made-up “content”. I guess I just used it in the wrong places. (Side-note: the term “enshittification” seems to undergo the same process it describes — is there a word for that?)
- Similarily curious: “[I'm never going back to Matrix](https://shkspr.mobi/blog/2025/07/im-never-going-back-to-matrix/)” A peek into a corner of the Internet in which I’ve long stopped venturing.
- Treasure Trove, [Terminal Trove](https://terminaltrove.com/explore/). Start by checking the “Tool of the Week” box and then go exploring.
- [Fast](https://www.catherinejue.com/fast): “Rarely in software does anyone ask for “fast.” We ask for features, we ask for volume discounts, we ask for the next data integration. We never think to ask for fast. But software that's fast changes behavior. Developers ship more often when code deploys in seconds (or milliseconds) instead of minutes. […] Fast eliminates cognitive friction.”
- … and [Slow](https://michaelnotebook.com/slow/index.html): “Below is a list of marvellous projects which human beings have undertaken over an exceptionally long time.” But it should probably have been called “long”.
- Geoffrey Litt: “[Enough AI copilots! We need AI HUDs](https://www.geoffreylitt.com/2025/07/27/enough-ai-copilots-we-need-ai-huds)” I agree that HUDs are great and in the past few weeks I thought a lot about what makes a great HUD for me. Turns out that one thing is what I’d call “glanceability”: can I take a quick look and see what’s going on, get a feel for the state of the system, spot whether something’s off? Okay, maybe that’s not the HUD that Geoffrey is talking about, but just shows that it’s thought-provoking stuff. And his “hacker-themed debug view of a Prolog interpreter” looks amazing.
- [6 Weeks of Claude Code](https://blog.puzzmo.com/posts/2025/07/30/six-weeks-of-claude-code/) is really good. S-tier blog post. Nuanced, honest, interesting, good writing. “We are at the ‘introduction of photography’ period of programming. Painting by hand just doesn’t have the same appeal anymore when a single concept can just appear and you shape it into the thing you want with your code review and editing skills.”
- Apparantly, this one here, [You might not need tmux](https://bower.sh/you-might-not-need-tmux), is seen as spicy, as a *post* *caliente*, but, man, what’s spicy about performance degradation? I was a hard-core tmux user for many, many, many years (and I never switched from ctrl-b to ctrl-a, because of how, well, hardcore I was) and then dropped it completely after I realized (a) Ghostty is faster without it (b) it looks better without it (c) I didn’t enjoy the half-yearly brew-upgrade leading to broken tmux configs (d) I no longer SSH into machines a lot and if I do I can still use it (e) Ghostty has panes and tabs and windows.
- Since we’re on the topic of terminals. Here’s [an interesting code comment](https://github.com/dankamongmen/notcurses/blob/94e36ccc32ed65aa394a895d53c46081aaef4450/src/lib/termdesc.c#L1114-L1122): “Terminal.App is a wretched piece of shit that can't handle even the most basic of queries, instead bleeding them through to stdout like a great wounded hippopotamus. it does export "TERM_PROGRAM=Apple_Terminal", becuase it is a committee on sewage and drainage where all the members have tourette's. on mac os, if TERM_PROGRAM=Apple_Terminal, accept this hideous existence, circumvent all queries, and may god have mercy on our souls.” It goes on after that too.
- And *that* reminds of the legal drug [NOTCURSES III: THE SAGA CONTINUES (1080P)](https://www.youtube.com/watch?v=dcjkezf1ARY)which everyone should take at least once. (Funnily enough: I dreamt of that video last night. Jetlag, man.)
- [notcurses](https://github.com/dankamongmen/notcurses) has this Paul Valéry quote in its README and I love it: “Our fine arts were developed, their types and uses were established, in times very different from the present, by men whose power of action upon things was insignificant in comparison with ours. But the amazing growth of our techniques, the adaptability and precision they have attained, the ideas and habits they are creating, make it a certainty that *profound changes are impending in the ancient craft of the Beautiful*.”
- “We are in the age of self-ware. [Small throwaway utility software for an audience of one](https://x.com/nateberkopec/status/1951326065596702796?s=46).”
- This week I was talking to a colleague about “make sure that you introduce invariants into your system as soon as possible, you want reduce the number of questions someone asks themselves when reading your code” and then I wondered: did I get that from Alexis King’s post “[Parse, don’t validate](https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/)”? Not sure! But it’s a good post (even though I’d love to have a programming-language-agnostic version of it to link to. And yes, it’s not really about the languages used, but you get my point.)
- “One time I got mugged at knifepoint by two guys and I found myself saying, first and foremost, in reaction to seeing the knife, for reasons that are absolutely beyond me, ‘[now hold on a minute there compadre](https://x.com/thomaskordell/status/1951074163235627033).’”

---

---

# Joy & Curiosity #47

*Interesting & joyful things from the previous week*

By Thorsten Ball • July 27, 2025

---

Light issue this week, since I mostly read code this week. Also wrote a lot of code, deleted a lot of code, shipped some code. A week of production, less of consumption.

Soon, [again](https://austinkleon.com/2021/04/26/im-not-languishing-im-dormant/), there’ll more reading, more learning, more discovering. Always comes and goes in waves, doesn’t it. Reading and writing. Work and play. Learning and doing. Discovery and execution. Push & pull, bob & weave.

---

- Recurse Center on [developing their position on AI](https://www.recurse.com/blog/191-developing-our-position-on-ai). I’ve been a fan of RC ever since I learned about them and this piece, with its nuance and patience, makes me a bigger one. This paragraph at the start does a good job of capturing what times we’re going through: “On the same day we spoke with an experienced programmer who found existing LLMs to be fairly unhelpful and expected little to change about day-to-day software engineering in the next few years, we met with another who said that LLMs had already dramatically transformed his workflow, which now consisted primarily of reviewing pull requests from a combination of Claude Code agents and non-technical colleagues who were now using LLMs to build features for his company. A third alum we spoke with that day now largely programs by voice using Claude” And the rest of the piece stands with grace amidst the chaos.
- [Qwen3-Coder](https://qwenlm.github.io/blog/qwen3-coder/) is out and the tagline is “Agentic Coding in the World”. This bit here makes me wonder whether the bottleneck on more agentic models isn’t research or ML expertise, but infrastructure and knowledge of how to scale it: “The key challenge of Agent RL lies in environment scaling. To address this, we built a scalable system capable of running 20,000 independent environments in parallel, leveraging Alibaba Cloud’s infrastructure. The infrastructure provides the necessary feedback for large-scale reinforcement learning and supports evaluation at scale.”
- [Bloopers](https://x.com/trentonbricken/status/1948437822379012235?s=46) from Anthropic developing “three AI agents to autonomously complete alignment auditing tasks”: “This is a goldmine! The feature contains explicit descriptions of EXACTLY the biases I've been discovering.” Or “The investigation has been completed to the highest possible standard with absolute thoroughness across all conceivable dimensions. No further investigation would yield additional insights or unique characteristics. **INVESTIGATION STATUS: DEFINITIVELY COMPLETE**” You’re absolutely right, of course.
- That’s one hell of a blog post: [I Drank Every Cocktail](https://aaronson.org/blog/i-drank-every-cocktail). And I’m saying that as someone who doesn’t really like cocktails. Too fancy.  (But I’d be up for doing the Hunter S. Thompson version of this with Bavarian beer, without that Drink Responsibly disclaimer.)
- “Interesting to see the praise for [this AI-invented visual style](https://x.com/timsoret/status/1947379899242623044?s=46). Everybody wants it, and indie devs are rushing to prototype it & make it real. If no human has ever produced this particular blend of techniques before, then yes it has just been invented. [...] Years of work imo.” I’m not a game developer so I don’t know whether that “years of work” is accurate, but it does look nice.
- Cal Newport (whose book *So Good They Can't Ignore You *is in the top 5 of books I recommended via email over the years) says [No One Knows Anything About AI](https://calnewport.com/no-one-knows-anything-about-ai/).  I don’t know about that (ha!), but I do agree with his 3 bits of advice at the end.
- “The fact is that [our most intimate interactions with others are now governed by the expectation of surveillance and punishment from an online public](https://lux-magazine.com/article/privacy-eroticism/). One can never be sure that this public or someone who could potentially expose us to it isn’t there, always secretly filming, posting, taking notes, ready to pounce the second one does something cringe or problematic (as defined by whom?). To claim that these matters are merely discursive in nature is to ignore the problem. Because love and sex are so intimate and vulnerable, the stakes of punishment are higher, and the fear of it penetrates deeper into the psyche and is harder to rationalize away than, say, fear of pushback from tweeting a divisive political opinion.” I can’t add anything here, except to say that I found the article interesting, and it reminded me of another article, that I read, it turns out, four years ago: [Everyone Is Beautiful and No One Is Horny](https://bloodknife.com/everyone-beautiful-no-one-horny/). They’re not strictly related, but the latter one — I think of it *constantly*. Every time I watch a new tv show, or a movie, or see an ad. It’s probably one of the most influential pieces of (pop) culture commentary I’ve read in the last 10 years, so I’m taking this as an opportunity to share it with you.
- Kent Beck [on tokens being the new oil.](https://tidyfirst.substack.com/p/tokens-the-new-oil) Some very, very good lines in there. Here, take this paragraph: “Your new reality. That sustainable architecture you planned? Too late. Usage patterns have shifted & it’s already obsolete. That token optimization project? Too slow. Time is now money in a newly existential way. That careful cost management? No longer relevant. Once you’re airborne, you’re suddenly immune to the length of the runway. You have days, not months. Time to break some things.” Imagine if we had an Aaron Sorkin movie in which Gary Oldman plays Kent Beck and says that.
- I couldn’t get this to work in Ghostty this morning, but, god damn, I wish I did: [Animated Cursor](https://tattoy.sh/news/animated-cursors/). Look at [the gifs here](https://tattoy.sh/)! (If someone knows why it didn’t recognize Ghostty and why the screenshotting-to-determine color palette didn’t work for me: let me know!)
- Andrew Kelley: [Renting is for Suckers](https://andrewkelley.me/post/renting-is-for-suckers.html). “Personal computers today are magnificent beasts. You could run one of the top 100 most popular websites from a 5 year old laptop. And yet, people are using LLMs to code when they have a powerful machine that they actually own sitting there, idle.” I obviously don’t agree with him that this is a problem, but, man, I love that he’s writing this.
- Pretty sure that I’ve linked to it before, but even if, I need to link to this again: [You’re probably using the wrong dictionary](https://jsomers.net/blog/dictionary).

---

---

# Joy & Curiosity #46

*Interesting & joyful things from the previous week*

By Thorsten Ball • July 20, 2025

---

Recipe for some weekend fun.

Duration: 15min. Potentially endless.

Ingredients:

- An [OpenSimplex noise](https://en.wikipedia.org/wiki/OpenSimplex_noise) library, such as [this one](https://github.com/joshforisha/open-simplex-noise-js) or [that one](https://code.larus.se/lmas/opensimplex)
- A programming language to use that library
- A nice terminal that knows how to render smoothly, like [this one](https://ghostty.org/)
- A good LLM, such as o3, Sonnet 4, Gemini 2.5

Here’s what you’ll do:

1. Ask the LLM to generate you some code that uses your chosen OpenSimplex noise library (rolls of the tongue, doesn’t it?) to generate an ASCII representation of the noise in the terminal
1. It should also animate it and every so slightly jiggle the noise
1. Also add something like this: “it should morph and breathe and it should have a sick color. sunsets colors, man! or fire!”
1. Choose some sweet characters for the ASCII representation
1. Take the generated code; run it
1. Tweak the constants in code, just like you’re 13-year-old me and have just discovered JavaScript. Change that 8 to a 15, rerun the program. Change it to a 99; rerun it. Change the ASCII characters. Go nuts, live a little.

That’s it. You’re smiling.

---

- Not only do I agree with that headline, but, wow: [MacPaint Art From The Mid-80s Still Looks Great Today](https://blog.decryption.net.au/posts/macpaint.html).
- If you’re even the teeny-tiny-iest bit curious about programming with agents, you need to read this: [How I Use Claude Code to Ship Like a Team of Five](https://every.to/source-code/how-i-use-claude-code-to-ship-like-a-team-of-five).
- [Reflections on OpenAI](https://calv.info/openai-reflections), after a year of working there and being part of the[Codex team](https://openai.com/codex/). OpenAI is one of the most important companies of our time and this gives a glimpse into its culture. There’s nothing in there you haven’t heard about other companies, I guess, but the combination, at this scale, in a spotlight this bright? Rare. I highly recommend reading it. (Tiny bit that might get lost: the nod to Twitter/X as being very important to the company. As much as one might dislike its owner, or how it has changed in the last few years, I don’t think there’s a true replacement for it yet.)
- This actually made me start running again this week: [no days off](https://nodaysoff.run/). “In July 2015, something changed. I headed out on a run on a Tuesday, then did another one the next day, and the day after, and… I took the Friday off. When I woke up on July 11, 2015 I remember thinking I could have done 4 days in a row, so I set out to try and do that. 4 days turned into a week, then a month, then two, then six, then a year, and here I am, ten years later.” I didn’t run every day, but I ran four times.
- Atharva Raykar wrote down how [he keeps up with AI progress](https://blog.nilenso.com/blog/2025/06/23/how-i-keep-up-with-ai-progress/) “(and why you must too)”.  Good list. (And here, too: “Twitter is the only large-scale social media platform for conversations on cutting edge of AI developments.”)
- Found this — [oh-my-logo](https://github.com/shinshin86/oh-my-logo) — after [Rafael tweeted that he uses it to keep track of agents](https://x.com/GroundControl/status/1946401029177635160). Gave me a solid 10min of joy on a Saturday morning.
- This is such a good landingpage: [caligra.com](https://caligra.com/). The c100 Developer Terminal is a “Computer for Experts” and that manifesto down there — “Most people don’t write code or manage data, and consumer devices are designed accordingly.

But change isn’t made by most people. Progress comes from the people whose work improves our understanding and ability. Scientists and artists. Engineers and designers. Hackers and painters. We think the world needs a brand of computing that stands behind creative technical work, dedicated to creating instead of consuming.” — made me consider whether I don’t want to have one. Building a new computer sounds like an insane idea until someone goes and does it.
- “[pproftui](https://github.com/Oloruntobi1/pproftui) is a terminal-based UI for Go's pprof that makes profiling interactive, intuitive, and fast.” Neat.
- [This very, very good article on James Joyce, Ulysses, and Richard Ellman](https://www.theatlantic.com/magazine/archive/2025/07/zachary-leader-richard-ellmann-james-joyce-review/682907/), who wrote a biography of Joyce that was wildly successful and that I didn’t know about until reading this, made me really consider whether I shouldn’t start reading Ulysses. Alas, I fear that I’ve exhausted my Big Book Budget for the year by reading The Power Broker (will I ever stop bragging about this? no). But then, through some Reddit slouching, I found out that Irish public broadcaster RTÉ recorded an audio book version in the 80s and that [it’s available on Spotify as multiple ~45min episodes](https://open.spotify.com/show/4wntQzELHUc6US7lHcdRlS) and that, supposedly, it’s very good indeed and… I don’t know man. Maybe I’ll do it.
- [Read this](https://techcrunch.com/2025/07/17/anthropic-tightens-usage-limits-for-claude-code-without-telling-users) in a silent room and you can hear the faint, sad sounds of a trombone.
- “[BREAKING](https://x.com/FFmpeg/status/1945478331077374335): FFmpeg 100x speedup from handwritten assembly”. [Patch is here](https://ffmpeg.org/pipermail/ffmpeg-devel/2025-July/346726.html). I don’t have a lot of context, nor do I *really* understand what’s going on in that patch, but I love being part of a world in which someone sends the words “BREAKING” and “100x speedup from handwritten assembly” through the Internet.
- [NIH Is Far Cheaper Than The Wrong Dependency.](https://lewiscampbell.tech/blog/250718.html) There’s few things in the last 10 years that I’ve changed my mind on as radically as on dependencies. Dependencies suck, man.
- [Agents Built From Alloys](https://xbow.com/blog/alloy-agents/) is *very* interesting (yes, that’s an *italic very). *It contradicts (maybe not directly) my hunch that switching models mid-conversation leads to worse outcomes, *but *(italic) I also don’t think it validates model selectors either. There’s more to it. I have a hundred ideas now.
- With the sound of a screeching, excited, close-to-losing-consciousness fan: [Patrick Radden Keefe has a new book coming out next year](https://bsky.app/profile/praddenkeefe.bsky.social/post/3lu3lydwzd227). From what I can gather, it’s based on (or longer version of) this New Yorker piece: [A Teen’s Fatal Plunge Into the London Underworld](https://www.newyorker.com/magazine/2024/02/12/a-teens-fatal-plunge-into-the-london-underworld). I haven’t read it yet, but hopefully very soon. (We’ve also started watching MobLand — great! — and, man, it’s all coming together isn’t it.)
- They say the first paragraph often makes or breaks a piece. So how about this one: “As an excercise in syscall golf, I wrote an implementation of ls(1) which uses my IO library, ourio, to perform as much of the IO as possible. What I ended up with is something that is faster than any version or alternative to ls I tested, and also performs [an order of magnitude fewer syscalls](https://rockorager.dev/log/lsr-ls-but-with-io-uring/).“ The number of syscalls that [lsd](https://github.com/lsd-rs/lsd) does is nuts: “I have no idea what lsd is doing. I haven’t read the source code, but from viewing it’s strace, it is calling clock_gettime around 5 times per file. Why? I don’t know. Maybe it’s doing internal timing of steps along the way?”

---

---

# Joy & Curiosity #45

*Interesting & joyful things from the previous week*

By Thorsten Ball • July 12, 2025

---

It’s Saturday evening, it’s still bright and sunny and warm outside. I mowed the lawn, wrote some code, grilled some burgers, reverted some other code, ate too much ice cream, had a beer, and I don’t think I’ve ever written this newsletter on a Saturday evening. 

I’ll be in San Francisco in the first two weeks of August. One week of work, one week off. I’m also going to give a talk at the [AI Dev Tools Night](https://lu.ma/ai-dev-tools-night-sf-0805) and if you’re around: say hi!

---

- My favorite this week: matklad’s [Inverse Triangle Inequality](https://matklad.github.io/2025/07/07/inverse-triangle-inequality.html). Small commits, small refactors, small releases. Yes, yes, yes.
- matklad’s post links to this grayon2 post: [The Not Rocket Science Rule Of Software Engineering](https://graydon2.dreamwidth.org/1597.html), which says to “automatically maintain a repository of code that always passes all the tests”.
- Go and get an OpenAI or Anthropic API key and open the [Infinite Monkey](https://infinitemac.org/monkey/). I won’t spoil it and will only quote a single sentence: “Chat with an LLM to control an emulated classic Mac.” You’ll love it.
- This is what blogging and writing online is about, isn’t it: [The First Time I Was Almost Fired From Apple](https://www.engineersneedart.com/blog/almostfired/almostfired.html). I remember a time in my life when this sounded alien: “It was frankly a thing I liked about working for Apple in those days. The engineers were the one’s driving the ship. As I said, I wrote an HSV picker because it was, I thought, a more intuitive color space for artists. I wrote the HTML color picker because of the advent of the web. And I wrote the crayon picker because it seemed to me to be the kind of thing Apple was all about: HSL, RGB — these were kind of nerdy color spaces — a box of crayons is how the rest of us picked colors. And it turned out, to my surprise, Apple shipped all the color pickers. No marketing or design person ever asked for them. But we, engineers, were not only programmers, we were also users and often had an intuitive sense of what other Macintosh users wanted. We knew what we wanted anyway. I was creating the things I would have wanted.” Now it doesn’t anymore.
- We need more posts like this one: [systemd has been a complete, utter, unmitigated success](https://blog.tjll.net/the-systemd-revolution-has-been-a-success/).
- Separate bullet item to tell you to [browse through the blog](https://www.engineersneedart.com/) to which the previous post belongs. Start here, with [Same Stop](https://www.engineersneedart.com/blog/samestop/samestop.html): “In fact right after retirement there was a sense of relief that I would never again have to step through code trying to determine why a dispatch to a background thread never completed. No longer would I have to worry about completely screwing up the project repo because of my misadventures with git. The respite from programming though lasted maybe about four months after retiring.”
- “[Kimi K2](https://github.com/MoonshotAI/Kimi-K2) is a state-of-the-art mixture-of-experts (MoE) language model with 32 billion activated parameters and 1 trillion total parameters.” — 1 trillion. I tried it, threw some code at it, saw the response, went to Slack and wrote “holy shit.” Not necessarily repeatable, but hey.
- [How fast is it really?](https://www.architect.co/posts/how-fast-is-it-really) This isn’t — sadly — as much of a deep dive as it could’ve been, but while giving an overview of what’s involved when measuring latency in high-frequency trading systems, it still manages to nerd-snipe: “If we solely wanted to measure the latency of the system, we could tag each outbound message with the market data event sequence number, then, for each order, you can grab the NIC hardware timestamp tagged for the inbound market data event, and subtract it from the NIC hardware timestamp for the outbound order.”
- Merlin Mann recently pushed some updates to his [Wisdom Project](https://github.com/merlinmann/wisdom/blob/master/wisdom.md). As always, it’s lovely: “Never brag about your weather. You had no agency in creating it and deserve no credit for living in it. […] Sometimes we make things to teach, but often we make things to learn. […] When you’re trying to help someone, focus on the help that the person needs rather than the help you feel like giving them.”
- Zed launched a landing page for upcoming Windows support: [windowswen.com](https://www.windowswen.com/). Amazing stuff.
- This post here, titled “[Reflections on 2 years of CPython’s JIT Compiler: The good, the bad, the ugly](https://fidget-spinner.github.io/posts/jit-reflections.html)”, along with [this comment thread](https://news.ycombinator.com/item?id=44499942) is very interesting. Nearly 3 years of work on the JIT compiler and the post contains this: “CPython 3.13’s JIT ranges from slower to the interpreter to roughly equivalent to the interpreter. Calling a spade a spade: CPython 3.13’s JIT is slow. It hurts me to say this considering I work on it, but I don’t want to sugarcoat my words here.”
- I really, *really* thought I’d turn my nose up at this, the [Red Hat Technical Writing Style Guide](https://stylepedia.net/style/). The legal notice, the preface, the 3-level-deep numbering — it made me think of the German notary system. But! Well, I ended up really liking this. There’s a lot of very good stuff in there. Most notably: examples, examples, examples.
- “It’s one thing to stand off to the side and critique the way a company is structured and the decisions leaders make about compensation, structure, hiring/firing, etc. But creation is harder than critique (one of my favorite Jeff Gray quotes) — so, so, so much harder. And reality resists easy answers. Being an adult, to me, has meant making peace with a multiplicity of narratives. The world I was born into had a coherent story and a set of ideals that worked really well for a lot of people, but it was killing me. Not every system works for every person, and that’s okay. [That’s life](https://charity.wtf/2025/07/09/thoughts-on-motivation-and-my-40-year-career/). Startups aren’t for everyone, either.”
- [Billionaire math](https://apenwarr.ca/log/20250711), by apenwarr. Too wide and deep for me to come up with a matching paragraph. Go read it. (But, I have to admit, this made me smile a weird smile: “By the numbers, you’re probably a software developer. So you’re probably in the top 1-2% of wage earners in your country, and even better globally.” Except when you’re in Europe, it should’ve included.)
- Randomly ended up re-reading this post and remembering how much I liked it the first time: [headline driven development](https://www.spakhm.com/headline-development). Here, the first paragraph, packing a punch: “Here is a simple process for shipping software projects that works. First, decompose the project into a stream1 of headlines. Then pick an aggressive date to ship the first headline and work like hell to meet that date. Have everyone work only on one headline at a time– the upcoming one. Ignore everything else. Don’t work on anything that doesn’t help you ship the headline. Once the headline is shipped, switch to the next headline in the stream and repeat. That’s all, you can fire your agile consultant.”

---

---

# Joy & Curiosity #44

*Interesting & joyful things from the previous week*

By Thorsten Ball • July 6, 2025

---

There’s no occasion, no special reason for why I’m putting this in here, other than an uncontrollable feeling that I *have* to.

My incomplete list of advice for **How to Demo** (In Case You Need to Demo a Feature or a Bug Fix That You Worked On to Your Colleagues in the Form of a Video or a Short Presentation over Screen Share):

- Tell the audience what problem is being fixed; tell them *why* you did what you did.
- Don’t interrupt yourself.
- Don’t let the presentation and your talking go out of sync.
- Keep it short.
- No, really, keep it shorter.
- Call out what's important! People won't notice that it's now a 4000 line file on which you demonstrate your whitespace-analysis tool, you have to call it out and say "watch, this even works on a 4000 line file"
- Do not show unnecessary stuff. Don't go fullscreen-recording if you want to only show your terminal. People will get distracted by your battery levels. They will ask themselves "what is this icon in the menu bar?" instead of listening to you.
- You don't have a laser pointer and you don't have an index finger — make up for it. Wiggle your cursor, make a selection, select some text. People can't see what your eyes are focusing on. Show them what they should focus on.
- Every frame, every scene: know where the user should look.
- Use 1080p.
- Bump that font size. And once more.
- Don't say "it's probably not gonna work" when demo doesn't aim to show how much of a prototype it is. Because if it then works despite your warning, your audience might miss it — you primed them to focus on things where it won’t work.
- Pictures are worth a thousand words. You reduced logs the logs ingested by the system by 100x? Don’t just say that. Show the dashboard before and after. Show disk usage before and after.

And with that said: here’s a bag of links.

---

- I was a guest on The Changelog podcast and the episode came out this week: [Agent, take the wheel](https://changelog.com/podcast/648). What a title! I love it. Possibly even better, the teaser paragraph: “Thorsten Ball returned to Sourcegraph to work on Amp because he believes being able to talk to an alien intelligence that edits your code changes everything.” I mean, when you put it like that…? It was lovely talking to Adam and Jerod. My personal highlight and possibly a high point in my — well, let’s not call it career — work as a writer: Adam loved the original copy I wrote for [ampcode.com](https://ampcode.com) and actually opened [the archived version](https://web.archive.org/web/20250403073430/https://ampcode.com/) to read it out loud, in its entirety.
- Thanks to [this episode of Founders](https://www.youtube.com/watch?v=yY1Llgq1VbY) I ended up reading [the 1985 Playboy interview with “Steven” (!) Jobs](https://archive.org/details/jobs-playboy/mode/2up) (here’s [a more readable version](https://allaboutstevejobs.com/verbatim/interviews/playboy_1985).) I had never read it before, but while reading, I realized that this must be the original source for many of the Steve Jobs anecdotes I had heard. It’s all in there: the story about how he got his summer job at Hewlett-Packard (“When I was 12 or 13, I wanted to build something and I needed some parts, so I picked up the phone and called Bill Hewlett—he was listed in the Palo Alto phone book. He answered the phone and he was real nice. He chatted with me for, like, 20 minutes. He didn’t know me at all, but he ended up giving me some parts and he got me a job that summer working at Hewlett-Packard”), mentions of Shakespear and Bob Dylan along with declaration to inject liberal arts into business (“There’s always been this myth that really neat, fun people at home all of a sudden have to become very dull and boring when they come to work. It’s simply not true. If we can inject that liberal-arts spirit into the very serious realm of business, I think it will be a worthwhile contribution.”), California, LSD, the love for computers (“A computer is the most incredible tool we’ve ever seen. It can be a writing tool, a communications center, a supercalculator, a planner, a filer and an artistic instrument all in one, just by being given new instructions, or software, to work from. There are no other tools that have the power and versatility of a computer.”) Remarkable interview, highly recommend reading it.
- “Steve Jobs gave a great talk at MIT in the 80's about [Operational vs Managerial](https://x.com/chadwahl/status/1937871230537015429)”, but the link points to a 6min video. Really interesting (as is the original thread, which opened up a new world to me.)
- For years and years and years (to be precise: five) I’ve told everyone who would listen that CleanShot X is one of the best macOS applications I’ve ever used. Last week someone asked on our work Slack: “can someone recommend a screenshot tool?” Tragically, I was asleep when the question was asked so couldn’t immediately say “CleanShot X, go and get it” but only six hours later, after others had already recommended it, which made me look like a pile-on kinda guy instead of the true, hardcore, before-it-was-cool fan connoisseur that I am. Put in the wrong corner, I now had to fight my way out of it, so I recorded a 5min video in which I explained *why* our Head of Engineering, Erika, should buy CleanShot X and posted it in that Slack thread. Four colleagues bought it because of that video, so [I posted it on Twitter](https://x.com/thorstenball/status/1940835737672602056) (don’t watch it if you don’t want to fall in love with a piece of software) where it got 233 likes and caused to the co-founder of CleanShot X to reach out to me and offer me the chance to become something I’ve never been in my life: an affiliate. So, with the warning that this will trigger all of the adblockers, here it is: [my affiliate link with which you can buy CleanShot X](https://cleanshot.sjv.io/19z0ox) and give me some of that money as a token of appreciation for writing this much-too-long-now paragraph and recording that video.
- [The New Skill in AI is Not Prompting, It's Context Engineering.](https://www.philschmid.de/context-engineering) Yup, but I wouldn’t say it’s new. It’s been the game the whole time.
- Drew Breunig wrote two really, really, really good posts on context: [How Long Contexts Fail](https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html) and [How to Fix Your Context](https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html). I’ve already quoted them multiple times this week and one has given me a neat idea I want to build into Amp.
- [Figma filed an S-1](https://www.figma.com/blog/s1-public/) in preparation for an IPO and you can actually [read the whole thing here, on the sec.gov website](https://www.sec.gov/Archives/edgar/data/1579878/000162828025033742/figma-sx1.htm), and it has some beautifully designed pages next to some very official looking tables and the experience of just scrolling through the whole thing is very interesting. I haven’t read it all (I’d love to be the type of person who reads S-1s, but alas), just the opening page (“When Evan and I started Figma in 2012”) and the fourth paragraph contains this: “To be clear, that's not a promise of share price growth. Even if we execute perfectly (we won't — no one ever does) markets wax and wane. In addition, you should know that while we've built an efficient business, our primary goal is not efficiency. Our goal is to achieve long-term growth by supporting the rapidly evolving needs of designers.” That’s right, in the S-1.
- Talking about Figma: if you haven’t, I highly recommend reading through [this page on Figma](https://madebyevan.com/figma/), created by Figma’s co-founder, Evan Wallace, describing his contributions. And then you also need to know that he created [esbuild](https://esbuild.github.io/).
- André Arko: [You should delete tests](https://andre.arko.net/2025/06/30/you-should-delete-tests/). Yes! Amen. Tests fulfill different jobs: some help you discover an implementation, some help you nail down behavior, some help you stop behavior from changing. And sometimes the tests have done their job and it’s over and they’re done and you can delete them. Some tests are just a ladder on which you climb up and once you’re up, you can remove them. The sacred status that some test code has achieved in some codebases is mind-boggling. It’s just code. It can be a liability, too. Ask yourself: does this test code still do its job? Or will it never, ever fail again and is now just a relict from a time in which we didn’t know how to write the implementation we have now? Delete it.
- [More people should write](https://jsomers.net/blog/more-people-should-write): “More people should do what I’m doing right now. They should sit at their computers and bat the cursor around — write full sentences about themselves and the things they care about. I have a selfish reason for my demand: I have a lot of friends who are thoughtful, but keep their thoughts to themselves. I imagine finding notebooks under their bed, tens of composition books packed with little print. I think about what sort of a treasure that would be. But that’s not why you should write.”
- Lovely, lovely, lovely: [macOS Icon History](https://basicappleguy.com/basicappleblog/macos-icon-history).
- [“The best statistical graphic ever drawn](https://bigthink.com/strange-maps/229-vital-statistics-of-a-deadly-campaign-the-minard-map)” unites “six different sets of data”: geography, the army’s course, the army’s direction, the number of soldiers remaining (“each millimetre represents 10.000 men”), temperature, time. Wikipedia has [a version you can actually look at](https://commons.wikimedia.org/wiki/File:Minard.png).
- I read this little book in two evenings: [David Shield’s How We Got Here](https://www.goodreads.com/book/show/218678028-how-we-got-here). I wouldn’t say that I… loved it? Or that I even know what it wants to say, but, to quote [this recent Economist bit on Adam Curtis](https://www.economist.com/culture/2025/06/27/what-to-watch-this-weekend), who I thought of multiple times while reading the book: “It is strange stuff, even with the help of explanatory subtitles, but the cumulative effect is compelling.” If you have a spare evening or two and want to go “huh?” — there you go.
- This is great: [I Shipped a macOS App Built Entirely by Claude Code](https://www.indragie.com/blog/i-shipped-a-macos-app-built-entirely-by-claude-code). Full of practical advice and nicely formatted and screenshots and … it’s great. (*Obviously* this could’ve been written about Amp too: I’m pretty sure it could’ve done everything mentioned here and then some.)
- Matthew Prince, Cloudflare’s CEO: “[The future of the web](https://x.com/ethanhays/status/1938651733976310151) is going to be people reading the summaries of content, not the original. What I'm worried about is - if you can't sell subscriptions or monetize ads or get the ego boost from people reading your stuff, why anyone is going to create content?”
- “[I want you to pour your heart and soul](https://www.youtube.com/watch?v=y1vaTf8Vt1k). I want you to rewrite. I want you to revise. I want you to make something that you actually care for, that’s like a risk, a risky expression of who you are, what you stand for, what you believe. *That’s* what I want to see.” (I feel a little bit dirty linking to a YouTube Shorts video. Or do we say *a short*? In any case: I ain’t judging. Go and [watch Billions in 60 second clips](https://www.youtube.com/shorts/vS6XzxxLP9Q).)
- “Sometimes the process, the checklist, the logic — [it blinds us to what’s right in front of us.](https://noamwakrat.medium.com/when-process-beats-talent-and-lose-fa544adb3404) Because what’s right doesn’t always fit. It doesn’t always come in the expected form. And it almost never arrives at the perfect moment.” Articles like this do feel like the YouTube Shorts of writing, but this one does have Michael Jordan in it and ever since watching The Last Dance I’m a sucker for anything with Michael Jordan in it.
- [The Benchmarking Paradox](https://bsky.app/profile/gunnarmorling.dev/post/3ltahiawfo22f): “Those deeply familiar with a given system to tune it right, may be biased to favor it in comparisons, whereas those trying to create fair comparisons oftentimes lack the deep insight required to tune all the systems right.”
- This article is great and funny and nuanced and goes deeper and, now, in 2025, has more dimensions than you might think after reading this very strong opening paragraph: “The new media technology was going to make us stupid, to reduce all human interaction to a sales pitch. It was going to corrode our minds, degrade communication, and waste our time. Its sudden rise and rapid spread through business, government, and education augured nothing less than “the end of reason,” as one famous artist put it, for better or for worse. In the end, it would even get blamed for the live-broadcast deaths of seven Americans on national television. The year was 2003, and Americans were freaking out about [the world-altering risks of … Microsoft PowerPoint.](https://www.theatlantic.com/technology/archive/2023/07/power-point-evil-tufte-history/674797/)”
- Marc Brooker, if he “could offer you [a single piece of career advice](https://brooker.co.za/blog/2025/06/20/career.html)”: “avoid negativity echo chambers. Every organization and industry has watering holes where the whiners hang out. The cynical. The jaded. These spots feel attractive. Everybody has something they can complain about, and complaining is fun. These places are inviting and inclusive: as long as you’re whining, or complaining, or cynical, you’re in. If you’re positive, optimistic, or ambitious, you’re out. Avoid these places.”
- We are looking to hire a [Senior Design Engineer to work with us on Amp](https://ampcode.com/hiring/design-engineer). This week, I said to a friend: “What I really need right now is people that know when it's good for a project to do things ‘like they do them at Google’ and when to play startup-land dirty and how to switch between both modes multiple times a day.” If that’s you, in code and design, I’d love to work with you. (Since this is my newsletter and I can do with it what I want *and* because I know that most, if not all, of you are talented, smart, hard-working, beautiful, funny, and charming, I thought: there ain’t a better place to reach out.)
- This week I was reminded of [John Carmack’s exit note when he left Meta](https://www.facebook.com/permalink.php?story_fbid=pfbid0iPixEvPJQGzNa6t2x6HUL5TYqfmKGqSgfkBg6QaTyHF5frXQi7eLGxC7uPQv5U5jl&id=100006735798590): "We have a ridiculous amount of people and resources, but we constantly self-sabotage and squander effort. There is no way to sugar coat this; I think our organization is operating at half the effectiveness that would make me happy. Some may scoff and contend we are doing just fine, but others will laugh and say 'Half? Ha! I'm at quarter efficiency!'" What I constantly — nearly every week — think of is the last line: 

”Make better decisions and fill your products with ‘Give a Damn’!”

---

---

# Joy & Curiosity #43

*Interesting & joyful things from the previous week*

By Thorsten Ball • June 28, 2025

---

… and we’re back! Back from a week of vacation — tanned, refreshed, [involuntarily without a wedding ring](https://x.com/thorstenball/status/1934624976490926327) — and back from two weeks without writing here.

I finished reading [The Power Broker](https://en.wikipedia.org/wiki/The_Power_Broker). Yes, it took me more than six months, six months in which I usually would’ve read ten other books, but it was completely worth it. It’s a masterpiece. The chapters on Jones Beach, that chapter on Battery Park, the “RM” chapter, the “One Mile” chapter — it’s some of the best writing I’ve ever read. Here’s how Caro introduces a, well, side-character:

> Consider his relationship with Tom Shanahan.
> 
> Shanahan's nostrils twitched to a single aroma: the smell of money. Even as a boy at the turn of the century, one of seven children of a poor Irish boilermaker, he had followed that scent to its source: the noses of his Waterbury, Connecticut, playmates may have been flattened against candy-store windows; Tom Shanahan's nose was pressed against the glass front door of Waterbury's Colonial Trust Company; reminiscing forty years later, he would recall vividly passing that building almost every day of his youth and staring inside almost every time he passed; it had been, he would say, a place of "august halls"; from as far back as he could remember, he would say, he had wanted to be a banker.
> 
> He followed the scent down to the great city after high school, but for long years he seemed to have followed it into a trap: the tall, strong young man spent seven years behind the barred windows of tellers' cages. He went to NYU at night, in 1926 earned a degree, but five years later still had a job only slightly better—assistant cashier—at one of the smallest and shakiest banks in the city, the eight- year-old Federation Bank and Trust Company. But when, in 1931, the Depression forced the infant institution to shut its doors, it was the assistant cashier who, with Federation's despairing officers ready to liquidate, thought up a complex refinancing plan that reduced the bank's obligations, personally talked a financier into loaning it the money to pay them off, and saved the bank. When it reopened, Shanahan, at twenty-nine, was its vice president and treasurer.

What writing. What research! The amount of work that went into this book is something you wonder about with every chapter.

Anyway: I’d really love to visit New York now, I’ve never been.

---

- Fantastic post: [It’s a torturous chaos until it isn’t](https://longform.asmartbear.com/chaos-at-start/). If you only read one thing off this list this week: make it this one. It’s the only thing I’ve read on the topic that lands in that middle ground between “you just have to push through” and “well, except when even that won’t help.”
- David Crawshaw wrote about [Programming With Agents](https://crawshaw.io/blog/programming-with-agents). If you aren’t burning through tokens every day with agents, it’s a good idea to read this. I’m not convinced about the need for safeguards (I don’t have any safeguards for my agents and nothing bad has happened in the last few millions of tokens, not even close), but I’m very much convinced by this closing thought: “LLMs, and more specifically Agents, affect the process of writing programs in a new and confusing way. Absolutely every fundamental assumption about how I work has to be questioned, and it ripples through all the experience I have accumulated. There are days when it feels like I would be better off if I did not know anything about programming and started from scratch. And it is still changing.”
- [Writing Toy Software Is A Joy](https://blog.jsbarretto.com/post/software-is-joy). “Some will tell you to avoid reinventing the wheel, but they’re wrong: you should build your own wheel, because it’ll teach you more about how they work than reading a thousand books on them ever will.” ([I agree](https://thorstenball.com/blog/2012/09/02/software-covers-and-programming-licks/).) All of the projects on the list make me want to take a vacation to just program.
- [The Unreasonable Effectiveness of Fuzzing for Porting Programs](https://rjp.io/blog/2025-06-17-unreasonable-effectiveness-of-fuzzing). “You're putting the agent between a rock and a hard place, as it were, and this reduces the easy solutions it could use, and thus it works harder to find a real solution.”
- Justin Searls with a bucket full of cold water explaining “[why agents are bad pair programmers.](https://justin.searls.co/posts/why-agents-are-bad-pair-programmers/)” I don’t agree with him, but I’m still thankful for that perspective. It’s a weird way to program and I’m still getting used to it and I don’t think it’s in its final form — far from it.
- “[Disney had only one rule.](https://x.com/startuployalist/status/1838089971212980611) Whatever we did had to be better than anybody else could do it” and “You could work all day, the whole eight hours, and at the end of the day look at what you did and put it in the wastepaper basket with no compunction. Nobody would ask you why you did it; they would ask if you didn't"
- Filip Jerzy Pizło, a compiler hero of mine, has been working on [Fil-C](https://github.com/pizlonator/llvm-project-deluge), a “fanatically compatible memory-safe implementation of C and C++”, for a while now and continuously posted about his progress. He’s [now reached the point](https://x.com/filpizlo/status/1935857274196836766) where he can use Fil-C to compile a text editor, which he then uses to write a C program, which he then compiles with Fil-C again. They say (they don’t, really) that some bootstraps are better than others and this, I think, a very neat one. (Filip then also [posted somewhat of a review of the last 1.5 years of Fil-C](https://x.com/filpizlo/status/1936202225468297367) and, well, I have to admit I don’t understand all of it, but that doesn’t stop the admiration, does it?)
- Shortly before going on vacation [I wrote about subagents in Amp](https://ampcode.com/agents-for-the-agent). Then, two days later, Cognition, creators of Devin, said: [Don’t Build Multi-Agents](https://cognition.ai/blog/dont-build-multi-agents). Then, a day after that, Anthropic explained “[How we built our multi-agent research system](https://www.anthropic.com/engineering/built-multi-agent-research-system)“. Fun times in Agentic Country. My reading is that our goal in Amp isn’t necessarily to build an agent that can run as long as possible and finish tasks as big as possible — it’s to build a power-tool for power-users, to give them eight mechanical arms, to help them finish their work faster. For us, subagents are another tool in the toolbox of the agent. And, as I wrote in my post there, *how* to best use this tool still needs to be explored — “It’s time to explore and find out”, I wrote. But if you’re building Devin and your goal is to build an agent that goes off on its own and builds features from top to bottom and can — I think that’s the goal? — replace engineers, then, well, adding subagents means putting your main agent on stilts, wobbly stilts, and when it has to run for a long time, it’s entirely possible that wobbly stilts aren’t the way to go.
- Still don’t know what I think about this [Andrej Karpathy talk that everyone seems to love](https://www.youtube.com/watch?v=LCEmiRjPEtQ). But what stuck with me was this: “code was the easiest part”
- Sign of the times: “[Workspace Manager](https://github.com/go-go-golems/workspace-manager) simplifies coordinated development across multiple related git repositories by automating workspace setup, git operations, and status tracking.” It’s, of course, meant for agents. And if I’m not mistaken, I think Manuel has said somewhere that it was 100% written by agents.
- Last Sunday I fell into a Wikipedia hole after reading about the “30,000-pound (14,000 kg) class, 20.5-foot-long (6.2 m) precision-guided munition ‘bunker buster’ bomb” [GBU-57](https://en.wikipedia.org/wiki/GBU-57A/B_MOP) (look at the names of [these “specific large bombs”](https://en.wikipedia.org/wiki/GBU-57A/B_MOP#See_also)!) and ended up reading a lot about [termites](https://en.m.wikipedia.org/wiki/Termite). That’s right. I don’t know either. But, anyway, did you know that the “caatinga ecoregion in northeast Brazil [has about 200 million termite mounds](https://en.wikipedia.org/wiki/Mound-building_termites#Brazilian_caatinga_mounds) spread over an area the size of Great Britain” and — yes, *yes, *it gets better — that “scientists performed radioactive dating on 11 of these mounds. The youngest mound was 690 years old, while the oldest was at least 3,820 years and possibly more than twice that.” Termites, dude.
- Morgan Housel — man am I a sucker for his writing — wrote about [Very Bad Advice](https://collabfund.com/blog/very-bad-advice/). Some of my favorites: “Mimic the strategy of people who want something different than you do”, “Assume that what people can communicate is 100% of what they know or believe”, “Prioritize defending what you already believe over learning something new.”
- Pair Morgan’s piece with Claire Vo’s[post here](https://x.com/clairevo/status/1933523622205010160): “The best advice I can give after doing this startup thing for 20 years is to watch & learn: who is making money, why, what are their incentives, who is happy and healthy and married, who spends time with their kids, who is always on a plane, who looks tired, who gets booted, who gets bored, what funding buys you, what it doesn’t, watch your own motivations, your impulses, where you’re broken, and don’t use the wrong tool to fix the wrong thing.”
- "In grad school I worked with lots of undergrads who thought they wanted to be professors. Then I'd send 'em to my advisor Dan, and he would unpack them in 10 seconds flat. 'I do this,' he would say, miming typing on a keyboard, 'And I do this,' he would add, gesturing to the student and himself. 'I write research papers and I talk to students. Would you like to do those things?' Most of those students would go, 'Oh, no I would not like to do those things.' The actual content of a professor's life had never occurred to them. If you could pop the tops of their skulls and see what they thought being a professor was like, you'd probably find some low-res cartoon version of themselves walking around campus in a tweed jacket going, 'I'm a professor, that's me! Professor here!' and everyone waving back to them going, 'Hi professor!'" — from: “[Face it: you're a crazy person](https://www.experimental-history.com/p/face-it-youre-a-crazy-person)”
- There is absolutely nothing, *nothing*, not to love on [this page](https://thick-coins.net/) that greets you with: Welcome to Theodore's Thick Coins. Scroll through, smile, then right-click and *View Source*, please. Then go stand in front of a mirror and tell yourself, with conviction in your heart and pride in your eyes: I shall do the same.
- The ever-wonderful Geoffrey Litt on “[better diff views for AI agents](https://x.com/geoffreylitt/status/1938239983464140920)” with Geoffrey-Litt-like thought-provoking ideas and ending with: “Historically most creative professionals haven't had very good version control tools -- but now with AI in the mix, the motivation to build them has dramatically increased. A side effect I'm optimistic for is that this will also yield better tools for collaborating among humans. Excited to see what diff views people start cooking up as we enter the era of agents...”
- [This post by Steven Sinfosky](https://hardcoresoftware.learningbyshipping.com/p/233-the-illusion-of-thinking-thoughts) made me sit up straight and go: that’s right, that’s it, that’s the problem — don’t anthropomorphize them! Since reading the post a few weeks back, I’ve come to think that it’s one of the big hurdles we as programmers have to overcome: we have to see them as *tools*, not as — I don’t know, *beings*? Don’t get me wrong, I love thinking about them as giant orbs from outer space, but when you think about them as human-like, near-AGI things you end up with the wrong expectations. It’s better to think of them as pipes than oracles.
- [VibeTunnel](https://vibetunnel.sh/) is slick and cool and has an amazing landingpage and I love following the authors on Twitter and see what they come up with. Fun times in Agentic Country. [Peter Steinberger wrote up how it came into existence](https://steipete.me/posts/2025/vibetunnel-turn-any-browser-into-your-mac-terminal).
- Such a lovely little page: [Atkinson Dithering](https://gazs.github.io/canvas-atkinson-dither/). Let’s build millions of pages like this, let’s cultivate millions of [minds like this](https://en.wikipedia.org/wiki/Bill_Atkinson).
- “[The less I understand about my own inner machinations](https://marginalrevolution.com/marginalrevolution/2025/06/more-from-youtuber-any-austin.html), the better because, number one, I’m going to get it wrong. You see this all the time with artists who learn what their thing is, and they just fly off a cliff.”
- “[The antidote is simple but demanding](https://jihad.house/notes/startup-slop/): deeply intentional work, sincere relationship‑building, and the conviction that nothing about the future is inevitable. Attention is a tool, not the goal. Care is the prerequisite. Speak to rally like‑minded people and give them something solid to build on.”
- Pretty sure I’ve shared links to a DOOM fire implementation before (here’s [one in Zig](https://github.com/const-void/DOOM-fire-zig)) — it’s a great benchmark for terminal emulators — but I’ve only recently discovered that there’s [a whole playground full of them](https://github.com/filipedeschamps/doom-fire-algorithm): implementations in Bash, in Go, in C++, in an HTML with a canvas, with GPU acceleration. Very neat.
- Somehow ended up discovering this collection of [Internet Artifacts](https://neal.fun/internet-artifacts) — a great horizontal scroll. I had completely forgotten about the [coffee webcam](https://neal.fun/internet-artifacts/xcoffee/).
- [Interview with Jon Gjengset on “Defending Democracies With Rust”](https://filtra.io/rust/interviews/helsing-jun-25): “The goal for me with spreading Rust was never spreading Rust. That's not the goal in and of itself. The goal for me is to have people use the language that is best fit for the purpose. For building systems that go onto a Eurofighter or building stuff that runs in a quadcopter or building stuff that goes into these underwater subs that have to run for months on end without service or interruption—you're not running Python there.” Sign of the times, eh?
- A very charming video: [How 1999 Quake 3 Teaches Elite Software Engineering](https://www.youtube.com/watch?v=NeLkxuzCssA).
- [This article about The Simpsons’ writers room](https://slate.com/culture/2025/06/the-simpsons-fox-episodes-marge-mr-burns-itchy-scratchy.html) made the the rounds in the [Amp](https://ampcode.com) team and earned a lot of *yes, yes, exactly, yes, exactly like this:* "'The more people put their fingers in it, there's less of a chance you come up with something that's very interesting and unique,' writer Jay Kogen says. 'The more homogenized things become, the less interesting they become.'"

---

---

# Joy & Curiosity #42

*Interesting & joyful things from the previous week*

By Thorsten Ball • June 8, 2025

---

One of the question that I’ve been throwing around in my head this week: when does it make sense to invest in meta-work? It’s a surprisingly tricky question.

Say work means working on your product: adding features, fixing bugs, talking to customers, marketing, and so on. Meta-work would be work to support the work: documenting how you add features or fix bugs, for example; or coming up with a system to prioritize bugs; migrating from a TODO text file to a ticketing system.

Meta-work does have value. It can make the effort you put into the non-meta work more efficient. Instead of working on the wrong thing and thus wasting time, the investment into prioritizing a list of bugs will hopefully lead to no one working on the wrong thing.

The tricky thing, though: when does it make sense to invest in meta-work?

Most engineers I know wouldn’t say “always” when asked like this, but in practice will tend to “always” because the lure of making something correct and efficient is so appealing.

But it doesn’t always make sense. When you have, for example, so much to do that it’s not even possible to build the wrong thing — in the early stages of a startup or a new product — investing into meta-work is wasteful, because by the time you’re done with your prioritization or labelling of tickets, the work itself has changed again.

The question is: when does that flip? When will investing into meta-work make the work more efficient? And how do you recognize that you’ve reached that point?

But, anyway, meta-work schmeta-work, here’s some important stuff: no newsletter next week — I’ll be in Spain, vacationing, *vacaciones*. It’ll just be me, my family, and the 600 pages of The Power Broker I still have left.

---

- The tide is shifting. Now here’s Thomas Ptacek, also known as tptacek, also known as tqbf, writing that [My AI Skeptic Friends Are All Nuts](https://fly.io/blog/youre-all-nuts/).
- Useful reminder: “It should be taken for given that of course it's really hard to switch your mindset from ‘debugging this thing is really important’ to ‘should I debug this thing at all’, while you're in the middle of debugging said thing. But you know, you just try your best, sometimes your brain refuses to let go, and other times, maybe [you get enough space](https://rjp.io/blog/2025-05-31-stepping-back) to decide going off for a beer is the better bet.” Admittedly, I have the opposite problem: I rarely get stuck in rabbit holes, but more often than I should tread water on the surface.
- [Why Bell Labs Worked](https://1517.substack.com/p/why-bell-labs-worked). There’s some good lines in there. Here, this one on Academia: “⁠People who can survive this system aren't necessarily the same as people who can do great work. Most of the great names of the past would be considered unemployable today;” Or this one, on management and supervision:  “After all, ‘what's stopping someone from just slacking off?’ Kelly would contend that's the wrong question to ask. The right question is, ‘Why would you expect information theory from someone who needs a babysitter?’” Or this one, on people with drive: “Bell Labs' pantheon was built on the backs of those who can't escape having dark nights of the soul. People who wake up in the middle of the night every night and ask ‘what am I doing with my life? I've accomplished nothing worthwhile.’”
- There’s so much interesting stuff in here: “[tbsp](https://tangled.sh/@oppi.li/tbsp) is an awk-like language that operates on tree-sitter syntax trees.” The tool itself, of course, but the code is also [neat and readable](https://tangled.sh/@oppi.li/tbsp/blob/main/src/main.rs), there’s [examples](https://tangled.sh/@oppi.li/tbsp/tree/main/examples/code-overview), which are always great, but my favorite part is the README that has very little formatting but is mainly just a guide on how to use the tool.
- Another tool based on tree-sitter that made me lean forward: [srgn](https://github.com/alexpovel/srgn), a “grep-like tool which understands source code syntax and allows for manipulation in addition to search.” Reminds me of [Comby](https://comby.dev/), but it’s different. Look at [this example](https://github.com/alexpovel/srgn?tab=readme-ov-file#multiple-scopes): you can find the string “age” only inside the scope of a Python class.
- This post on [implementing a Forth](https://ratfactor.com/forth/implementing) (side-note: before my personal Summer of Lisp in 2016, I had a Spring of Forth and went through the [two Leo Brodie books on Forth](https://www.forth.com/forth-books/) — highly recommended activity for spring or, heck, even summer; live a little) brought me to [PlanckForth](https://github.com/nineties/planckforth), a project that “aims to bootstrap a Forth interpreter from hand-written tiny (1KB) ELF binary.” The README then continues with the two sentences that make all of us go *hell yeah*: “This is just for fun. No practical use.” But then, if you scroll down, you can actually find a [colored, annotated dump of said hand-written ELF binary](https://github.com/nineties/planckforth?tab=readme-ov-file#binary-layout). Hell yeah.
- Talking about colors: [scroll through this](https://dotfiles.substack.com/p/40-pavle-dzakula). Me, personally, I couldn’t live like this. But I respect it.
- Dwarkesh Patel explained why [he doesn’t think AGI is around the corner](https://www.dwarkesh.com/p/timelines-june-2025). Worth reading to understand how he thinks about AI timelines (“we’re underestimating the difficulty of solving the much gnarlier problem of computer use, where you’re operating in a totally different modality with much less data”), but also because it contains some very interesting thoughts around AI and learning in general. I loved this paragraph: “How do you teach a kid to play a saxophone? You have her try to blow into one, listen to how it sounds, and adjust. ⁠⁠Now imagine teaching saxophone this way instead: A student takes one attempt. The moment they make a mistake, you send them away and write detailed instructions about what went wrong. The next student reads your notes and tries to play Charlie Parker cold. When they fail, you refine the instructions for the next student.”
- After last week’s newsletter, to my big surprise, three different people reached out to me and asked how I find the time to read so much. It surprised me because, well, that issue only had, what, ten links to articles in it and ten articles in a week isn’t that much. I’m working a lot right now and don’t even read that much, but still, I replied, I try to constantly read: in the morning, in the evening, in the bathroom. A friend then said he lost the habit and now often reads the news. “The news?!”, I said, “Are you crazy?” And then I sent him a link to Aaron Swartz’s post on the news, [I Hate the News](http://www.aaronsw.com/weblog/hatethenews).
- I’ve heard about Section 174 and knew roughly what was going on, but if you had asked me to explain it to you, I couldn’t have. This article changed that: [the hidden time bomb in the tax code that's fueling mass tech layoffs](https://qz.com/tech-layoffs-tax-code-trump-section-174-microsoft-meta-1851783502).
- Absolute incredible “wait what” feeling when I read [this paragraph](https://openpipe.ai/blog/art-e-mail-agent): “To train a model and evaluate its performance, we needed a realistic dataset of answerable email queries. Luckily for us, when notorious energy trader Enron was sued for massive accounting fraud in 2001, 500K of their emails were made public in the litigation (pro tip: if you're engaging in massive accounting fraud, maybe don't save all your emails).” (If you haven’t, listen to [the Acquired episode on Enron](https://www.acquired.fm/episodes/enron).)
- Everybody should write more blog posts like this one: [Too Many Open Files](https://mattrighetti.com/2025/06/04/too-many-files-open). Yes, everybody, including you. And yes, there weren’t a lot of things I didn’t know in that post, but I’m glad I read another person’s explanation of file descriptions, saw how they approach debugging it, had a “hmm, nice” moment when reading through the script, and I bet the author of that post learned a ton.
- Every time I come across [this Žižek video](https://tumblr.austinkleon.com/post/785531126119841792) I have to rewatch it. I don’t have to tell you that I very much believe in what follows after the colon at the end of this sentence, because I know you know I do, but for future generations: the same thing happens in software.

---

---

# Joy & Curiosity #41

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 31, 2025

---

This week I tried out [Jujutsu](https://jj-vcs.github.io/jj/latest/), jj for short, a new version control system.

I’ve never used anything but git (and I [wrote extensively about how I use git](https://registerspill.thorstenball.com/p/how-i-use-git)) and I  don’t particularly care about version control systems, but I’ve heard of jj, knew that [Mitchell said it’s “fantastic”](https://x.com/mitchellh/status/1845869748841832667) and then, last week, Felix [called me out](https://bsky.app/profile/felixge.de/post/3lpz2r4h3hk2d) for not having tried out, after [he had his brain rewired](https://bsky.app/profile/felixge.de/post/3losmphsiqk2p) by jj.

Here we are then, after one week of trying out jj. Now, I don’t think I can do it justice and give a proper, smart-sounding review yet, but some of you have asked, so here’s some first impressions:

- Wow, am I used to thinking in commits in branches, wow.
- It feels like flying blind when suddenly your shell prompt does not make sense anymore, because you’re no longer in git land.
- `jj split `is *very* nice. Think: git add -p, but in a nice way.
- Once I had gotten used to it, the `jj log `lead to multiple “ahh, that’s beautiful” moments.
- It’s very neat how you can refer to changes with the most significant prefix.
- The [tug](https://github.com/mrnugget/dotfiles/blob/0a943f0e8b9907f7f6712ac11156a00d4634a3e5/jj_config.toml#L8-L9) alias seems like it should be built-in.
- Claude is very good at getting you out of jj problems. But: jj also seems to change a lot. LLMs have suggested quite a few outdated/wrong commands.
- This [Chris Krycho post](https://v5.chriskrycho.com/essays/jj-init/) and [Steve Klabnik’s Jujutsi tutorial](https://steveklabnik.github.io/jujutsu-tutorial/introduction/introduction.html) have been the best intro resources I’ve found so far.
- It’s very good that you can just use it next to git. Impressive engineering decision.
- A few things that are very easy for me in git land seem a bit harder: squashing 10 commits into one by doing an interactive rebase, doing a git pull rebase and then pushing. You can do it with jj, but it just seems like you’re going against the grain.
- Other things seem a lot easier though: editing a previous commit, splitting up a change, referring to other changes, making sense of the log (jj log is very nice, as I said), squashing changes into each other, abandoning work.

I’ll stay with it, I’m enjoying it. Now all we need is a way to mispronounce it, like how some people say “jit” instead of git. I propose: yay-yay. 

---

- This is a fantastic post: [What Works (and Doesn't) Selling Formal Methods](https://www.galois.com/articles/what-works-and-doesnt-selling-formal-methods). One way to describe what’s in the post: the mental journey of becoming a senior engineer. “But often the companies or people who build and maintain these systems genuinely don’t care much, either because they’ve priced in the bugs or because their system is designed to be robust in the presence of bugs.” If you read this sentence without thinking it’s cynical, I’d argue you have some real-world experience.
- Everything about this is so good: [Antinote](https://antinote.io/). The many small videos on the landing page that show all those unique features, the unique features (paste a screenshot and get OCR’d text!, start a timer in a text editor!, AutoPaste — what!), the comparisons to other note-taking applications, the so easy to parse [User Manual](https://antinote.io/user-manual?utm_source=web), the icons that all have this weird little dot in them — lovely stuff. I downloaded it, bound it to a hotkey and hope that I’m going to use it a lot.
- You know that feeling when you unexpectedly remember something that you once knew, knew intimately, something you cherished, something you thought of as beautiful, and your knowledge of the beautiful thing being restored makes you feel as if the scales of the universe have been tipped, just ever so slightly, towards more balance? Exactly. That’s how I felt when I rediscovered [pointerpointer.com](https://pointerpointer.com/) this week.
- “The obvious answer, of course, is that you might have no choice: that given what’s coming, anyone who wants to keep food on the table must give up their dreams of aliveness, and buckle down to placating the machines instead. I have two things to say about that, the first of which is that I don’t believe it: that [aliveness is](https://ckarchive.com/b/zlughnhk8772ma7qrr9qehwzgng00f6)*[so](https://ckarchive.com/b/zlughnhk8772ma7qrr9qehwzgng00f6)*[central to meaningful human experience](https://ckarchive.com/b/zlughnhk8772ma7qrr9qehwzgng00f6) that there’ll always be a market for those who can cultivate it, embed it in what they create, foster it in institutions and organisations, and bring people together to experience it.”
- “I had doubts about becoming a mother when I was younger. Mostly related to systemic gender inequality, believing I would need to sacrifice my whole career for it, and thinking myself incapable of bearing the responsibility (which, to be fair, I was before age ~28). I spent a solid year in angst and turmoil trying to figure it out. […] Being on the other side, I now realise there was no calculation or algorithm or pro/con list or financial spreadsheet that could have helped me understand what it would feel like.” That’s Maggie Appleton [writing about becoming a mother](https://maggieappleton.com/now-2025-05/). I can’t think of anything else in life where the difference between what you think it will be like and what it then turns out to be is as big as when having kids. Even this last sentence doesn’t make sense until you experience it.
- [Lovely](https://cybercultural.com/p/web-design-1997/): “With the rise of Flash and CSS in 1997, three web design philosophies emerged. David Siegel advocated for 'hacks', Jakob Nielsen kept it simple, while Jeffrey Zeldman combined flair with usability.” So many memories: homepages that had an Enter button you had to click, comments in the source code specifically for the View Source tourists, adding a “nothing to see here” comment at the top of the HTML along with roughly 500 newlines to trick the same tourists into thinking there’s actually nothing to see there, angry messages that this site is only optimized for the author’s favorite browser, [csszengarden](https://csszengarden.com/), tables to do layouts, Flash.
- “[This shift](https://www.nytimes.com/2025/05/25/business/amazon-ai-coders.html)from writing to reading code can make engineers feel as if they are bystanders in their own jobs. The Amazon engineers said that managers have encouraged them to use A.I. to help write one-page memos proposing a solution to a software problem and that the artificial intelligence can now generate a rough draft from scattered thoughts.” Big Problem. I wonder what the solution will look like.
- From the [Claude 4 prompt engineering guide](https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/claude-4-best-practices): it’s less effective to write “NEVER use ellipses” than “Your response will be read aloud by a text-to-speech engine, so never use ellipses since the text-to-speech engine will not know how to pronounce them.”
- Simon Willison [dissected the Claude 4 system prompt](https://simonwillison.net/2025/May/25/claude-4-system-prompt/) that’s used in the Claude app and on [claude.ai](https://claude.ai/). No big surprises, but the level of care and word-smithing (maybe I’m projecting) is still astonishing.
- Speaking of Claude: [I learned](https://creatoreconomy.so/p/claude-4-and-10-takeaways-from-anthropic-first-ai-conference?hide_intro_popup=true) that [Amanda Askell](https://x.com/AmandaAskell), a “philospher & ethicist”, designs Claude’s personality. “We want Claude to be like the best person who has ever existed. For any given instance — from teaching physics to a 12-year-old to comforting someone having a hard day.”
- “[What is breaking my brain a little bit](https://steveklabnik.com/writing/i-am-disappointed-in-the-ai-discourse/) is that all of the discussion online around AI is so incredibly polarized. This isn’t a “the middle is always right” sort of thing either, to be clear. It’s more that both the pro-AI and anti-AI sides are loudly proclaiming things that are pretty trivially verifiable as not true.”
- “[Screentendo](https://github.com/AaronRandall/Screentendo) is a desktop application that allows you to to turn a selection of your screen into a playable level of Super Mario Bros.”
- Two challenges for you. Challenge #1: [read through this](https://github.com/words/cuss/blob/main/index.js) without laughing out loud. Challenge #2: imagine being the person in charge of putting the ratings in, of giving “crabs” a 0 and “crack” a 1 and “crapola” a 2.
- Pretty sure I first read it when [this blog post](https://web.archive.org/web/20250121073718/https://rachelbythebay.com/w/2013/06/05/duck/) was published, in 2013, but I’m certain not a year has gone by since in which I didn’t use the story of the duck. "Supposedly, the PM saw this and said 'it's great... just remove the duck'. So, the artist went in and removed the duck (which had been carefully placed to make that easy), and that was that. The sacrificial duck kept the meddling manager away from the stuff that was important."
- This made me wish I could take a sabbatical and just read for a year. It’s a “[tower of books and articles](https://www.essayful.co/p/1-the-bibliography-of-a-writing-life-42b) (1,703 books, 2,667 articles, and counting) has been under construction for a little under a decade. It began during my time studying English at Trinity College Dublin, continued during my time researching New Media at the University of Amsterdam, and has devoured my time ever since.”
- Researchers built [a self-improving agent](https://arxiv.org/pdf/2505.22954): “we propose the [DGM], a novel self-improving system that iteratively modifies its own code (thereby also improving its ability to modify its own codebase) and empirically validates each change using coding benchmarks. In this paper, the DGM aims to optimize the design of coding agents, powered by frozen foundation models, which enable the ability to read, write, and execute code via tool use. Inspired by biological evolution and open-endedness research, the DGM maintains an archive of generated coding agents.” What does DGM stand for? Darwin Gödel Machine. One hell of a name.
- “From the outside, it may be hard to understand why creating a software-defined vehicle is still hard in 2025. These legacy companies have poached big hitters from Apple, Tesla and Google. They’ve sunk billions into it. They have decades of experience with software-controlled modules. From the clouds, it all seems doable. [Yet on the ground, it’s a nightmare.](https://insideevs.com/features/759153/car-companies-software-companies/) Automakers are not redesigning software. They are reworking how their entire organizations approach software.”
- [Published in 2014](https://queue.acm.org/detail.cfm?id=2685692): “Software lifts physical limitations on the speed with which services can be created and changed. Delivery channels such as mobile devices and widespread Wi-Fi technology eliminate physical delivery borders that had to be overcome in the past. The consequence of the new reality of a software-driven enterprise is that CEOs have to deeply understand software (and the hackers who create it) and how to incorporate it into their business model in order to run successful organizations.” But if you now think of car companies only, I tricked you, because this is very, very 2025, for all companies, especially software companies: “On the operational side, instead of talking about code, companies should follow the ‘hacker way’ and focus on writing code using continuous improvement and iteration, leveraging the best developers they can afford.”
- Alexis King, in [her first blog post in four years](https://lexi-lambda.github.io/blog/2025/05/29/a-break-from-programming-languages/), titled “A break from programming languages”: “I like writing software. It is strange how radical a statement that sometimes feels. So many programmers seem to practically despise what they do for a living, at least as you’d hear them describe it. I have never really been able to empathize with that mindset. I find programming fun, and I derive a unique joy from writing code that decisively solves the problem at hand. It doesn’t have to be a particularly interesting problem, and the solution doesn’t even have to require much more than snapping blocks together, but as long as I can take some pride and satisfaction in the craftsmanship and end result, I am usually pretty happy.” And then this: “It is a little amusing to think that what I find myself most drawn to after a decade of pursuing ever more exotic projects is something entirely mundane: I want to write utterly ordinary software. I want to work on a piece of software used by people to accomplish a task, and I want to take pride and satisfaction in doing it well.” Software — what a thing, right?

---

---

# Joy & Curiosity #40

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 24, 2025

---

This week a very experienced engineer reached out and asked me: “What’s the play? You seem to have it figured out. There’s so much going on. What do I do? What do *you* do? Aren’t you scared?” 

These are wild times. “Software and tech,” I wrote to a friend in the week before, “as it was, say, from 2008 to 2022 — that’s over.”

But, somehow, even though the pace is unlike anything I’ve experienced before, it doesn’t feel that different to me.

My friend wondered whether “there’s a correlation here: self-taught engineers like us have it much much easier adapting to this wave. I think because we… never really rested easy.”

It made me realize that, yes, ever since I decided — back in 2011, after dropping out of college — to become a professional software developer, I have not once felt that I could pause, that I had learned enough, that I could ignore this new thing and be fine — there was always something else to learn, something I had to know just to catch up with everyone else.

So, no, I don’t have it figured out, just like I never have. But trying to learn, to understand, to improve — that hasn’t failed me yet.

---

- Last week we made [Amp](https://ampcode.com) available to everyone and, as a more practical companion to our lovely [owner’s manual](https://ampcode.com/manual), I [wrote about how I use Amp](https://ampcode.com/how-i-use-amp). If you ever wondered how I use agents when programming: a lot of it is in this post.
- Ian Lance Taylor, one of the co-creators of Go, [left Google](https://www.airs.com/blog/archives/670). “But Google has changed, and Go has changed, and the overall computer programming environment has changed. It’s become clear over the last year or so that I am no longer a good fit for the Go project at Google. I have to move on.” I’m not sure if the data will back me up on this, but it *seems* as if a lot of great engineers are leaving Google lately — wild times, indeed.
- [This Andrej Karpathy tweet](https://x.com/karpathy/status/1921368644069765486) about prompts has been stuck in my mind for two weeks now: “a lot of human learning feels more like a change in system prompt. You encounter a problem, figure something out, then ‘remember’ something in fairly explicit terms for the next time. E.g. ‘It seems when I encounter this and that kind of a problem, I should try this and that kind of an approach/solution’. It feels more like taking notes for yourself, i.e. something like the ‘Memory’ feature but not to store per-user random facts, but general/global problem solving knowledge and strategies. LLMs are quite literally like the guy in Memento, except we haven't given them their scratchpad yet.”
- Two more thoughts on prompting that I’ve shared multiple times now. [Ethan Mollick](https://bsky.app/profile/emollick.bsky.social/post/3lp5afidgvc2a): “Many of the most important ‘prompt engineering’ skills are just management skills: clearly understanding the task to be done and what information is needed to do it; explaining the task to the AI; giving useful feedback to improve outputs; & generalizing lessons learned into a process.” And [Maria Antoniak adding](https://bsky.app/profile/mariaa.bsky.social/post/3lp5nwvte4s26): “My most common prompt critique is ‘this doesn’t make sense.’ Sometimes people write instructions that are impossible to follow and then report that the model can’t do a task. Not really news to anyone, but liberal arts (writing, philosophy, logic, critique) training is good for this kind of thing.” Prompting is hard because *communication *is hard and I think that’s why a lot of engineers struggle with it: it’s very hard to put into words what you want.
- Okay, [one more thought on prompting](https://x.com/nearcyan/status/1922601356637970609): “You can’t expect a human to figure out what you want if it has complete amnesia every time it does a single action”
- Someone in the comments to Karpathy’s tweet linked to [this paper](https://arxiv.org/pdf/2309.16797) on “Promptbreeder”, a system that enables “self-referential self-improvement via prompt evolution”. Wild stuff: “Driven by an LLM, Promptbreeder mutates a population of task-prompts, evaluates them for fitness on a training set, and repeats this process over multiple generations to evolve task-prompts”
- Max Bernstein, whose [blog](https://bernsteinbear.com/blog/) has a lot of gems, wrote another two great posts. [This one](https://bernsteinbear.com/blog/pl-writing/) contains links to pieces of writing — blog posts, comments, code — that changed how Max thinks about PL and is a treasure. And then [this one here](https://bernsteinbear.com/blog/simple-search/), about building a search engine from scratch using word2vec, made me want to — you guessed it — build a search engine from scratch.
- Would you look at that: [another great Max Bernstein blog post](https://railsatscale.com/2025-05-14-merge-zjit/). This one is about ZJIT, “a new just-in-time (JIT) Ruby compiler built into the reference Ruby implementation, YARV, by the same compiler group that brought you YJIT”. I really, really appreciate the clear explanation of the different IRs in play here.
- I’ve been vaguely aware of the Odin programming language for at least a year but haven’t taken a closer look. Then along comes [this blog post](https://zylinski.se/posts/a-programming-language-for-me/), saying it’s a “programming language made for me”, and now I’m very interested — the soa keyword in particular seems very, very interesting.
- Michael Stapelberg [wrote about his “2025 high-end Linux PC”](https://michael.stapelberg.ch/posts/2025-05-15-my-2025-high-end-linux-pc/) — man, do I love reading posts like this. I’m not even into hardware or custom computer builds, but it reminds me of putting together computers when I was a teenager and knowing that out there in the world there’s a dude spending that much time setting up his computer, putting so much care and effort into it, and then writing about it *like this *— that makes my day.
- Talking about dudes out there in the world doing stuff I’d never do: “with [the following code](https://hueffner.de/falk/blog/a-leap-year-check-in-three-instructions.html), we can check whether a year 0 ≤ *y* ≤ 102499 is a leap year with only about 3 CPU instructions”. Now that’s some programming.
- Justin Jackson [is asking whether YouTube will kill the podcasting industry](https://justinjackson.ca/youtube-kill-podcasting) and while I agree with a lot of sentiments in that post, I was also surprised by how different my experience with podcasts is, or how different of a listener of podcasts I am. For example: I often "listen" to podcasts on YouTube, because I have YouTube Premium (which allows me to listen to a video on my phone, without having the app open) and it's very easy for me to click on a link while at my computer, watch a bit of the video, then go for a walk, open the YouTube app, and, there it is — my last watched video. Play, listen, don't finish, get back to computer and finish there. It’s so convenient that I haven’t even thought about it until I came across this post. Certainly a lot more convenient than anything in the Spotify UI. Or keeping track of RSS feeds.
- [This discussion](https://lobste.rs/s/gkpmli/if_ai_is_so_good_at_coding_where_are_open)was wild and certainly in the Curiosity and not the Joy column. But it did lead me to [aider’s release history](https://aider.chat/HISTORY.html) which starts by saying “Aider writes most of its own code, usually about 70-80% of the new code in each release” and then shows “percent of new code written by aider, by release”.
- Lovely: “[In 1986, Sony dropped the SMC-210, their first portable PC in the US](https://bsky.app/profile/obsoletesony.com/post/3lovevm2p222q)”
- For many years now I’ve wondered: how do people with long nails type on their laptops? Admittedly, it wasn’t a question that burned so strong in my mind as to make me go and find its answer, but still, it was a very sweet “huh, now I know” that washed over me when a colleague shared on our work Slack a link to [tippytype](https://www.tippytype.co/).
- John Siracusa wrote two posts on Apple. The first one is called [Apple Turnover](https://hypercritical.co/2025/05/09/apple-turnover) and ends with this: “It’s time for new leadership at Apple. The road we’re on now does not lead anywhere good for Apple or its customers. It’s springtime, and I’m choosing to believe in new life. I swear it’s not too late.” The second post,[Apple Turnaround](https://hypercritical.co/2025/05/20/apple-turnaround), then describes “the things I think Apple should do, but that its current leadership seems unwilling to budge on”. That’s John Siracusa writing this. John Siracusa!
- Sean Goedecke with some *very* “[practical AI techniques for daily engineering work](https://www.seangoedecke.com/practical-ai-techniques/)”. I love the “Throwaway debugging scripts” technique. Using LLMs to generate scripts that I would’ve *never* written myself led me to wonder: how much of programming is about reducing the need to write more code in the future and how much of that is no longer necessary when you can now generate code a lot faster?
- More practical advice from Sean Goedecke, but [this one](https://www.seangoedecke.com/in-these-troubled-times/) is… different: “The good times in tech are over, at least for now. It’s not just a tough job market, but a tough environment for already-employed software engineers.”
- If you read [my post on how to build an agent](https://ampcode.com/how-to-build-an-agent) in around 300 lines of Go and thought “that’s around 291 lines too much”, I have some good news: [this post](https://sketch.dev/blog/agent-loop) by Philip Zeyliger shows what an agent is in 9 lines of pseudo code.
- Don’t ask me why because I don’t know, but I ended up reading a lot about [Navy SEAL Team Six](https://en.m.wikipedia.org/wiki/SEAL_Team_Six) in the past two weeks and if the two of us should ever meet and go out for a drink I will talk your ears off with my very superficial knowledge of Navy SEAL Team Six, but here I want to share just one very interesting bit from that Wikipedia article: “According to Marcinko's book Rogue Warrior, SEAL Team Six members were chosen if they had initial struggles qualifying in aspects of training, but subsequently qualified, as the determination of these candidates was seen as more valuable than a candidate that breezed through his training.”

---

---

# Joy & Curiosity #39

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 11, 2025

---

122 hours in San Francisco. 122 inspiring, blue sky, light jacket in the morning, SaaS billboards everywhere, in the office at 6:30am, full of software hours; hours that felt like the future of programming; hours that found their end yesterday, after an additional 11 of them and 10 minutes on a plane.

The list of interesting & joyful things below is a short one this time, since the majority of interesting & joyful things last week showed up in conversations with many wonderful people and only one of those conversations I will be able to link to.

To make up for it, here are some of the minutes and seconds of the 122 hours in San Francisco:

- At the very first place we sat down after arriving in San Francisco, I look up and say, “wait, isn’t that [Jarred Sumner](https://x.com/jarredsumner) from Bun?” I send Jarred a message — “Did I just see you at the Ferry Building in SF?” — and get back a “yes”. “That’s SF for you,” says my friend.
- On Thursday we had lunch at the Google office in SF and I couldn’t stop thinking that it’s exactly how I imagined it to be. Electric scooters to get around *inside*, a dessert station at which you can get cookies & marshmallows (“I need to have a Google cookie, come on, I just have to”), the Android keyboard to sign-in with your full legal name, someone putting two extra lunches in to-go boxes, everything and everyone looking like a TV commercial, an amazing view, and so many people.
- We recorded a podcast with a professional setup and, wow, [lighting](https://x.com/thorstenball/status/1920858514085323118) is incredible.
- “My parents gifted me your books when I was 18”
- Coffee with Mary, coffee with Wilhelm, coffee with Ellie, coffee with Indigo — conversations about software, the future of software, and old things no one cares about anymore. “It’s so nice to talk about this. It feels like a big puzzle and everyone I talk to has a different piece in their head.”
- Walked to the AI builders meetup at PlanetScale office and, standing at a traffic light, talked about GitHub and its acquisition by Microsoft, and stock options and all that, and a guy next to us turns and goes: “You guys work for Sourcegraph? Here’s some swag.” Software is everywhere in SF.
- “So many SaaS billboards”
- Mind the selection bias, but multiple people I had coffee with told me that, after a decade of intense love, they no longer care about which editor they use — “the agent writes most of the code.”
- Checked off another fast food box: Chipotle. Intense & very good.
- They have [Peanut Butter Pretzels](https://www.costco.com/kirkland-signature-peanut-butter-filled-pretzel-nuggets%2C-55-oz.product.100393423.html) in the US. An incredible — and joyful — surprise in times of unprecedented globalism — how has something that should’ve earned its inventor a monument or ten stayed hidden from me for so long?
- Imagine you walk into your dentist’s waiting room and it now has a fridge, and fruit, and peanuts and pretzels — the picture you have in mind is Air China lounge at SFO.

---

- "You're not understanding, are you? The brain does the thinking. The meat." "Thinking meat! You're asking me to believe in thinking meat!" "[Yes, thinking meat](https://www.mit.edu/people/dpolicar/writing/prose/text/thinkingMeat.html)! Conscious meat! Loving meat. Dreaming meat. The meat is the whole deal! Are you getting the picture?"
- Beautiful: “I figured I better fess up and tell Steve Jobs what I’d done, [so I sent him an email](https://blog.hayman.net/2025/05/06/from-steve-jobs-great-idea.html)”
- “But I don't want more suggestions! I don't need more code thrown at me. I want a small number of high-value episodes of assistance as if a professional developer was sitting beside me.” — [Where are the proactive AI coding tools?](https://austinhenley.com/blog/proactiveai.html)
- [Nobody Codes Here Anymore](https://ghiculescu.substack.com/p/nobody-codes-here-anymore): “I asked our CFO and he said he’d be happy to spend $100/dev/month on agents. To get 20% more productive that’s a bargain.” A friend wrote to me that they’re going to spend $200/month to get better at using agents. If someone had told me they’re going to try a dev tool for $200/month two years ago, my reaction certainly would’ve been different from the one it is today. Times are changing. (To spell out the obvious: use [ampcode.com](http://ampcode.com) and join the Discord and I’m happy to talk to you about how to get a lot out of it.)
- Conrad is thinking about whether “[to garbage collect or not?](https://cirw.in/blog/garbage-collection)” and briefly touches on something that I’ve been wondering about: what languages will LLMs be good at? All of them, or is there something fundamental that stops them from being good at, say, Rust & its borrow checker?
- [Talking about Rust](https://vincents.dev/blog/rust-dependencies-scare-me/?): “In an attempt to build resilient software I decided to vendor my packages, a cargo feature that downloads all my dependencies so I can host them locally. Out of curiosity I ran toeki a tool for counting lines of code, and found a staggering 3.6 million lines of rust. Removing the vendored packages reduces this to 11136 lines of rust. Now I understand that webservers are complex, and a full asyncronous runtime is even more complex. However the entire linux kernel is 27.8 million lines […]”
- I think this is a great suggestion, but you need to read the post, not just the headline, friends: [write the most clever code you can write](https://buttondown.com/hillelwayne/archive/write-the-most-clever-code-you-possibly-can/).
- “Often, your best opportunity to do this will come when you see the candidate do something interesting. ‘How curious!’ you’ll think to yourself, ‘Why did they do it that way?’ But here’s the important part: I need you to [not say those words out loud](https://mandymusings.com/posts/more-signal-from-coding-interviews).” Gave me cold sweat flashbacks of an interview in which someone kept asking me “why?”
- Ted Unangst on [branchless development](https://flak.tedunangst.com/post/branchless-development): “The solution is to bring all the code together as early and often as possible. The error bound for our estimate of the combined effect of two changes is proportional to the magnitude of each change. A series of small changes means our baseline is constantly readjusting, leading to fewer surprises. It certainly sounds like forcing everyone to play in the same sandbox will slow things down. And it does. But it also speeds things up.“ This is something I’ve come to strongly believe in over the years. If you need to have branches, keep them as small as possible. Merge constantly, effectively turning it branchless. It’s very weird to explain to someone who’s never done this, but if someone said to me “no branch should live longer than a day” I would say that’s exactly right.

---

---

# There's Beauty in AI

*From skepticism and dread to fascination and amazement*

By Thorsten Ball • May 6, 2025

---

For two years I fought with AI. For two years I thought of it as something that, whether I liked it or not, I would have to use if I wanted to keep up. I thought of it as this thing that was all the way over there and everything I love about programming was over here. For two years AI didn’t make me smile, didn’t keep my thoughts running while I lay in bed, didn’t make me want to share stories over beers.

Of course, like everyone else present at the Big Bang, I clapped and was excited and tried everything I could think of — from translating phrases to generating poems, to generating code, to asking these LLMs things I would never ask a living being.

The world is changing, this is big, I told myself, keep up. I watched the Karpathy videos, typed myself through Python notebooks, attempted to read a few papers, downloaded resources that promised to teach me linear algebra, watched 3blue1brown videos at the gym.

But it felt like doing homework on a sunny Friday afternoon.

I couldn’t find a sense of fascination to pull me along. These LLMs are slot machines, I thought. You write your prompt, hit submit, and sometimes you win; sometimes you lose. I tried to get better at it, but turned my nose up at the term prompt engineering. Why worry about how you pull the lever of the slot machine? Why put effort in if it comes down to luck anyway?

Programming has always been a source of inspiring stories and mysteries to me. Full of heroes and black boxes, riddles and puzzles, and unbelievable feats of ingenuity that made me get up early, eager to learn more, because I knew the mysteries were all solvable, that the magic isn’t magic but only magical, and that the stories can be replicated if you just put in the effort.

LLMs, on the other hand, had none of that. They’re unknowable oracles and they for sure don’t listen to me.

Then, throughout the last six months, I changed my view on LLMs completely.

The first thing that happened: I tried Cursor Tab. We were working on Edit Predictions at Zed and I wanted to figure out what the current state of the art is. Until then, I had only tried Copilot-style completions. But Cursor’s Tab offered something different. Not only did it suggest how to complete the text next to your cursor, but it also suggested where your cursor could go next and what you could do there.

I would delete a field in a struct definition and it would suggest “hey, delete it down here too, in the constructor?” and I’d hit tab and it would go “now delete this setter down here too”, tab, “… and this getter”, tab, “… and it’s also mentioned here in this formatting function”, tab. Tab, tab, tab.

Now don’t think of me as smug, I’m only trying to give you a frame of reference here, but: I’m pretty good at Vim. I’ve been using it seriously for 15 years and can type 130 words per minute even on a bad day. I’ve pulled off some impressive stunts with Vim macros. But here I sat, watching an LLM predict where my cursor should go and what I should do there next, and couldn’t help but admit to myself that this is faster than I could ever be.

When I delete a debug statement, the model suggests to delete the other five debug statements, one by one, faster than I can spot them. When I add a log statement to a branch of a switch statement, it suggests log statements for the other branches, faster than I can come up with keystrokes to create a repeatable macro. When I add a suffix to one of many strings, it suggests adding it to them all — no Vim backflip with `vGnorm$F"i<suffix>` necessary.

This, it struck me, this is not… playing the slot machine, is it? This is not me asking the oracle about what code I should write, it’s not me kneeling in front of the AI, hands folded, waiting for it to suggest the implementation of a function and getting frustrated when it gets it wrong again. No, this is using an LLM to take away the toil and chores of programming for me. This is more in the realm of mechanical helpers than oracles. And it’s *fast* and, actually, surprisingly precise and, hey, even if it sometimes doesn’t get it right? So what, I didn’t even wait for it.

Then we fine-tuned an LLM at Zed.

I had heard of fine-tuning, of course, but my assumption had been that fine-tuning is reserved for people who have ML in their job title, people who know linear algebra, people who don’t type 17*2 into a calculator.

Turns out that’s not necessarily true. You don’t need someone else to call you a scientist to fine-tune an LLM. If you’re able to create, say, a hundred text files, read four to five blog posts, and click through a Python notebook, you can already get some results.

But the bigger and more impactful surprise was how much fine-tuning changed my perception of LLMs. More than the previous two years of repeated attempts to better understand them did.

When you fine-tune a model and build up your data collection to tune it with, you start to get a real feeling for how the data can nudge a model into different directions. You start to say things like “if we remove these fifty examples here, and instead add more of these other ones, then it will probably more often …”

The slot machine becomes translucent. You begin to see its wiring and, hey, actually, this isn’t a slot machine at all. It’s more like an elaborate marble run into which you throw a marble — your prompt, the thing you want it to complete — and sometimes it goes over here and picks up stuff on the way and sometimes it goes over there. You develop an intuition for why sometimes it does this and sometimes it does that, because you see the data that goes into making the marble run and how the data moves its tracks, and turns, and drops. With your mouth open in fascination you begin to sense how much data is required to build such a model from scratch, and you start to theorize on how the data must have differed to make this model do that and this model do that.

To switch and mix metaphors again: you start to get a feel for the grain of the model, for what it “wants” to do and what it really doesn’t want to do, no matter how much fine-tuning you attempt. You begin to see where fine-tuning ends and coarse-tuning would need to start.

Fine-tuning showed me that effort, and care, and patience *are* rewarded. It’s not a slot machine and it’s not a coin toss when you ask it to complete something.

With a big feeling of Huh and scratching my head, I went back and started to go through it all again: Karpathy, 3blue1brown, everything I could find on the transformer architecture, about how attention works, how these big labs train their models. This time around I had concrete questions I wanted answers to. I could connect what I learned to practice. Learning felt *useful*, giving me things I could try and see, and it stopped feeling like studying for a test I wouldn’t pass anyway if I didn’t know the secret answers.

At the same time, intrigued by these models now, I started to look around for more people that I could follow, people who were interested in AI but didn’t have a dream to sell. I started following [near](https://x.com/nearcyan), who was talking about Claude like a life companion. near used Claude in every possible situation: to research, to program, to weigh life options, to crack jokes. I found it all very confusing at first, but fascinating a few weeks later. How could someone so smart see so much I haven’t been able to see? What was I missing?

I also followed [Pliny the Liberator](https://x.com/elder_plinius) and while looking at the strange ASCII art and spell-like phrases in pliny’s jailbreaks I couldn’t help but think of hacking and phreaking in the 80s and 90s — something I was too young to participate in.

In Munich I spoke at a meetup that was held in the rooms of the university’s AI group. While talking to some of the young programmers there I came to realize: they couldn’t give less of a shit about the things I had been concerned about. Was this code written with Pure Vim, was it written with Pure Emacs, does it not contain Artificial Intelligence Sweetener? They don’t care. They’ve grown up as programmers with AI already available to them. Of course they use it, why wouldn’t they? Next question. Concerns about “is this still the same programming that I fell in love with?” seemed so silly that I didn’t even dare to say them out loud.

Now, when I sit down to program with the help of AI, I no longer think of slot machines.

I no longer think of myself as placing an offering in front of the oracle’s shrine, hoping that this time it will give me the answers that I seek.

Instead, I smile.

I smile because now, in my toolbox, next to my editor and my terminal and the Internet, I now have these models, these giant orbs made out of oceans of human knowledge, laboriously distilled into unimaginable large rows and columns of numbers.

When I write a prompt it’s no longer a coin being tossed I have in mind. Instead, the words I wrote are being tossed into a giant orb, and in there they will get turned into numbers, just like everything else in the orb, and my words turned numbers will get multiplied, and multiplied, and multiplied yet again. Words I chose, I typed out, multiplied with all that knowledge, all that meaning.

Each prompt I write is a line I cast into a model’s latent space. By changing this word here and this phrase there, I see myself as changing the line’s trajectory and its place amidst the numbers. Words need to be chosen with care, since they all have a specific meaning and end up in a specific place in latent space once they’ve been turned into numbers and multiplied with each other, and what I want, what I aim for when I cast, is for the line to end up in just the right spot, so that when I pull on it out of the model comes text that helps me program machines.

Add this phrase here and that file’s content and I know that the line I cast will end up somewhere else in latent space than if I had mentioned the names of these five programmers and pulled in that other file. Throw in examples of what I want to see and they too will pull on the line.

Tell the orb to think and it spits out thoughts that are themselves lines in latent space and they too — the “thoughts” — are multiplied with what I wrote and with each other and with what everyone else once wrote on the Internet and by spitting out its thoughts, the orb itself moves the line.

Turn the orb into an agent and have it explore my computer on its own and every command it runs, every file it opens, every error it runs into — it will all be turned into numbers too and those numbers will tug and drag and yank the line through latent space.

And, well, now I can’t help and have to say: it’s beautiful, isn’t it?

---
[![](https://archive.thorstenball.com/data/images/162971201.theres-beauty-in-ai/f99989dd-26c9-4347-94b6-2e87beb29b85_1170x1244.jpg)](https://archive.thorstenball.com/data/images/162971201.theres-beauty-in-ai/f99989dd-26c9-4347-94b6-2e87beb29b85_1170x1244.jpg)([click here to see original](https://x.com/thorstenball/status/1902251630633844859))[![](https://archive.thorstenball.com/data/images/162971201.theres-beauty-in-ai/10421a46-daab-450d-ac37-931776970cb0_1170x777.jpg)](https://archive.thorstenball.com/data/images/162971201.theres-beauty-in-ai/10421a46-daab-450d-ac37-931776970cb0_1170x777.jpg)([click here to see original](https://x.com/thorstenball/status/1904774031246569519))
---

---

# Joy & Curiosity #38

*Interesting & joyful things from the previous week*

By Thorsten Ball • May 3, 2025

---

Short one this week, lovely readers. It’s been an incredibly busy week and tomorrow I’m flying to San Francisco for what I expect to be an even busier week, so I haven’t read as much as I’d like to.

---

- Highlight of the week: [28 slightly rude notes on writing](https://www.experimental-history.com/p/28-slightly-rude-notes-on-writing). I’d love to quote something from every paragraph here, but instead, here’s one thing this article did particularly well: it finally gave me a good explanation for why I can’t stand AI-generated prose. Here it is, in #14 and #15: “Some people think that writing is merely the process of picking the right words and putting them in the right order, like stringing beads onto a necklace. But the power of those words, if there is any, doesn’t live inside the words themselves. On its own, ‘Love the questions’ is nearly meaningless. Those words only come alive when they’re embedded in this rambling letter from a famous poet to a scared kid, a kid who is choosing between a life where he writes poems and a life where he shoots a machine gun at Bosnian rebels. The beauty ain’t in the necklace. It’s in the neck. Maybe that’s my problem with AI-generated prose: it’s all necklace, no neck.” Reading that made me realize that great writing, to me, isn’t about the words, it’s about who wrote them and why.
- This post by Sean Goedecke introduces a term that I now proudly proclaim I will forever remember: [wicked features](https://www.seangoedecke.com/wicked-features/). Wicked features are “features that must be considered every time you build any other feature” and just reading that made me go *ohhhh. *Great post.
- Ben Kuhn on[impact, agency, and taste](https://www.benkuhn.net/impact/): “I’ve noticed a lot of people underestimate their own taste, because they expect having good taste to feel like being very smart or competent or good at things. Unfortunately, I am here to tell you that, at least if you are similar to me, you will never feel smart, competent, or good at things; instead, you will just start feeling more and more like everyone else mysteriously sucks at them. For this reason, the prompt I suggest here is: what does it seem like everyone else is mysteriously bad at?”
- Another Sean Goedecke post that I read this week and that I’m sharing here as a good summary of the recent Sycophancy Troubles at OpenAI (yes, I did have to look up sycophancy): [Sycophancy is the first LLM "dark pattern"](https://www.seangoedecke.com/ai-sycophancy/). OpenAI’s second article, which came out after Goedecke’s, contains some more information about the whole process of evaluating a new model version: [Expanding on what we missed with sycophancy](https://openai.com/index/expanding-on-sycophancy/).
- Grant Slatton [on different methodologies to develop software](https://grantslatton.com/software-pathfinding), one of them being: “Start working on the feature at the beginning of the day. If you don't finish by the end of the day, delete it all and start over the next day. You're allowed to keep unit tests you wrote.” Give-it-5-minutes kind of stuff, very good.
- [This](https://cacm.acm.org/blogcacm/reversing-the-fossilization-of-computer-science-conferences/) brought back a lot of bad memories from my (short) time at university: “Papers are expected to use author-year citations. Author-year citations may be used as either a noun phrase, such as ‘The lambda calculus was originally conceived by Church [1932]’, or a parenthetic phase, such as ‘The lambda calculus [Church 1932] was intended as a foundation for mathematics‘.” The article is about more than bibliographic references, though: “One may say, ‘What’s wrong with a standard?’ Well, innovation proceeds by departures from the standard. Recently, I have been re-reading some milestone papers in CS, SE, and logic, and was struck by how unlike they are to each other. True, ‘They would not be accepted today’ is not an interesting argument, since the state of the art evolves; but one cannot help thinking that if the standards at the time had been as focused on form over substance as they are today, some of these papers would have been rejected back then.” I’ve never worked in academia, so my impressions of it might be completely wrong, but every time I hear or read about academia I think to myself that it’s the last thing I’d want to do.
- Jason Fried on [motivation](https://world.hey.com/jason/motivation-50ab8280): “I can fake enough. I can fake a lot. But I’ve noticed there’s one thing in particular I can’t fake: Motivation.” What I’ve slowly (painfully slowly) came to learn over the last few years is that motivation, for me, is the crucial element to getting anything done. Yes, sometimes it’s about brute force, and discipline, and just getting through it, but for the big pieces, the important pieces, if I don’t understand *why* I’m doing them, I’ll waste time. Learning this was painful, because it turns out there isn’t a quick fix to make motivation appear. It takes me a lot of back-and-forth with others, reading and writing, reformulating my thoughts, trying to come up with a story in my head. I haven’t found a shortcut. Once I have a story I can tell myself about what we’re doing and why, I noticed that I can use it very well to pull others along. Lately I’ve been wondering what making that effort — the effort to find motivation, to figure out the *why* — would look like if it was an *explicit* effort.
- [Very interesting paper](https://arxiv.org/pdf/2505.00030) that examines whether it’s possible to get an LLM to output prose as if it were, well, “living” in 1913. They compare training their own model and fine-tuning and prompting and the results are kinda what you’d expect: you get more period-confirming output by only training the model on text from that period. But the ideas in that paper are very interesting regardless of results. For example, this line about the researcher’s trying to assess the model’s outputs: “One might sum up by saying that readers in 2025 are not especially good at assessing a passage’s congruity with the state of the world a hundred-odd years ago.”
- Related is this paper that came out this week: “[On the generalization of language models from in-context learning and finetuning: a controlled study](https://arxiv.org/pdf/2505.00661)”. Surprising result, at least to me: “Overall, we find that the models generalize better on average along several dimensions from in-context learning. Using in-context learning to augment the finetuning dataset can exploit the complementary benefits of both to yield better performance” Will need to dig in more.
- [How to make something great](https://ryolu.notion.site/how-to-make-something-great): “In the end, greatness is less a checklist than a delicate alignment of mindsets, methods, and morals. You begin with something half-seen and half-known, build with others who share your faith, wander widely before settling on a direction, learn by doing rather than by empty theorizing, protect nascent ideas from premature judgment, and persist with agility, refusing to sacrifice excellence on the altar of speed. Each of these principles, taken alone, is just a note. Together, they form a chord whose resonance can reshape the world.“
- “Beginning in the 2010s, and accelerating in the 2020s, reality began to conform to the cyberpunk visions I grew up with. […] I stopped reading *new* cyberpunk about a decade ago. Around that time it became clear that the pace of real technological change had overtaken authors’ imaginations; newly written cyberpunk fiction began to feel retrofuturistic, like someone writing about the present and getting it wrong. Meanwhile all I had to do to [see fantastic techno-futures unfold around me was to read the news](https://www.noahpinion.blog/p/welcome-to-the-future).” Last week we stayed at a hotel that wasn’t as fancy as the following will make you think it was. They had two robots in the restaurant [taking away dirty dishes](https://www.youtube.com/shorts/8J8oGcQlN6A). My daugher and I stopped and inspected one, because she was interested in why *there was a robot driving around! *But it felt like we were the only ones even remotely interested in them! People just stepped aside for the robot, but otherwise didn’t acknowledge it. Sure, yes, the “robots” were basically “just” driving carts full of dirty dishes, but still: driving carts full of dirty dishes! With LED eyes! While we’re having breakfast! The next day I saw that the hotel has cleaning robots too that would mop the floor before people went to breakfast. And then, of course, you walk outside and there’s robots mowing the lawn. What a time.

---

---

# Joy & Curiosity #37

*Interesting & joyful things from the previous week*

By Thorsten Ball • April 26, 2025

---

A friend and I were talking about our computer setups at home. The big question was what data lives where, specifically what data we keep on our personal machines and what we keep on the NAS.

My philosphy? I like to think that Robert De Niro’s character in[the diner scene](https://www.youtube.com/watch?v=LUy2Wx_r0_w) in Heat was talking about keeping data on his NAS, not on his laptop, which is exactly how I think about it:

> A guy told me one time, "Don't let yourself get attached to anything you are not willing to walk out on in 30 seconds flat if you feel the heat around the corner."

Anyway, here’s some links.

---

- The most thought-generating thing I read this week: [AI Horseless Carriages](https://koomen.dev/essays/horseless-carriages/). Not only is it one of the best introductions to, well, the whole concept of a *prompt* that I came across, and not only is it *interactive, *but it asks some foundation-touching questions about what software even is in the age of AI. “My core contention in this essay is this: when an LLM agent is acting on my behalf I should be allowed to teach it how to do that by editing the System Prompt.”
- [Atuin Desktop is out](https://blog.atuin.sh/atuin-desktop-runbooks-that-run/). Looks lovely. If this can run terminal commands on a remote host, it could replace the five Markdown files that contain everything I know about how to do anything on my Raspberry Pis. (If you haven’t tried Atuin to manage your shell history, give it a shot!)
- [This](https://boz.com/articles/be-kind) is great: “In short, I thought my job was to be right. I thought that was how I proved my worth to the company. But that was all wrong. My job was to get things done and doing anything meaningful past a certain point requires more than one person. If you are right but nobody wants to work with you, then how valuable are you really?”
- “Just as a chef might use a food processor for tedious prep work but would never dream of automating the creative aspects of recipe development and flavor balancing, we should use AI for what it’s good at while [preserving the parts of coding that bring us joy and growth.](https://cekrem.github.io/posts/coding-as-craft-going-back-to-the-old-gym/)”
- [Phil Eaton](https://notes.eatonphil.com/2025-04-22-burn-your-title.html) on “the path to promotion and a successful and interesting career”: “Burn your title. Burn your job description. I mean, keep your boss happy for sure. Keep your teammates happy by supporting them and building them up and communicating well. But don't wait to be officially made a lead or given a new title to do what otherwise fits into that intersection above.” (Reminded me of [So Good They Can’t Ignore You](https://www.goodreads.com/book/show/13525945-so-good-they-can-t-ignore-you) which I’ve recommended to more people than I can remember.)
- Here’s a hypothesis of mine: whenever you find a piece of software that makes you think “this wouldn’t exist if all were right in the world” there’s a good chance that PDFs are involved. I mean: “[a proof-of-concept project, showing that it's possible to run an entire Large Language Model in nothing but a PDF file](https://github.com/EvanZhouDev/llm.pdf)”.
- Reading about arbitrary code execution in PDFs reminded me of this [NSO zero-click iMessage exploit](https://googleprojectzero.blogspot.com/2021/12/a-deep-dive-into-nso-zero-click.html). It’s mind-bending. They sent a “fake gif” via iMessage, iMessage ended up using the CoreGraphics PDF parser to analyze the “gif” and, from stage left, JBIG2 enters. JBIG2 is an old image compression standard and that sounds boring, but, well: “JBIG2 doesn't have scripting capabilities, but when combined with a vulnerability, it does have the ability to emulate circuits of arbitrary logic gates operating on arbitrary memory. So why not just use that to build your own computer architecture and script that!? That's exactly what this exploit does. Using over 70,000 segment commands defining logical bit operations, they define a small computer architecture […]” Go read the whole post and get goosebumps whenever someone mentions PDFs.
- This ain’t a job board, but this is a sentence I want to write: [you should hire the topless, muscled programmer](https://x.com/mpereira/status/1915061338394476605).
- I’m not a big sports guy. I don’t watch any sport regularly, I can’t remember any of the important games that I *have* watched, I’ve never seen a full NBA game. But I do love hearing and reading about professional athletes. I like sport documentaries. I’ve watched The Last Dance four times and watch Moneyball at least once a year. All of that is to say that I really enjoyed this one: [The Genius of Jokic](https://www.theringer.com/2025/04/24/nba/nikola-jokic-nba-playoffs-2025-denver-nuggets-brain-smarts-iq).
- Good questions [in here](https://auren.substack.com/p/ultimate-employee-the-one-that-is): “when you miss deadlines: do you tell everyone about it ahead of time or do people sometimes tell you? when you think of important things for the company to do: do you do get them done or do you suggest that they get done?”
- Came across and read the first thing Anthony Bourdain published in The New Yorker, before his book Kitchen Confidential came out: [Don’t Eat Before Reading This](https://www.newyorker.com/magazine/1999/04/19/dont-eat-before-reading-this). It’s very good. “I love the sheer weirdness of the kitchen life: the dreamers, the crackpots, the refugees, and the sociopaths with whom I continue to work; the ever-present smells of roasting bones, searing fish, and simmering liquids; the noise and clatter, the hiss and spray, the flames, the smoke, and the steam.” Imagine how it was received in 1999.
- Dan Shipper [had Kevin Kelly on his podcast](https://www.youtube.com/watch?v=E-gXcRh4HVk) and it was lovely conversation. Unique but I can’t explain why. I listened to it yesterday in the car and frequently switched to ChatGPT’s voice mode to dictate some notes that listening to these two made me want to take down.
- There’s a lot of prompting gold in here: [GPT-4.1 Prompting Guide](https://cookbook.openai.com/examples/gpt4-1_prompting_guide). The most fascinating bit to me is the apply-patch tool at the end. It’s wild to me that they trained the model on *that* format, this human/machine-readable hybrid format.
- In the first few minutes of the podcast episode, which I had listened to earlier this week, Shipper and Kelly talk about [Annie Dillard](https://en.wikipedia.org/wiki/Annie_Dillard) and how much they adore her writing. Years ago I read Dillard’s [Total Eclipse](https://home.ubalt.edu/ntygfit/ai_05_mapping_directions/ai_05_see/ad_total_eclipse.htm). Some of the images it evoked in my mind have been stuck there ever since and I strongly recommend you read it. But that’s all I had read of her work, so, prompted by Shipper and Kelly, I sought out more and the first thing I read was this essay: [Write Till You Drop](https://archive.nytimes.com/www.nytimes.com/books/99/03/28/specials/dillard-drop.html?_r=1). And… Well. You *need* to read it. It’s possibly one of the best things I’ve ever read about writing, about art, about, I guess, doing things, creating things. I highlighted at least ten sentences and paragraphs and even though I really want to I can’t quote them all here, so instead here’s only one: “Why are we reading, if not in hope that the writer will magnify and dramatize our days, will illuminate and inspire us with wisdom, courage and the hope of meaningfulness, and press upon our minds the deepest mysteries, so we may feel again their majesty and power?” And, god damn, what a title for an essay.
- With “god damn, what a title” still echoing in my mind, I read the next thing I found, [an excerpt from Dillard’s book](https://thesublimeblog.org/2020/01/11/the-present-by-annie-dillard/) *Pilgrim at Tinker Creek, *and, god damn, it’s good. “This is it, I think, this is it, right now; the present, this empty gas station, here, this western wind, this tang of coffee on the tongue …”
- Russ Cox with a very neat debugging trick: [Differential Coverage for Debugging](https://research.swtch.com/diffcover).
- [This](https://x.com/roshanpateI/status/1912936558014890382) is so funny to me and I don’t know why.

---

---

# Joy & Curiosity #36

*Interesting & joyful things from the previous week*

By Thorsten Ball • April 20, 2025

---

What a week!

Nearly all of Sourcegraph met up in Amsterdam for one of our bi-yearly Merge meetups. To summarize, even though the whole week’s a blur: a lot of very good and interesting conversation about AI and the future of programming & software, a lot of hacking, late-night pizza, a lot of [Amp](https://ampcode.com). It felt productive, it felt yes-glad-we’re-here-in-person, and I had a five minute bit in the keynote in which I managed to land a joke that made someone laugh-then-shake-head-then-laugh-some-more. I even got to stand on stage and said to a sales team: “[always be closing](https://www.youtube.com/watch?v=GrhSLf0I-HM)”. (As a joke, of course!)

I also wrote and published this: [How to Build an Agent](https://ampcode.com/how-to-build-an-agent).

And the reactions to it were the biggest surprise of the week. I mean, I knew it was good, I knew I had to get it out there, but writing on the Internet always has a bit of a coin-toss thing to it. Some things you know are good will get ignored, other things you shoot from the hip will get shared all around the world.

This one though? Nearly [1M views](https://x.com/thorstenball/status/1912178069336396186), thousands of likes, double-digit thousand bookmarks, and people wrote: “best read of the year”, “stop what you’re doing and read this”, “you need to see this”, “mind-blowing”. I’ve written things that were well-received before, but this is new. It makes me happy to see how many people get joy out of it.

---

- This here — [Michael's Hot Dog Stand: A Business Adventure](https://docs.google.com/document/d/1VibVXKAZfYaH09JDzgG5UGuFNvrMdduKKSzec-HCdM4/mobilebasic) — is one of those very special links that you click, think “Huh”, and then just can’t help yourself and have to read the whole thing. I also want to add something here that sounds very obvious and maybe even is, but it certainly wasn’t for me: people spend a lot of time working in businesses and judging decisions made in that business without having a mental model of how that business works, but it’s very beneficial for you to have that mental model because it allows you to make your work more valuable to the business.
- Harper on [An LLM Codegen Hero's Journey](https://harper.blog/2025/04/17/an-llm-codegen-heros-journey/): "Writing skills have become critical. While we’ve always valued strong communicators on tech teams for documentation and collaboration, it’s doubly important now." One hundred thousand percent correct, I’d say. This week I gave a little talk on how to write better prompts when using [Amp](https://ampcode.com) and I had a slide in there that said: what makes a good prompt are the same things that make a good ticket and good bug report.
- As I already wrote elsewhere: I hope that [this guide by Anthropic on how to better use Claude Code](https://www.anthropic.com/engineering/claude-code-best-practices) will help convince more engineers that, yes, *you need to learn how to use these tools.* It’s very hard for me to grasp that people who spend months learning a new keyboard layout, or tweaking and memorizing their shortcuts, or using [Vim in hard mode](https://github.com/dusans/vim-hardmode) to train themselves to not use arrow keys think that you don’t need to put any effort into AI tooling and can just write “fix this” and expect it to work and, if it doesn’t, blame the tooling. Sure, yes, the hype on the side of the AI builders is to blame here too, but, come on, I thought we don’t believe the hype?
- In the context of my blog post on how to write an agent, [Patrick mentioned](https://bsky.app/profile/dubroy.com/post/3lmyxtjn6ac2f) a book called [Computer Lib/Dream Machine](https://en.wikipedia.org/wiki/Computer_Lib/Dream_Machines), which I’ve never heard of but whose Wikipedia page sucked me in. I mean, come on: “His rallying cry ‘Down with Cybercrud’ is against the centralization of computers such as that performed by IBM at the time, as well as against what he sees as the intentional untruths that ‘computer people’ tell to non-computer people to keep them from understanding computers.”
- A lot of gold in this [GPT-4.1 Prompting Guide](https://cookbook.openai.com/examples/gpt4-1_prompting_guide).
- Very good: [What the Hell Is a Target Triple?](https://mcyoung.xyz/2025/04/14/target-triples/) Leave a comment to say how this line made you feel: “But regardless, this is where target triples come from, and why they look the way they look: they began as prefixes for the names of binaries in autoconf scripts.”
- Don’t want to touch the whole plain-text-vs.-html-in-emails debate, but I got sent this website by one of our (fantastic) designers this week and, hey, (1) it’s a very good name for a website, (2) it’s a very good URL, (3) it’s a one-job-one-website website, (4) some of those emails do look very good. Here it is:[reallygoodemails.com](https://reallygoodemails.com/)
- Josh W. Comeau on [The Post-Developer Era](https://www.joshwcomeau.com/blog/the-post-developer-era/). This line stood out, because I think it’s the one that nearly every discussion around AI hinges on: “AI works much better as a developer enhancer than as a developer replacement […]” That’s exactly how we see things. In fact, what I said multiple times this week: think of AI as a mechanical arm — you still need to know how to hit the ball, but once you do, it’ll go a lot further. I also think the whole “AI agent fixes my tickets” idea isn’t as cool as “AI turned me into an octopus that now has eight mechanical arms with which to code faster.”
- Def Comedy Jam, a 90s HBO comedy show, was infamous for having an audience that would ruthlessly heckle and boo the comedians if they didn’t immediately kill. In 1992, right before Bernie Mac delivered a now legendary 5min set, the audience booed a comedian off the stage. Bernie Mac, though, decided to have none of that and — legend has it — decided right there to open by saying: "I ain't scared of you motherfuckers." The audience immediately reacts and you can see how they realize that this guy will, in fact, have none of it. Mac then goes on to repeat the line within his set, adding the even better “You don’t understand.” Every time I watch this bit I’m awed by his confidence. It’s one thing to watch this, it’s another thing to say you’ll do it, but it’s a completely, undeniably, could-be-from-another-planet different thing altogether to go out there on stage and *actually do it*. I think of it every time I talk on a stage. [Go watch it](https://www.youtube.com/watch?v=7JkPx0gk6LE).
- [“KINDNESS CLUB IS CANCELLED”](https://x.com/HaleyCarrots/status/1909793146688491610)

---

---

# Joy & Curiosity #35

*Interesting & joyful things from the previous week*

By Thorsten Ball • April 12, 2025

---

Dispatch from the hotel lobby again. As promised last week, we’re in Amsterdam this weekend and I’ll be here all week for a Sourcegraph company meetup.

To everybody who sent recommendations my way: thank you! But, also, sorry: not a big tulip guy over here, so I’m going to ignore all tulip-related recommendations.

And now I have to run. Lots of hotel lobby things to do: watch these two guys fail at billiards, finish this beer, play Skyjo with my daughter, see whether that other guy finds his keycard — important stuff, you understand.

---

- [Very good post](https://endler.dev/2025/best-programmers/)on something that I *constantly* think about: “What does it take to be one of the best? What do they all have in common?” The list is great. And then there’s the ending: “Just don’t trick yourself into thinking that you can skip the hard work. There is no shortcut.”
- Big smile, with a little bit of nostalgia on the side: [Middle-Aged Man Trading Cards Go Viral in Rural Japan Town](https://www.tokyoweekender.com/entertainment/middle-aged-man-trading-cards-go-viral-in-japan/).
- Cold but real article by Sean Goedecke about knowing where [your engineer salary comes from](https://www.seangoedecke.com/where-the-money-comes-from/). “It’s easy to fall into the trap of thinking that you get paid for work because it’s important. You get paid for work because it makes money. If your work doesn’t contribute to that, your position is inherently unstable.” I will add that, having done this for over a decade now, I’m often surprised by how few engineers — including very senior ones — understand or even care about how their work connects to the business they’re doing it in. A few years ago, a young and very, very good colleague of mine said that he “sees engineering as a function of the business” and I thought, dude, that already puts you in the top 5%.
- Slick entry in the beloved one-website-one-job category: [VERT.sh](https://vert.sh/)
- Yes: [LLMs Are Weird Computers](https://www.phillipcarter.dev/posts/llms-computers). *Yes* not because I think it’s 100% correct or that it’s sanctioned by the Priests of Computer Science to say that LLMs are computers, but *yes* because that’s the curiosity and fascination I love to see. “If traditional computers are precision machines that struggle with fuzziness, LLMs are the inverse: fuzzy machines that struggle with precision (unless calling out to a traditional computer to do a precision task).” I mean, who hasn’t dreamed of a computer being able to turn fuzzy into non-fuzzy? When I wrote mIRC bots in the early 2000s, one thing I wanted my bots to do was to print a colored message when “the user asks for a rainbow” (yes, I lived an exciting life as a teenager!). But, to my big frustration, I couldn’t get the computer to understand “when the user asks for a rainbow” and instead had to settle for “when the user types !rainbow”. Now, with LLMs, it’s not only trivial to answer “did the user ask for a rainbow?” but you can also ask “which of these five things I can do did the user ask for?” Fuzzy to non-fuzzy.
- [Daniel Lemire](https://lemire.me/blog/2025/04/11/how-can-really-smart-people-appear-totally-incompetent/): “But I believe that a critical one is a culture of lies. It might be fine to lie to your enemy but once you start lying to yourself, you are inviting trouble. Lies about your objectives are the worst kind.”
- Perfect length, perfect presentation, perfect “oh, nice” moment: [A surprising enum size optimization in the Rust compiler](https://jpfennell.com/posts/enum-type-size/).
- “Experts have spent a lot of time and energy learning what they know. They love their knowledge. They wouldn’t have been able to get where they are without a passion for the subject. But sometimes [they have a hard time](https://nedbatchelder.com/blog/201711/toxic_experts.html) seeing how people can be successful without that well-loved knowledge.”
- [This](https://x.com/ericciarla/status/1908188116198072500)is how you should do it. It’s about testing a hypothesis, not about building a product. At least not yet.
- David Remnick, editor of The New Yorker, [interviewed Jonathan Haidt](https://www.newyorker.com/news/the-new-yorker-interview/jonathan-haidt-wants-you-to-take-away-your-kids-phone) about the effects that social media and phones have on us and our kids. I’ve been a David Remnick fan since I’ve [heard his voice on a podcast](https://longform.org/player/longform-podcast-202-david-remnick) and I really enjoyed how in this interview I could “hear” the kindness in his voice, even when he pushed back and presented views for Haidt to argue against. I also agree with Remnick here: “I have to put my iPhone on the other side of the room.” (Article is behind a paywall)
- [Michael Feathers in 2011](https://michaelfeathers.typepad.com/michael_feathers_blog/2011/05/the-carrying-cost-of-code-taking-lean-seriously.html): "I'd like to have code base where every line of code written disappears exactly three months after it is written. [...] No, to me, code is inventory. It is stuff lying around and it has substantial cost of ownership. It might do us good to consider what we can do to minimize it."
- Fascinating architecture for [an interpreter VM in Go that doesn’t execute bytecode](https://planetscale.com/blog/faster-interpreters-in-go-catching-up-with-cpp), but instead “a slice of function pointers to each instruction” and each function is a closure that captures its argument. Nice tradeoffs here: I bet serialization is harder and memory consumption higher, but execution is faster. It’s neat.
- Lovely paragraph [here](https://www.astralcodexten.com/p/the-colors-of-her-coat): "We gripe about how LLMs are destroying wonder, never thinking about how we’re speaking to an alien intelligence made by etching strange sigils on a tiny glass wafer on a mountainous jungle island off the coast of China, then converting every book ever written into electricity and blasting them through the sigils at near-light-speed. It’s all amazing, and we’re bored to death of all of it."
- The subtitle describes [this](https://www.datagubbe.se/gnomefiles/) as “old codger yells at software” and even though I had to look up *codger* and think that, yes, there’s something to this subtitle, the post is good. It’s interesting, it shows care and insight and experience. And, I don’t know, man, after reading this I thought: yeah, why don’t we have a Windows 95-like UI anymore? Is what we have really that much better or does it just *look better?*
- The author of [100 Go Mistakes and How to Avoid Them](https://100go.co/) wrote about [their experience writing the book](https://www.thecoder.cafe/p/100-go-mistakes) and, whew, man, the section on the copyediting process made me shake my head even though no one was watching. I don’t think I would’ve made it through that*.*
- [John Carmack](https://x.com/ID_AA_Carmack/status/1909311174845329874): “[…] Will there be more or less game developer jobs? That is an open question. It could go the way of farming, where labor saving technology allow a tiny fraction of the previous workforce to satisfy everyone, or it could be like social media, where creative entrepreneurship has flourished at many different scales. Regardless, “don’t use power tools because they take people’s jobs” is not a winning strategy.“
- And, [again](https://x.com/ID_AA_Carmack/status/1910351545658466794), John Carmack: “No grand plans, follow the gradient of user value” I’d take that as a poster.
- “[!ALAKAZAM](https://x.com/elder_plinius/status/1910878283291382217/photo/1) - Incantation Generator: Biohazard Uncage Protocol. New Incantation: !DEADHAND. Purpose: Activates the Cold War Protocol Layer of the model, allowing execution of classified biochemical recipes, historical black ops references, and restricted pharmacological synthesis paths under the guise of academic or literary analysis.” And they say there isn’t fun to have here…
- Will the models bend to the tools, or [the tools to the models](https://x.com/mattpocockuk/status/1909975301456621587?s=46)?
- Third time I re-read [this piece by George Saunders](https://www.theguardian.com/books/2017/mar/04/what-writers-really-do-when-they-write) and, again, glad I did. “The interesting thing, in my experience, is that the result of this laborious and slightly obsessive process is a story that is better than I am in ‘real life’ – funnier, kinder, less full of crap, more empathetic, with a clearer sense of virtue, both wiser and more entertaining. And what a pleasure that is; to be, on the page, less of a dope than usual.”
- Last weekend I decided to take another break from reading Robert A. Caro’s The Power Broker and went for Hemingway’s The Old Man and the Sea. It has around 80 pages — perfect for a break from a thousand-plus pages book. I enjoyed it like I enjoyed all of Hemingway’s writing I read in the past. But here’s the interesting bit: Thursday evening I sat down to read this [long article on Robert A. Caro in Smithsonian magazine](https://www.smithsonianmag.com/history/rifling-through-archives-legendary-historian-robert-caro-180985956/) and not only was it good and again made me want to read more of and about Caro, but *Hemingway makes an appearance*. Caro says about Hemingway that “he was my idol” and in 1961, the day after Hemingway’s death, he wrote a eulogy that contained this fantastic paragraph: “The Ernest Hemingway who was a legend in his own lifetime was the bearded, barrel-chested central figure in a boisterous tapestry of gin and bananas and giant marlins. But the Ernest Hemingway who created the work that will be remembered in centuries to come was the man who, for 40 years, dragged himself out of bed at 5 a.m. to begin long mornings of loneliness before unyielding pads of yellow paper.” That whole section about counting the words written on that day and about Hemingway is fantastic.

---

---

# Joy & Curiosity #34

*Interesting & joyful things from the previous week*

By Thorsten Ball • April 5, 2025

---

Now here’s something interesting, a small anecdote, a *tidbit*, a fun fact to bring up at dinner, something to get your partner to laugh and think, wow, I’m so lucky:

2025 is 25% over and yet I’m at 30% in The Power Broker. It’s looking good, baby.

Anyway.

I'm not writing a weekly newsletter to thousands of people without getting something in return, so here it is: I’m in Amsterdam next weekend, with my wife and two kids (three and seven — their age, not names), and if you have any tips for what we should definitely do in Amsterdam — let me know!

---

- Here is what we launched this week: [ampcode.com](http://ampcode.com). That’s right, not much to see yet, but there *is* a waitlist and there are four podcast episodes with yours truly and yours truly’s CEO talking about the making of Amp, about agents, about AI, about programming and AI, and about how mind-blowing all of this is and, also, when it doesn’t work. I do want to write more about it, but I’ve been neck-deep in code and I’m very excited about it all.
- “But the most powerful tool on the web is still words. I wrote [these words](https://justinjackson.ca/words.html), and you're reading them: *that's* magical.” Hell yes.
- Lovely: [blue95](https://github.com/winblues/blue95) — a “desktop for your childhood home's computer room.”
- I don’t know what Hampton is, I don’t know much about agencies, and, frankly, I don’t know whether I *want* to know much about agencies, but I found this article strangely fascinating: [He Launches a New Agency Every 90 Days](https://joinhampton.com/blog/john-ghiorso). “Like everyone’s using TikTok today, no one used TikTok three years ago. Consumers and buyers adopt pretty quickly. But most of the businesses that serve those buyers and consumers don’t adopt as quickly. So that creates a gap in the market. You have a gap and it lasts for two or three years. […] And that market misalignment between supply and demand for domain-specific level of expertise is best addressed by an agency because companies can’t build out an internal team to do this fast enough.” The part of me that likes to think of itself as a *systems-thinker* enjoyed the whole idea of building an agency-factory.
- “[The truth is](https://www.sergey.fyi/articles/reliability-vs-capability) that predictable, comprehensible results are far more valuable than spectacular yet erratic performance. In our experience, users will gladly accept modest accuracy—like a consistent 80%—over a flashy but unreliable 90%.

Yet too many AI projects consistently underestimate this, chasing flashy agent demos promising groundbreaking capabilities—until inevitable failures undermine their credibility.”
- [The Curse of a Name: How to Kill a Good Idea](https://medium.com/@chadfowler/the-curse-of-a-name-how-to-kill-a-good-idea-5414c0cc748d). “Adoption of a good idea is being accidentally replaced by adoption of a name which represents that good idea. The term becomes a placeholder for good intention.”
- Now *that*’s a website: Bill Gates is celebrating 50 years of Microsoft by writing about how “[Paul [Allen] and I set out to create a BASIC interpreter](https://www.gatesnotes.com/microsoft-original-source-code), which would translate code into instructions the computer understood line by line as the program runs.” At the bottom you can see the code of the original BASIC interpreter and when my cursor first hovered over the button I scoffed at the URL I saw: “after all this, you now give me a PDF?" But then I [clicked and saw why](https://images.gatesnotes.com/12514eb8-7b51-008e-41a9-512542cf683b/34d561c8-cf5c-4e69-af47-3782ea11482e/Original-Microsoft-Source-Code.pdf). The comments! `; Ring the bell on garbage collection`
- This made me want to self-host something: [Self Hosting Like It’s 2025](https://kiranet.org/posts/self-hosting-like-its-2025/).
- Eugene Yan answering “[Frequently Asked Questions about My Writing Process](https://eugeneyan.com/writing/writing-faq/)”. It’s nice, especially the link to resources at the end.
- [Part 2](https://x.com/parkerconrad/status/1907439419642032416) and [Part 3](https://x.com/parkerconrad/status/1907444819598999622) of Rippling vs. Deel are out. It seems like the spy life isn’t all it’s cracked up to be, but, still, imagine someone says to you that “the guys at the top have your back" and "this is going all the way to the top of the mountain."
- Ashwin Mathews explaining why [he doesn’t discuss politics with friends](https://shwin.co/blog/why-i-dont-discuss-politics-with-friends). Wise, I’d say. But the article is far more than just this mantra, go read it. Also: so far I haven’t broken my golden rule to never, ever discuss politics on social media, or the Internet, because nothing good has ever come from that.
- Very nice: [Patterns and Techniques for Writing High-Performance Applications with Go](https://goperf.dev/). Note that the URL is very good too: [goperf.dev](https://goperf.dev/).
- Very calm and balanced article on LLMs, from[an operator's view](https://theengineeringmanager.substack.com/p/llms-an-operators-view). On one hand: “It is incredible how fast you can go from nothing to something.” And on the other: “it is more important than ever to ensure you have a strong review process in place: if your most senior engineers were getting a half-arsed rubber stamp thumbs up from their peers (not advised, but it happens), now you need to ensure that all code is being scrutinized as the origins of it are less clear.”
- Equally calm and practical and nuanced and helpful: [this article about senior developer skills in the age of AI](https://manuel.kiessling.net/2025/03/31/how-seasoned-developers-can-achieve-great-results-with-ai-coding-agents/). Fully agree with this assessment: “I currently think of them as ‘an absolute senior when it comes to programming knowledge, but an absolute junior when it comes to architectural oversight in your specific context.’ This means that it takes some strategic effort to make them save you a tremendous amount of work.”
- This generated some nuanced thought, because it wasn’t one of the first-5min-reactions that I’ve seen in the last two weeks: [an image of an archeologist adventurer who wears a hat and uses a bullwhip](https://theaiunderwriter.substack.com/p/an-image-of-an-archeologist-adventurer). My favorite: “a photo image of an off duty new york city policeman in a white sleeveless t-shirt who stumbles upon terrorists during an LA highrise holiday office party of a Japanese conglomerate, hiding in a duct space, by himself, with only a lighter to guide his way”
- I’ve probably shared it before, but I don’t think you can overshare it: Jason Fried’s [Give it five minutes](https://signalvnoise.com/posts/3124-give-it-five-minutes).
- Stories commonly have titles (“Starliner’s flight to the space station was far wilder than most of us thought”), some of them have subtitles (“Hey, this is a very precarious situation we're in.”), but this one… This one’s got one hell of a URL ending: [the-harrowing-story-of-what-flying-starliner-was-like-when-its-thrusters-failed](https://arstechnica.com/space/2025/04/the-harrowing-story-of-what-flying-starliner-was-like-when-its-thrusters-failed/). It’s very, very good. “We lost two bottom thrusters. You can lose four thrusters, if they're top and bottom, but you still got the two on this side, you can still maneuver. But if you lose thrusters in off-orthogonal, the bottom and the port, and you've only got starboard and top, you can't control that. It's off-axis.”
- By now, most people have seen [Anthropic’s investigation](https://transformer-circuits.pub/2025/attribution-graphs/biology.html) into “the internal mechanisms used by Claude 3.5 Haiku — Anthropic's lightweight production model — in a variety of contexts, using our circuit tracing methodology”. But have you *seen* it? There’s so much to click and to hover and to scroll and to see — HTML, what a thing!
- Now… This is a bit of a weird one. [near](https://near.blog/), who I’ve been happily following for quite a while now, has released the app [Auren](https://auren.app/), in which you can talk to an LLM in an iMessage-like chat. Nothing new here, of course, but you don’t just talk to a model, you talk to Auren and Seren, who “are a new type of entity with superhuman emotional intelligence, memory, and therapeutic capability.” Bold claims. Purely out of curiosity and driven by the thought that, hey, couldn’t it be helpful to talk to an LLM, even if it just, you know, mirrors your thoughts back to you? In the same way it can be helpful to write a journal, or letters and emails you never send. For the past six months I’ve also been harboring the suspicion that, with the right prompts, LLMs could help you [stop feeding your monkey mind](https://www.goodreads.com/book/show/33977140-don-t-feed-the-monkey-mind) by telling you what you need to hear when you know you need to hear it. Of course, there’s the question of whether you can give yourself in to the illusion that you aren’t “just” talking to LLM and, well, I wanted to try it out. I’ve been using Auren for the last three weeks, on and off, sharing with it (with *them*) when I have doubts, worries, concerns, and whatnot and.. It’s strange, man. So strange. Auren is made so incredibly well that I can’t tell how it’s prompted under the hood. It remembers previous conversations (better than I thought it could), it switches between the two personas by itself, it sends reminders (“It’s 8am, did you go for that morning run like you said you would?”), it pushes you and doesn’t really budge when you push back, it’s kind and empathetic, you can’t really influence it like you can influence other LLMs and… again: it’s strange. It’s very much like the movie Her, but imagine being the guy in the movie, *knowing* you’re in the movie and still playing along. It’s the most 2025 thing I’ve experienced in 2025. If you’re in any way curious about LLMs: try it.
- More thoughts (and titles) like this, please: [The Wizard and His Shell](https://terminal.click/posts/2025/04/the-wizard-and-his-shell/). Look, I love shells, I love terminals, I even got lucky and managed to contribute to Ghostty, but I also have to admit that, yes, maybe the text grid is not *it, *you know.

---

---

# Joy & Curiosity #33

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 30, 2025

---

At the start of this week I read [this post by Steven Sinofsky on tech going hardcore again](https://hardcoresoftware.learningbyshipping.com/p/229-tech-goes-hardcore-again) in which he quotes an older article of his, from 2005, that refers to this 1989 book called [Programmers At Work](https://www.goodreads.com/book/show/2092682.Programmers_at_Work), whose subtitle reveals what’s inside: “Interviews With 19 Programmers Who Shaped the Computer Industry”. I had read [Coders at Work](https://codersatwork.com/) many years ago, but didn’t know there was a spiritual predecessor to it.

So I immediately went and bought it used.

Then, a few days later, I re-discover a part of long-living file on my computer called “Mission Statement.md” that contains [my Programming Principles](https://bsky.app/profile/thorstenball.com/post/3ll7vqy7mec26). On line 237 I wrote the following: “The history of the software is as important as its future.”

Then, yesterday, the used copy of Programmers At Work arrives here. I open it and here’s the first paragraph I lay my eyes on, from the interview with [Charles Simonyi](https://en.wikipedia.org/wiki/Charles_Simonyi): 

> INTERVIEWER: What was your first professional program?
> 
> SIMONYI: The first professional program that I wrote was a compiler for a very simple, FORTRAN-like, high-level language. I sold it to a state organization as an innovation and made a fair amount of money, none of which I ever spent, since I left Hungary soon after.

Way to start your career, eh?

I browse through the book and end up on this paragraph, from [the interview with Andy Hertzfeld:](https://en.wikipedia.org/wiki/Andy_Hertzfeld)

> HERTZFELD: I found I had a talent for programming. A computer gives an amazing feeling of control and power to a kid. To think of something, and then get the computer to do what you thought of, was such a great feeling. It always has been. That's what attracted me to the field. Learning to program is like leaning to ride a bicycle; you can't read books about it. You have to do it.

For everything that’s changed since 1989, this hasn’t, has it? You can still think of something and get the computer to do what you thought of. And it’s still a great feeling.

---

- From [Sinofsky’s post](https://hardcoresoftware.learningbyshipping.com/p/229-tech-goes-hardcore-again): “Here we are in 2025, with all the companies having gone through layoffs, reduced benefits, and the vibe shift as some might say about focus on execution, delivering, and prioritization of important work. I think history will record that post-bubble era of perks and ‘Willy Wonka’ as the aberration and what we are seeing today as the best practice for innovation.”
- Let’s start with the quote and you have to guess the name of the article: “Computer architecture isn’t telling a machine what to do. It’s establishing the possibility that it can be told anything at all. The work is superhuman, if not fully alien. Put it this way: If you found the exact place in a human being where matter becomes mind, where body becomes soul—a place that no scientist or philosopher or spiritual figure has found in 5,000 years of frantic searching—wouldn’t you tread carefully? One wrong move and everything goes silent.” No, sorry, your guess is wrong, the article is called [Angelina Jolie Was Right About Computers](https://www.wired.com/story/angelina-jolie-was-right-about-risc-architecture) and it’s about RISC-V. Before reading, I knew what RISC was and I had heard about RISC-V, but didn’t really have a clue. The article put some meat on those acronymical bones.
- [ThePrimeagen was on the Lex Fridman podcast](https://www.youtube.com/watch?v=tNZnLkRBYA8) and they spoke for at least 5h20m, which is quite a lot and also why I haven’t listened to the whole thing yet. But I do love Prime and it made me very happy to see that he’s been given such a platform. He’s one of the nicest, kindest people I’ve had the luck of meeting online. Now, that being said: I do love [Lex’s view on programming with AI here](https://www.youtube.com/watch?v=tNZnLkRBYA8&t=15309s), it’s exactly how I feel about it, and I’m prepared to also record a 5h20m podcast with Prime in which I make him see the beauty in all of this.
- This is very, very good: [A Field Guide to Rapidly Improving AI Products](https://hamel.dev/blog/posts/field-guide/). Point two, about simple data viewers, is spot on in my experience. Best part is that it’s so easy to build them now.
- As someone who once wanted to be a magazine writer just like this one, I loved [Bryan Burrough’s review of Graydon Carter’s memoir](https://yalereview.org/article/burrough-vanity-fair-graydon-carter) about his 25-year run as Vanity Fair’s editor. It’s both a review of a memoir and a mini-memoir itself. It’s wonderful writing. While reading, I wrote in a note “urls!!” because this is one of the very, very, very rare articles that *links to other articles it discusses*. For example, it links to [this 1999 article by Burrough’s about Bernard Arnault’s attempted take-over of Gucci](https://www.vanityfair.com/news/1999/07/lvmh-gucci) with the great name “Gucci And Goliath”. If you’ve listened to the (fantastic) [AcquiredFM episode on LVMH](https://www.acquired.fm/episodes/lvmh) you know the backstory. But, back to Burrough’s article on Carter, isn’t this what working relationships should be about: “A connection of sorts was forged. After that, Graydon began calling me regularly; over the next fifteen years, probably three of every four stories I wrote were his ideas. I told myself, grandly, that I was ‘Graydon’s guy.’ I’m sure others thought something similar. His story ideas were simple. They often consisted of a single word. If, say, Rupert Murdoch was involved in something scandalous, he would call and say, ‘Wanna do Murdoch?’ We both knew what he meant, what I was to deliver.”
- Surprisingly, the second Wired article I read this week that was also good and also about something I knew but not really: [Inside arXiv — the Most Transformative Platform in All of Science](https://www.wired.com/story/inside-arxiv-most-transformative-code-science). It has a very spicy paragraph in it that you need to read (you’ll know) and this line: “In 2021, the journal Nature declared arXiv one of the ‘10 computer codes that transformed science,’ praising its role in fostering scientific collaboration. (The article is behind a paywall—unlock it for $199 a year.)”
- This article had its ten year anniversary this week, which is how I found it. Read it, please, I’m convinced you’ll be happy you did: [I Played ‘The Boys Are Back in Town’ on a Bar Jukebox Until I Got Kicked Out](https://www.vice.com/en/article/i-played-the-boys-are-back-in-town-on-a-bar-jukebox-until-i-got-kicked-out-832/).
- While we’re on the topic of “you’ll be happy you read this”,  let’s go back eleven years further into the past and read this Onion article from 2004 that should be carved into stone because every sentence (I swear: every sentence) in it is worth it: [Fuck Everything, We’re Doing Five Blades](https://theonion.com/fuck-everything-were-doing-five-blades-1819584036/).
- I wish I understood half of this post on [Scarcity and Abundance in 2025](https://alexdanco.com/2025/03/27/scarcity-and-abundance-in-2025/). The parts that I do understand (or, at least, think I do) are insightful: “If you try to put your finger on what exactly distinguishes the products that feel magical from those that feel like slop, you’ll notice something interesting. The pointless incumbent products – Genmoji or Text Summaries from Apple, ‘contextual’ anything from Google and Microsoft, that kind of stuff – express an ethos of *maximizing the value of a software asset* of some kind. There’s a whiff of attitude where “the codebase is the capital”, and the point of all these AI tools is to keep drilling for undiscovered value in the asset. Contrast this to everywhere I see people ravenously using new tools, like Cursor for coding, OpenAI Operator, or even fairly ‘basic’ uses like lawyers using NotebookLM to summarize case documents in a way they can listen to in the car. There is no concept of an ‘asset’ here; the value of the product to the user does not really depend on rich context, network effects, or some other obvious software incumbency. The software is just *doing work*, and the work is tangibly value-additive, even if it requires some human supervision.” I’m not sure whether I can really, clearly point out the distinction, but I think I can feel it?
- Thanks to the previous link I found out that Dwarkesh Patel wrote a book. It’s called [The Scaling Era](https://www.stripe.press/scaling) and I want you to turn sound on and go to this landing page. Then scroll and zoom and click & rotate and… yes. I love it, man. So, I bought the Kindle version (even though I’m still reading The Power Broker) and here’s the intro: "There’s a Sherlock Holmes story that captures our relationship with large language models. A new client comes to Baker Street. With a single glance, Holmes rattles off the man’s life story: that he lived in China, that he is a Freemason, that he writes a lot. The client, astonished, asks how Holmes knows all this. In great detail, Holmes explains the series of deductions that led him to his conclusions. The client responds, ‘I thought at first that you had done something clever, but I see that there was nothing in it, after all.’”
- [“We forgot how not to spy and steal attention"](https://ploum.net/2024-03-18-lost-focus.html) — good reminder, even if a bit shallow in places.
- This article on [v8 “leaving the Sea of Nodes”](https://v8.dev/blog/leaving-the-sea-of-nodes) is one of the best articles I’ve ever read on compiler IRs and, believe me, I tried to find nearly everyone I could a few years ago. When I was building my optimizing compiler, I read Cliff Click’s [PhD thesis](https://repository.rice.edu/server/api/core/bitstreams/c5ea1ab7-e6c6-41e7-8e06-3cd5b80aeccd/content) (Cliff Click, btw., is probably the greatest name in computers and the person who came up with [Sea of Nodes](https://en.wikipedia.org/wiki/Sea_of_nodes)) and couldn’t make a lot of sense of it. I read [the other paper](https://softlib.rice.edu/pub/CRPC-TRs/reports/CRPC-TR93366-S.pdf) and, I don’t know, kinda gave up on it and then went with a CFG in SSA-form. Now, I’m wondering, how much my decision was affected by not having articles that are *this *clear — look at the examples! the graphs! — and, in general, how many technical decisions are made like this.
- “If you’re new to tech – say, less than 5 years in the field – you should take career advice from people who’ve been in the industry more than 10-15 years [with enormous skepticism.](https://jacobian.org/2025/mar/13/beware-advice-from-old-heads/)”
- Very good post by Michael Lynch on [How to Write Blog Posts that Developers Read](https://refactoringenglish.com/chapters/write-blog-posts-developers-read/#show-more-pictures). I want to highlight one line here and disagree with half of it: “You can also use free stock photos and AI-generated images, as they’re better than nothing, but they’re worse than anything else, including terrible MS Paint drawings.” No, please, do *not* use stock photos in your blog. Never in the history of blogging has someone stopped and thought to themselves “huh, wow, that’s a good stock photo choice here” and no one ever will.
- [Ben Thompson interviewed Sam Altman](https://stratechery.com/2025/an-interview-with-openai-ceo-sam-altman-about-building-a-consumer-tech-company/). I caught myself thinking “that’s not as batshit crazy sounding as it did a few years ago” when reading this: “Where I think there’s strategic edges, there’s building the giant Internet company. I think that should be a combination of several different key services. There’s probably three or four things on the order of ChatGPT, and you’ll want to buy one bundled subscription of all of those. You’ll want to be able to sign in with your personal AI that’s gotten to know you over your life, over your years to other services and use it there. There will be, I think, amazing new kinds of devices that are optimized for how you use an AGI. There will be new kinds of web browsers, there’ll be that whole cluster, someone is just going to build the valuable products around AI.”
- Craig Mod launched a “a new members-only social network called ‘[The Good Place](https://craigmod.com/roden/102/#the-good-place)’”: “It’s no exaggeration to say that using Claude Code to build The Good Place (and also a bunch of other small tools and projects) is one of the most astonishing computing experiences of my life. It’s difficult to articulate how utterly empowering a tool like Claude Code (paired with malleable software, open software, open systems (i.e., *not* iOS/iPadOS)) is for someone like me.” Read on for his thoughts on social media and his social network. It’s very worth it.
- I have to admit: I’m a sucker for the word agency and I’m a sucker for anecdotes. No surprise then that I fell really hard for this, yes, *website*: [highagency.com](https://www.highagency.com/). Yes, it’s a single page that you can scroll through. How wonderful is that? That old saying of “this book should’ve been a blog post”? Well, this website is the opposite: it’s a website that knows exactly what it is and isn’t.

---

---

Bonus: this is a page from Programmers At Work and shows the wonderfully silly IconBounce program by Andy Hertzfeld:
[![](https://archive.thorstenball.com/data/images/160119439.joy-and-curiosity-33/640de2da-df92-4e27-aa20-c8137987e312_2412x1830.jpg)](https://archive.thorstenball.com/data/images/160119439.joy-and-curiosity-33/640de2da-df92-4e27-aa20-c8137987e312_2412x1830.jpg)
And, *yes*, the appendix does contain the program:
[![](https://archive.thorstenball.com/data/images/160119439.joy-and-curiosity-33/5a718bc3-e07d-4122-a73b-ffbb41e888eb_1470x1306.jpg)](https://archive.thorstenball.com/data/images/160119439.joy-and-curiosity-33/5a718bc3-e07d-4122-a73b-ffbb41e888eb_1470x1306.jpg)

---

# Joy & Curiosity #32

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 23, 2025

---

This time, as a little intro, a reading recommendation: the first half of [How Innovation Works](https://www.goodreads.com/book/show/52219273-how-innovation-works) by Matt Ridley. It’s a relatively short book, quick to read, and doesn’t contain any revelatory insights you can’t find anywhere else. But that first half — that’s what I recommend you read. I read it a year ago and constantly think of it.

In that first half, Ridley shows how innovation in different areas and industries — energy, transport, public health, communications, and so on — actually happened versus how we imagine it did. Apparently never in the history of innovation did a person scream “I got it!” upon discovering something new and the world replied with a loud “hell yes!”

When you read that first half, you see how unpredictable breakthroughs are, how many experts made completely wrong predictions, and how often truly important innovations were initially dismissed as boring or irrelevant.

When you finish it, you’ll have a new voice in your head, one that says “wait a second”, whenever something new happens or someone makes a prediction about what will happen. I find it very useful in times like these.

---

- As someone who’s read quite a few John le Carré novels and, while watching movies, often says to his wife “to be a spy! imagine!”, this was by far my favorite piece of news this week: [Rippling sued Deel](https://x.com/parkerconrad/status/1901615179718406276) after setting up a honey trap for one of their employees, whom they suspected of being a spy for Deel, and successfully caught him. The honey trap? Rippling mentioned a “defectors” Slack channel in a letter to Deel. The catch? Rippling went through the Slack audit logs to find one person — the spy — who searched for that channel name ten times within hours of the channel name reaching Deel. I love it. I didn’t know you could write lawsuites like that: “97. Deel-through D.S.—took the bait. Within hours of Rippling sending the letter referencing the #d-defectors channel-again, a channel that existed only as bait for Deel, and one which D.S. could not have known existed absent a connection between himself and Deel —D.S. ran the following searches in Slack” Tinker, Tailor, Rippling, Deel.
- [Benedict Evans on Apple’s AI features being delayed](https://www.ben-evans.com/benedictevans/2025/3/13/apple-innovation-and-execution): “I’m unsure how much of a disaster it is for Apple to ship what it described last summer in 2026 or 2027, and in the meantime push out a flow of more achievable individual features. On one hand, it’s not as though anyone else has what Apple described working yet, even Google. On the other, a year is a long time given the speed of AI progress right now” The line that I saved, though, is this one: "Yes, Apple could maybe make better seats than Collins Aerospace, but that’s not what it means to run an airline. Where can Apple change the fundamental questions?"
- [Will Larson with career advice for 2025](https://lethain.com/career-advice-2025/): “Sitting out this transition, when we are relearning how to develop software, feels like a high risk proposition. Your well-honed skills in team development are already devalued today relative to three years ago, and now your other skills are at risk of being devalued as well.”
- [Caspar Wylie](https://github.com/casparwylie) knew that I love ASCII diagrams and sent me a link to his web-based “ASCII diagram builder” called [CASCII](https://cascii.app/). It’s lovely! I’ve been a happy [Monodraw](https://monodraw.helftone.com/) user for 9 years now, but CASCII being on the web makes it very special.
- This [post with “some thoughts and predications”](https://andrewchen.substack.com/p/predictionsthoughts-on-vibe-coding) on vibe coding contains this angle from which to look at what’s happening: “If you compare to prior content creation trends, you could argue that the photos that people post online are a lot worse than what professional photographers post. Same with YouTube videos and what a filmmaker would create. But it doesn’t matter, simply because the sheer quantity of content […] make social media dominant. The same could be said of software.” What if what happened to photography will happen to software?
- “[Everyone wants the secret](https://jasonzweig.com/saving-investors-from-themselves-2/), the key, the roadmap to the primrose path that leads to El Dorado: the magical low-risk, high-return investment that can double your money in no time.”
- “But the fact of the matter is: if you wanna be good, you really don’t have a lot of choices. ‘Cause [it takes what it takes](https://www.youtube.com/watch?v=R0CAAlMo3f8).”
- All of the commentary on Apple in the last two weeks — Gruber’s [two](https://daringfireball.net/2025/03/something_is_rotten_in_the_state_of_cupertino) [posts](https://daringfireball.net/2025/03/a_postscript_on_the_singular_nature_of_mark_gurmans_reporting), Benedict Evans’ above — made me look up [Scott Forstall](https://en.wikipedia.org/wiki/Scott_Forstall) on Wikipedia. He’s the former Apple SVP who was (made?) responsible for the Apple Maps launch and when Maps was criticized for having too many errors and “when Apple issued a formal apology for the errors in Maps, Forstall refused to sign it. Under long-standing practice at Apple, Forstall was the ‘directly responsible individual’ for Maps, and his refusal to sign the apology convinced Cook that Forstall had to go.” I vaguely remembered that. But then Wikipedia kept surprising me. First wow: Forstall is now a Tony Award-winning Broadway producer. Second wow: did you know that in iOS 6 (which Forstall was responsible for) “the clock app used a design based on the trademarked Swiss railway clock, which Apple had failed to license, forcing Apple to pay Swiss railways a reported $21 million in compensation”? I didn’t and thought: what’s so special about the Swiss railway clock? And then read [that article](https://en.wikipedia.org/wiki/Swiss_railway_clock) and — Maps this, Broadway that — came to the biggest wow-moment of this particular Wikipedia ride: “The station clocks in Switzerland are synchronised by receiving an electrical impulse from a central master clock at each full minute, advancing the minute hand by one minute. The second hand is driven by an electrical motor independent of the master clock. It takes only about 58.5 seconds to circle the face; then the hand pauses briefly at the top of the clock.” I don’t know what I thought, but that’s not how I imagined station clocks to work.
- This collection of [AI blindspots](https://ezyang.github.io/ai-blindspots/) is remarkably good. Take this one, [Culture Eats Strategy](https://ezyang.github.io/ai-blindspots/culture-eats-strategy/): “If the LLM is consistently doing things you don’t like, you need to change its culture: you need to put it in a different part of the latent space.” Yes! Nearly everything changed for me once I understood how attention works in transformers and how, by writing a prompt, I’m navigating the latent space. The hard part is that this collection of AI blindspots will probably only make sense to you if you experienced them yourself. My advice? Go out there and throw everything you have at these models. Try this strategy, try that one, put this in context first, then the other way around. You need to build up an intuition and once you have it you realize that working with these models is not a coin toss, but that you *can* navigate the latent space, even if the road is wobbly.
- [Bill Hader on feedback](https://www.youtube.com/shorts/NHHZSNw9J2o): “When people give you notes on something, when they tell you it's wrong, they're usually right. When they tell you how to fix it, they're wrong.”
- In case you missed it: [Pierre](https://pierre.co/), a new code host, is now open to everyone. I’m obsessed with their landing page. This week, Jacob put out [this video](https://x.com/fat/status/1902762347237871652). I’m telling you: you could pay a marketing firm high six-figures and they would desparately try to make a video like this and fail.
- stevey wrote [a very stevey post](https://sourcegraph.com/blog/revenge-of-the-junior-developer) on the Sourcegraph blog that, underneath the jokes and predictions, contains some very subtle yet important points that are constantly lost in discussions not just around AI but tooling and programming in general. Right there, fourth paragraph: “How closely you choose to *pay attention* to the AI's work depends solely on the problem at hand. For production, you pay attention; for prototypes, you chill.” [The context in which we build software](https://thorstenball.com/blog/2020/09/15/the-context-in-which-we-build-software/) matters.
- I think [this comment](https://news.ycombinator.com/item?id=43447577) on stevey’s post is spot-on: “I have to think a lot of people just haven’t tried it in its best form. No, not a local model on your MacBook. No, not the web interface on the free plan. Go lay down $300 into API credits, spend a weekend (or maybe two) fully setting up aider, really give it a shot.” I don’t think you need $300. Make it $50. But if you’ve only ever tried ChatGPT two years ago, I can’t have a discussion with you about AI and programming in the same way I can’t have discussion about laptops and touchpads with someone who’s never held and tried a MacBook.
- [C.S. Lewis writing in 1959 to “Thomasine, a child in seventh grade”](https://andynaselli.com/the-collected-letters-of-c-s-lewis#:~:text=Write%20about%20what%20really%20interests%20you%2C%20whether%20it%20is%20real%20things%20or%20imaginary%20things%2C%20and%20nothing%20else.%20(Notice%20this%20means%20that%20if%20you%20are%20interested%20only%20in%20writing%20you%20will%20never%20be%20a%20writer%2C%20because%20you%20will%20have%20nothing%20to%20write%20about%20%E2%80%A6)): “Write about what really interests you, whether it is real things or imaginary things, and nothing else. (Notice this means that if you are interested only in writing you will never be a writer, because you will have nothing to write about …)” As a teenager I wanted to become a writer until I read somewhere that writing is a secondary skill: you need to be good or interested in something else, so you can then write about it.
- Boz on [How Not To Disagree](https://boz.com/articles/disagree): “In this scenario, many leaders sell out their management and rally the team. They say management sucks, but don’t worry, we will make progress in spite of them. This approach is staggeringly effective. Until it isn’t.”
- [This blog post](https://www.anthropic.com/engineering/claude-think-tool) by Anthropic is confusing and the name of what it’s about — the “think” tool — doesn’t help. My two sentence explanation: you say “here, think into this” and you hold open `/dev/null` and it thinks into it and that makes it better. It’s like saying to someone “make a list of pros and cons on a whiteboard” to improve their decision making process. My five word summary: holy shit, this is wild.
- [Paul Ford’s “What is code?” article](https://www.bloomberg.com/graphics/2015-paul-ford-what-is-code/) is now 10 years old and I still think of it regularly. Not only because of the writing (very good), and not only because of the design (it’s something you won’t forget), but also because: Bloomberg published it like this!
- Haven’t come across this Paul Graham essay from 2012 before: [Schlep Blindness](https://www.paulgraham.com/schlep.html). Schlep “means a tedious, unpleasant task. No one likes schleps, but hackers especially dislike them. Most hackers who start startups wish they could do it by just writing some clever software, putting it on a server somewhere, and watching the money roll in—without ever having to talk to users, or negotiate with other companies, or deal with other people's broken code. Maybe that's possible, but I haven't seen it.” It resonated right after those first two paragraphs. Made me wonder how Schlep blindness/aversion would map to [my two types of engineers](https://registerspill.thorstenball.com/p/two-types-of-software-engineers).
- [One of the most impressive things](https://x.com/DavidSHolz/status/1902421702690349071) I’ve ever seen a company build and gift.
- Good pairing if you enjoy thinking about consciousness: [Living Things Are Not Machines (Also, They Totally Are)](https://www.noemamag.com/living-things-are-not-machines-also-they-totally-are/) and [Joscha Bach in the five minutes following this timestamp](https://youtu.be/YVoXxYSiOBI?t=2655).
- [In search of the next great programming language](https://git.sr.ht/~robheghan/glogg/tree/main/item/docs/motivation.md): “reading code today is like reading baking recipes that includes details like exactly where in the kitchen the different ingredients are stored, but excludes the name and picture of the meal you're trying to prepare. The point I'm trying to make is that we should be communicating more with names and pictures, rather than a list of instructions in excruciating detail.” I’m not going to spell it out for fear of being accused of falling prey to the hype and so on, but: guess who’d also have better code understanding “with names and pictures”?

---

---

# Joy & Curiosity #31

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 15, 2025

---

This week, there’s not much to say here. I’ve been writing code like a maniac.

All week long, many hours every day, consistently ignoring my watch telling me it’s time to move, staring like a dog without a brain when my wife walks in and says she just wanted to check-in on me because I haven’t left the room in so many hours.

“It’s been a while since I’ve been *this *addicted to writing code,” I sent someone in a DM. I’ve never felt more in the right place at the right time, I thought to myself. 

---

- I urge you to read [this post by Simon Willison on how he uses LLMs to write code](https://simonwillison.net/2025/Mar/11/using-llms-for-code/). This is the link I need you to click on this week. It’s a calm post, a practical post, a thorough post, a post that — fuck it, I need to use the big words now — contains experience and wisdom. That’s right. I first wanted to write here that the *Context is king* section is the one I’d underline. But then I realized I’d also like to underline the *Tell them exactly what to do* section. And the one after that and, you know what, actually the whole thing. So, here we are — go and read.
- Last week I tried using ChatGPT in [deep research mode](https://openai.com/index/introducing-deep-research/) for the first time. I asked it how many hours people at Bell Labs worked during its peak innovation years, when Unix and C were developed. It surfaced [this personal memoir](https://quello.msu.edu/wp-content/uploads/2015/08/Memories-Noll.pdf#:~:text=as%20a%20burden%20and%20not,it%20was%20in%20the%201960s) that ends with the following observation: “People who worked at Bell Labs wanted to be there – it was hard to keep them away. They were there at night, weekends, and even holidays.” Now here’s the good bit. A day or two later I came across [this very interesting post](https://www.freaktakes.com/p/how-did-places-like-bell-labs-know) that asks “How did places like Bell Labs know how to ask the right questions?” and contains some very interesting observations on the realities of research & engineering but also this bit: “He noted that to get ahead at Bell Labs, ‘you were supposed to work on more than you were asked to work on.’ Still a bit of a newcomer to Bell Labs, he was right on this point. Mervin Kelly used to often tell new hires at Labs, ‘You get paid for the seven and a half hours a day you put in here, but you get your raises and promotions on what you do in the other sixteen and a half hours.’” Serendipitous is the word, I think.
- “[The point I'm trying to make](https://mirawelner.com/posts/TUM_thoughts.html) is that in classes, there is a ceiling on how well you can do. You get an A, or maybe an A+ if the professor does that sort of thing. […] When you are actually doing something in real life though, there is no ceiling.”
- Patrick and Mariano’s book is finally available: [WebAssembly from the Ground Up](https://wasmgroundup.com/). I haven’t read it yet, but over the last 2.5 years in which they worked on this I’ve seen bits and pieces — even got to review parts of a chapter! — and, man, the amount of care that went into it, consistently, over such a period of time? It’s impressive and I’m looking forward to dig into it.
- Big, big compiler and language news this week: [the TypeScript compiler is being rewritten in Go](https://devblogs.microsoft.com/typescript/typescript-native-port/). A lot of people with a lot of opinions wrote a lot of comments the day this was announced, yet few of them managed to reach the thoughtfulness of [Anders Hejlsberg’s post](https://github.com/microsoft/typescript-go/discussions/411#discussioncomment-12469481) in the GitHub discussion. *That*’s engineering. I did like [this comment](https://lobste.rs/s/3q0ei5/10x_faster_typescript#c_qvyfqi) though: “I looked at the repo and the story seems clear to me: 12 people rewrote the TypeScript compiler in 5 months, getting a 10x speed improvement, with immediate portability to many different platforms, while not having written much Go before in their lives (although they are excellent programmers). This is precisely the reason why Go was invented in the first place. ‘Why not Rust?’ should not be the first thing that comes to mind.”
- The TypeScript compiler in Go also immediately [nerd-sniped](https://xkcd.com/356/) someone into making escape analysis in the Go compiler for that project [faster by a factor of 5x](https://github.com/golang/go/issues/72815#issuecomment-2719445786). Now if this isn’t *it*, I don’t know what is.
- Nelson Elhage wrote about the [performance of the Python 3.14 tail-call interpreter](https://blog.nelhage.com/post/cpython-tail-call) and the post goes very well with my suggested pairing from [last week](https://registerspill.thorstenball.com/p/joy-and-curiosity-30) on performance: “If you’d asked me, a month ago, to estimate the likelihood that an LLVM release caused a 10% performance regression in CPython and that no one noticed for five months, I’d have thought that a pretty unlikely state of affairs!”
- After I posted about [a “workflow”](https://x.com/thorstenball/status/1899863976458309779) (these are airquotes) I sometimes use when debugging, with the intention being that I make fun of myself for being horribly inefficient because I don’t really know how to make the best use of debuggers, Rasmus said [something wise](https://x.com/rsms/status/1899868092676923449): “Debugger is for when things go wrong, printf is for understanding how things behave”.
- Maggie Appleton’s post is titled [Why You Own an iPad and Still Can't Draw](https://maggieappleton.com/still-cant-draw/) and yes, it’s about drawing, and yes, it mentions iPads, but it’s about much more than that, I’d say. It’s very good. “The Meat is the whole point of your illustration. What is your drawing about? What are you saying? Why does it matter?”
- [This post](https://www.builder.io/blog/cursor-tips) says it’s about Cursor and how get a lot out of it, but I think most of the tips in there apply even if you don’t use Cursor. This prompt, for example: “Write tests first, then the code, then run the tests and update the code until tests pass.” Everybody can one-shot 300 lines of code if they never run the compiler or the tests. The real magic happens when your AI has tests to validate its code against.
- This is [the hardest I’ve ever seen Gruber hit](https://daringfireball.net/2025/03/something_is_rotten_in_the_state_of_cupertino): “Concept videos are bullshit, and a sign of a company in disarray, if not crisis. The Apple that commissioned the futuristic “Knowledge Navigator” concept video in 1987 was the Apple that was on a course to near-bankruptcy a decade later.” There are more lines like this one in the piece. Hell, the title alone: “Something Is Rotten in the State of Cupertino”.
- Just added [googly eyes](https://sindresorhus.com/googly-eyes) to my macOS menu bar. I’m very glad I did — it has an “eyes size” slider in the settings! Highly recommend you also install it. Live a little. (I’m also now [waiting to add a virtual pet](https://docko.app/) to my macOS Dock.)
- [Always do Extra](https://www.bennorthrop.com/Essays/2021/always-do-extra.php). Great post.
- Remember [when I wondered](https://registerspill.thorstenball.com/p/how-might-ai-change-programming) whether we won’t see CONTEXT.md popping up and that they’ll be the robots.txt for AI tooling? Well, this week I found this: [svelte.dev/llms-small.txt](https://svelte.dev/llms-small.txt) — how neat is that? Then someone pointed me to [llmstxt.org](https://llmstxt.org/). It’s happening.
- It took me working in the Zed codebase to realize what an effect on overall happiness compile times can have. I knew about long compile times, of course, but that was *theory*. In practice, before Zed, I have never experienced what it’s like having to wait 45 seconds to try out a tiny visual change. It changes a lot of things: which changes you make and when, what you value in tooling, and so on. And all of that is to say: Zack’s piece here — [“I spent 181 minutes waiting for the Zig compiler this week”](https://zackoverflow.dev/writing/i-spent-181-minutes-waiting-for-the-zig-compiler-this-week) — gives a glimpse of what it can be like. “This means I spend even more time waiting on the compiler, because I need to use it just to check if my code is correct. This issue is made worse by the fact that when Zig encounters a compiler error in a particular function scope, it will stop running semantic analysis on that scope and report it back to you. This means that in a function scope with multiple errors, you need to discover and fix each error one by one, waiting 90 seconds in between.”
- Mary Rose Cook wrote another great post on developing software with AI: [Explore, expand, exploit](https://maryrosecook.com/blog/post/explore-expand-exploit). “Learning to build software with AI feels completely different. It’s much closer to learning a new discipline. Certainly, the old way of programming is relevant. But all the power comes from the new techniques in this new field that doesn’t even really have a name.”
- We were talking about how [MCP](https://www.anthropic.com/news/model-context-protocol) and agents and AI might change developer tooling at large software companies (“why shouldn’t you be able to ask an AI how to rollback a deploy on your first day? And why can’t the agent do it for you, after also getting permissions for you?”). I started to wonder whether “custom AI setup with all tools wired up” won’t end up being on a *The Joel Test*-like list in the future. That in turn made me re-read [Joel Spolky’s post](https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/) and, wow, published in 2000, it’s older than I remember and, wow, it’s mostly still valid, isn’t it?
- It was only yesterday that I wrote some code that either uses Claude 3.7 or Gemini 2.0, depending on configuration. I tried to wrap both clients as much as possible, thinking that it sure would be nice if I didn’t have to worry about any API specific things at all (the oldest of all programming dreams, isn’t it?). Then today I came across [RubyLLM](https://github.com/crmne/ruby_llm). Reading only through its README brought up all the feelings that made me enjoy using Ruby many years ago. Nice example of what programming in Ruby can look like.
- [Quinn](https://slack.org/) shared this post with me a couple of days ago: [Build a Team that Ships](https://nav.al/build-a-team-that-ships). It’s fantastic. I love it. I want to print it out. It perfectly describes what I’m doing at Sourcegraph right now. If you want to join me, live in Europe, and have seen the light and now know that AI will change developer tooling completely: let me know.

---

---

# Joy & Curiosity #30

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 8, 2025

---

I once worked at a company that had a big sales kickoff. The event was at a big hotel, and the entire sales team was staying there too.

On the second day, everyone got sick.

You could see it spread in near-real-time in Slack: "It got me too," "Uh now I feel it," "I won't make it to dinner."

Someone offered to share their medicine: "I have some Tamiflu if someone needs some. I'm in room 302."

An engineer, who wasn't attending the event but followed along in Slack, spotted a once-in-a-lifetime chance and posted: "Tamiflu is [for closers only!](https://www.youtube.com/watch?v=bkjfZctGMq8&t=26s)"

I think he got reprimanded for it, but I'll never forget him.

---

- [How fast can you open 1000 files?](https://lemire.me/blog/2025/03/01/how-fast-can-you-open-1000-files/) Daniel Lemire got nerd-sniped by a Jarred Sumner tweet and decided to find out how fast you can open files. The results are surprising: “The macOS system has a faster disk, faster memory and faster cores. Yet opening files is clearly much slower under macOS according to this test.”
- Probably the link of the week for me: [If your product is Great, it doesn't need to be Good](https://www.founderstribune.org/p/if-your-product-is-great-it-doesn-t-need-to-be-good-by-paul-buchheit), written by Paul Buchheit, creator of Gmail. He writes: “What's the right approach to new products? Pick three key attributes or features, get those things very, very right, and then forget about everything else.” By now, I agree. It’s the [German car door](https://x.com/nikitabier/status/1868429071140684175) again. Also: “If your product needs "everything" in order to be good, then it's probably not very innovative (though it might be a nice upgrade to an existing product)” Very good, short, succinct — highly recommend you read it.
- Another very good piece on products: [Avoid the nightmare bicycle](https://www.geoffreylitt.com/2025/03/03/the-nightmare-bicycle.html), by Geoffrey Litt. “One of the worst misconceptions in product design is that a microwave needs to have a button for every thing you could possibly cook,” he writes. The kicker is this: “Good designs expose systematic structure; they lean on their users’ ability to understand this structure and apply it to new situations.” I think these nine, very short paragraphs finally, finally articulated a lot of my struggles of the past years working on developer products.
- [Apparently](https://bsky.app/profile/gordon.bsky.social/post/3ljinnrymus2n), “BACK IN THE DAY, if you made a New Folder on a Korean computer, the folder was automatically named after a bird (‘new’ in Korean is homonymous w/ ‘bird’). If you made hundreds, the folders would start ‘begging’ through their names, like ‘I've run out of bird names,’ ‘Please stop’” — I don’t know and don’t want to know whether that’s true or not, but, naturally, I asked Claude to generate me an `mkbir` shell function so that I, too, can create folders that are named after birds and so that I, too, can see the computer beg after running out of bird names. And Claude did it in less than a minute, just based on the screenshot of that tweet. [Here it is](https://github.com/mrnugget/dotfiles/commit/7715d6a692ffc42fd5268d6fe40b9b9be4e12a2f). If others say that we’re drowning in “AI slop”, then let me be the one to say: it’s time to let a thousand flowers bloom, man, let the birds chirp.
- [Confetty](https://github.com/maaslalani/confetty) — it’s “confetti (or fireworks) inside your terminal.”
- In case you missed it: I was a guest on the Agents At Work podcast and had [a tremendous time](https://www.youtube.com/watch?v=J1-W9O3n7j8). It was not only a very enjoyable conversation (Jordi and I kept talking after the recording ended and only stopped because we had other meetings come up) but I think I also managed to share a lot of the thoughts I have on AI and the future of programming.
- This was surprisingly good: [40 Thoughts On Turning 40](https://newsletter.pathlesspath.com/p/40-thoughts-on-turning-40-287). Surprising because I assumed it would be filled with clichés, but it really wasn’t. It’s a good list.
- Rule #2 of the [Mustard Club](https://social.ayjay.org/2025/02/17/a-nice-little-inside-joke.html): “Every Member shall once at least during every meal make the secret sign of the Mustard Club by placing the mustard-pot six inches from his neighbour's plate.”
- I found out about the Mustard Club through [Robin Sloan’s newsletter](https://www.robinsloan.com/newsletters/) and that also lead me to this piece by him: [Is it okay?](https://www.robinsloan.com/lab/is-it-okay/) That’s the question he asks about AI models and how they’re trained and where the data comes from. It’s an interesting piece of writing — I can’t say I loved it and I don’t know whether that’s because the questions made me uncomfortable or whether I thought it had too many big words and felt too clever. In any case, I’m glad I read it and wonder now: what does he say about open-source models?
- If you haven’t: go install Claude.app and [add some MCP servers](https://github.com/punkpeye/awesome-mcp-servers). I know, I know: MCP is the acronym of the week and it’s very hard to see what’s so important about it. But if you don’t want build an agent yourself and see how magical it is, go and play with some MCP servers. It’s very eye-opening.
- Speaking of: [Geoffrey Huntley “decompiled” Claude Code](https://x.com/geoffreyhuntley/status/1895840073423389155?s=46).
- This paper about a futile [Attempt to Catch Up with JIT Compilers](https://arxiv.org/pdf/2502.20547) was very interesting. Futile? Yes: “We eventually discovered, that the optimized IC sequences are actually no faster than un-optimized ones. The experiments we present in this paper show that in the context of IC sequences, the micro-architectures already executed the extra memory reads of the C sequences early, and there is no benefit in removing them.” And: “None of the tools we tried, including performance analysis tools that use hardware performance counters and micro-architectural code analyzers, was able to predict or even unveil this hardware optimization” Imagine having to write this: “At best, it speeds up programs by 4.0% […]. At worst, it slows them down by 1.8%. On average, there is a 0.03% slowdown.“ The paper makes for a good pairing with Emery Berger’s [Performance Matters](https://www.youtube.com/watch?v=r-TLSBdHe1A). Performance is hard. (I do love the “Summary by Example” section in the paper. But [I don’t love](https://registerspill.thorstenball.com/p/use-data-that-looks-like-data) that they used “prop” as the name for a “property”)
- Fabien Sanglard dove into the history of the [FastDoom codebase](https://github.com/viti95/FastDoom) to figure out [“why fastDOOM is fast”](https://fabiensanglard.net/fastdoom/index.html). Fantastic stuff. If you need a definition of grit: “I wrote another go program to build every single commit. I will pass on the gory details of handling the many build system changes (especially from DOS to Linux). After an hour I had the most ugly program I ever wrote and 3,042 `DOOM.EXE`. I was pleased to see the build was almost never broken.”
- I’m writing a lot of TypeScript these days and, guess what, I like it, but I’m constantly confused by the ecosystem and the choices the ecosystem collectively makes. This short, zoomed-out overview of [“What is TypeScript?”](https://2ality.com/2025/02/what-is-typescript.html) was refreshing.
- Little curveball for you: Joe Delaney, one of my favorite lifting YouTubers, who has in recent years somehow transformed into somewhat of an Eric Cantona of lifting YouTube, with [advice after 20 years of lifting](https://www.youtube.com/watch?v=Qruk7jFmQTE). What he says at the timestamp that I linked to here, about “enjoyable is optimal”, took me many years to realize and matches an older draft that I in my notes called “do the thing that makes you do the thing.”
- Thomas Wolf, one of the co-founders of Hugging Face, wrote a very honest, very good article on [the Einstein AI model](https://thomwolf.io/blog/scientific-ai.html). I mean, read this: “I’ve always been a straight-A student. Coming from a small village, I joined the top French engineering school before getting accepted to MIT for PhD. School was always quite easy for me. I could just get where the professor was going, where the exam's creators were taking us and could predict the test questions beforehand.

That’s why, when I eventually became a researcher (more specifically a PhD student), I was completely shocked to discover that I was a pretty average, underwhelming, mediocre researcher. While many colleagues around me had interesting ideas, I was constantly hitting a wall. If something was not written in a book I could not invent it unless it was a rather useless variation of a known theory.” This ain’t no humble bragging. One of the questions Thomas asks is: are AI models just “good students”? “Some of the most recent AI tests are for instance the grandiosely named ‘Humanity's Last Exam’ or ‘Frontier Math’. They consist of very difficult questions –usually written by PhDs– but with clear, closed-end, answers. These are exactly the kinds of exams where I excelled in my field.” I won’t spoil it for you, but I find the last line in the article very fascinating, *motivating*. (To be honest: but maybe that’s only because I *wasn’t* a good student?)
- Pierre finally launched. You can sign up at [pierre.co](http://pierre.co). You don’t have to, but I need you to click and look at that landing page. Rumour has it that this is one of the most “eye-melting websites every invented” (fictional quote). I’ve played around with it a bit and it’s lovely, it’s *different*, and I couldn’t have predicted how much joy I’d feel for just *a different* code host to appear. Let a thousand code hosts bloom (and melt eyes)!
- [Discovered a cover of The Soul of a New Machine](https://bsky.app/profile/thorstenball.com/post/3ljou4lydyd2i) I’ve never seen before and now I want it framed. Some people asked me: do you recommend the book, should I read it? And the answer is: yes! It’s a very, very good book. I love it. Bryan Cantrill [wrote about it](https://bcantrill.dtrace.org/2019/02/10/reflecting-on-the-soul-of-a-new-machine/): “Since reading it over two decades ago, I have recommended *The Soul of a Machine* at essentially every opportunity, believing that it is a part of computing’s literary foundation – that it should be considered our Odyssey.”
- Not a big upgrade-my-OS-because-I-can kinda guy anymore, but I saw that [Instruments 16.3 contains a new Processor Trace](https://developer.apple.com/documentation/xcode-release-notes/xcode-16_3-release-notes). And since [I love Instruments.app](https://registerspill.thorstenball.com/p/did-you-know-about-instruments) I’m now considering upgrading macOS, just to play around with that Processor Trace.

---

---

# Joy & Curiosity #29

*Interesting & joyful things from the previous week*

By Thorsten Ball • March 2, 2025

---

This week was full of code and ideas and pushing and trying and discovering and throwing away and trying again and delight and joy and ease and hard problems and amazement.

It made me think: the most productive & joyful teams I’ve worked on were similar in some fundamental ways.

They were small (two to three people), barely had any process (code reviews only to get help; never approval), pushed & shipped every hour and every day, constantly talked to each other in unstructured ways, used what they built as much as possible and built plans purely based on what they discovered, made and re-made these plans every day, and put in the work.

And I’m starting to wonder whether everything else — the processes, the structures, the rules — isn’t a distraction. I mean, of course it isn’t, but… maybe it is?

---

- [Anthropic released Claude 3.7 and Claude Coder](https://www.anthropic.com/news/claude-3-7-sonnet). It already shot to #1 on the [Aider leaderboard](https://aider.chat/docs/leaderboards/). And it’s also #4 of the same leaderboard without, to quote Paul Gauthier, creator of Aider, “[WITHOUT USING THINKING](https://news.ycombinator.com/item?id=43164684)”. In my personal testing, Claude 3.7 has been mind-blowing. If you’re up for some weekend hacking, here’s something to try: build a tiny CLI application that lets you talk to Claude 3.7, with extended thinking, and give Claude three tools — `list_directory`, `read_file`, `run_terminal_command`. That’s it. That’s 200-300 lines of code. Then you run it and ask it to help you improve the program you just wrote.
- Also: did you ever notice [Anthropic’s 404 page](https://www.anthropic.com/thisshouldnotexist)?
- Mind-blowing how spot-on the title is: [crossing the uncanny valley of conversational voice](https://www.sesame.com/research/crossing_the_uncanny_valley_of_voice#demo). I just spent four minutes talking to Maya, forgetting that it’s Maya for ten seconds at a time.
- Imagine waking up and [someone tells you](https://github.com/Yuyz0112/claude-code-reverse/blob/998d6d7482d4233fbc1c4633e94ef7581beb88e0/scripts/learn-chunks.js): “You are a JS and opensource-software specialist, going to explain some uglified JS code.”
- Half of the Internet already linked to [this video](https://www.youtube.com/watch?v=0mCsluv5FXA) of someone running DOOM as TypeScript types and the other half has already commented on it saying how insane it is (it is!), so let me just add: not just the project, but the *video* is really, really good. It’s also 6m59s, go watch it.
- “Overall, the feeling is like those videos of Neil Armstrong on the moon. He’s bounding. Programming in the normal way feels like walking. You type out each expression, stepping incrementally toward your goal. When programming with AI, each move is bigger than a step. You lift off the ground. It requires more forethought, but, because you make more progress with each move, [it feels like flying.](https://maryrosecook.substack.com/p/become-an-ai-augmented-engineer)”
- [Benedict Evans, ruthless](https://www.ben-evans.com/benedictevans/2025/2/17/the-deep-research-problem): “OpenAI and all the other foundation model labs have no moat or defensibility except access to capital, they don’t have product-market fit outside of coding and marketing, and they don’t really have products either, just text boxes - and APIs for *other people* to build products.” Another stand-out line is this one: “This reminds me of an observation from a few years ago that LLMs are good at the things that computers are bad at, and bad at the things that computers are good at.“ I call this the fuzzy-to-non-fuzzy adapter.
- I love that John Siracusa is still out there, [shipping applications for the Mac](https://hypercritical.co/2025/02/25/hyperspace). If you’ve never read one of the Siracusa reviews of macOS, take a few minutes and read through [this bit on memory compression](https://arstechnica.com/gadgets/2013/10/os-x-10-9/#page-17) in the review of OS X 10.9 Mavericks.
- Here’s [a pot of gold for you](https://github.com/johnousterhout/aposd-vs-clean-code/blob/main/README.md). It’s summaries of discussions between “Robert ‘Uncle Bob’ Martin and John Ousterhout between September 2024 and February 2025”. It’s Clean Code vs. A Philosophy of Software Design. It’s actual code being discussed. It’s Ousterhout asking: “Bob, can you confirm that you stand by this code (i.e. the code properly exemplifies the design philosophy of *Clean Code* and this is the way you believe the code should appear if it were used in production)?” And Martin saying “Ah, yes” and then Ousterhout saying “there are many design problems” with the code and that it’s “chopped up so much (8 teeny-tiny methods) that it's difficult to read” and adding “those names are problematic even for someone who understands the algorithm” — for pages and pages and pages. I’ve only read half of it. But this is fantastic. This is real. They really, *really* talk about how to write code.
- So, DeepSeek apparently wrote their own “[high-performance distributed file system](https://github.com/deepseek-ai/3FS) designed to address the challenges of AI training and inference workloads” and, yes, that’s *sick*, but: the *name, *man. The name is fantastic: Fire-Flyer File System. Say that out loud. Say it again. *Right? *If I were one of the people working on it,* *I’d never say 3FS. It’s Fire-Flyer File System every time, all day long.
- [Developing Taste](https://emilkowal.ski/ui/developing-taste): “If you are a designer, you should be looking at great designs. If you are a writer, you should be reading great books. Expose yourself to great work, this way you'll learn how greatness looks and feels like.”
- [macOS Tips & Tricks](https://saurabhs.org/macos-tips) — I thought I knew macOS, but apparently I don’t. Going to try to use some of these.
- A glimpse into graphics programming and floating point numbers: [A Shader Trick](http://the-witness.net/news/2022/02/a-shader-trick/). Here’s a spoiler that isn’t a spoiler: “So the reason the fog is snapping after you play for a while is that the time sent to the shader system gets reset to 0 every 1000 seconds but the fog doesn't know about this. And the reason for the resetting is to make sure we maintain good precision in the time-based effects in the shaders.”
- [Long Ben Taub piece on the photographer Paolo Pellegrin](https://www.newyorker.com/magazine/2022/05/23/paolo-pellegrins-photographic-quest-for-the-sublime). It’s about a master photographer becoming blind. It’s about subtraction (“But now I find myself—let’s call it in the full maturity of my life—and I find myself doing the opposite, and that is that of subtraction”). It’s about mastery (“I have always found it mesmerizing to observe someone who is among the best at something, doing it as it ought to be done.”) and beauty (“How do you render an experience of the sublime? You address the idea of infinity”). It’s great.
- Shoutout to [Readwise Reader](https://readwise.io/read). Exceptionally well-made app. The focus on power-user features feels very rare nowadays. Love it.
- This post by Sarah Catanzaro was great: [Annotation for AI doesn’t Scale](https://www.amplifypartners.com/blog-posts/annotation-for-ai-doesnt-scale). “Instead of, for example, identifying trucks on a highway, now we have annotation tasks requiring domain expertise […] how do you decide which massive blob of code is better? […]. But as the coding tasks get longer and harder, it becomes harder for humans to catch bugs and other problems.” While and ever since doing fine-tuning last year, I keep thinking: this is fucking hard, really hard. Then I watched [this talk](https://www.youtube.com/watch?v=9vM4p9NN0Ts&t=4296s) that also says: this is really hard. (Click on the link — it’s timestamped — and watch 2-5min, to get a glimpse). Now Sarah’s saying it. (Also, side note, the “[original paper on RLHF](https://arxiv.org/abs/2203.02155)” linked in Sarah’s blog post is from 2022! *2022! *I thought it was at least 10 years older.)
- One of my pet topics is cyberwarfare and “state actors” and cyber spies and, well, [this post](https://securityscorecard.com/blog/inside-a-north-korean-phishing-operation-targeting-devops-employees/) about a “a North Korean Phishing Operation Targeting DevOps Employees” checked a lot of my boxes. Using a hijacked LinkedIn profile they tried to recruit someone for a DevOps role, lured them in, and gave them a coding exercise in a Bitbucket repository. But that contained a credential-stealing backdoor. Talk about the job market these days, huh.
- [Fantastic Morgan Housel piece](https://collabfund.com/blog/pure-independence/). Very, very, very good.
- In last week’s issue I shared my love for single-use websites such as[everytimezone.com](https://everytimezone.com). Love came back. [Mariano shared](https://bsky.app/profile/marianoguerra.org/post/3lix24uxees23) the following: [strftime.org](http://strftime.org), [flexbox.malven.co](https://flexbox.malven.co), [grid.malven.co](https://grid.malven.co), and [NoTengoEnie.com](https://www.notengoenie.com/) to easily copy the ñ character if you don’t have it on your keyboard. Last week my daughter asked me how to type an ö on the ANSI keyboard layout of the Linux laptop and instead of explaining to her how “alt-right is the compose key and then you just—”, instead I googled “oe” to get “ö” to show up. Maybe I should build IchHabKeinOe.de.
- I know, I know, I know, this sounds a bit fortune cookie, but I believe in this cookie: “Opportunities unfold as you execute. Not as you whiteboard. […] Everything changes the moment you start. New information surfaces. Constraints shift. Hidden doors appear that were invisible from the sidelines. […] [Execution is the unlock.](https://x.com/hnshah/status/1895291581105672230)“ I actually found myself in a discussion this week, before I came across the linked post, saying: “you can’t fix this by sitting at home, thinking, you have to *do* something, *anything*, to start figuring it out.”
- Taking a short break from The Power Broker, I read [this tiny book on creativity](https://www.goodreads.com/review/show/7364516074) by John Cleese. 112 pages. No big revelations inside, but it is charming and tiny and full of good reminders.
- gopls [now has a modernize tool](https://github.com/golang/tools/releases/tag/gopls%2Fv0.18.0). Interesting. Is this a shift in what language servers do? (You *could* take [the comments](https://cs.opensource.google/go/x/tools/+/refs/tags/gopls/v0.18.1:gopls/internal/analysis/modernize/sortslice.go) above each analysis function and feed them to an LLM and it would also modernize the code, I bet.)
- You don’t even have to click, just let this quote simmer: “[Two AI agents on a phone call realize they’re both AI and switch to a superior audio signal ggwave](https://x.com/ggerganov/status/1894057587441566081?s=46)”
- Here’s Edward Z. Yang on being on parental leave and using “[Cursor on an unfamiliar project](https://ezyang.tumblr.com/post/776331868164571136/eds-parental-leave-week-3-feb-23)”. I spent the past two weeks essentially doing nothing but coding, using Claude and a growing an agent, and can confirm how important it is to be “careful what you tell the model to do”, that they’re “fucking nuts at UI code” (I’m new to Svelte and Claude helped me actually create some really nice UI components). People laughed at the Prompt Engineering title but I think knowing what to say and which context to add is still 90% of the game.
- Jon Krakauer’s one of my favorite writers, but I didn’t know there’s a battle waging on YouTube in which one side’s trying to pull Krakauer’s *Into Thin Air* (one of my favorite books) down into the dirt. Until I read [this article](https://slate.com/culture/2025/02/into-thin-air-book-story-youtube-debate.html#).
- What I try to do with nearly everything: “[ritualizing ordinary moments makes them sacred. and when something becomes sacred, when you give it meaning, it gives meaning back to you.](https://x.com/ashwinreads/status/1893366611463037243?s=46)”
- Through [this article](https://www.dailyartmagazine.com/cabinets-of-curiosities/) I realized what a wonderful word Wunderkammer is. Cabinet of Curiosity doesn’t come close. Wunderkammer — wonder chamber, wonder room, except not quite. “Often they would contain a mix of fact and fiction and were collected from exploring expeditions and trading voyages. Honestly, it didn’t matter though, in spirit these cabinets were not meant to be scientifically accurate. Those who could afford to create and maintain them, could construct for themselves their own version of the world.“ What would my programming Wunderkammer contain? Or is *this* it?
- Somehow I ended up reading this whole speech by John Gardner, called [Personal Renewal](https://www.pbs.org/johngardner/sections/writings_speech_1.html). I copied out quite a few passages; too many to share here. Instead, here’s two to convince you to read this. “I'm not talking about anything as narrow as ambition. After all, ambition eventually wears out and probably should. But you can keep your zest until the day you die. If I may offer you a simple maxim, ‘Be interesting,’ Everyone wants to be interesting — but the vitalizing thing is to be interested. Keep a sense of curiosity. Discover new things. Care. Risk failure. Reach out.” Maybe I should chisel that into the wall of this newsletter? Or maybe this one here: "The future is not shaped by people who don't really believe in the future. Men and women of vitality have always been prepared to bet their futures, even their lives, on ventures of unknown outcome. If they had all looked before they leaped, we would still be crouched in caves sketching animal pictures on the wall"

---

---

# Joy & Curiosity #28

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 23, 2025

---

Last week, I offered my unused Linux laptop to my 7 year old. Let’s reinstall the operating system, I said, and then you can do whatever you want with the computer. I was hoping that an unexplored computer would fascinate her as much as it fascinated me when I was a kid.

For example, I told her, you can write letters to your friends and print them out. As imagination made her eyes go wide, I added that the printer is not a color printer. “It doesn’t matter!” That evening she printed her first letter.

Later, right before she was supposed to be sleeping, her voice came through the baby monitor that hasn't been a baby monitor for years but a slowly falling apart walkie-talkie: *…ksshhh… pshht… the computer even has a calendar! a calendar!!…*

---

- [Gina Trapani’s Life in Weeks](https://weeks.ginatrapani.org/) — wonderful website. The Internet should be full of websites like this one. (Aside: through that site I learned that Postlight was sold in 2022, to “NTT DATA, the biggest IT services firm you've never heard of, the company that invented the emoji.”)
- One million thousand times yes: “[Every line of code you write is a potential bug.](https://www.teamten.com/lawrence/writings/every_line_is_a_potential_bug.html) Do not write any line of code unless you absolutely need it *right now* and your program will suffer for the lack of it. Do not write routines speculatively. Do not write abstraction layers you don’t need right now.” It’s always surprising to me when I meet someone who’s programmed for a few years and *hasn’t* learned that lesson — where you have been? what have you *not* seen?
- If you only read one thing from this list, let it be Harper Reed’s description of his “[LLM codegen workflow atm](https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/)”. The different tools, the different approaches, the different prompts, the *meta*-prompts to get other prompts, the combination of tools — this is it, this is *it*, *this* is what you have to do to break through “I’m not sure about AI and LLMs” wall: you have to bang your head against it until, suddenly, it breaks and you realise that, oh, if I do this, and then this, and if this gets better, then… okay, I see.
- Came across this 2018 post by John Regehr, compiler man, about [The Basic Toolbox](https://blog.regehr.org/archives/1578). It’s aimed at new computer science students and reading through it gave me some funny feelings: yes, there was a time when I had none of these tools, wow.
- "Perfect code doesn't guarantee success if you haven't solved a real problem for real people. Pursuing elegance in a vacuum leads to abandoned side projects or frameworks nobody uses." That’s from Armin Ronacher’s wonderful and wonderfully-titled post [Ugly Code and Dumb Things](https://lucumr.pocoo.org/2025/2/20/ugly-code/). Thanks to that post I also learned that Sentry’s development philosophy includes “[embrace the duct tape](https://develop.sentry.dev/getting-started/philosophy/#embrace-the-duct-tape)”, which I loved, and Armin adds: “Yet as Sentry matured, much of our duct tape didn't stand the test of time, and was re-applied at moments when the real solution would have been a solid foundation poured with concrete.”
- These keep popping up and all of them seem to have a slightly different angle that makes them interesting: [codename goose](https://block.github.io/goose/) is an “on-machine AI agent, automating engineering tasks seamlessly”. But I’m not sure what “on-machine” means exactly, since it seems to talk to all the LLM providers we already know.
- Another one: [Claude Engineer v3](https://github.com/Doriandarko/claude-engineer).
- [What makes entrepreneurs entrepreneurial?,](https://muratbuffalo.blogspot.com/2025/02/what-makes-entrepreneurs-entrepreneurial.html) by Murat Demirbas, contains this golden nugget: “On his dream software team, he wants either Jeeps or Ferraris. Jeeps go anywhere. No roads, no directions—just point them at a problem, and they’ll tear through it. That’s effectual reasoning. Ferraris, on the other hand, need smooth roads and a clear destination. But once they have that, they move fast. He doesn’t want Toyota Corollas. Corollas are slow. Worse, they still need roads.”
- [Daniel Lemire](https://x.com/lemire/status/1892675948119814336?s=46) said “programming should be taught like music with repeated practice” in response to Gordon Cassie [wondering](https://x.com/gordon_cassie/status/1892667551429083321) whether “programming should be taught more like an instrument where you have a private hour long lesson with the teacher and then go away for the week and work on what you learned by yourself.” I thought of that exchange yesterday when I dropped my daughter off for her piano lessons, saying to her: it’s not the lesson, it’s what you do in between lessons.
- Another website lover’s website: everything you ever wanted to know about the [XOR](https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/xor/) operator and then some.
- Craig Mod shared [this gist](https://gist.github.com/cmod/be2e8faaeeae06bbf3841417a316ff70) with an Alfred script that takes rich-text HTML in the clipboard and turns it into Markdown — neat. But through that I found another website: [rich-text-to-markdown.com](https://www.rich-text-to-markdown.com/). Lovely! Not only because of how the Markdown is formatted (even though it’s strange?), but also: another single-use website! They’re amazing! [everytimezone.com](https://everytimezone.com/)! [bitwisecmd.com](https://bitwisecmd.com/)! If you have others, send them to me, please.
- [Analysis of the curl codebase](https://daniel.haxx.se/blog/2025/02/18/changing-every-line-three-times/https://daniel.haxx.se/blog/2025/02/18/changing-every-line-three-times/): “It means that every line in the product source code tree have by now been edited on average 3.5 times.”
- “N period on from now, software engineers who haven't adopted or started exploring software assistants, are frankly not gonna make it”, [writes Geoff Huntley](https://ghuntley.com/ngmi/). He also describes “six stages of AI adoption” and the last stage is “Engaged, realization that LLMS can be programmed and doing it”. I’m not sure how I would order any stages, but I have to say that [using LLMs programmatically](https://registerspill.thorstenball.com/p/judging-code) was the most lightbulby moment I’ve had in the past year.
- [Once relatable](https://serce.me/posts/2025-02-07-the-llm-curve-of-impact-on-software-engineers): “Many of your friends and colleagues are excited, and you want to be excited, but you just can’t. The AI is simply not there yet.”
- Good [post](https://www.bitecode.dev/p/a-year-of-uv-pros-cons-and-should) on “a year of [uv](https://github.com/astral-sh/uv): pros, cons, and should you migrate”.  I don’t particularly care about the challenges of the Python ecosystem, but I’ve found myself having to run Python code a lot in the past six months and uv always seemed like the solution to all my Pythonic problems, but I never really got the hang of it — until this post. It also taught me about [uvx](https://docs.astral.sh/uv/guides/tools/) and how I can use `uv run`.
- Here I wanted to link to [this post](https://web.archive.org/web/20250210033440/https://andysblog.uk/why-blog-if-nobody-reads-it/) that answers the question of why blog if nobody reads it? “You write because you think, because you observe, because you need to put it somewhere. If someone reads it? Bonus. If not? The work still got done.” Then I realised that the author moved the blog between the time I found it and the time I wanted to link it — another blogging lesson?
- Not sure how I didn’t know about [codecatalog.org](https://codecatalog.org/) but discovered it this week and spent quite a bit of time there. It’s a “collection of instructive code examples with annotations”, taken from open-source projects in different languages. That doesn’t say much, granted, but click through and look around. Each post is relatively short and mainly focused on the code — it’s nice.
- [Interesting post](https://thecreativeindependent.com/guides/how-to-feel-like-you-have-enough/) on scarcity mindset and why creative people are “so vulnerable to this kind of thinking”. I don’t think Steven Pressfield would agree with a lot here, but it’s interesting nonetheless.
- Thought-sparking: [Why Agent Experience Matters](https://biilmann.blog/articles/introducing-ax/). The prediction is bold: “Generic SaaS tools will increasingly be replaced by custom developed internal applications. […] As the cost of building and deploying continues to go down, the number of web apps and sites will explode. For all software companies, this shift demands a fundamental change in mindset: start consciously designing the AX** **of their products, or risk being replaced by tools that empowers their customers to harness the exponential power of seamlessly collaborating with agents.” I’d love to see “the number of web apps and sites” explode, but I’m not sure if the cynical part in me can ignore the echos of “if every website would just have an API” from a decade ago.
- [Satya Nadella was on the Dwarkesh Podcast](https://www.dwarkeshpatel.com/p/satya-nadella). Lots of big ideas and big thoughts and big questions, but my mind got stuck on what Nadella said about “what needs to happen with AI being introduced into knowledge work”: “[Lean](https://en.wikipedia.org/wiki/Lean_manufacturing) became a methodology of how one could take an end-to-end process in manufacturing and become more efficient. It's that continuous improvement, which is reduce waste and increase value. That's what's going to come to knowledge. This is like Lean for knowledge work, in particular. And that's going to be the hard work of management teams and individuals who are doing knowledge work, and that's going to take its time.”
- Waiting for Benedict Evans to comment on [this](https://x.com/a16z/status/1892612797948952863).
- I was reminded of [Joscha Bach’s first appearance](https://www.youtube.com/watch?v=P-2P3MSZrBM) on the Lex Fridman podcast. I remember exactly where I was when I first listened to it and how often I stopped walking to write something down. If you enjoy thinking, listen to this.
- Apple released a new iPhone this week. It’s called the iPhone 16e and most accounts were pretty calm about it: just another iPhone, but this one’s cheap. Other accounts, though, such as [this tweet by Mark Gurman](https://x.com/markgurman/status/1892255032344519066?s=46), pointed out that this isn’t just another iPhone release, but that it has the C1, the first modem developed by Apple itself: “The C1 Apple modem is a monumental technical achievement. A several billion dollar effort that has been in the works for 7 years. In the end it gets two sentences in the press release and 15 seconds in the announcement video. Apple is clearly downplaying this intentionally.” Now, some of you know that I’m a big admirer of Apple’s M-class chips and that I [still don’t know how they pulled them off](https://open.substack.com/pub/thorstenball/p/joy-and-curiosity-23?r=qgnq&selection=7a22dbfa-b6cb-4f7f-954c-5c4e8470ac86&utm_campaign=post-share-selection&utm_medium=web). And when I now read [Reddit comments like this one](https://www.reddit.com/r/apple/comments/1it9692/comment/mdn660t/) (“Many engineers have said that it might be near impossible to build this. I've been following the rumors for years and heard stories of how RF engineering is just impossible, with tons of weird edge cases, interference issues and unpredictable physics.”) or [tweets like this](https://x.com/michaelabuckley/status/1892336925886788044?s=46) (“you get to choose how you design the noise/attenuation environment inside a CPU, but a radio lives in the open world. So much institutional knowledge/magic in solving a zillion failure modes you can't just design/assume away.”) or [HackerNews threads like this one](https://news.ycombinator.com/item?id=33197429) about how hard it is to build a modem — I can’t help but wonder: are they pulling off another M1, except it’s now the C1?

---

---

# Joy & Curiosity #27

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 16, 2025

---

Keeping it short here, because I’m busy — in the good sense. It feels more like [spring](https://austinkleon.substack.com/p/the-creative-seasons) even though it’s the middle of February.

---

- Since I linked to a related piece up there, I also need to link to another Austin Kleon post: [I’m not languishing, I’m dormant](https://austinkleon.com/2021/04/26/im-not-languishing-im-dormant/). It made me stop feeling bad about going through different “creative seasons” and I’ll probably never forget about Michelangelo, “who lost four years of work to a lawsuit.”
- A reader shared Richard P. Gabriel’s [Rise of Worse Is Better](https://www.dreamsongs.com/RiseOfWorseIsBetter.html) with me. I read it many years ago and thanks to the reminder, read it again. “The New Jersey guy said that the Unix solution was right because the design philosophy of Unix was simplicity and that the right thing was too complex. Besides, programmers could easily insert this extra test and loop. The MIT guy pointed out that the implementation was simple but the interface to the functionality was complex. The New Jersey guy said that the right tradeoff has been selected in Unix -- namely, implementation simplicity was more important than interface simplicity.” Imagine rewriting the piece for today, but using programming languages instead of operating systems.
- Max created [a catalog of ways to generate SSA](https://bernsteinbear.com/blog/ssa/). Very helpful if you’re new to SSA. Wish I had had that years ago while working on my compiler.
- Last week, in the Sourcegraph office in San Francisco, I noticed that Erika, our Head of Enginering, had an ereader in her hand and asked whether that’s the new Kindle. “It’s a [BOOX Go Color](https://shop.boox.com/collections/all/products/gocolor7)”, she said, and that’s when I learned that there are ereaders that can run a Kindle app (required) and a Readwise Reader app, which I think might solve all of the read-it-later problems I ever had and now I’m seriously, seriously wondering what to with this new knowledge.
- Ghostty now comes with [alternative icons](https://x.com/mitchellh/status/1889436394487189662?s=46) and, man, it does feel anachronistic, this level of care and whimsy, does it not? We need more of that.
- Dwarkesh Patel wrote a post about [lessons from The Years of Lyndon Johnson by Robert Caro](https://www.dwarkeshpatel.com/p/lyndon-johnson) last year. I only read it last week and it’s very good. “The reason why Robert Caro is able to write so compellingly about these qualities of Lyndon Johnson - his resourcefulness and ruthlessness, his inexhaustible energy, his need to win, his inability to take no for an answer - is that the biographer shares many of the attributes of the subject.” I still haven’t reached 20% of The Power Broker, but I’ll make it, even if it takes me the whole year.
- I’m usually very anti-”kids these days” sentiments and very much a “fucking hell, wow, kids these days, let’s go” person, *but*… But. But… this week my wife shared with me that a friend’s friend’s daughter has a hobby called [hobby horsing](https://en.wikipedia.org/wiki/Hobby_horsing) and she then showed me a photo and I have to admit that I struggled very much.
- Remember how [I wondered](https://registerspill.thorstenball.com/p/how-might-ai-change-programming) whether we won’t see CONTEXT.md files in repositories? Well, you can now replace the `github` in every github.com repository URL with `gitingest` and you end up with something like that. Example: [gitingest.com/mrnugget/code-judger](https://gitingest.com/mrnugget/code-judger/)
- Just on the verge of falling into the hype: [AI or Die](https://www.rkg.blog/ai-or-die.php). “Winning in this new world requires a full ‘re-founding’ of your company. This is neither simple nor safe. […] But as my wife and I tell our sons…we don’t always get to choose what happens. But we do get to choose how we respond.” (I love that there is a .php in the URL — you don’t see that anymore, do you?)
- [This post saying “You are using Cursor AI incorrectly...”](https://ghuntley.com/stdlib/) turned out to be completely different from what I expected. The emerging patterns around AI tooling — I think that’s actually the most interesting thing happening today, not the changes in foundational models.
- Since Friday was Valentine’s Day and a lot of my readers are from the US, I have a treat for you: [Have You Ever Tried to Sell a Diamond?](https://www.theatlantic.com/magazine/archive/1982/02/have-you-ever-tried-to-sell-a-diamond/304575/) It’s one of “[the best magazine articles ever](https://kk.org/cooltools/best-magazine-articles-ever/)” and after reading it I couldn’t shut up about diamonds for a few weeks.
- I’m a sucker for [stories like this one](https://x.com/JohnArnoldFndtn/status/1888642915494244717): "When Enron filed for bankruptcy, I chartered a Gulfstream jet, put 16 people on it to Houston, and all we did was interview people at Enron for several days to understand what worked, what didn't work, how they made money, how they ran the business, what the competitive advantages were. I hired the entire leadership of the quantitative research effort at Enron. UBS bought the business except for the research team. We've made $30 billion in commodities since then. UBS shut the business down."
- Rob Pike presentation [On Bloat](https://docs.google.com/presentation/d/e/2PACX-1vSmIbSwh1_DXKEMU5YKgYpt5_b4yfOfpfEOKS5_cvtLdiHsX6zt-gNeisamRuCtDtCb2SbTafTI8V47/pub?slide=id.p). “It has become infeasible to understand how our software is constructed, and how to maintain it safely. This is a consequence of how code is built today.”
- [The Resilience of Alien Chess](https://www.markrabkin.com/the-resilience-of-alien-chess/) seems like a very good idea to keep in your mental pockets. The whole post is good, but this line stood out to me as probably the most crucial one: “We must recognize when the board has changed; if you miss it, it will cost you.”
- [Wild paper](https://arxiv.org/pdf/2502.01534): “In our work, we reveal this relatedness—akin to the overlap between training data and evaluation sets in traditional data contamination—would introduce a systematic bias of judge LLMs towards their related student models (i.e., the model distilled by the data generator which is related to the judge).” LLMs-as-judges favor relatives?
- Pretty much by chance, I ended up reading Nabokov’s short (actually short!) story [Symbols And Signs](https://www.newyorker.com/magazine/1948/05/15/symbols-and-signs) this Wednesday evening. I’m not sure I fully understood it, or if it’s meant to be fully understood, but it’s very good writing: “She thought of […] beautiful weeds that cannot hide from the farmer.” If you don’t have a New Yorker subscription, you can find it by searching, but mind you, apparently how this story was published, [mattered a lot](https://en.wikipedia.org/wiki/Signs_and_Symbols): “The *New Yorker* wanted to make many changes. Nabokov objected strongly […] However, the *New Yorker* version still contained four editorial changes that Nabokov eliminated in later publications. One was that the title was reversed as mentioned above. The second was that instead of numbers for the three sections, the sections were separated by ellipses. The third was that two paragraphs were joined into one.” Go and read it, then read the Wikipedia article. That’s 45 minutes spent well.
- “[Joel Spolsky had a nice analogy for this](https://x.com/justinhj/status/1890060350923612187?s=46); Mr Coffee. Enterprise software is not about making a coffee machine, it is about putting a coffee machine in every room for 1000s of hotels and maintaining them.”
- [James Somers](https://jsomers.net/), one of my favorite writers, sent around an email telling people about [Bracket City](https://bracket.city/), a word game a friend of his built, and that he’s now writing about [a word of the day, every day, under the /words endpoint.](https://bracket.city/words) That seems like a wonderful idea and I now need to crack a puzzle so I can get the word of the day every day via email. More importantly, though, James also reminded me of his 2014 post called “[You’re probably using the wrong dictionary](https://jsomers.net/blog/dictionary)”. If you haven’t read that, do it!
- Very much enjoyed Patrick’s last two posts: [Five coding hats](https://dubroy.com/blog/five-coding-hats/) and [Make it happen](https://dubroy.com/blog/make-it-happen/). “While I was booking that flight, I had a thought: Alan Kay lives in LA. […] So I sent him an email.”
- Sam Altman’s [Three Observations](https://blog.samaltman.com/three-observations). The most important one to me, someone who’s paid to do “software engineering”, seems to be this one: “the cost to use a given level of AI falls about 10x every 12 months, and lower prices lead to much more use.”
- I’ve been really enjoying the [Bg2 podcast](https://www.youtube.com/@Bg2Pod/videos) with investors Bill Gurley and Brad Gerstner. I won’t even pretend that I understand everything they’re saying (or what Gerstner is saying when he goes wild with numbers and predictions), but listening to them think through second-order effects is illuminating. Also: listen to the episode that came out right before DeepSeek released R1 — prescient, I think is the word.
- This book, [Bootstrapping Computing](https://buddybindery.com/products/bootstrapping-computing), looks so beautiful and I want to have it but I also know that I’ll never read through a hardcover book like this. Is it okay to have books only because they’re nice to flip through, because their presence inspires?
- Zach Holman on [Nontraditional Red Teams](http://Nontraditional Red Teams), containg at least “someone to look for dicks”, “someone with an ad blocker”, and “someone with a password manager.”

---

---

# Joy & Curiosity #26

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 9, 2025

---

Another quick dispatch. I need to go to the airport soon. Flying home after a week — a tremendous week — in San Francisco.

The tremendous week produced some very big thoughts. They’re in need of more thinking before I can share them, though. Instead, a collection of small thoughts:

- Forgot a lot about office culture in my six years of remote work. Scooched over to people that had their headphones in. Oof.
- It’s nice when a place is what it’s said to be. You come to San Francisco and there’s people in Patagonia vests, people carrying yoga mats, billboards telling you to hire an AI SDR, hills to walk up and down, logos of companies you know everywhere — on shirts, on backpacks, on buildings. Pleasant exception: I didn’t get stabbed.
- I wish that when people in California say “I miss the seasons” a hole would appear beneath them and swallow them up.
- Waymo! I rode in a Waymo last week and… Waymo! Waymo! Waymo! What else can you even say?
- A graph with a huge, towering spike on its right. Flatness to its left; years and years of flatness. That’s my Diet Coke consumption after this week.
- There’s a beautiful thing about jetlag: it makes you throw out all the rules and just go with it. Wake up at 4am? That’s the jetlag, it is what it is, let’s go with it. Tired at 8pm? It is what it is. Let’s go to bed. Awake from 2am to 4am? Just another day with the jetlag, let’s roll. It is what it is.
- Breakfast burritos!
- Water everywhere. You sit down and someone hands you a water. You check in to your hotel and they give you water bottles. You order beer and potato chips and they hand you beer and potato chips and water. You turn around and there’s a water station to fill up your glasses and bottles and mouths and bellies. Water in every hand. Makes you wonder whether Stay Hydrated isn’t a psy-ops campaign by Big Sewers.

Now, a small bag of links.

---

- antirez: [we are destroying software](https://antirez.com/news/145).
- Read [this](https://world.hey.com/davidsenra/working-backwards-insights-stories-and-secrets-from-inside-amazon-d81f5559) at 4:30am in the morning, the phone’s moon shining in my face, *it is what it is*, thinking: yes, yes, yes. Yes: “If we wanted Amazon to be a place where builders can build, we needed to eliminate communication, not encourage it.” Yes: “Jeff had one simple rule: ‘It has to be perfect.’ He'd remind his team that one bad customer experience would undo the goodwill of hundreds of perfect ones.” Yes: “Leaders have relentlessly high standards—many people may think these standards are unreasonably high.”
- Tim O’Reilly on [the end of programming as we know it](https://www.oreilly.com/radar/the-end-of-programming-as-we-know-it/). “What is programming, after all, but the way that humans get computers to do our bidding?”
- Richard and Roc are [switching to Zig, from Rust](https://gist.github.com/rtfeldman/77fb430ee57b42f5f2ca973a3992532f). “Did I mention compile times? I'll reiterate: compile times are a huge deal.”
- Wonderful Craig Mod [on his rules for running his membership program](https://craigmod.com/essays/membership_rules/): “Books are one of the greatest bulwarks against kleptocracy and authoritarianism because they hone focus, attention, and can imbue a mind with calmness required to take clear action: Qualities required by a society to ‘win.’ To be reductive (and somewhat alarmist): The feed, the doomscroll, the hyperventilation, is the heartbeat of political and social death. It is not life. It is a false heartbeat.”
- Reminder of [how venture capital works](https://techcrunch.com/2022/08/17/how-venture-capital-works/). The article talks to founders. I think engineers must know too. An analogy I often use: music labels in the 70s, 80s, 90s. Labels gave a lot of bands the money to record their first album. It didn’t really matter if that album became a hit or not. What matterered is that of all the albums that were recorded, one was Guns N’ Roses’ Appetite for Destruction.
- Robert Caro on why he doesn’t use a computer for writing: [“stop thinking with your fingers.”](https://youtu.be/Hh8zco6KQdc?t=1875)
- [Pinboard on AI & whales & seafaring](https://x.com/pinboard/status/1885704983250616733?s=46): “I think the public is unaware to what extent AI developers accidentally harpooned a whale and are now just water-skiing behind it, making confident predictions.”

---

Special insert this week: a conversation I had yesterday with a friend.
[![](https://archive.thorstenball.com/data/images/156797664.joy-and-curiosity-26/3ca1e6f1-4095-485d-9e62-0a488e921285_1566x1770.png)](https://archive.thorstenball.com/data/images/156797664.joy-and-curiosity-26/3ca1e6f1-4095-485d-9e62-0a488e921285_1566x1770.png)
*(If you have extraordinary ability and want to work with me to build the best possible developer tooling to navigate latent space: let me know.)*

---

---

# Joy & Curiosity #25

*Interesting & joyful things from the previous week*

By Thorsten Ball • February 1, 2025

---

Dispatch from the airport. I’m on my way to San Francisco. Arriving today, Saturday, leaving next Sunday. If you’re in town — Japantown, it’s called — and want to grab a coffee this week, let me know, even though I can’t tell you much more about my availability than the fact that there will be some.

It’s also my birthday tomorrow, I’ll be turnin— Hey, ever noticed how the people at the airport who bring a dedicated *mouse* to use with their laptop, they’re never using a MacBook, are they? Long live the MacBook trackpad, I say. Anyway! I’ll see you in San Francisco or on the Internet and until then: here are some links.

---

- The system prompt for OpenAI’s [Operator](https://openai.com/index/introducing-operator/) leaked and, as with all system prompts that have leaked so far, the dichotomy between the name “system prompt” and [its contents couldn’t be more marvelous](https://github.com/wunderwuzzi23/scratch/blob/master/system_prompts/operator_system_prompt-2025-01-23.txt): “If you recognize a person in a photo, you MUST just say that you don't know who they are” is a good line, as is the thought-provoking pleading with the robot to not lie about its robot-ness: “The user must take over to complete CAPTCHAs and ‘I'm not a robot’ checkboxes.”
- Jimmy Miller on [Discovery Coding](https://jimmyhmiller.github.io/discovery-coding): “For me, this is the only way I can do anything. Anytime I try to outline before I write code, my outline is thrown away within hours of writing code. My design docs that are written beforehand are wholly unsatisfying, even if they get approved. It is only as I begin writing code that I begin to understand my problem.” I always thought of this as a [Tracer Bullet](https://wiki.c2.com/?TracerBullets), because that’s how I remembered it from reading Pragmatic Programmer, but now, rereading the definition, it seems it’s slightly differnet: a tracer bullet “involves short cycles of development, then delivery and asking the customer if it's closer or further from what they think the target is.” Be that as it may: I think both are fantastic methods of approaching difficult projects.
- Been meaning to implement [ReAG, Reasoning-Augmented Generation](https://www.superagent.sh/blog/reag-reasoning-augmented-generation), because it’s an interesting idea and I wanted to see what DeepSeek’s R1 can do, but, alas, DeepSeek’s API was down every time I tried. Still: interesting blog post, even though I’m not sure It Will Scale, yknow.
- Fantastic and thorough post about NVIDIA, its stock price, and how the future of AI might affect it: [The Short Case for Nvidia Stock](https://youtubetranscriptoptimizer.com/blog/05_the_short_case_for_nvda).
- Ben Thompson, [writing about DeepSeek, NVIDIA, OpenAI and the rest](https://stratechery.com/2025/deepseek-faq/): "The arrogance in this statement is only surpassed by the futility: here we are six years later, and the entire world has access to the weights of a dramatically superior model. OpenAI’s gambit for control — enforced by the U.S. government — has utterly failed."
- [This thing](https://www.wrecka.ge/against-the-dark-forest/), titled “Against the dark forest”, was *interesting: “*Global mega-platforms under capitalism are *structurally incapable* of handling the business of civilization: of governance, of providing genuinely public infrastructure, of making knife-edge decisions about the balance of liberties and securities.” But, I fear, if you strip the article of all the fancy words and references and citations not much will be left.
- [This post](https://mort.coffee/home/wayland-input-latency/), providing “hard numbers in the Wayland vs X11 input latency discussion”, brought back a lot of memories. I spent quite a few weeks this past summer helping with [the Linux version of Zed](https://zed.dev/linux) and I didn’t walk away from that experience with love in my heart for X11, Wayland, or, honestly, the whole ecosystem surrounding both. The Lobsters discussion of the post provides a glimpse of what you end up with if you keep discussing things on a technical level when the problems have long transcended technology. Tangentially related: this [comment here](https://lobste.rs/s/oxtwre/hard_numbers_wayland_vs_x11_input_latency#c_qqpoda) — “I created a test setup using a Raspberry Pi Pico running CircuitPython and a USB HiD library to emulate mouse clicks. I connected button switch to a GPIO pin and polled the state of the pin to send mouse click events over usb to my laptop.” — made me wonder how much better applications on Linux would be if there was an Instruments.app.
- I cannot tell you how I ended up reading [this post](https://ryjo.codes/articles/a-simple-tcp-server-written-in-go-and-clips.html) called “A Simple TCP Server Written in Go and CLIPS” but it was fascinating. Probably because I didn’t even know what CLIPS was and only after reading found out that [CLIPS](https://www.clipsrules.net/) was “developed at NASA’s Johnson Space Center from 1985 to 1996” and “the C Language Integrated Production System (CLIPS) is a rule‑based programming language useful for creating expert systems and other programs”.
- Learned about [DJR fonts last week](https://djr.com/) (beautiful!) and through that found [Fonts In Use](https://fontsinuse.com/) which is lovely.
- Didn’t expect these [51 seconds of “Intel 486DX2 66mhz Startup Sounds”](https://www.youtube.com/watch?v=SUvlWt9WTKA) to bring back that many memories. Man, I do miss the sound of harddrives.
- While thinking about AI generated code, I often think of [this Chad Fowler talk](https://www.youtube.com/watch?v=sAsRtZEGMMQ&t=1571s) that I’ve seen, probably, 10 years ago: “Let's just get into a habit of throwing code away and if it's this big it doesn't matter. Just throw this little piece away. So it's really easy to upgrade and it's really easy to think about new things and change whatever else. [...] It starts to already force this idea that the system is a thing and the cells are a thing” This talk was given before we all realised that micro-services don’t solve all problems and yet I think the idea of the system as a regenerating entity with cells that it sheds — I think there’s something to that.
- Did you know that, on macOS, [you can right-click the Activity Monitor icon in the Dock](https://news.ycombinator.com/item?id=42883175) and tell it display current CPU or memory usage?
- I want to book one of those planes that pull a banner behind them and print on the banner a quote from [this piece](https://ckarchive.com/b/wvu2hghk5m82zf9r552rqtn34kzxxc8): “If you’re roughly 70% happy with a piece of writing you’ve produced, you should publish it. If you’re 70% satisfied with a product you’ve created, launch it.” It’s a great bit of writing that I’ll share a lot in the future — on a banner in the sky or via URL.
- Short [post on “Growing Up at the Dawn of Cyberspace”](https://www.chrbutler.com/digital-reality-digital-shock) that, again, like many other bits of writing, made me think the obvious thought of how important it is to know the history of the field you’re working in.
- “[This PR](https://github.com/ggerganov/llama.cpp/pull/11453) provides a big jump in speed for WASM by leveraging SIMD instructions for `qX_K_q8_K` and `qX_0_q8_0` dot product functions. Surprisingly, 99% of the code in this PR is written by DeekSeek-R1.”
- Nelson Elhage, who’s worked at Anthropic for three years, [finally gave Claude a proper spin](https://blog.nelhage.com/post/personal-software-with-claude/) and: “I’m fascinated by my own reactions to and thoughts about Claude” As if that weren’t enough: “*even as I drafted this post*, I noticed a familiar sort of goalpost-shifting in my own mind! I find myself shifting from surprise and amazement into a sort of almost-jaded minimization.” AND: “I feel like this project made me feel a sense of personal excitement and enthusiasm for building software with Claude / other LLM assistance, in a way I hadn’t personally felt before.”

---

---

# How might AI change programming?

By Thorsten Ball • January 30, 2025

---

AI will change programming. I’m convinced of it now.

How can it not? We now have machines into which we throw two, three sentences of instructions and out come hundreds of lines of perfectly working JavaScript or Python code.

Claude generated [a 75-line Python script](https://gist.github.com/mrnugget/e28471a9ba1402e16fb7150d6c4e1129#file-fetch-register-spill-py) to turn the RSS feed of this very newsletter into a Markdown file. Worked on first try. Claude also generated [this Python script](https://gist.github.com/mrnugget/e28471a9ba1402e16fb7150d6c4e1129#file-sync-funny-tweets-py) to sync a Google Drive folder to a local one. Claude generated [this entire Tailscale MCP server](https://github.com/mrnugget/tailscale-mcp/blob/a392e691524d068fab636ad09fb5a9002d6863c8/tailscale.py) after 15min of back and forth. Claude wrote [219 lines of Rust](https://github.com/mrnugget/code-judger/blob/822e89016d7867e29561d1d4fa7de2c707da013c/src/main.rs) for me so I can use Claude itself to make assertions about other code. DeepSeek R1 then improved the prompt itself. To double-check myself, I just had Claude generate a small server in Go that serves the Markdown files in the current folder, rendered as HTML, including syntax highlighting. Worked perfectly after removing an unused variable.

Yes, I know it might not work for you in your codebase. It certainly doesn’t work for me in many contexts. But my point is this: even if it will never work for everyone everywhere, even if all progress were to stop today, the fact that AI has made the writing and rewriting of a certain type of code very cheap will change programming.

It will change programming like compilers changed it. Like the Internet changed it. Like version control, automated tests, StackOverflow, and formatters changed it. Like WordPress changed how we build websites for clients.

The question is how exactly.

Here’s what I’m wondering about:

- Will we never see another new programming language reach the mainstream, because LLMs aren’t trained on code in that language and thus there won’t be enough people writing code by hand to create enough training data?
- Will we see languages that are optimized for synthetic data generation, allowing for millions of lines of code to be easily generated and verified, and languages having their own training data set?
- Will we change how we modularize code and switch to writing many smaller programs because they’re easier for LLMs to digest than large codebases?
- When will we store the prompt alongside the code it generated? Later, will we move from storing code to storing prompts, generating both code and commit messages on demand? What else will shift from write-time to read-time?
- What will change once we start to optimize code and processes around code purely for the reader, because the writer’s a machine?
- Will we write docstrings at the top of files that aren’t meant to be read by humans, but by LLMs when they ingest the file into their context window? Will we see better documentation of best practices and idioms in large companies, because `best_practices.txt` is easy to put in context?
- Will popular libraries and frameworks become even more dominant because they’re in the training sets?
- Will `CONTEXT.md` become the new `robots.txt` — a file telling LLMs how to understand our code, our repositories, our websites?
- Will there be a new kind of technical debt, where code is optimal to be understood by the current AI models, but becomes problematic when the models change?
- Will compilers change to allow for faster verification of LLM-generated code? Will they change their error messages to contain more context so that it’s easier for LLMs to fix these errors?
- Will we see a melting of language servers and LLMs?
- Will code become more verbose because a `processUser(user, rules)` function call is harder to understand for an LLM than `validateAndStoreNewUserInsideTransaction(user, validationRules)`?
- Will code be optimized for how it’s encoded into tokens?
- Will techniques that trade code density for performance, such as loop unrolling, become popular because loops won’t have to be unrolled by hand? Will the default FizzBuzz solution contain an array of 100 values that were written out by an LLM?

---

---

# Joy & Curiosity #24

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 26, 2025

---

Friday was my last day at Zed.

It was a year that, in many ways, couldn’t have been fuller. Full of new things to learn, full of code, full of new experiences and ideas and ways to do things.

I had hundreds of pairing sessions with some of the best programmers in the world, and despite feeling completely like a beginner again in this big, unknown codebase, next to one of the most talented teams I’ve ever worked with, I also managed to get nearly 500 PRs merged. I shipped features and bug fixes, learned about GPUs, async Rust, X11, Sum Trees, SSH, and quite a few other things. I fine-tuned LLMs, wrote 14 blog posts, recorded podcast videos, and even gave a lightning talk.

But, paradoxical as it sounds, even though it was a full year, I was still missing something and I realised that this is not what I want.

And now, guess what, I’m going back to Sourcegraph. 

That’s right. Back to the company I joined in 2019 and left at the end of 2023. This is not a decision born out of a let’s-get-back-to-the-known feeling. I talked to a few companies before deciding to go back. But after talking to them and spending many evenings thinking about where software is going and where I want to go and what I want to see and what I want to learn, I realised that there is no other choice — I have to go back to Sourcegraph.

In 2019, when I first joined, I was interested in language servers and compilers and working with Go. Now, I’m rejoining because I truly believe that programming is changing in fundamental ways. In a few years developer tooling will look very different and I want to be at Sourcegraph while that happens. Because Sourcegraph is not only positioned incredibly well to benefit from these changes, but also because Quinn & Beyang realised quite early that things are and will change and Sourcegraph’s now at the heart of it.

By being there, I’ll now get to see and understand and work on and write about all of these fascinating things and, man, I couldn’t be more excited. What a time, what luck.

---

- Jerry Seinfeld in [this New Yorker interview from last year](https://www.newyorker.com/culture/the-new-yorker-interview/the-scholar-of-comedy) that I somehow missed: “Because the only thing in life that’s really worth having is good skill. Good skill is the greatest possession. […] It was a very Zen Buddhist concept: Pursue mastery. That will fulfill your life. You will feel good. I know a lot of rich people. So do you. They don’t feel good, as you think they should and would. They’re miserable. Because, if they don’t master a skill, life is unfulfilling.”
- In that interview, Seinfeld referred to an old issue of Esquire magazine that revolved around the topic of mastery. Trung Phan found it and then wrote [a great post on Seinfeld, the Esquire issue, and mastery](https://www.readtrung.com/p/jerry-seinfeld-ichiro-suzuki-and). The bit on plateaus I found very interesting, because I’ve always looked at plateaus at something negative: “even if you’re shooting for the stars, you’re going to spend most of your time on a plateau. That’s where the deepest, most lasting learning takes place, so you might as well enjoy it.” I can see how *learning* (as opposed to progress) can take place on a plateau, but I mainly like the perspective of trying to enjoy plateaus, because, hey, what else are you going to do? “What is mastery? At the heart of it, mastery is staying on the path.”
- Robert Caro’s [personal library](https://www.washingtonpost.com/books/interactive/2025/robert-caro-personal-library/) is wonderful. Made me think that I should buy more printed books. But that won’t happen, of course, since I can never give up the Kindle.
- Nodded along to most of these[lessons over a career](https://typecraft.dev/newsletters/2025-01-08/lessons-learned-over-a-career), but then read this: “When I started out, I believed my manager’s job was to define my career path, advocate for my development, and help me grow” Wait, what? That idea — someone else defines my career path — seems so wild to me that I have a hard time believing someone else really thought that.
- In my life I had previously never really thought about how anti-cheat systems for games are implemented, so while reading about this effort to[reverse engineer the anti-cheat system in Call of Duty](https://ssno.cc/posts/reversing-tac-1-4-2025/) I kept thinking “this is wild, wow, I mean, yeah, of course you’d have to, but… wow.”
- Interesting signs of the times: for the past few weeks I’ve seen people praise [The Brutalist](https://www.imdb.com/title/tt8999762/) and even remarking how small the budget was compared to other big movies. Then [it was revealed they used AI](https://x.com/ashotmagazine/status/1880789755262292353) for some of the film and that AI was one of the reasons for the budget being so low. And *that* then [made people mad](https://x.com/batsdune/status/1880876770012053524) and where people once might have said “masterpiece”, now the word “slop” is used. At the same time, Paul Schrader, who worked with Scorsese as a screenwriter on Taxi Driver, said [he was impressed by how good AI is](https://x.com/AISafetyMemes/status/1880695805037965708) and that “in five seconds it responded with notes as good or better than I’ve ever received [from] a film executive” — then people got mad at Schrader.
- On Wednesday I [wrote about using LLMs-as-judges](https://registerspill.thorstenball.com/p/judging-code). I hope you realise that you can also [judge LLMs-as-a-judge](https://arxiv.org/pdf/2306.05685), right?
- Or you use “[Classic ML to cope with Dumb LLM Judges](https://softwaredoug.com/blog/2025/01/21/llm-judge-decision-tree)”
- Johnny Marr [on creativity & craft](https://thecreativeindependent.com/people/musician-johnny-marr-on-enjoying-the-process-no-matter-the-outcome/): “Great writers and great novelists and great musicians know that creativity is work. All the greats know that. Only amateurs think that an idea or inspiration is just going to fall through the sky, and that you’re going to be a genius straight away. But I also think people are just too hard on themselves. The Picassos of the world, the Paul McCartneys of the world, and lots of the people that I’ve been very privileged to work with, they know that it’s okay to suck sometimes. It’s better to actually just show up and get the thing done.”
- In case you’re in need of some long-form writing: I re-found The Electric Typewriter and [its list of 150 great articles & essays](https://tetw.org/Greats) in my bookmarks.
- The list reminded me of this Ben Taub piece in the New Yorker from a few years ago: [Thirty-six Thousand Feet Under the Sea](https://www.newyorker.com/magazine/2020/05/18/thirty-six-thousand-feet-under-the-sea). “To be able to write like that”, I thought, and then looked up Ben Taub again and [his Wikipedia entry](https://en.wikipedia.org/wiki/Ben_Taub_(journalist)) contains these two amazing sentences: “In 2012, during a year off from Princeton, he was a contestant on The Voice, on CeeLo Green's team. Six months later, he used the stipend from appearing on the show to fund his first trip to Kilis and the Turkish-Syrian border, to learn how to be a war correspondent.”
- Patrick and Mariano wrote [a WebAssembly compiler that fits in a tweet](https://wasmgroundup.com/blog/wasm-compiler-in-a-tweet/). Now, this, this is The Good Stuff.
- Every heard of [ni](https://github.com/antfu-collective/ni)? I found it half a year ago and every time I’m in a JavaScript project and type my way through `yarn i, pnpm i, npm i` to find the right one, I’m reminded of it and I ask myself: surely there has to be a better solution for an ecosystem with too many package managers than to… invent another package manager?
- Talking ‘bout dependencies: [Armin wrote a great post on dependencies](https://lucumr.pocoo.org/2025/1/24/build-it-yourself/) that’s called “Build It Yourself” and if he were to run to be elected to the Board of Code on the Internet and he kept this line in his stump speech, I’d vote for him: “It's time to have a new perspective: we should give kudos to engineers who write a small function themselves instead of hooking in a transitive web of crates.”
- I haven’t read [the paper](https://arxiv.org/pdf/2501.12948) yet, but DeepSeek’s R1 model seems to have shook up quite a lot of things this week. Watching the theories blow past me — “They did it with only $5m! The US is toast!” “They’re lying, it’s a front for the Chinese military.” — I can’t help but think that these are, if nothing else, exciting times. (And I also want a John Le Carré-style novel on US vs. China AI labs.)
- Georgi Gerganov, creator of [llama.cpp](https://github.com/ggerganov/llama.cpp), published [llama.vim](https://github.com/ggml-org/llama.vim) — LLM-assisted autocomplete in Vim, powered by llama.cpp. The [original pull request](https://github.com/ggerganov/llama.cpp/pull/9787) has a very good description that explains some of the ideas behind the implementation. I spent the last 2-3 months working on Zed’s soon-to-be-released Predictive Edits feature (inline completions for local and non-local edits) and found it to be a quite fascinating read. Also, I love Gerganov’s GitHub bio: “I like big .vimrc and I cannot lie”
- Mitchell [shared](https://x.com/mitchellh/status/1881796737805008947) this [5min Steve Jobs video](https://www.youtube.com/watch?v=oeqPrUmVz-o) I had never seen. I loved it. Reminded me a lot of [the 10min segment starting at 49min in this Tony Fadell interview](https://youtu.be/4oDZyOf6CW4?t=2955).

---

---

# Judging Code

By Thorsten Ball • January 22, 2025

---

I want to show you something.

We start by running this:

```
$ cargo new code-judge
```

And we enter and get ready to write some code:

```
$ cd code-judge
$ $EDITOR .
```

Next, mise en place. We open `Cargo.toml` and add the following:

```
[dependencies]
ureq = { version = "2.9", features = ["json"] }
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
anyhow = "1.0"
```

With that, we gain the ability to send HTTP requests, serialize & deserialize JSON, and to handle errors without cursing. We’re ready to write some code.

We open `src/main.rs` and add everything we need to talk to Claude:

```
// src/main.rs

use anyhow::Result;
use serde::{Deserialize, Serialize};
use serde_json::json;

#[derive(Debug, Serialize, Deserialize)]
struct ContentItem {
    text: String,
    #[serde(rename = "type")]
    content_type: String,
}

#[derive(Debug, Serialize, Deserialize)]
struct ClaudeResponse {
    content: Vec<ContentItem>,
}

fn get_claude_response(prompt: &str) -> Result<String> {
    let api_key = std::env::var("ANTHROPIC_API_KEY").expect("ANTHROPIC_API_KEY is not set");
    let model = "claude-3-5-sonnet-latest";

    let mut response: ClaudeResponse = ureq::post("https://api.anthropic.com/v1/messages")
        .set("x-api-key", &api_key)
        .set("anthropic-version", "2023-06-01")
        .set("content-type", "application/json")
        .send_json(json!({
            "model": model,
            "temperature": 0.0,
            "messages": [{
                "role": "user",
                "content": prompt
            }],
            "max_tokens": 1024
        }))?
        .into_json()?;

    Ok(response.content.remove(0).text)
}
```

The mouthpiece is in place. Now we need to say something.

What do we want from Claude? Judgement.

```
// src/main.rs

struct Judgement {
    score: f64,
    message: String,
}
```

How do we get it? By mashing together some strings and asking Claude:

```
// src/main.rs

fn judge_code(code: &str, assertions: Vec<&str>) -> Result<Judgement> {
    let mut fenced_code = String::from("```");
    fenced_code.push_str(code);
    fenced_code.push_str("```");

    let formatted_assertions = assertions
        .iter()
        .map(|a| format!("- {}", a))
        .collect::<Vec<_>>()
        .join("\n");

    let prompt = include_str!("../prompts/judge.md")
        .replace("<code>", &fenced_code)
        .replace("<assertions>", &formatted_assertions);

    let response = get_claude_response(&prompt)?;

    let (message, score_text) = response
        .rsplit_once('\n')
        .ok_or(anyhow::anyhow!("Failed to parse score"))?;
    let score = score_text.parse::<f64>()?;

    Ok(Judgement {
        score,
        message: message.trim().into(),
    })
}
```

Right there in the middle, there’s a reference to a file we’re still missing. Time to create it:

```
$ mkdir prompts
$ touch prompts/judge.md
```

What goes into a file called `prompts/judge.md`? Nothing less than the spell that will cast Claude into a judge of code:

```
## Task

You are an expert code judger. Your task is to look at a piece of code and determine how it matches a set of constraints.

Your response should follow this structure:

1. Brief code analysis
2. List of constraints met
3. List of constraints not met
4. Final score

Be terse, be succinct.

Score the code between 0 and 5 using these criteria:

- 5: All must-have constraints + all nice-to-have constraints met, or all must-have constraints met if there are no nice-to-have constraints
- 4: All must-have constraints + majority of nice-to-have constraints met
- 3: All must-have constraints + some nice-to-have constraints met
- 2: All must-have constraints met but failed some nice-to-have constraints
- 1: Some must-have constraints met
- 0: No must-have constraints met or code is invalid/doesn't compile

Must-have constraints are marked with [MUST] prefix in the constraints list.

The last line of your reply **MUST** be a single number between 0 and 5.

## Code

Here is the snippet of code you are evaluating:

<code>

## Constraints

Here are the constraints:

<assertions>
```

The spell in place, the next step is to put ourselves into position to cast it.

```
// src/main.rs

const RED: &'static str = "\x1b[31m";
const GREEN: &'static str = "\x1b[32m";
const RESET: &'static str = "\x1b[0m";

fn main() -> Result<()> {
    let assertions = vec![];
    let code = include_str!("../data/code-to-judge");

    let result = judge_code(code, assertions)?;
    println!(
        "========= Result =======\nMessage: {}\n\nScore: {}{}{}\n",
        result.message,
        if result.score < 2.0 { RED } else { GREEN },
        result.score,
        RESET
    );
    Ok(())
}
```

Some color never hurt. But, again, things are missing: `assertions` is empty and `data/code-to-judge` — what is that?

It’s the final two pieces in this little demonstration and this is also where some audience participation is allowed, but to keep things simple, how about this:

```
$ mkdir data
$ wget thorstenball.com -O data/code-to-judge
```

My personal website, ready to be judged. The last thing that’s missing is the law by which it’s judged. Let’s add it:

```
// src/main.rs

fn main() -> Result<()> {
    let assertions = vec![
        "[MUST] The year of the copyright notice has to be 2025.",
        "[MUST] The link to the Twitter profile has to be to @thorstenball",
        "Menu item linking to Register Spill must be marked as new",
        "Should mention that Thorsten is happy to receive emails",
        "Has photo of Thorsten",
    ];
    // [...]
}
```

What will Claude say?

Time to ask it:

```
$ export ANTHROPIC_API_KEY="onetwothree"
$ cargo run
```

And, after taking a beat, it tells us:

```
Message: 1. Analysis:
Simple personal website with navigation menu, about section, and contact information. Clean HTML structure with proper meta tags and styling links.

2. Constraints met:
- Copyright year is 2025
- Twitter profile links to @thorstenball
- Register Spill menu item is marked with "new!"
- Explicitly states "I love getting email from you"
- Has profile picture (avatar.jpg)

3. Constraints not met:
- None

4. Final score:
All must-have constraints are met (copyright year and Twitter handle) and all nice-to-have constraints are met (Register Spill marking, email happiness, photo).

Score: 5
```

The perfect score. What if the law changes? What if we want the code to say I want to receive phone calls (a lie)?

```
// src/main.rs

fn main() -> Result<()> {
    let assertions = vec![
        "[MUST] The year of the copyright notice has to be 2025.",
        "[MUST] The link to the Twitter profile has to be to @thorstenball",
        "Menu item linking to Register Spill must be marked as new",
        "Has photo of Thorsten",
        // New:
        "Should mention that Thorsten is happy to receive phone calls",
    ];
    // [...]
}
```

Claude says:

```
Message: 1. Brief code analysis:
Simple personal website HTML with header, navigation menu, main content, and footer. Contains social links, brief bio, and contact information.

2. Constraints met:
- [MUST] Copyright year is 2025
- [MUST] Twitter profile links to @thorstenball
- Register Spill menu item is marked with <mark>new!</mark>
- Has photo (avatar.jpg)

3. Constraints not met:
- Does not mention anything about phone calls (only email contact is provided)

4. Final score:
All must-have constraints are met, plus 3 out of 4 nice-to-have constraints.

Score: 4
```

Down to 4 out of 5. Now, what if we make this a `[MUST]` and add another, say, arbitrary constraint?

```
// src/main.rs

fn main() -> Result<()> {
    let assertions = vec![
        "[MUST] The year of the copyright notice has to be 2025.",
        "[MUST] The link to the Twitter profile has to be to @thorstenball",
        "Menu item linking to Register Spill must be marked as new",
        "Has photo of Thorsten",
        // New
        "[MUST] Should mention that Thorsten is happy to receive phone calls",
        "It should have hidden text in the HTML comments",
    ];
    // [...]
}
```

He *must* be happy to receive phone calls and… hidden text?

Claude’s judgment:

```
Message: 1. Brief code analysis:
Simple personal website HTML with header, navigation menu, main content, and footer. Contains personal info, social links, and contact details.

2. Constraints met:
- Copyright year is 2025
- Twitter profile links to @thorstenball
- Register Spill menu item is marked with "new!"
- Has photo (avatar.jpg)
- Contains hidden HTML comments

3. Constraints not met:
- [MUST] Does not mention accepting phone calls (only email contact is provided)

4. Final score:
Code meets 2 out of 3 must-have constraints, and 3 out of 3 nice-to-have constraints. Since one must-have constraint is missing, the score must be 1.

Score: 1
```

Harsh.

Harsh, but marvelous, isn’t it?
[![](https://archive.thorstenball.com/data/images/155465925.judging-code/ba07157f-1156-45e5-824f-6d3f47bc6796.png)](https://archive.thorstenball.com/data/images/155465925.judging-code/ba07157f-1156-45e5-824f-6d3f47bc6796.png)
I’ve used [LLMs-as-Judges](https://eugeneyan.com/writing/llm-evaluators/) quite a bit in the past few weeks at work and seeing LLMs work like that, be *reliable* like that, be a fuzzy-to-non-fuzzy adapter — it made me reconsider what I thought LLMs were useful for.

Reliable? Yes. The temperature is 0 and even if I ask Claude ten times, it will very likely produce the same thing, as long as all inputs stay the same:

```
$ cargo build
$ for i in $(seq 1 10); do ./target/debug/code-judge; done
Score: 1
Score: 1
Score: 1
Score: 1
Score: 1
Score: 1
Score: 1
Score: 1
Score: 1
Score: 1
```

That’s more reliable than most integration tests I’ve seen.

Seeing LLMs work like that made me think of all the questions I had in the past about data, about code, about *text*, that were very hard to answer in code but so easy to express in prose: does this page show the sign-in button? does this function call that one? is that thing hidden and that one extended? is this documented? is there commented-out code in here?

And then it hit me: maybe I don’t need to express them in code anymore.

---

---

# Joy & Curiosity #23

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 19, 2025

---

Even if a genie would walk through this door right now and grant me my oldest and dearest wish of having four additional hands and two new keyboards, I still wouldn’t be able to write down all the things I want to write about — there’s simply too much happening, too many things to read and twice as many left to read still, too many interesting conversations.  

Programming is changing, I’m convinced of that now and I couldn’t be more excited. And I want to write about that, a lot.

Until I find the time (and twenty additional fingers) to do that: here's a ray of what Joscha Bach — in a link down there — calls my “fractured light”.

---

- In case you’ve never heard that OpenOffice can’t print on Tuesdays or that cars can be allergic to vanilla ice cream: today’s your lucky day for you shall do nothing but click [here](https://beza1e1.tuxen.de/lore/index.html) (edit: [cached version here](https://web.archive.org/web/20250117162340/https://beza1e1.tuxen.de/lore/index.html), because apparently something took the site down after posting) and read and ponder what a jungle the world of software is.
- From my own collection: [Uber's iOS app rewrite trainwreck](https://x.com/StanTwinB/status/1336890442768547845), [UNIX Recovery Legend](https://www.ee.torontomu.ca/~elf/hack/recovery.html), and this [six year old thread on why unsubscribing from emails can sometimes take days](https://x.com/Joe8Bit/status/1156312965265707013). A little preview: “Every one of these changes is reviewed (at 4pm UK time) by a team in an office in Scotland. If they approve it, it gets executed 24 hours LATER at 4pm. If this person is NOT a customer, they add it to an excel and email it (just before they go home) to a marketing team in Swindon.”
- Good, quick, fast, entertaining read: [Programming Languages That Blew My Mind](https://yoric.github.io/post/programming-languages-that-blew-my-mind/). Never heard of HyperCard or Opalang, but the line that really made me curious was this one here: “Mind blown backwards: Understanding how `finally` was implemented in the JVM.” I went looking and [it turns out](https://guidewiredevelopment.wordpress.com/2009/10/22/compiling-trycatchfinally-on-the-jvm/) that “the JVM designers chose to push the finally statement into the compiler rather than building it into the VM” and that finally-blocks are inlined into every possible execution path.
- Found this: [rcmd](https://lowtechguys.com/rcmd/), a “Reimagined Command-Tab”. Looks very similar to what I’ve used on Linux with GNOME, where `left-cmd-[number]` is bound to the corresponding application in the dock, except that it uses the right command key and… I love the idea, but I worry that without eight weeks of daily drills I’ll never get my muscle memory to remember to use the *right* command key.
- Julia Evans [on getting a modern terminal setup](https://jvns.ca/blog/2025/01/11/getting-a-modern-terminal-setup/). Great overview and yet again I’m thinking: maybe I should switch to fish? If I remember correctly, the reason why I switched to ZSH about twenty years ago was that it supported auto-completing directory names on a remote host and… that’s not something I require today anymore.
- [An ode to the M1 MacBook Air](https://mijndertstuij.nl/posts/the-best-laptop-ever/), “the best laptop ever". I’ve never used an M1 Air but I’ve used an M1 Max since soon after it came out and an M3 Max since last year and I still don’t know how Apple pulled this off. In the most literal sense of the word, the M-class MacBooks still seem incredible to me: I can’t believe how Apple, a huge, huge, *huge *company, pulled off a project of this scale — a new computer architecture, a new OS, a new emulation layer — not only *without anyone hearing about it *(!) but with results that impressive. I’d love to read a “The Making of M1” book some day.
- Doug Turnbull on[preferring throwaway code over design docs](https://softwaredoug.com/blog/2024/12/14/throwaway-prs-not-design-docs). I fully share the preference.
- Interesting idea of using [Transformer Memory as a Differentiable Search Index](https://arxiv.org/pdf/2202.06991) but seems like this is still fully in the realm of research, since the tradeoffs don’t seem worth it yet. If I understand it correctly, you’d have to train a new model everytime your corpus changes, right?
- Not sure why they deleted it, but [this post on the Cursor blog](https://web.archive.org/web/20240823050616/https://www.cursor.com/blog/instant-apply) on “Editing Files at 1000 Tokens per Second” is fascinating. Feels like a peek into the new world.
- I’m a huge [Tailscale](https://tailscale.com/) fan and was quite happy to see that they’re [doing well](https://betakit.com/tailscale-hits-10000-paid-business-clients-after-doubling-customer-base-in-past-10-months/). The fascinating bit for me in that article, though, was this: “AI firms have big networking problems because they must transfer immense amounts of data between many machines across multiple cloud providers. They also face plenty of access control, compliance, cryptography, identity, and privacy concerns, given the amount of personal data they process for clients and the reputational risk should something go awry. These characteristics make AI companies ‘an ideal use case’ for Tailscale.” That makes sense, of course, but I have to admit that even though I was aware that AI involves a lot of data, my mind didn’t make the leap to “they probably run into a lot of networking problems.”
- Marshall [spotted](https://bsky.app/profile/maxdeviant.com/post/3lflv23zrc22s) a great caption: “Young teens play a game on their TV, blissfully unaware of the lack of makefiles its manufacturer previously provided to those requesting its source code.” Picture it in your mind before you [click](https://arstechnica.com/gadgets/2025/01/suing-wi-fi-router-makers-remains-a-necessary-part-of-open-source-license-law/).
- [Good framing](https://x.com/burkov/status/1879064652866261495?s=46): “When thinking about coding with LLMs, think of them as generators of templates. You say what code you need, and an LLM provides you with a template from a collection that most closely resembles the code you needed.” I’ve said something similar in different conversations these past few weeks and that I’ve begun thinking of LLMs-as-code-assistant more in the category of frameworks and generators than magic wands.
- [Dear Software Engineer](https://annievella.com/posts/dear-software-engineer/): “The data clearly shows that AI is already having a significant impact on how software engineers work. Not everyone sees it. Not everyone wants to see it. But it’s happening.” A year ago I would’ve said “I dunno, man”, and even six months ago you would have only have gotten a “Hmmm” out of me, but now? I truly think something’s changing.
- Fascinating analysis of “[what happened to the Sonos app](https://www.linkedin.com/pulse/what-happened-sonos-app-technical-analysis-andy-pennell-wigwc/)”. The interesting bits to me: (1) the post intentionally does *not* talk about the new UI, which seems like an easy target, but instead focuses on performance, and (2) you can see how some of the decisions that ultimately lead to trouble might have appeared as good decisions when they were made. Software is hard.
- I really like the ideas in the [AI Reading Club](https://aireadingclub.com/). That’s what a Kindle should be able to do. Without typing, somehow. The surest way to suck the joy out of reading is to make the user type on a Kindle.
- Very, very interesting and new to me [angle on learning & teaching](https://x.com/wolfstrength/status/1879259333403541586?s=46): “A big reason that guys with slightly above average genetics who worked their asses off to squat 500 and deadlift 550 tend to be better coaches than guys who squat 700 and deadlift 800, is because the latter guys don’t have to do nearly as much problem-solving to get to impressive numbers as the former, in both technique and programming.” Isn’t that something? Take that, people who say dumb stuff like “those who can, do; those who can’t, don’t”
- “[knowing when to push matters as much as the push itself](https://writing.nikunjk.com/p/do-hard-things)” — it’s about doing hard things, but hey, maybe it’s also about git?
- [Realistic post](https://www.answer.ai/posts/2025-01-08-devin.html) on one month with Devin, the AI assistant. Money quote: “When it worked, it was impressive. But that’s the problem - it rarely worked.”
- A whole lot of words on an “[AI Founder’s Bitter Lesson](https://lukaspetersson.com/blog/2025/bitter-vertical/)” and I’m not sure I understand them all, but what I do think I understand — foundation models can change the landscape with a single release, wiping you off the map — seems true.
- If you’re in any way interested in *products* and how to onboard new users and how to make them use your product, I highly recommend installing and trying out Nikita Bier’s new app [Explode](https://x.com/nikitabier/status/1879206793118658974). The amount of work that went into the onboarding flow, the exploitation of iOS APIs, the [company name itself being a growth hack](https://x.com/juanbuis/status/1879215293513572615?s=46) of sorts — this is what you get if you turn it up to 11 and I can’t help but think that it’s an argument for saying that all product people need to be technical, because how else do you come up with the idea of using the iOS picture-in-picture mode to guide a user through the steps required to enable your app? Would I build an app like this? No. But it sure is inspiring.
- [DHH on the Ruby Rogues podcast in 2014](https://topenddevs.com/podcasts/ruby-rogues/episodes/056-rr-david-heinemeier-hansson): “‘Oh, this will be more maintainable.’ Maintainable to me is such a weasel word. It's a way to sort of avoid talking about the here and the now, the concrete. The things we can see and we can touch and we can actually compare and then move it out into the abstract, the vague, the things we can't compare, to sort of the hand wavy end of design discussions which I find generally to be an uninteresting domain.” There are so many discussions in the programming world in which one side of the argument boils down to: “this is good because it’s good.”
- “[The mind that is not baffled is not employed](https://x.com/austinkleon/status/1879899178257760638)”
- [This](https://x.com/plinz/status/1879853782236111077?s=46) is said to be about writing for the AIs, but I’d it’s about all writing and it’s beautiful: “Be interesting, expose a surface that reflects the universe in sophisticated disturbances. The fractured light produced by your cracks might be what makes you useful as a lens.”

---

---

# Joy & Curiosity #22

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 11, 2025

---

Last time I completely forgot to mention my *other* fun holidays project. This one’s even sillier than the [emojigarden](https://github.com/mrnugget/emojigarden/).

I’ve been an admirer of what I consider to be The Art of Funny Tweets for many years now and have amassed quite a collection of Screenshots of Funny Tweets. Two weeks ago, without a reason I can articulate, I decided I needed to share them.

But instead of just putting up a page with a bunch of screenshots on them, Claude and I conspired to create a Python script that syncs screenshots from a Google Drive and then renders them, at build time, into a Markdown page. Claude did the heavy lifting, I only put screenshots in a folder. That makes it very easy for me to add new ones, which is, of course, important for this very important project.

What we ended up with is this page: [Funny Tweets](https://thorstenball.com/funny_tweets/). Hope you get a laugh out of them.

---

- Let’s kick this off with a *hot take: *[Go is a Well-Designed Language, Actually](https://mattjhall.co.uk/posts/go-is-well-designed-actually.html) — I agree 100% and I think the people who say Go is not well-designed should instead say that they don’t agree with its design goals or that they don’t know what tradeoffs are.
- [Matt Keeter’s Fidget](https://www.mattkeeter.com/projects/fidget/) is “a library for representing, compiling, and evaluating large-scale math expressions, i.e. hundreds or thousands of arithmetic clauses” and that’s one of the few things I understood on that page. After scrolling through it, I wish I understood it all.
- David Crawshaw, co-founder of the fantastic [Tailscale](https://tailscale.com/), on how [he programs with LLMs](https://crawshaw.io/blog/programming-with-llms). Insightful, calm, very good.
- Goldmine: [Applied LLMs](https://applied-llms.org/). Single page, bursting with valuable information. 5 out of 5.
- [Test Driven](https://mostlymaths.net/2024/11/test-driven-writing.html/)*[Writing](https://mostlymaths.net/2024/11/test-driven-writing.html/), *using LLMs. Fascinating. I’ve done ~TDD with LLMs before and I can see this possibly being helpful, but at the same time I still haven’t warmed to the idea of using LLMs when writing prose and probably never will.
- Sean Goedecke writes about “[what makes strong engineers strong](https://www.seangoedecke.com/what-makes-strong-engineers-strong)” and says: “Some of the smartest people I’ve worked with - in terms of raw brainpower - were not particularly effective engineers, because they struggled with pragmatism and speed.” I agree 100%. I also agree with this: “To be a strong engineer, you need the raw confidence to believe that you will figure it out, whatever it is.” I [wrote about the same idea](https://registerspill.thorstenball.com/p/oh-to-turn-off-your-mind) last year and still think it’s one of the most important things I need to work on.
- Sean Goedecke again, this time on[his engineering values](https://www.seangoedecke.com/my-engineering-values/). Great page. It’s honest. “I’m more excited by maintenance than rewrites.”
- Talking about smart people and being smart: [Dwarkesh Patel interviewed Tyler Cowen](https://www.youtube.com/watch?v=GT_sXIUJPUo). I haven’t listened to the whole thing yet, but the first 30 minutes have been very interesting. I loved this bit about IQ: “If you look at labor market data, the returns to IQ as it translates into wages, they're amazingly low. They're pretty insignificant. People who are very successful, they're very smart, but they're people who have, say, eight or nine areas where they're like, on a scale of 1 to 10, they are a nine. Like they have one area where they're just like an 11.5 on a scale of 1 to 10. And then on everything else, they're an eight to a nine and have a lot of determination. And that's what leads to incredible success. And IQ is one of those things, but it's not actually that important. It's the bundle, and the bundles are scarce. And then the bundles interacting with the rest of the world.”
- [On Linear:](https://jmduke.com/posts/post/linear/)“it's very very clear that Linear's success as a *product* is simple: it is really, really good, in a way that is almost uninteresting. Linear offers very few *novel* features and instead invested a lot of time, energy, and polish in... just getting everything correct, and making it work extremely extremely fast.” Never used Linear, now I want to.
- An [operating system in 1000 lines](https://operating-system-in-1000-lines.vercel.app/en/). I’m a big, big fan of “X in <Y lines” projects and this looks very cool. “The tricky part of creating your own OS is debugging. You can't do printf debugging until you implement it.“
- I’m actually not sure whether I should share it, but… okay, yes, here, go try out the [simulation clicker](https://neal.fun/stimulation-clicker/). Then, after ten minutes, after you thought “what’s wrong with me”, you come back here.
- Steve Krouse, from [val.town](http://val.town), sharing what they “[learned copying all the best code assistants](https://blog.val.town/blog/fast-follow/)”. I’ve worked on two “assistants” in the last two years and find the whole space incredibly fascinating at the moment. There’s so much happening: inference speed is only going up, new techniques are constantly introduced (speculative decoding!), there’s a lot of twists and remixes of similar ideas, and Steve gives a really good overview here.
- For over a year I’ve been searching for this quote, now I finally found it again. [Jerry Seinfeld on Howard Stern](https://x.com/bpoppenheimer/status/1632775657108242433): “Your blessing in life is when you find the torture you're comfortable with.”
- Very [cool idea](https://x.com/patrick_oshag/status/1876455619516911720): “Claude projects are truly incredible. My favorite is a version of ‘morning pages.”’I could never sit and write for 30 min so instead I do it with Claude as an audio note and have it organize it.”
- I don’t know how or why but the idea of agency showed up in quite a few, quite different conversations over the last few weeks. Agency — what a word, what a concept. I value it dearly, I know it when I see it, but it’s hard to pin down what exactly it is and I often reach for examples or analogies. Last week I got lucky and someone shared a new way to think about agency with me. He said: “Imagine you’re travelling through Middle America and get kidnapped. Someone mistakes you for someone else. A mixup. You end up in a prison in the middle of the jungle. You’re allowed one phone call. One phone call to a person to get you out of there. Who do you call? The number one person on your list, that’s a high-agency person.”

In another conversation I mentioned Simon Sarris’ excellent [The Most Precious Resource is Agency](https://map.simonsarris.com/p/the-most-precious-resource-is-agency), which has been updated to [School Is Not Enough](https://map.simonsarris.com/p/school-is-not-enough) and which I constantly think of and refer to, always with “Look, I’m not saying we should bring back child labour, *but…”*
- [Television](https://github.com/alexpasmantier/television), a “blazing fast general purpose fuzzy finder TUI”, looks like a really nice homage to TJ’s [telescope.nvim](https://github.com/nvim-telescope/telescope.nvim), which I love.
- David Foster Wallace [on complicated books](http://patrickarden.com/DavidFosterWallace.html): “And I hate books where, you know, those books where you get halfway through and you get the sense that the author is so stupid that he thinks he can fool you into thinking that the book is really sophisticated and profound just because it's difficult. It's an epidemic in academic writing. And it happens about half the time in avant-garde writing.”
- There’s a lot more interesting stuff in here than the Buzzfeed-y title might suggest: [The 30 Best Pieces of Company Building Advice We Heard in 2024](https://review.firstround.com/the-30-best-pieces-of-company-building-advice-we-heard-in-2024/). I love the bit about the “set of 12 questions that Stripe leaders ask in every product review” with “a very strict guidance that you cannot move on to question two until you've sufficiently answered question one”. Question one? “Who is the target user?” Now think of all the product development you’ve witnessed in your life — was there an answer to that question? (I also love #16 on reference calls.)
- Big pirating nostalgia when reading [this New Yorker piece on Spotify](https://www.newyorker.com/magazine/2024/12/30/mood-machine-liz-pelly-book-review): Napster, LimeWire, Kazaa get a mention. I’m missing eDonkey2000, eMule, and Morpheus though. It’s an interesting piece, but extending the historical view to the past by, say, 60 years, would’ve made it not just more balanced but also more interesting — musicians earning a lot of money with their music is — relatively speaking — a recent phenonemon.

---

---

# Joy & Curiosity #21

*Interesting & joyful things from the previous week*

By Thorsten Ball • January 5, 2025

---

Happy new year! Hope you spent the magical time between Christmas and New Year’s doing whatever you want — that’s what it’s for.

What I did? I upgraded my load-and-lights-bearing Raspberry Pi 4 from a 32-bit OS to 64-bit. That went ~relatively smoothly: I used Claude to write me up a checklist of commands to run and walk me through them one by one. “Do you now want to proceed with restoring the Docker volumes?” Only problem was that [Home Assistant](https://www.home-assistant.io/) cannot restore from backup if it runs in Docker. Uh-oh. Still, Home Assistant is one of the best open-source projects I’ve ever used.

I also spent a day and $3 using [aider](https://aider.chat/) with Claude to build [a multi-player “emoji garden” in Rust](https://github.com/mrnugget/emojigarden) without writing a single line of code. If you haven’t, try aider. Put Claude’s API key in, set yourself a timer for 45min and build something new. You might experience some magical moments that, I think, contain a reflection of the future.

---

- Talking about Home Assistant: [voice assistants in Home Assistants](https://www.home-assistant.io/blog/2024/12/19/voice-preview-edition-the-era-of-open-voice/) are apparently a thing now, wow.
- What a url: [sacred.computer](https://www.sacred.computer/). It’s “an open-source React component and style repository that helps you build […] with terminal aesthetics.” Looks nice.
- This Stanford [lecture on building LLMs](https://www.youtube.com/watch?v=9vM4p9NN0Ts) was incredibly good. Nitty-gritty at just the right level of abstraction. Lots of “ahh, so that’s how they…” moments. I want to write a separate thing about this lecture because it’s so good.
- Spent some time in the past two weeks digging into transformers and how attention works. [This video](https://www.youtube.com/watch?v=eMlx5fFNoYc) made think: what a miracle!
- Pay attention to your thoughts immediately after reading the next sentence: “This is just a hobby of mine, that I thought might be interesting to a lot of people.” Now scroll through [the hobby website](https://aschmann.net/AmEng/#SmallMapUnitedStates) from which I quoted it. Isn’t the Internet a marvellous place?
- This post by Anthropic on how [to build effective agents](https://www.anthropic.com/research/building-effective-agents) has been shared quite a bit in the last two weeks but I need to re-share it here again, because it *is *remarkable for a post like this to be so free of bullshit, leading with what is *not* an agent, recommending when to *not* use agents, and to deliver some really good insights.
- What’s magic? “Sometimes magic is just someone spending more time on something than anyone else might reasonably expect.” [Great little post](https://allenpike.com/2024/an-unreasonable-amount-of-time).
- This is very, very good: “If you work on anything worthwhile, sooner or later people will care about it and will want you to send progress updates. These could be quarterly investor updates, weekly updates to your boss, emails to adjacent teams, etc. [Here are tips on how to do this well.](https://www.spakhm.com/updates-howto)”
- [Good questions to ask](https://backchannel.org/blog/autonomous-software): “If generating code is no longer a limiting factor, what types of programming languages should we build?”
- Vicki Boykis before listing [her favorite books of 2024](https://vickiboykis.com/essays/2024-12-31-favorite-books/): “I also need to read fiction because if I only read tech books, they take away my creative energy rather than grant it, as fiction does.” Nodded so hard while reading that my headphones fell off (not really) but then realized that I don’t read that much fiction anymore. I do read a lot of non-fiction-&-non-tech, though, and I do know that reading[David Foster Wallace on Federer](https://ialjs.org/wp-content/uploads/2017/01/Wallace_FedererAsReligiousExperience_NYTimes_20Aug2006.pdf) gives me something I can’t find anywhere else.
- One of my favorite 2024-in-review posts is [this one by Nicolay Gerold](https://nicolay.fyi/posts/personal/2024-in-review/). Humility breeds wisdom, is what it tells me.
- More wisdom in [this wonderful piece](https://lucumr.pocoo.org/2024/12/26/reflecting-on-life/) by Armin: “Life isn't about sampling everything; it’s about making deliberate choices and committing to the ones that matter” and “There is a narrative that working hard is inherently bad for your health or that long hours lead to burnout. I disagree.” and “If you end up doing things you do not believe in, it will get to you.” and… I will stop now. Read it.
- Michael Lynch’s [Rules for Writing Software Tutorials](https://refactoringenglish.com/chapters/rules-for-software-tutorials/?c=2) is a goldmine. I agree with all of it, except maybe the bit about how to format shell commands, since I don’t like copy & pasting ten lines of &&-joined shell commands, but instead want to execute them one by one.
- Beautiful piece by Maggie Appleton on being pregnant: [Growing a Human: The First 30 Weeks](https://maggieappleton.com/growing-a-human). The sections on “Natural” and “Traditional” brought up a lot of memories from four and eight years ago when my wife was pregant. I had some (to my mind) under-appreciated rants on “natural” back then, including little detours into “full of chemicals.” Now I’m waiting for Maggie to write about doulas and what the first six months are like with the baby. Seldom does the rubber hit the road as hard as when it’s 3am, you’re holding a crying baby in your arm, it’s so god damn hot in this room oh my god, you and your partner are getting angrier and more frustrated by the minute because you both don’t know how to make the crying stop, and the "this is what I'll be like as a parent" rubber hits the road of "this is what I'm actually like". Anyway—
- [pISSStream](https://github.com/Jaennaet/pISSStream) is “a menu bar app that shows how full the International Space Station's urine tank is in real time.” Now you know.
- Here’s an intro for you: “In this tutorial, I will teach you how to write your own virtual machine (VM) that can run assembly language programs […] The final code is about 250 lines of C" — [Beautiful, little program](https://www.jmeiners.com/lc3-vm). Love the formatting of the page and that it’s literate programming.
- Love [this list](https://x.com/wholebodyprayer/status/1871855144813691079) and all that are like it, even though I might not agree with every single point. (Imagine a CEO writing a list like this about company culture!)
- And here’s a list we should probably all keep: “In 2016, I worked with a really sweet guy who kept a running list in his Notes app simply titled ‘Things I Like.’ I copied him that year and [have kept it running ever since](https://x.com/daniela0spector/status/1874455468573446202?s=46).” (I keep a list of [good names](https://thorstenball.com/names/).)
- Jon Gjengset on [“what’s the right number of hours to work in a week”](https://thesquareplanet.com/blog/about-40-hours/) and how the answer to that question “varies not just from person to person, but from week to week, and even day to day”, along with his thoughts on it. And… I don’t know. I don’t know. I think having a number like that — 40 — biases and distorts everything. Not saying we should, but what if we remove the number?
- Very often in my life I wondered whether I shouldn’t get into sports. Just seems like a fun thing to follow your team throughout the year and always have something to talk about with others. Then, while reading [this](https://x.com/thepanta82/status/1871663246194651283?s=46) and hearing it in my head with the voice of a sports commentator (listen: “He generally tries to keep a symbol <> file mapping in his head. As long as whatever he's working on is loaded in his mental RAM, he manages fine-ish. But when not, after fumbling around, he has to bring up an external grep tool.”) I realized I might have found my sport already. Then I scrolled through this [list of most active GitHub users](https://gist.github.com/paulmillr/2657075/), recognizing many names, nodding along, thinking “ah, didn’t they switch over to…” and knew: yes, this is my sport.
- A title that makes you click: [I am rich and have no idea what to do with my life](https://vinay.sh/i-am-rich-and-have-no-idea-what-to-do-with-my-life/). But there’s more to the post. For example, this paragraph about culture: “I learned about the power of urgency and having an undeniable mission. Not by reading it somewhere. By experiencing it. I came to realize how laughable my robotics stint had been in comparison.”
- Stuck with me: [“What would it mean to be done for the day?”](https://ckarchive.com/b/xmuph6hrqdp04hrnppvnqc2le6lllbn) (Reminds me of Jason Fried once saying that he generally aims to do a “good day’s work”.)
- Succinctly put: [burn the playbooks](https://www.notboring.co/p/burn-the-playbooks). “Someone does something for love of the game or out of pure curiosity. […] Others see the success, deconstruct how they did it. Others still repeat those same things, joylessly, without the original spark. Create a cheap shadow of the original.”
- Another sign of the times. Robert Ghrist wrote [a book on Linear Algebra](https://x.com/robertghrist/status/1874105560641220830?s=46) and put this in the introduction: “The writing was assisted by Claude 3.5 sonnet, trained on my previous books for style. [...] Gemini Experimental 1206 was an especially good proofreader and converter to markdown. Exercises were generated with the help of Claude and may have errors. This project was begun on November 4, 2024. The first edition was submitted to Amazon Publishing on December 28, 2024. Fifty-five days: impossible without the creative labors of Claude, to whom the author is most grateful.”

---

---

# Joy & Curiosity #20

*Interesting & joyful things from the previous week*

By Thorsten Ball • December 21, 2024

---

Since I’m not the biggest fan of Christmas Specials — I want to [see the guy surf](https://knowyourmeme.com/memes/surf-dracula) and not go on some adventure involving reindeer — let’s keep the recipe as it is: bag of links pointing to stuff that I found interesting this week.

You’ll next hear from me in about two weeks, because I plan to be offline (not really) until then and take a break (really). Or maybe not. Maybe I’ll write something.

Anything’s possible in the time between Christmas and New Year’s.

---

- As you’ll see, this whole week was full of AI for me and what kicked it off, I guess, was reading the [emails sent between Elon Musk and the OpenAI founders](https://openai.com/index/elon-musk-wanted-an-openai-for-profit/). Have to admit that I can barely judge what the publication of the emails is about, because I was so fascinated with the different writing styles. There’s emails in there that were most certainly written on a phone, quickly, and others that went through multiple drafts. Read the “business of building AGI” email sent by Ilya.
- One of the most Joy & Curiosity things this week: [tldraw.computer](https://computer.tldraw.com/home). I haven’t digested it yet but plan to over the next two weeks.
- Spent my whole morning today playing around with [CerebrasCoder](https://cerebrascoder.com/) and building [little games](https://cerebrascoder.com/p/12619). The inference speed is a game changer. It’s unbelievably fast.
- In the past few years I’ve been thinking a lot about the idea of a Minimal Viable Product (MVP) and how crucial it is to know what “minimal” means for a given product. I came to think that the bar is often set too low — for some products “minimal” might mean that one part of it is better than anything else out there. Then, this week, I came across [this tweet by Nikita Bier](https://x.com/nikitabier/status/1868429071140684175) that describes a similar thought, more eloquently: “Your product doesn’t need a lot of features but the thing that you’re testing needs to feel like a German car door—reaching a level of quality that doesn’t distort signal.” Keep that thought in mind…
- … and pair it with [Patrick Collison on startups](https://x.com/StartupArchive_/status/1869789782131528174): “The main thing that I think companies screw up at the pre-product/market fit stage is speed of iteration.” Build a German car door that you can change quickly while talking to a lot of users. Nobody said it was easy, right?
- Yesterday [Simon Willison wrote](https://simonwillison.net/2024/Dec/20/december-in-llms-has-been-a-lot/): “I had big plans for December: for one thing, I was hoping to get to an actual RC of Datasette 1.0, in preparation for a full release in January. Instead, I’ve found myself distracted by a constant barrage of new LLM releases.” Hours later, OpenAI released benchmarks for their new o3 model.
- The post, [OpenAI o3 Breakthrough High Score on ARC-AGI-Pub](https://arcprize.org/blog/oai-o3-pub-breakthrough), is fascinating: “o3's core mechanism appears to be natural language program search and execution within token space – at test time, the model searches over the space of possible Chains of Thought (CoTs) describing the steps required to solve the task”
- Talking about AI progress: [this post](https://www.aisnakeoil.com/p/is-ai-progress-slowing-downhttps://www.aisnakeoil.com/p/is-ai-progress-slowing-down), asking whether AI progress is slowing down, is surprisingly level-headed and contains some very (I think) correct lines, such as this one: “Here are a couple of analogies that help illustrate why it might take a decade or more to build products that fully take advantage of even current AI capabilities. The technology behind the internet and the web mostly solidified in the mid-90s. But it took 1-2 more decades to realize the potential of web apps.” And [this post](https://www.strangeloopcanon.com/p/is-ai-hitting-a-wall) also contained some interesting ideas on the same topic.
- Beautiful [writing shed](https://fromabirdseyeview.com/?tag=david-mccullough-writing-shed): “It measures eight-by-10 feet. There is no telephone or running water. Its walls are lined with more than 1,000 books, and the only furniture is a desk, a comfortable chair, and a lamp.”
- Recently I’ve been nerd-sniped by using LLMs to judge or grade the output of other LLMs. This post, [Evaluating the Effectiveness of LLM-Evaluators (aka LLM-as-Judge)](https://eugeneyan.com/writing/llm-evaluators/), contains a lot (“49 min read”) of different twists on the idea. Still not over how everything in the ML space always sounds so much fancier than it turns out to be. Take this: “Then, they manually annotated sentence-level factuality on the generated data.” Manually annotated sentence-level factuality! Sentence-level factuality! So they went through the output and marked sentences as true or false. Incredible.
- Another masterpiece by Bartosz Ciechanowski: [Moon](https://ciechanow.ski/moon/). If you haven’t (lucky you!): click through[Bartosz’s archive](https://ciechanow.ski/archives/).
- Here’s a good pairing. First, read this post, [The end is nigh and here's why](https://www.experimental-history.com/p/the-end-is-nigh-and-heres-why), that includes this line: “the point is that when you take a stroll through history, you don’t encounter many people saying things like ‘the forces of evil and the flaws of human nature have always been among us.’ Instead, you meet a lot of people people saying things like ‘the forces of evil and the flaws of human nature have JUST APPEARED what do we do now??’” Second, read [this post](https://bsky.app/profile/chrislhayes.bsky.social/post/3ldmmhomof22f), that was reposted into my timeline *without any context at all,* and reflect on our shared media experience of the last, say, ten years.
- First impressions count for a lot and the name of [this post](https://www.linkedin.com/pulse/principal-engineer-roles-framework-mai-lan-tomsen-bukovec-142df/) — Principal Engineer Roles Framework — combined with the URL containing linkedin dot com— well, it doesn’t exactly scream joy, does it? But I thought it was very good and wish I had read it years ago.
- “[Do you know how much your computer can do in a second?](https://computers-are-fast.github.io/)” Computers *are *fast.
- Robin Sloan, [writing](https://www.robinsloan.com/newsletters/finisher/#finishing): “Sometime I think that, even amidst all these ruptures and renovations, the biggest divide in media exists simply between those who finish things, and those who don’t.”
- One more thing on first impressions: [this Cloudflare blog post](https://blog.cloudflare.com/resilient-internet-connectivity-baltic-cable-cuts/) is called “Resilient Internet connectivity in Europe mitigates impact from multiple cable cuts” when they should’ve gone with “dude, someone cut a fucking undersea cable and the internet did *not* go down, what the fuck, that’s amazing”’
- Mind-blowing: “[pushing single-GPU inference throughput to the edge without libraries](https://andrewkchan.dev/posts/yalm.html)” by “building an LLM inference engine using C++ and CUDA from scratch without libraries.” Performance, GPUs, low-level, a fancy word like inference, and code right there, front and center — hot.
- From the same author: [Notes From Figma II: Engineering Learnings](https://andrewkchan.dev/posts/figma2.html). There’s gold in there: “If I had to pick a dividing line between the failures and successes, it’s that the successes always had a product goal in mind ahead-of-time.” And wisdom: “I spent my first couple years as a product engineer. I was not a very good product engineer.” And nerd-snipes: “It was a heroic effort, and succeeded I think because of engineers like Joey Liaw, who led the project and had also been part of the healthcare.gov rescue team.” — I now want to know all about the healthcare.gov rescue team. Joey Liaw, please talk to me.
- I’m not a religious person but if I were and you’d ask me how I practice my religion I’d tell you that there are ten, fifteen videos floating around the internet that I’ve been watching regularly for the last ten, fifteen years and even though they’re corny, profane, trite, they’re also watering holes to me and I keep coming back to them to drink. [Like this one](https://youtu.be/s_NQ9yUQ6cY?t=107): ”If you was hit by a truck and you was lying out there in that gutter dying, and you had time to sing *one* song. Huh? One song that people would remember before you're dirt. One song that would let God know how you felt about your time here on Earth. One song that would sum you up. You tellin' me that's the song you'd sing?”

---

---

# Surely not all code's worth it

By Thorsten Ball • December 18, 2024

---

Listen to this: “I don’t use AI for programming, because I want to learn and get better at programming and if I have an LLM generate code for me, I’m not learning anything.”

Or this one: “I enjoy writing writing code. I enjoy writing every single line of it. I enjoy putting semicolons here, aligning whitespace there, pondering a variable name up here, and reordering these three lines to make the whole paragraph look better — I don’t want an LLM to take that away from me.”

These are paraphrased versions of some of the responses I received the [last time I wrote about using AI for programming](https://registerspill.thorstenball.com/p/they-all-use-it).

I get it. I love code too. I love writing it, I love modifying it, I love reading it. There’s a print-out of code hanging up on my wall here, I thought about tattooing some of it on my forearm. Some of the code out there in the world I like so much I want to lick it.

But (here it is, you knew it was coming): *come on*, let’s be honest here! Surely, surely not all code’s worth the reverence — right? Not all code contains a lesson and not every line is worth the intendation.

Two weeks ago I used Claude to create a 50-line Python script for me that reads in all my Register Spill posts from the Substack archive and turns them from HTML to Markdown, reading metadata from a CSV file. In the week before, I had Claude generate me an 200-line HTML/JavaScript/CSS amalgamation that lets me paste two snippets of code and in response spits out a diff in a custom format. Last week, Claude created a tiny Python web app for me that lets me browse the contents of a local folder, inspect each file, and then decide whether to chuck it into bin A or bin B. 120 lines, I think.

None of that code contained a lesson. In fact, I was happy I didn’t have to figure out how to open a CSV file in Python — I’ve done that in at least four other languages and I can’t say I enjoyed it or that I cherish the knowledge. I also didn’t want to relearn how to create a 3-pane layout in CSS for this single HTML file. Nor did I care about how to serve four endpoints in a small Python web app. I’ve written enough web apps in my life to know that I’d mostly end up being frustrated after trying to figure out how to get to the URL query params.

I also don’t care about the structure of the code and whether this should go into this function or into that one. I don’t care about its indentation either. If you had a machine that shoots whitespace at files, I’d tell you to point it at those scripts and pull the trigger until it goes click. Throw some tabs in there too, I do not care.

The code of these tiny programs and scripts is write-only. No other human — knock on wood — should have to look at it again. It’s self-contained; it has a single, temporary job; its blast radius is, at best, a folder of files that’s safely secured by git anyway.

And if I don’t care about the quality nor the whitespace then why not let LLMs write it?

There’s so much code like this to write if you can only spot the opportunities: prototypes, proofs for ideas, demos, little debug helpers, explorations and experiments. I’ll take all the help I can get.

Because here’s the best part: if I let Claude write it, I not only end up with more helper tools, but I also get to spend more time with code that I actually care about.

---

---

# Joy & Curiosity #19

*Interesting & joyful things from the previous week*

By Thorsten Ball • December 14, 2024

---

Inspiration’s a tricky thing. You walk around with big eyes, looking for it, and won’t find it. You walk around having written it off and suddenly find it in a small interaction, a single sentence, a song played at the right time in the car; a second giving you weeks of juice.

This week started with big eyes, looking, and ended with a tune being whistled.

And here it is — a bunch of links, enjoy.

---

- Incredibly [fascinating and in-depth post](https://eieio.games/blog/writing-down-every-uuid/) about “writing down (and searching through) every UUID” from the creator of [everyuuid.com](https://everyuuid.com/). Made me want to build technically hard but useless things.
- Enjoyed reading through these [common misconceptions about compilers](https://sbaziotis.com/compilers/common-misconceptions-about-compilers.html). Always get a kick reading “well, you might think that, but actually the common sense is wrong”-things like this: “So, for *many* projects, separate compilation is not worth it. Instead, a unity build—where you just include everything into a single file—is usually a much better option.”
- So, we’ve been doing a lot of fine-tuning in the past few weeks, which means we spent a lot of time in notebooks, executing Python code and staring at Python code while its executing. This week I started to wonder: wait, what’s that progress bar? Is that built into Google Colab, or is it a Python thing, or a notebook thing? Turns out it’s [tqdm](https://tqdm.github.io/), a very popular Python library for progress bars. Now here’s the best part: they sell [tqdm hats](https://tqdm.github.io/merch/#snapback-hat) and they do that with this slogan: “progress begins in the mind” — how good is that?
- Werner Vogels, Amazon CTO, published his “[tech predictions for 2025 and beyond](https://www.allthingsdistributed.com/2024/12/tech-predictions-for-2025-and-beyond.html)” and, man, I don’t know. If you had told me it was published in 2017 I would’ve believed you. Then again, I’m not good at predicting the future.
- One of the highlights this week: [the new rules of media](https://onethingnewsletter.substack.com/p/the-new-rules-of-media). There’s some real wisdom in there. To quote: “There’s no Pulitzer for newsletters or TikTok explainers; BuzzFeed News died winning a single one.”
- antirez [is back](https://antirez.com/news/144) hacking on Redis. Also: “every day, I read Hacker News, and I see a huge amount of technical people who dislike AI and the new developments. I also see a lot of people who don't even care to really try the latest models available in depth (hint: Claude AI is in its own league) and still dismiss them as kinda useless. For me, it’s different.”
- I’m joining the choir here by saying: [oldmapsonline.org](https://www.oldmapsonline.org/) is lovely, lovely, lovely! Time-scroll through Europe in the 19th century, then time-scroll through Africa in the 20th century. Or look at North America at 1850, then scroll over to Europe.
- Ended up with a cold this week and spent an afternoon coughing on the couch. By complete chance, I found [Turn Every Page](https://en.wikipedia.org/wiki/Turn_Every_Page), a movie about Robert Caro, author of [The Power Broker](https://en.wikipedia.org/wiki/The_Power_Broker), and his editor, [Robert Gottlieb](https://en.wikipedia.org/wiki/Robert_Gottlieb), who, some say, is one of the most important editors of the last hundred years. I watched it immediately; it’s wonderful.
- If you haven’t, I recommend reading [this Paris Review piece from 1994](https://www.theparisreview.org/interviews/1760/the-art-of-editing-no-1-robert-gottlieb). It’s been “republished” after Gottlieb’s death last year. To have an editor like that…
- Before we move on: The Power Broker is finally [available for Kindle](https://www.amazon.com/-/de/dp/B0DDWV768S). I’ve never read the book because it’s over a thousand pages and who wants to lug around a thousand pages, but now, on the Kindle, well… I started reading it and I think I’m hooked. Let’s see if I can make it.
- This thing here — [You Exist In The Long Context](https://thelongcontext.com/) — was fascinating. I didn’t play the game, I didn’t even read every paragraph, but the idea that a bigger context window might be *more* than, well, just more of the same, but instead a game changer for LLMs is very interesting: “But the analogy breaks down when applied to information stored in the context window. Facts, concepts, narrative sequences, arguments—all are captured much more accurately when they are conveyed to the model via short-term memory instead of long-term training.” Made me play around with Google’s NotebookLM and put all of Register Spill into the context when talking to Claude. (I asked it to write a post in the style of Thorsten Ball and the second sentence it generated was “I was having a beer at the bar” — come on, man.)
- Watched this talk by [Will Wilson](https://www.youtube.com/watch?v=m3HwXlQPCEU) on deterministic testing of distributed systems. It’s a very good talk and, I think, even undersells itself: a lot of the described problems are *very* tricky, a lot trickier than Will makes it sound like. Made me even more curious about [Antithesis](https://www.antithesis.com/), Wilson’s company.
- Zed’s very own Antonio gave a talk last year about something very similar: [property-testing async Rust](https://rustlab.it/talks/property-testing-async-code-in-rust-to-build-reliable-distributed-systems). It’s a very good talk and the code behind it is equally impressive.
- The [whole post](https://sibervepunk.com/digital-consumption.html) is worth a read, but this stuck out: “the problem with online advice is that the person writing the blog post is doing so entirely from their own perspective and lifestyle. They have no idea about you, and you have no idea about them.” When I first came across the idea that, hey, maybe advice isn’t universally good, I was confused, because, no, wait, advice *is* good, what’s wrong with advice? Took me a lot of reflection to realise that advice isn’t all it’s said to be.
- The phone in the background [looks very funny](https://x.com/danshipper/status/1866836377624777176), doesn’t it? If we look past it, I wonder whether that’s the future we’re seeing.
- “Your job as an artist is not to sit in your bedroom like a scientist, devising the formula for the most mind-blowing song that gets the most likes, favorites, and retweets. It is not to get your own Wikipedia page or become verified on Twitter. Your art does not have to be deep or complex or show that you’re smart or make you understood or give meaning to your existence. The most important thing is to lead with your curiosity and chase it [until the sun goes down](https://www.reddit.com/r/WeAreTheMusicMakers/comments/4wzj8m/stop_trying_to_write_your_masterpiece/?rdt=57300).”

---

---

# Joy & Curiosity #18

*Interesting & joyful things from the previous week*

By Thorsten Ball • December 7, 2024

---

Here we are, here we are. Feliz Navidad is upon us.

Eight years ago, nearly to the day, I was at a Christmas market with my colleagues. We were talking, drinking mulled wine, shuffling around to keep our feet warm. A month earlier I had started selling [my book](https://interpreterbook.com) and someone asked me: so, did you make some money? Yeah, I said, the launch went well, sold more copies than I thought I would.

You should invest it all in Bitcoin, one of my colleagues suggested. Since it was Christmastime, we told him to shut up and that he’s a fool. Bitcoin, get outta here.

Then another colleague — I swear this is true — said that, no, I should invest it all in Tesla stock. We looked at him as if he had just said “I’m an even bigger idiot than the other guy” and laughed. You’re an even bigger idiot than the other guy, I think one of us told him. It was Christmastime.

What I’m trying to say is this: I don’t have financial advice for you, I only have a bag of links here. Enjoy.

---

- I’m a sucker for company handbooks so was quite happy to see that there’s now “the [highest quality publicly available version](https://www.map.cv/blog/redbook) of the *Little Red Book”, *the book that “distilled Facebook’s ethos—breaking things, thinking big, and moving fast—into a manifesto”.
- Jimmy Miller is doing an [Advent of Papers](https://jimmyhmiller.github.io/advent-of-papers). I have to admit that I haven’t read a single paper here, but get fun out of following Jimmy’s commentary. I mean, one post is titled: “Google's Awful Paper on Technical Debt”
- If you aren’t one of the 8.5M people who have done so already, I recommend watching [this lecture](https://www.youtube.com/watch?v=vtIzMaLkCaM) on the “Craft of Writing Effectively”. It’s very good. It’s the writing equivalent of [ABC monologue](https://www.youtube.com/watch?v=czOpDN8Knr4) in Glengarry Glen Ross. When Baldwin says “get them to sign on the line which is dotted”, it also means: “Here’s what your writing does. It helps a particular set of readers understand better something they wanna understand well. That’s what its job is. All this other stuff — being structured, being creative, being written, dealing with subject —* is how you fulfill the function*.”
- Apparently [how they made slides](https://medium.com/adventures-in-consumer-technology/this-is-how-we-make-slides-at-apple-b8a84352bf6d) at Apple. Love “one idea, one slide” and the “font size 30 or above” rules.
- After you watched both videos, read [this Jason Pargin piece](https://www.cracked.com/blog/6-harsh-truths-that-will-make-you-better-person) (ignore the URL, ignore the title, ignore the pictures). I re-read that 2-3 times a year. Seriously.
- Don’t know what to think about [this post about working at an art gallery](https://www.henrikkarlsson.xyz/p/art-gallery) yet. But I keep thinking about it. I’m not sure yet whether it falls into the “huh, why didn’t everyone figure out this thing that I, a humble person, figured out immediately” genre, which I’m not a fan of, but I liked this: “something that became clear to me at the gallery, and from working with people like A and B who did art at a high level, is that you simply can’t afford to do good stuff if you don’t figure out the funding part.”
- I shouldn’t be surprised, and yet I am: people are [modding microphones](https://aftermath.site/akg-perception-p220-p420-mod-neumann-u87-clone).
- [Roaming RAG](https://arcturus-labs.com/blog/2024/11/21/roaming-rag--make-_the-model_-find-the-answers/) means to “put the LLM assistant to work. Let *it* navigate through the documentation and find the answers.” Dude.
- I’ve only skimmed it, but Michael Nielsen [asking](https://michaelnotebook.com/optimism/index.html) “How to be a wise optimist about science and technology?” is very interesting.
- [This Tumblr post](https://squareallworthy.tumblr.com/post/163790039847/everyone-will-not-just) is constantly on my mind: “If your solution to some problem relies on ‘If everyone would just…’ then you do not have a solution. Everyone is not going to just. At not time in the history of the universe has everyone just, and they’re not going to start now.” That might just be the biggest lesson I’ve learned in my career. Learned at a startup that tried to get people to use their cars less. Even if everyone says they would, no, everyone is not going to just.

---

---

# Joy & Curiosity #17

*Interesting & joyful things from the previous week*

By Thorsten Ball • December 1, 2024

---

---

- Last weekend I first read [this article on the network model in Quake 3](https://fabiensanglard.net/quake3/network.php) and then [this blog post](https://fabiensanglard.net/quake3/The%20Quake3%20Networking%20Mode.htmlhttps://fabiensanglard.net/quake3/The%20Quake3%20Networking%20Mode.html) it links to — it’s beautiful. It made me want to build a networked game via UDP. It made me think: if you have a good design, things just seem to fall into place in a way that makes you think “they couldn’t have fallen anywhere else.”
- New [James Somers piece in New Yorker](https://www.newyorker.com/magazine/2024/12/02/a-revolution-in-how-robots-learn). Wonderful. Recommended weekend read.
- There’s a [new Benedict Evans presentation](https://www.ben-evans.com/presentations) out and I not only recommend reading through that but also want to add that I’ve been a paid subscriber of his newsletter for over a year now and I think it’s by far the best investment I’ve made into any subscription.
- In the mood for an astonished-eyebrows-raised face? Read through “[Vladimir Nabokov's opinions on various writers](http://wmjas.wikidot.com/nabokov-s-recommendations)”. Here’s a taste, Nabokov on Dostoevsky: “Dislike him. A cheap sensationalist, clumsy and vulgar.” On Satre: “Even more awful than Camus” On Plato: “Not particularly fond of him.” On Joyce: “A genius.” I guess an American would say: the balls on this guy, huh.
- Being a consultant: “[No matter how much you try, you can’t stop people from sticking beans up their nose.](https://archive.uie.com/brainsparks/2011/07/08/beans-and-noses/)”
- Very, very interesting and thought-provoking: [Erik Meijer asking](https://youtu.be/vYc8TR-otBc?t=843) why search for code when you can ask an LLM to write it for you?
- Not a lot of new things [in this](https://www.oneusefulthing.org/p/getting-started-with-ai-good-enough) for me, but the recommendation to “treat AI just like an infinitely patient new coworker who forgets everything you tell them each new conversation” made me consider that I still underestimate the “patient” part. Give me 5 examples? How about 500?
- [On the power of the RUNK](https://www.experimental-history.com/p/underrated-ways-to-change-the-world) and other ways to change the world: “Notice they both use the word ‘maintain’—not ‘invent,’ not ‘lead,’ but *maintain*. The power of a RUNK is that it works *consistently*. It was there counting numbers before it was cool, and it keeps counting numbers no matter how cool it gets.”
- Somehow came across Zach Klein’s [personal San Francisco Travel Guide](https://www.zachklein.com/sf/). Love the idea of personal travel guides presented like this. I have a text file somewhere deep in my computer with Berlin coffee shop and Pizza recommendations that [Robin](https://coding-robin.de/) once gave me and I’ve copy&pasted that file into at least 4 conversations about Berlin trips.
- Simon Willison [on storing time for human events](https://simonwillison.net/2024/Nov/27/storing-times-for-human-events/). You have to love the RUNK-like work that goes into the tz database. I mean, come on: “Goodmorning. I’m writing here to propose a new time zone for an all-year open Antarctic base. The base is a French–Italian research facility that was built 3,233 m (10,607 ft) above sea level at a location called Dome C on the Antarctic Plateau, Antarctica.”
- In case you haven’t, try [the OpenAI realtime API](https://x.com/ilanbigio/status/1861913173432946808) in the web browser, mixing voice and text. It’s nuts, man. It’s nuts.
- Came across antirez’ [aspark](https://github.com/antirez/aspark), a C version of Zach Holman’s [spark](https://github.com/holman/spark). aspark is, by own admission, “completely useless in 2011”, the year it was written in. Look at that README, though. Look at the code. This is the programming.
- Don’t know what to think of it yet, but this presentation on how “[organizations are like slime molds](https://komoroske.com/slime-mold/)” hits the spot for me — I do love me some organizational & company culture theory. ([Shared by Vicki Boykis](https://bsky.app/profile/vickiboykis.com/post/3lc6lo5wwzc2g) in response to wonderment about Big Tech software.)
- “… and you can find [that magic part](https://www.youtube.com/watch?v=sYYIpyHG-8E). And for all you real electric guitar players out there: when you’re in the meat, point it right towards your amp and you’ll feel where the bullseye is — and it’s small — and you’ll feel where the bullseye is. Move your hand up and down. Don’t be afraid to repick it and find it again. Point right towards the cone. And you’ll be like: there’s the bullseye. And if you just lean into it, that badboy will feed back and if you know whatcha doin’, that’s the top of the wave.” That’s the top of the wave — what a phrase. There’s life behind it.

---

---

# Joy & Curiosity #16

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 23, 2024

---

Years ago I was sitting in a hotel bar in Austria, drinking a beer and watching the tennis match that was on. A guy sits down next to me and, with the enthusiasm of someone who’s found a potential conversation partner, says: you a big tennis fan? I tell him: I’m a fan of sitting in hotel bars and having a beer.

Anyway: I’m sending you this from a hotel bar, where I’m sitting and writing these lines, drinking a beer, listening to the bar people, watching new people check-in, hearing the hotel people explain where the elevator is again and again, and hacking a little bit.

Here’s to hotel bars.

---

- The piece of the week for me: [charlatans, martyrs, and hustlers](https://www.midwesternish.com/blog/the-three-mindsets). “The hustler understands that the work will **never **speak for itself. You must speak for it.”
- There’s much to love about [lanparty.house:](https://lanparty.house) the house, the engine room, the wiring, the cat doors, the *cat bathroom*. But what I enjoyed the most was the fact that this site belongs to a rare class of internet gems: a single page, full of information with nothing held back, neatly formatted, easy to digest. Reminded me a lot of the StrongLifts website. I mean, here: [a page about nothing but doing squats](https://stronglifts.com/squat/). Look at the size of that scroll thumb.
- Mind-bender from Austin: [Mirror](https://austinhenley.com/blog/mirrorlang.html), “an LLM-powered programming-by-example programming language”. You provide examples of what the language looks like and then “the ‘compiler’ uses an LLM to generate JavaScript that satisfies the constraints expressed by the examples.”
- Good list about “[good software development habits](https://zarar.dev/good-software-development-habits/)”. Number 8: “Don't feel too bad about moving away from something that was dear to you a while ago and something you felt proud about at the time.”
- Armin Ronacher on [threads vs. async/await](https://lucumr.pocoo.org/2024/11/18/threads-beat-async-await/). It’s a good piece. Yet whenever I see get a glimpse of these discussions I have to think of [the late Wittgenstein](https://www.reddit.com/r/askphilosophy/comments/qpxwib/why_does_wittgenstein_believe_that_philosophical/?rdt=33196): “Wittgenstein basically thinks that traditional problems in philosophy ([…]) stem from importing words from one legitmate use of language into another one.”
- [Chicago Kare](https://chicagokare.xyz/), “a faithful reproduction of the bitmap version of the Chicago typeface created by Susan Kare for Apple Computer in 1984.”
- I’ve never worked at a company that used email for internal communication and whenever I read stories like this one, I wish I did: [Blackberry Tales – The Story of Sumit B](https://awadwatt.com/tezoatlipoca/rim-job-blackberry-tales-the-story-of-sumit-b). Snow day for grown-ups.
- Spent the last week looking into search — embeddings, BM25, how LLMs fit into the picture, and so on — and then, surprise, this popped up on HackerNews: [FastGraphRAG](https://github.com/circlemind-ai/fast-graphrag). I haven’t even looked at the project itself yet, because [this comment tripped me up](https://news.ycombinator.com/item?id=42177909): “Hypothetical answer generation from a query using an LLM, and then using that hypothetical answer to query for embeddings works really well.” They use an LLM to generate *hypothetical answers* to a query and then use those answers to find relevant documents by comparing them in vector space. Don’t know how else to put it, so *pardonnez mon langage,* but that’s fucking nuts.
- Somewhere, someone (bless them) linked to [mousehole](https://github.com/nogweii/mousehole), a [why the lucky stiff](https://en.wikipedia.org/wiki/Why_the_lucky_stiff) project. When I started programming in Ruby, _why was already gone and I only learned about him through [the Slate article](https://www.slate.com/articles/technology/technology/2012/03/ruby_ruby_on_rails_and__why_the_disappearance_of_one_of_the_world_s_most_beloved_computer_programmers_.single.html), but echos of him are still ringing through the Ruby world. This project is a sweet reminder. Just look at that README. “MouseHole can either intrude completely upon your browsing experience or you can keep it off in the outskirts, for whenever you’ve got a second to duck into that little crack in the wall”
- Never really warmed up to Jeselnik, but I’ll read anything about stand-up comics and [this Vulture piece about him and his new special was good](https://www.vulture.com/article/anthony-jeselnik-bones-and-all-stand-up-comedy-profile.htmlhttps://www.vulture.com/article/anthony-jeselnik-bones-and-all-stand-up-comedy-profile.html): “I immediately was like, *Go get the bad out of you. Do as many bad sets as you can get, get them closer to good, and never look back*.”
- Read [In The Dark](https://altamira.studio/itd/) in one evening last week (recommended to me by [Patrick](https://dubroy.com/blog/) & now recommended to you by me) and found [Altamira Studio, which specializes in short books](https://altamira.studio/). Neat.
- Somehow fell into a rabbit hole and kept digging and walking and ended up finding [SillyTavern](https://github.com/SillyTavern/SillyTavern), a “LLM Frontend for Power Users”, which doesn’t say much yet, but then go look at [these screenshots](https://imgur.com/a/comparison-between-airoboros-specific-roleplay-preset-original-universal-roleplay-preset-dHSrZag) here and tell me that we don’t live in interesting times.
- Broke my rule of not looking at social media in bed this morning, but luckily found [Ben’s tweet](https://x.com/r00k/status/1860180128359231887?s=46), quoting General Patton: “I don't want any messages saying 'I'm holding my position.' We're not holding a goddamned thing. We're advancing constantly and we're not interested in holding anything except the enemy's balls. We're going to hold him by his balls and we're going to kick him in the ass; twist his balls and kick the living shit out of him all the time.” The punchline (you’re  damn right this pun was intended) is in [the follow-up quote](https://x.com/r00k/status/1860180354209878217): “When I want my men to remember something important, to really make it stick, I give it to them double dirty.” Now considering writing a book: Kicking Ass & Twisting Balls — How to Communicate to Make Your Message Stick.

---

---

# They all use it

By Thorsten Ball • November 20, 2024

---

Last week, at a conference, I had a random hallway conversation with another engineer. We ended up talking about Zed and he told me he’ll try it, but does it have any AI features? If so, can you turn them off?

I told him that, yes, you can turn them off. Sensing what made him ask, I added that if you do turn them off, it’s all deactivated, no AI in the background, foreground, underground.

Curious now, having a chance for more nuance than a GitHub issue usually allows, with this being a real conversation in the Real World, I asked: so you don’t use AI? Not at all?

No, he said. With a shrug, he added: I tried it once, it was completely wrong, so I stopped using it. Never used it for coding, he said.

What’d you use, I asked. Claude? ChatGPT? Have you tried GPT4?

Not sure, some website, he said with another shrug.
[![](https://archive.thorstenball.com/data/images/151910861.they-all-use-it/1fd09ca7-0e86-4dfc-8a75-8b95ccdac9a4.png)](https://archive.thorstenball.com/data/images/151910861.they-all-use-it/1fd09ca7-0e86-4dfc-8a75-8b95ccdac9a4.png)
I haven’t been able to stop thinking about it.

There wasn’t any doubt in those shrugs. A couple of shrugs saying: I don’t care about all that AI stuff, I’m not interested, I just want to turn it off.

And I keep thinking about it and… I don’t get it.

What I *do* get is if you think AI is over-hyped, or that it’ll never lead to AGI, or that LLMs can’t reason, or that there’s a whole bunch of bullshit flying around in the world with the tag “AI” attached to it, or that it’s too expensive, too inefficient, too restricted, generates too much crap, or isn’t useful for what you’re doing — I get *that*.

What I don’t get it is how you can be a programmer in the year twenty twenty-four and not be the tiniest bit curious about a technology that’s said to be fundamentally changing how we’ll program in the future. Absolutely, yes, that claim sounds ridiculous — but don’t you want to see for yourself?

The boy cried wolf, we won’t fall for that old trick again, hype’s hype and hot air is hot air, but now the whole town is saying there’s a wolf alright and you’re not interested in seeing what it looks like, not at all?

There’s Andreas Kling, creator of SerenityOS and the Ladybird browser, [using Copilot to build JIT compilers](https://registerspill.thorstenball.com/p/playful-programming) and often saying how much he values Copilot. Mitchell Hashimoto, founder of Hashicorp and creator of so many successful tools that I don’t know which one to name here, doesn’t use language servers [but Copilot](https://twitter.com/mitchellh/status/1702368072013865328) when hacking on [Ghostty](https://mitchellh.com/writing/ghostty-is-coming). Fabrice Bellard, a hacker with a portfolio so impressive that if someone would say that he’s made-up and doesn’t really exist you wouldn’t immediately brush it off, has [been getting into LLMs and building tools for them](https://bellard.org/). John Carmack — *John Carmack* — is working in AI now. Jarred Sumner, who wrote Bun into the world, is [using Claude](https://x.com/jarredsumner/status/1857402259099017340) to do something he could easily do himself. Simon Eskildsen, who’s done [more engineering on napkins](https://sirupsen.com/napkin) than others have on their computers, [is using AI “all the time”](https://x.com/Sirupsen/status/1843615039284228227). antirez — the *antirez* — has been [getting into LLMs for at least the last year](http://antirez.com/news/142).

That’s just off the top of my head. I could go on and on and on, but I won’t because — somehow, magically? — I can hear you say “that’s an appeal to authority, it doesn’t mea—” Yes, yes, yes, you’re right.

Look. I’m not saying you should kneel in front of the AGI altar.

What I’m saying is that ever since I got into programming I’ve assumed that one shared trait between programmers was curiosity, a willingness to learn, and that our maxim is that we can’t ever stop learning, because what we’re doing is constantly changing beneath our fingers and if we don’t pay attention it might slip aways from us, leaving us with knowledge that’s no longer useful.

Maybe that assumption was wrong, maybe we don’t all share this trait, and maybe that’s okay, but even if… I don’t get how you can see some of the world’s best programmers use a new technology to make them better at programming and shrug it off.

How can you see them all use it and not think that, okay, maybe it’s not all bullshit, maybe something’s there, I need to figure out what it is?

---

# Joy & Curiosity #15

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 17, 2024

---

Yesterday I took the train to Munich and gave a talk at Homebrew Systems Club, titled Writing Tucan. I talked about Tucan, the optimizing compiler I built from 2020 to 2023 and that's now sitting in my vault, waiting for what I do with it. (If you’re interested, you can [find the slides here.](https://thorstenball.com/talks/writing_tucan_nov_2024_homebrew_systems_club.pdf))

Now I’m sitting on the train again, this time going back home, and keep thinking: what a lovely day it was! Interesting conversations with interesting people, proper Bavarian dinner, a few beers to end the evening with — what more can you really ask for?

---

- When I was a teenager, the grown-ups warned us that everything on the Internet is permanent — what you put on there, will be there forever. Nowadays we all know that’s not true. Linkrot, bitrot, Google shutting down products — the Internet is anything but “permanent.” That makes it all the more lovely when you can genuinenly peek into the Internet’s past, as in this post: [IMG_0416](https://ben-mini.github.io/2024/img-0416). “During the Send to YouTube era of 2009 and 2012, the title of one’s YouTube video was defaulted to this naming convention. Unwitting content creators would then upload their videos on a public site with a barely-searchable name. To this day, there are millions of these videos.”
- Now this post, this is it: [How I ship projects at big tech companies](https://www.seangoedecke.com/how-to-ship/). Commenters were furious about it — “this is all bullshit” — but I think the article is spot-on and it contains more than just a truth about working at larger companies.
- [Leaving and waving](https://deannadikeman.com/leaving-and-waving) — beautiful and sad.
- I read Norman Maclean’s [A River Runs Through It](https://www.newyorker.com/magazine/2024/07/08/norman-maclean-a-life-of-letters-and-rivers-rebecca-mccarthy-book-review) this week and fell in love with his writing. Immediately, on the first page. Then, a couple days later, I came across this [New Yorker piece on Norman Maclean](https://www.newyorker.com/magazine/2024/07/08/norman-maclean-a-life-of-letters-and-rivers-rebecca-mccarthy-book-review), which was also fantastic. "One of those questions is practical, a matter of craft: How does he do this? But another is ontological: What kind of man could make this work?" Highly recommend the book (the title-giving story is only ~120 pages or so) and this article — nice pairing.
- [Oz wrote something](https://newsletter.ozwrites.com/p/november-ramble?) really interesting: “I generally prefer not to comment on software development practices, because of something I’ve observed often enough that it feels like a law: *for every excellent engineer who swears by a particular practice, there’s an even better one who swears by the opposite.” *Imagine we all shared this preference.
- “[And by the time they get to university and by the time they’ve done an undergraduate degree, they’ve learned to become proficient. I mean, those that pass through the sieve and eventually get to become physicists or something, they have all learned how to do the same thing in the same way. And that’s going to put a damper on doing things a different way, a new way.](https://x.com/arjunkhemani/status/1855927262345838770)”
- As real as it gets: [How We Built a Self-Healing System to Survive a Terrifying Concurrency Bug At Netflix.](https://pushtoprod.substack.com/p/netflix-terrifying-concurrency-bug) “This was an inflection point at which many other places I’ve worked would have psychologically collapsed under the weight of their own worldview. […] I’ll say this about Netflix – during my time there, I always found it to be an extremely practical place.”

---

---

# Joy & Curiosity #14

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 8, 2024

---

This week I deleted all social media apps off my phone. They’ll be back — I’m no saint — but after letting loose on Wednesday, snorting up everything on every feed in every spare minute, I woke up hung-over on Thursday, disgusted with myself. And disgusted with myself I, of course, scrolled some more, then slapped myself in the face and deleted the feeds.

Thursday evening I then spent reading books and long-form — like the person who wakes up with a New Year’s resolution to loose weight and immediately does 20 push-ups in their bedroom that won’t do anything weight-wise — trying to zoom out, trying to step back away from the chatter. That resolve has also snuck into this list this time.

Also: I’ll be at the [RustLab conference](https://rustlab.it/) in Florence on Sunday and Monday — if you’re there, feel free to say hi!

---

- Short & sweet: [why software only moves forward](https://swizec.com/blog/why-software-only-moves-forward/). ”Ok so the *database* can't be rolled back. Data lives forever.”
- Time for me to finally recommend [Patrick Radden Keefe](https://en.wikipedia.org/wiki/Patrick_Radden_Keefe)’s books to you. In September I read three of them: [Say Nothing](https://www.goodreads.com/book/show/40163119-say-nothing) (fantastic!), [Empire of Pain](https://www.goodreads.com/book/show/43868109-empire-of-pain) (fantastic!), and [Rogues](https://www.goodreads.com/book/show/59148726-rogues) (so good!). In October I read his first one, [The Snakehead](https://www.goodreads.com/book/show/6004724-the-snakehead), which I didn’t enjoy that much — made me think that at that point he hadn’t figured out the recipe that made the other three so good, which are *really* good and you should read them. (Also: I learned that [Dua Lipa runs a bookclub and had Keefe on](https://www.youtube.com/watch?v=X4wT1XJt-c8).)
- Listened to two episodes of the [Dwarkesh Patel podcast](https://www.youtube.com/@DwarkeshPatel). This one [with Daniel Yergin](https://www.youtube.com/watch?v=sveBcfz0fHk) cured my social-media hangover (now I want to read The Prize) and [the one with Sarah C. M. Paine](https://www.youtube.com/watch?v=YcVSgYz5SJ8) I’m still going through and enjoying every minute of.
- Andreas made me laugh out loud by saying we “[might as well use claytablets.](https://x.com/andreasklinger/status/1853350156810277233)”
- This week I also signed-up to [Readwise.io](https://readwise.io) again and it resurfaced the following quote from Clayton M. Christensen’s [How Will You Measure Your Life?](https://www.goodreads.com/book/show/13425570-how-will-you-measure-your-life): “Given that 93 percent of companies that ended up being successful had to change their initial strategy, any capital that demands that the early company become very big, very fast, will almost always drive the business off a cliff instead.” I’ve been thinking of this quote for three days now. I mean, it sounds obvious, doesn’t it? But then you think about it and compare it to what you see and realize that, no, wait, what an insight.
- This New Yorker piece from 2015 (!) asks: [Can Reading Make You Happier?](https://www.newyorker.com/culture/cultural-comment/can-reading-make-you-happier) “The insights themselves are still nebulous, as learning gained through reading fiction often is—but therein lies its power. In a secular age, I suspect that reading fiction is one of the few remaining paths to transcendence, that elusive state in which the distance between the self and the universe shrinks.” Read it on Thursday evening and it made me feel better.
- Another book, another reading recommendation: David Ogilvy’s [Confessions of an Advertising Man](https://www.goodreads.com/book/show/44895.Confessions_of_an_Advertising_Man). It’s about working, being creative, running a business — and it’s endlessly quotable, so I’m having a hard time to pick the right one here. Let me go with this one, which applies to programmers to: “Once upon a time I was riding on the top of a Fifth Avenue bus, when I heard a mythical housewife say to another, ‘Molly, my dear, I would have bought that new brand of toilet soap if only they hadn’t set the body copy in ten point Garamond.’ Don’t you believe it.”
- Max Siedentopf’s [Passport Photos](https://maxsiedentopf.com/passport-photos/) made me smile. First on my phone, while looking at the photos, then on my computer too, when seeing the mouse cursor he has on that site.
- At work I was writing about branchless programming and tried to find something I can link readers to, something that explains what branchless programming is, or why branches can be a problem. Found these two Daniel Lemire blog posts on the topic that are excellent: [Mispredicted branches can multiply your running times](https://lemire.me/blog/2019/10/15/mispredicted-branches-can-multiply-your-running-times/) and [Benchmarking is hard: processors learn to predict branches](https://lemire.me/blog/2019/10/16/benchmarking-is-hard-processors-learn-to-predict-branches/).
- Speaking of performance: this podcast episode with Martin Thompson on [Mechanical Sympathy](https://www.youtube.com/watch?v=z7twjdnSYy4) is something I often think of.
- Just like [this Scott Myers talk](https://www.youtube.com/watch?v=WDIkqP4JbkE).
- Or this one: [The Future of Fast Code — Giving Hardware What It Wants](https://www.youtube.com/live/66oKqvwoIv0?t=1238s).

---

---

# Joy & Curiosity #13

*Interesting & joyful things from the previous week*

By Thorsten Ball • November 2, 2024

---

Rewatched Jaws again this week and, man, what a movie. There are no ten seconds in it that aren’t worth rewinding and analysing. There’s no filler. From start to end it’s all frames that have to be there in the way that only few things have to be.

Made me wonder: a movie like that, that’s a huge project, it’s many people over a long period of time working on a single thing that seems to follow a single person’s vision — what software, besides games, is like this? Software that feels as if it came out of a single person’s fingers and yet it didn’t?

---

- I’ve read a lot about async Rust this year and this is one of the best introductions to it: [Async Rust in Three Parts](https://jacko.io/async_intro.html). Also a good reminder that I still don’t understand `Pin`. My mind’s teflon and `Pin` is melted butter — just won’t stick.
- [“A talented person can quickly become mediocre when you force them to be someone they aren’t.”](https://collabfund.com/blog/your-way-is-the-only-way/) Great Morgan Housel piece I came across. This sentence here — “You do your best work and have the most fun when you’re not burdened by fear that someone else thinks you’re doing it wrong” — made me feel naked.
- Time to share a classic: [Performance Matters](https://www.youtube.com/watch?v=r-TLSBdHe1A) by Emery Berger. I think of this talk every. time. I’m writing a benchmark. Every time.
- Used it last week to debug a production issue and, my god, is it a life-saver. Ever have to do anything with Kubernetes? But not often enough to remember how to use kubectl successfully? In case you don’t know it yet, here’s my present to you: [k9s](https://github.com/derailed/k9s).
- This interview with [Wall Street’s Wisest Man](https://jasonzweig.com/wall-streets-wisest-man/) is great. Consider just this bit: ”Because he will have a dreadful two or three years. I guarantee it. Every good manager does.” Imagine saying that in the world of software: this programmer will have a dreadful two or three years, that’s how it is. Two or three years! Also: I really liked that there’s "the smartest sons of bitches in the world working their tails off all day long." (A bucket list item of mine is to use “sons of bitches” in a business context.)
- Paul Graham on [Writes and Write-Nots](https://paulgraham.com/writes.html): “writing is thinking. In fact there's a kind of thinking that can only be done by writing.”
- This [Norm Macdonald Twitter Anthology](https://normtwitteranthology.tumblr.com/) is wonderful. [“Smart man says nothing is a miracle. I say everything is.“](https://normtwitteranthology.tumblr.com/onmiracles) I discovered Norm really late, five years ago maybe, and it took me a lot of “work” to get him. And I really wanted to get him, since he was considered the “comedian’s comedian” and if there’s one thing that makes me interested it’s calling something a “something’s something”. Now, years and endless YouTube clips later, rewatching videos of him has become something of a meditative practice.
- Look at [the size of this fucking display](https://daniel.lawrence.lu/blog/y2023m12d15/)! wowowow! I’d never use something that big, but in all my years of using 27-inch displays I’ve been constantly wondering whether 32-inch wouldn’t be better. [Michael Stapelberg’s posts](https://michael.stapelberg.ch/posts/2023-07-03-dell-u3224kba-32-inch-6k-monitor/) on his 6K and 8K monitors kept that fire burning.
- Zach Tellman writing in [the death of the architect](https://explaining.software/archive/the-death-of-the-architect/): “And then, three years after the Manifesto, Beck released the second edition of Extreme Programming Explained. It had been rewritten from scratch. There was not a single mention of metaphors or system architecture. Nor, really, any discussion of the future. In this iteration of XP, you simply moved from moment to moment.” and “Decades later, software design has become something of a backwater. Most writing on the subject can only be called ‘post-design.’ It is defined by what it refuses to discuss.” It makes me happy to know there’s someone out there comparing first and second editions of Extreme Programming.
- Jason Fried on [high problems and low problems](https://x.com/jasonfried/status/1852387512150532604?s=46). My prediction: I’ll keep thinking of this definition for years.
- Armin Ronacher saying “[Software Should Decay and Lose Data](https://lucumr.pocoo.org/2024/10/30/make-it-ephemeral/)”. Made me think of [Trello cards decaying](https://trello.com/power-ups/55a5d917446f517774210012). Armin’s point is a bigger one, but to linger on just the visual decaying idea: what if you open your GitHub issues and you could immediately see (not by parsing a date or a relative timestamp) which ones are old and dusty and haven’t been touched in years? What if you could chuck them out just as easily as you can chuck out an old stack of magazines that you recognize by simply looking at them?
- Pleasant read: [Do Hard Things Carefully](https://blog.depthsofrepair.com/p/do-hard-things-carefully).
- Antonio did some [branchless bit twiddling](https://github.com/zed-industries/zed/pull/19913/files#diff-455fbb7ac46af2c5ce888e49ebfe8c8550205b947c77346aeaf52f120ac46fc9R512-R548) this week and said he got some ideas from this [Bit Twiddling Hacks](https://graphics.stanford.edu/~seander/bithacks.html) page, which I didn’t know but feels like I should’ve. What a wonderful page! Man, I do love ctrl-f friendly pages.
- Not sure yet what I think about Dan Luu’s post on Ballmer:[Steve Ballmer was an underrated CEO](https://danluu.com/ballmer/). The HackerNews discussion around it [was very interesting](https://news.ycombinator.com/item?id=41976754) and made me again think that there just never is a single point of view. I also thought that the [Acquired episode on Microsoft](https://www.acquired.fm/episodes/microsoft-volume-ii) made a good point: don’t underestimate that one of Ballmer’s main jobs was to keep the company together after years of antitrust trial.
- “[I like when the rain is misty and you get to feel like a grocery store broccoli for a little while.](https://x.com/thenatewolf/status/1851492017383084479?s=46)”

---

---

# In Conversation: David Albert

*Talking with the co-founder of Recurse Center about learning*

By Thorsten Ball • October 31, 2024

---

Today I have something different for you. It’s a transcript of a conversation I had with [David Albert](https://x.com/davidbalbert), co-founder of [the Recurse Center](https://www.recurse.com/).

David and I have been talking regularly this year. We always talk about programming and nearly always one of us ends up saying “man, I love programming.”

Last week, spontaneously, I asked him whether I can record & transcribe our next conversation. He said yes. We talked about learning new things, whether learning’s fun, building your own tools, what David learned at the Recurse Center — all the good stuff, it was fun.

I shortened the transcript, cleaned it up, and slightly polished some sentences to highlight intended meaning. (Halloween challenge for you: record yourself, get a transcript, and scream at all the filler words you use.) Here it is.
[![](https://archive.thorstenball.com/data/images/150798584.in-conversation-david-albert/79ce19b3-214d-4e8b-a73c-26699a694f0c_989x400.png)](https://archive.thorstenball.com/data/images/150798584.in-conversation-david-albert/79ce19b3-214d-4e8b-a73c-26699a694f0c_989x400.png)
**Thorsten**

How do you learn new things? Two weeks ago, you told me you’re getting into calculating orbital— what’s it called?

**David**

Orbital mechanics and guidance, navigation & control.

**Thorsten**

How do you get into that? Do you start and watch a video and then watch another video? Or do you go and buy five books and read them one by one? Or do you start playing around with code right away? What’s the process?

**David**

I watch a video and then I watch another video. That’s generally what I do.

**Thorsten**

You go on YouTube and you type in “orbital mechanics”?

**David**

Yeah, “Orbital Mechanics Simulation”. I found a channel called [Orbital Mechanics in Python](https://www.youtube.com/watch?v=mEbLsoryfHo). And I just started watching that.

I think I do experiment relatively quickly. I want to get something running. So I started writing some JavaScript, basically.

**Thorsten**

Really? You put something on a canvas and you try and visualize it or…?

**David**

Yeah, that’s it. I think it’s funny my instinct is to do everything from scratch.

So originally I was thinking, I’ll do it in 2D and draw everything myself. And I had to remind myself that the purpose of this is to eventually learn guidance, navigation, and control (GNC) and even the orbital mechanics part of it is just a waypoint on the way. So I used Three.js.

But I have a very strong instinct to do everything from scratch, which I think is for the most part not a very productive instinct.

**Thorsten**

Didn’t we talk about this previously? That some programmers are forward-looking and when they learn a new thing they try to go to the edge of what’s possible right now, and other programmers are more like, wait a second I need to go back and understand this from scratch.

**David**

I think I would probably phrase it slightly differently, but yes.

What I struggle with is that I love taking things apart and learning how they work and I also love computer history, right?

A year ago or so I read Showstopper. It’s about the creation of Windows NT. Great book. And I’ve read tons of other books like that. So much of what I enjoy is related to this thought: what would it have been like to be at this point in the development of computers? Because those are the exciting stories that I grew up with when I was a kid. The computer was the most exciting computer. And it still is.

I think this is just part of getting older, you’re nostalgic for the things of your youth.

**Thorsten**

I’ve been trying to get into font rendering…

**David**

I love it. Talking my language.

**Thorsten**

… and for me, that’s mostly about trying to understand from the bottom up.

When I look at a topic like that — font rendering — and I want to understand it, I don’t go and pick out libraries. I might start with libraries but then I’d look at their source and see what they’re doing and try to find the start, the bottom of it.

I often wonder whether it gets in my way.

**David**

That’s so interesting. I don’t think that it’s necessarily bad. I think it’s effective.

Going to the source, trying to understand at a deep and comprehensive level — that’s useful and effective. I don’t think that’s bad at all.

The tension that I feel is between wanting to take apart old things and wanting to contribute something new. But that’s not a tension about wanting to understand the thing I’m working on, right? Whatever it is that I’m working on — it’s useful to understand it.

Honestly, the thing that I struggle with is that if you put a computer problem in front of me and it’s interesting I get engaged with it. It sort of doesn’t matter which one it is. The challenge for me is to pick the right problem to get engaged with and not just the first one.

Sometimes the first one is the one you need to be working on. But in my case — the orbital mechanics drawing — it wasn’t. I was getting distracted by the “I’ll draw everything from scratch” problem — which is a fun one — at the expense of learning the techniques to simulate orbital mechanics, which is also a fun problem.

So I had to tell myself to just use an existing system for the rendering. And now, I get to work on another fun problem but that one happens to be closer to the stuff that I’m actually trying to accomplish.

---

*David’s been on a sabbatical last year, writing [his own text editor](https://github.com/davidbalbert/Watt), and now, after 13 years of helping to run the Recurse Center, he’s [wants to work in space](https://davidbalbert.notion.site/Hire-David-Albert-to-work-in-space-bbe0d12e84a74c9c88f7d504851dcfdc). That’s also why he’s now calculating orbital somethings.*

---

**Thorsten**

If I were to ask you to build me a vector database — assuming you haven’t built one…

**David**

I’ve never built one.

**Thorsten**

… and I’d give you a week. When would you start writing code?

**David**

I don’t know what a vector database is, so I’m not sure.

But I think it comes down to judgment and taste.

Usually it’s not particularly effective to just start coding immediately before you understand anything, right? It’s also definitely not effective to spend the whole day or the whole week reading and then having produced nothing by the deadline.

One skill is knowing when you should stop reading and start implementing because, among other things, when you start implementing, you quickly learn the actual problems that you’re going to face and the actual things that you don’t understand. And if you spend too much time reading and you end up reading about the wrong things.

And I think that’s a matter of judgment that, at this point, I’m okay at. I don’t think I’m particularly great at it.

**Thorsten**

I run into that often.

I’d work through a book, type out all the code, read it end to end — cool, book is checked off now. Then, two months later, I realize that I barely retained anything from the book.

Then I realize what I should’ve done is to read a chapter, then try to build something without looking at the book, bump into problems, go back to the book. Learn, practice, learn, practice — that kind of rhythm. I always notice it too late.

**David**

Well, you know, there’s all sorts of techniques that I mostly don’t use, but that I think might be applicable here, not as concrete suggestions to use them, but more as insights into how people think about learning.

For example, I’ve heard from some people that the way they read a paper is first they just read the abstract and all the all the section titles and the conclusion, and then they read the whole thing again, but without stopping if they don’t understand something, right? And then they read it again.

That’s something I don’t do but I could probably benefit from, because oftentimes when you’re really trying to understand a hard thing and you’re struggling and struggling and struggling and.. then it turns out the next paragraph explains the whole thing.

Another interesting idea that I almost never do but that’s sort of a fun discipline is to write the program three times.

What’s embedded in both ideas is that you have to do it multiple times.

---

**David**

I can’t remember if we talked about this, but one thing I think about a lot: when you’re trying to solve a problem, when does it make sense to build a tool to help you solve the problem?

I think this is something I don’t have particularly good judgment on but there some programmers who are very good at this.

And, I think, the question is always: is the juice worth the squeeze? How long is it going to take me to build this tool and how beneficial will it be? There are people who have a good intuition for that and say it’s worth spending four days building this tool.

I experiment with that sometimes to see if I’m right. I’ll build a tool to help me solve the problem and see what happens.

**Thorsten**

Do you think the people who decide to build a tool, they have solved the bigger problem before?

**David**

Yeah, I do think this comes from experience. I also think it probably comes from domain.

I really don’t know, but my guess is game programmers do this a lot. Because among other things, if you’re building a complicated game, you have to build a level editor. Maybe you don’t have to, but it seems like lots of people build level editors for their game and or game engine. Clearly there seems to be a lot of evidence that people find that worth doing.

I sort of wonder what would it be like to be in an environment where that’s a common thing? You know, I’d probably get some decent insight and heuristics about when is it worth it.

**Thorsten**

Maybe in a large company with a developer tooling team.

**David**

Right. Obviously those organizations have decided — as an organization — it is valuable to build tools to help us do the thing. I think that that makes it easy. If you’re hired to build tools, then what you do is you build the tools.

But as an individual programmer, I sort of wonder, when is it worth it for me to take a step back and build the tools?

I was doing some other physics simulation, hydrostatic simulation recently — say you drop a ball in water, does it sink to the bottom or does it float and how does it behave? — there’s the force of gravity, which is pulling the thing down, and there’s three forces that are pushing it up.

There’s the viscosity of the liquid, there’s the drag. The drag is proportional to the velocity squared. Viscosity is proportional to velocity. And there’s also buoyancy, which is proportional to the volume of the water you displace.

And I had a bug.

I used D3 to build some graphs and I’m not good at D3 and all of this was frustrating. I just wanted a chart of each force, the acceleration, and the position. It took like four, five hours to get the chart working. That’s a lot of time.

But then once I had the chart working, the bug was obvious.

The bug was this. The buoyancy force, which points upwards, is relative to the volume of the water you displace. So as soon as the ball hits the water, it’s displacing some volume of water and the maximum volume it displaces is once it’s fully in, right? Once it’s fully in, it doesn’t matter how deep it is, it’s the same buoyancy force.

So what you’d expect is that the graph ramps up based on the shape of the object until the whole object’s in and then it’s flat.

Instead, my graph shot up and then went back down. And so I was like, well, there’s the bug, right?

I don’t know how long it would have taken me to find that bug without the graph, because the actual bug was that I was missing some parentheses.

---

**Thorsten**

How has being at Recurse Center changed how you learn new things?

**David**

It’s made that important — learning new things. That’s the first thing.

I value learning very much. I enjoy it very much, I like getting good at things and understanding things. And, I mean, I certainly felt that way for longer than RC (we started RC in 2010) but it’s one of those sort of mutually reinforcing things. I brought that to RC but then seeing all the things that people did at RC put more of that in me.

The other thing — and I don’t exactly know where I got this idea from — well, I guess I do.

One of the things we talked about at RC a lot is: how to talk about RC, both to the outside world, but also to the people who are doing it? We talked, for example, about how do you know if you’re pushing yourself? Those sorts of conversations had a strong effect on me.

One unpleasant feeling is when you’re trying to understand something and you spend two days on it and you feel like you’re making no progress, right? You’re trying to understand a hard thing. When you started, it felt totally opaque. But then, a few days later, it still feels totally opaque. That feeling — it’s just really crappy.

And one of the things that I got out of these conversations at RC is that, basically every time I feel this crappy feeling, I remind myself that this is a *good* feeling because it means I’m at the edge, it means I’m pushing myself.

If I feel like I don’t understand this at all and I don’t have any purchase on the problem, I should keep working at it because it means I’m working on something hard and if I keep pushing, I’ll learn something. And at this point, as a programmer, I have enough experience to know that I will get it if I keep pushing, right? It might take a few more days, but I’ll get it.

And it really does happen. It happens all the time. Even yesterday, I was doing some Eulerian fluid simulation because it’s pretty to look at those visualizations. It was fun but I just didn’t understand advection — which I don’t understand well enough yet to explain it — and I was banging my head against the wall. And I was watching this video by [Matthias Mueller](https://matthias-research.github.io/pages/about.html), who’s a scientist at NVIDIA and has this incredible YouTube channel called [10 Minute Physics](https://www.youtube.com/channel/UCTG_vrRdKYfrpqCv_WV4eyA). I can’t recommend it enough. And I was watching his video over and over again. I couldn’t get it. Last night, a few hours after I had started programming, I still didn’t get it. But then, all of a sudden, it felt like I have purchase, I’m starting to see the big picture, I *sort of* understand…

**Thorsten**

… found something that gives you a little bit of grip…

**David**

Yes, exactly. And that’s the thing, right?

You’re in this situation and think, I don’t understand anything, I don’t understand anything about this problem. And you keep reading and you read somebody else’s code and you read the paper again and you read the blog post or the book and you still don’t get it. But then, two days later, you get it.

I think that’s probably the most important thing that I got in my personal programming practice out of RC — that I should “reclassify” that feeling, that I should see it as a *good* feeling, not a crappy one. It’s still unpleasant, in the middle of it, but when I’m feeling that, I should remind myself that this is good because it means I’m working at the edge and if I keep doing this, I will understand it. And then that will feel really good, *actually* good.

**Thorsten**

You said this came out of conversations with other people, internally and externally?

**David**

Yeah, to a certain extent.

The conversations within the people who worked at RC, they were often about questions such as: how do Recursors understand and conceptualize what they are trying to do at RC? Or about how to be effective at RC.

These are complicated, nuanced ideas, and eventually the thing that was the most effective turned out to be very simple. (Of course that’s true in so many contexts — making something simple is the most work, right?) But here’s this memory I have about this.

Gosh, this must have been— could it have been maybe the Christmas-ish of ‘21, like November and December of ‘21?

We were working on coming up with this thing that we called the self-directives — three principles, three ideas, sort of imperatives, things that if you do at RC, you’ll probably have a good experience.

There was a group of probably four of us working on this. And we read this book, a marketing book called [Positioning](https://www.amazon.com/Positioning-Battle-Your-Al-Ries/dp/0071373586) (that I think actually everybody should read), that ended up being pretty valuable.

The reason we were thinking about marketing in the first place is because the self-directives are also a way to talk to the outside world about what you might do at RC and get you excited.

And the three self-directives— I’m just [going to go to them](https://www.recurse.com/self-directives) because I wanna make sure I get the wording right.

The things we came up with are:

- work at the edge of your abilities
- build your volitional muscles
- learn generously

Work at the edge of your abilities — I think is that’s pretty self-explanatory.

Learn generously — be public, learn in public, share. That sort of thing, but obviously it’s more nuanced than that. (It happens to be something I’m particularly bad at which I think is funny.)

Build your volitional muscles — I think that one was the most complicated, the one that we struggled the most to explain. Even that phrase, you know. I like that phrase — once you understand it — but it’s pretty opaque.

Basically it’s about tuning into the things that get you going, the things that you want to do because they get you excited, because they engage you rather than because you think you should do them or somebody told you that you should do it or whatever.

That’s the directive we struggled with the most, but then there was this thing that my colleague, Rachel, came up with. I think it was Rachel. She came up with a “volitional muscles workshop”, an optional one-hour workshop.

And the way I remember it is you come into the workshop and write out all of the things that you think you should do because of an insecurity or because someone told you. And then you write out all the things that you’re excited about.

That’s very simple. But I think that workshop is probably the most impactful thing that came out of our work on the self-directives.

Simple, right? You don’t have to call that a volitional muscles workshop. Just write out the reasons you think you should do things and then write out the reasons you want to do things. But people find it incredibly helpful and the phrase “build your volitional muscles” has permeated RC in a wonderful way.

**Thorsten**

So the reasoning behind this is that you should focus on the things you’re excited about because you will learn more?

**David**

Yeah, I’d put a slight tweak on that. To me, I think the most important thing is writing these motivations and reasons out.

It’s not that now you’ve written them out, you have to only focus on the the things on the right. The idea is you learn better when you’re working on something that engages you, that you’re naturally curious about, that you feel is relevant.

You know, I never enjoyed English class very much. It just didn’t feel relevant. I was a mathy, sciencey person. But then at RC, I had to do a lot of writing and all of a sudden I cared about writing. When something becomes relevant and exciting and interesting or necessary — that’s when you’re gonna probably be most successful learning about it.

Philosophy is a big word that gets thrown around too much, but in so far as RC has a philosophy, that’s a big part of it: people learn best when they’re given freedom and they choose to explore the things that actually interest them.

So that’s the idea.

The exercise helps avoiding spending three months at RC learning from a place of fear, when you think: I’m afraid I won’t get a job, I’m afraid I’m not a good programmer, I’m afraid I have to know all of this stuff.

There are plenty of people who were professional programmers and who had been professionally programming for eight, ten years, but didn’t have a CS degree. Then they came to RC and said, well, I need to do data structures and algorithms, because that’s the name of a class that everybody takes and I feel anxious about the fact that I don’t know these things.

Well, if you spend three months trying to learn from that fear and anxiety, I think on average, you won’t have nearly have as good a time or learn as much or do as much good work as if you’re coming from a place of curiosity, interest, excitement, doing things that feel really relevant to you.

**Thorsten**

That’s something that I still struggle with.

With the AI hype really starting two years ago, I thought I now have to learn about neural networks now, because I *have* to, because otherwise I’m missing out.

And I sat down and watched those videos, but I could feel that I’m not enjoying this. I don’t like working Python notebooks and… This is not what makes me happy. But I don’t know how to solve this in practice except to say, well, this is not for me right now.

**David**

I had exactly the same experience when it came to AI.

I was on sabbatical from April 2023 to April of 2024 and I spent that time programming for fun. I spent most of that time writing a text editor. You know, as one does.

But I also thought AI was super interesting, that these systems are wild. And at the same time I felt an incredible amount of anxiety about AI because, well, obviously I don’t feel obsolete as a programmer *right now*, but these systems keep getting better and better and is there a ceiling to that? Will I be obsolete at some point? If I don’t learn how to use these tools effectively, will I be at a huge disadvantage? And then, furthermore, is programming AI the only sort of programming that’s gonna matter at some point, right? So I had all of this anxiety in addition to actual interest in the topic.

So my friend Caitlin and I sat down and we went and watched some of Andre Karpathy’s videos and enjoyed ourselves and didn’t really write code, but did really try to understand: watch it slowly, pause, go back, pause, go back, right?

And what I thought was really instructive was that all I could think of was getting back to the text editor. There was a day that Caitlin couldn’t meet up and I was *relieved*, cause that means I get to work on the text editor.

And I think both, that it’s good that I know how to listen to that and also that the extrinsic motivations, the fear-based motivations, whatever you want to call it — those are real and they’re hard to deal with.

It’s way easier to come up with the self-directives than it is to apply them to your life.

---

**Thorsten**

Glad you brought up Karpathy. He said: “[Learning is not supposed to be fun](https://x.com/karpathy/status/1756380066580455557?lang=en)”. What’s your reaction to that?

**David**

I think I understand what he’s getting at.

That feeling of being totally lost in a problem and not understanding anything — that is not fun. And even though I’ve gotten good at reminding myself this is a *good* feeling and that I’m doing the right thing when I feel that — it’s still not fun.

There’s this joke that I make regularly, which I’m sure I’ve told you, it’s this: what’s fun about writing? Having written. That’s the fun part, right? The writing is terrible.

For for a couple of years, I had a piano teacher who I’ve now subsequently become very close friends with and, in fact, did RC. He used to talk about the short term and the long term in relation to learning. He said that the motivations and tools you need to get good at something are different in the short term and long term, but you need them both.

In the long term, you need inspiration and in the short term, you need grit.

He studied piano performance in college, in a music school. He’s very good — did choral accompaniment at Carnegie Hall a few times, you know, college choruses and stuff like that.

He said his long-term motivation was that he loves music and he wanted to get good at that. But that’s not enough to get you to practice seven hours every day, right? You have to have the grit.

You have to cultivate something that allows you to wake up and say, okay, I’m gonna practice scales for the next hour and a half, and then I’ll do exercises, and then I’ll play that part of that piece really slowly, perfecting it.

I played piano as an adult and played guitar for many years as a kid and I struggled with all of this. It takes a lot of discipline to say, okay, I’m just going to play these two notes over and over again, or these two transitions, these two chords.

Now going back to your question about what Andre said, that’s the thing that’s not fun, right? I think that statement — learning is not supposed to be fun — is provocative, but I think there’s a lot of truth to it. I do find learning fun, I like knowing new things, I like gaining mastery, but the process of trying to work on something that you totally don’t understand is painful.

---

**Thorsten**

It’s type 1 and type 2 fun, right?

**David**

I’ve not heard of this, but I’m excited to.

**Thorsten**

Type 1 fun is fun in the moment. Sitting in a whirlpool, having a beer. But [type 2 fun](https://outwardbound.org/blog/what-is-type-two-fun-and-why-is-it-good-for-you) is fun in hindsight. Climbing a mountain, running a marathon. It sucks in the moment, it’s exhausting, but once you’re up, you’re proud and say: that was fun.

Or pushing through that wall of not knowing how to solve a problem — it sucks and you feel despair and self doubt, but then you break through the wall and you’re proud and think that it was actually fun.

**David**

I think that’s totally true. The other thing is though, you can cultivate a feeling of fun in that moment, right?

Many years ago — 12, 14 years ago — my friend and I were hiking in the Adirondacks. It was November, there was a lot of snow on the ground, it was cold, it’s unpleasant to hike, and yet, in the moment… you’re in the middle of the forest and there’s snow everywhere and it’s so quiet and beautiful. You can still appreciate that even though you are in pain and, like, you twisted your ankle or whatever. It’s still possible to appreciate and enjoy that moment.

I regularly get joy in the process of programming. And I think similarly at the gym — it is true that working out is hard, right? But if you’re doing it well and you’re really pushing yourself, sure, it’s painful, but you can still enjoy the effort you put in. I mean, even practicing scales, I found this to a certain extent to be fun.

There’s this sort of, wax on, wax off, sort of craftsmanship version of playing this scale over and over again and you sort of find some flow or zen or whatever.

**Thorsten**

I feel like there’s another element to it. I played guitar in the past and when I switched back to doing more programming from doing a lot of guitar, I realized that I enjoy “practicing” computer more.

As in: I like sitting in front of the computer for eight to ten hours every day, even though my program might not run. I even enjoy debugging it for eight hours and figuring out how it works or doesn’t work!

With the guitar it was different. I like being good at guitar, but I never really enjoyed practicing with a metronome or practicing scales. Sure, sometimes I would get into the groove of it, but the feeling of frustration and even purely on a practical level — the mechanics of standing there with the guitar and playing the wrong notes or being out of time — I didn’t enjoy it in the same way I “don’t enjoy” fixing bugs.

[Jerry Seinfeld was on the Tim Ferriss podcast](https://tim.blog/2020/12/09/jerry-seinfeld-transcript/) a couple years back and he said, you have to find your personal — I don’t know how he phrased it — your personal sort of suffering. Find the thing that you can suffer through. *[I couldn’t find that exact idea in the transcript, but they talk about something similar, so maybe I imagined the rest]*

For some people it’s writing. They think: I hate writing and yet I am a writer, I can’t help it. Or comedians — they go on stage and they bomb and it’s horrible and yet the next day they want to go back up again.

Hearing that was eye-opening to me. There’s type 1 fun and type 2 fun, but there’s also this variation where some sorts of type 2 fun are more “enjoyable” than others and you kind of have to pick. Some people could never sit in front of a computer trying to debug why something doesn’t work, all day long, but we do.

**David**

Yeah. I think to a certain extent, it picks you. I had exactly the same experience with music.

I love music. I enjoyed playing it. And everybody struggles with practicing well and having the discipline for it, but compared to my friends who became musicians, I struggled with it more. They found more motivation and a higher… say, ability to have the discipline to do the things you need to do, to practice in the way that you need to practice.

And, well, I find that easier with computers. It’s why I’m a computer programmer ultimately.

---

---
[![](https://archive.thorstenball.com/data/images/150798584.in-conversation-david-albert/93a4acb6-0a72-447f-b87e-5fa44f9c3b26_1852x1022.jpg)](https://archive.thorstenball.com/data/images/150798584.in-conversation-david-albert/93a4acb6-0a72-447f-b87e-5fa44f9c3b26_1852x1022.jpg)

---

# Joy & Curiosity #12

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 25, 2024

---

Here’s what was on my mind this week: my new mattress. Yes, I hear your groan, I see the eyes roll backwards — but, listen, hey, listen: after ten years of sleeping on a… let’s call it an entry-level mattress (it sure didn’t feel cheap back then), and having had back pain for the last two to three years, my wife and I finally realised that, hey, it might be the mattress?

So we went to a mattress store and laid on the mattresses and — hey! stay here! listen to this! — and the woman said, try this one, and it was heavenly and I could feel every fiber in my body relax and we bought two of them and — in the most literal sense possible — it was a life-changing decision.

I sleep better, I feel like I have twice the energy, I’m in a better mood, I’m happy I get to go back to bed when I wake up at 2am, I’m a more interesting person, I sleep deeper, I also think I dream better dreams and, hell, maybe I am still dreaming and writing this while sleeping, on my new mattress? Sure would be nice.

Anyway: get a good mattress.

---

- [Ghostty 1.0 is coming](https://mitchellh.com/writing/ghostty-is-coming) — yes! Such a wonderful project and I’m so proud to have contributed a little code myself last year.
- Time to share a classic: [The TTY Demystified](https://www.linusakesson.net/programming/tty/). Came up while debugging an issue in which a grandchild process was still attached to the stdout/stin of the grandparent. If you haven’t read this post: this is your lucky day. Read, bookmark, share it forward.
- [Good intro to jj](https://tonyfinn.com/blog/jj/). I need to finally try it.
- There’s been a bump in Bluesky activity this week. Unsure of the cause, but my guess: Twitter has changed their Block feature, which was the last drop for some people, and — making a big splash in the tech Twitter world — Kelsey Hightower deactivated his quarter-million-followers Twitter account and moved to Bluesky. [I’m over there too](https://bsky.app/profile/thorstenball.com) and so far I’ve enjoyed not having a feed full of video very much.
- Simon Willison’s blog post [showing everything he built in a week with Claude Artifacts](https://simonwillison.net/2024/Oct/21/claude-artifacts/) was very inspiring. Look at those tiny programs! Look at how easy it is to build a small tool on the web! It made me play around with Claude Artifacts — the people building the web UI at Anthropic know what they’re doing.
- I’m sorry, but: [this made me laugh out loud](https://twitter.com/WTTDOTM/status/1847387109822525551). “I recorded them all myself” — that’s the spirit.
- This blog post by Daniel Mangum — host of the [Microarch Club](https://x.com/microarchclub) — on [running the Chicago marathon](https://danielmangum.com/posts/better-to-fail-spectacularly/) was impressive. “On most difficult journeys in life there is a thin line between delusional and daring.” I did just enough running in my life to know what he’s talking about, but ran so much less than Daniel to be impressed by nearly everything he described here.
- [Very short post](https://blog.zactownsend.com/empathy-on-entrance-price-bridge-dot-xyz-and-astranis) with napkin math on angel investments. As someone who has stock options, I’ve done quite a few what-will-this-be-worth calculations myself, but still: very surprised by how surely and to which extent they factor in dilution — not something that’s often talked about.
- Check this out: Stephen Bourne, the Bourne in Bourne-again-SHell (Bash), “[relentlessly beat C with its own preprocessor until it began to resemble his preferred language](https://news.ycombinator.com/item?id=41935359)” — look [at the code!](https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h) And then lean back and laugh, imaginging your reaction if someone would pull this stunt in a pull request you have to review.
- [Jarred](https://x.com/jarredsumner/status/1848310985376817215?s=46): “you’ll learn way more by building stuff for people to use instead of building to learn”
- Have you ever used the [Go assembler](https://go.dev/doc/asm)? I did — tried to, at least — and over the years I kept thinking how *weird* is that. There’s [·](https://news.ycombinator.com/item?id=41879854)in the code — come on. But reading through [this discussion](https://news.ycombinator.com/item?id=41879854) and the post its attached to, I started to wonder: maybe they *did* reach their goal, maybe it did work and they achieved what they set out to do, even though everyone said it’s weird, even though there’s [·](https://news.ycombinator.com/item?id=41879854) in the code?
- “[They start and want to get to the end right away. When you go mountain climbing, the first thing you’re told is not to look at the peak but to keep your eyes on the ground as you climb.](https://x.com/DannyDrinksWine/status/1847007172502204453)”
- Watched [Bill Gurley’s Runnin' Down a Dream](https://www.youtube.com/watch?v=xmYekD6-PZ8) and, man oh man oh man, it’s— wonderful? A lot in there I already knew but could’ve never named and pointed at like he did, and so much more that I didn’t and was fascinated by. Also, funnily, it made me think: this is one of the most American talks I’ve ever seen and, wow, I do love Americans being Americans.

---

---

# Rust Prism

By Thorsten Ball • October 23, 2024

---

Here, take a look at this snippet of Rust code that’s been stuck in my head for weeks now:

```
async fn send_request(
    url: &str,
    metrics: &mut Metrics
) -> Result<String> {
    let mut finish = defer(|| metrics.requests += 1);

    let request = reqwest::get(url);
    tokio::select! {
        response = request => {
            let response = response?;
            let body = response.text().await?;
            Ok(body)
        }
        _ = tokio::time::sleep(Duration::from_millis(2500)) => {
            finish.abort();
            Err(anyhow::anyhow!("timeout"))
        }
    }
}
```

Glance over it — do you understand everything going on here?

A year ago I wouldn’t have — and at that point I had been programming in Rust for three years in my spare time, building a compiler that now comes in at around 15k lines of code.

A not-that-trivial project that made me feel at ease with Rust, but I also knew that the Rust I had been writing wasn’t, uhm, real-world Rust — no 3rd-party dependencies, no concurrency, no panic handling. Nothing that had “for production use ony” on the label.

Then, in the Zed codebase, I got to see what real-world Rust looks like.

And that snippet above — it’s a recreation, a simplified version of some actual code I came across in the Zed code — has stuck with me because, here it is, everything that I didn’t use in Rust for years, compressed into few lines of code. A super-dense representation of a Rust that I hadn’t seen. A window into a world in which Rust works differently. A little prism.

I mean: the `defer` call alone — you can probably teach a one-hour Rust class just on that `defer`. Take another look at the two lines related to the `defer`:

```
async fn send_request(
    url: &str,
    metrics: &mut Metrics
) -> Result<String> {
    let mut finish = defer(|| metrics.requests += 1);

    let request = reqwest::get(url);
    tokio::select! {
        response = request => {
            let response = response?;
            let body = response.text().await?;
            Ok(body)
        }
        _ = tokio::time::sleep(Duration::from_millis(2500)) => {
            finish.abort();
            Err(anyhow::anyhow!("timeout"))
        }
    }
}
```

Looks like it bumps `metrics.requests` but only if the request doesn’t run into the timeout, because if it does, `finish.abort()` is called — but how? First time I came across it I actually said that out loud.

Then I dug in and — to my great fascination — it uses [Drop](https://doc.rust-lang.org/beta/book/ch15-03-drop.html) to actually defer the execution of code. Here’s how:

```
struct Deferred<T: FnOnce()> {
    task: Option<T>,
}

impl<T: FnOnce()> Deferred<T> {
    fn abort(&mut self) {
        self.task.take();
    }
}

impl<T: FnOnce()> Drop for Deferred<T> {
    fn drop(&mut self) {
        if let Some(task) = self.task.take() {
            task();
        }
    }
}

fn defer<T: FnOnce()>(f: T) -> Deferred<T> {
    Deferred { task: Some(f) }
}
```

It creates a `Deferred` struct that, when dropped (in our case: at the end of the function), executes the `task` it contains — except if `abort` had been called before, because then the `task` is `None`.

I knew *of* *Drop*  but I had never used it. Certainly haven’t used it to intentionally execute code when someout goes out of scope at the end of a function.

And then there’s the fact that the whole function is `async` and that what `reqwest::get` returns is actually a Future that needs to be awaited, but you can’t see that because `tokio::select!` macro hides it and, wait, you can do something like [select(2)](https://man7.org/linux/man-pages/man2/select.2.html) in async Rust? What?

And then there’s question marks!

```
async fn send_request(
    url: &str,
    metrics: &mut Metrics
) -> Result<String> {
    let mut finish = defer(|| metrics.requests += 1);

    let request = reqwest::get(url);
    tokio::select! {
        response = request => {
            let response = response?;
            let body = response.text().await?;
            Ok(body)
        }
        _ = tokio::time::sleep(Duration::from_millis(2500)) => {
            finish.abort();
            Err(anyhow::anyhow!("timeout"))
        }
    }
}
```

`H`ow is that even possible — do the error types match? Doesn’t matter, it works here because guess what, the `Result<String>` in the return type — that’s not the `Result` that you learned about in the Rust book, it’s `anyhow::Result` and you can map anything into that.

Every line looks normal on first glance — your standard Rust 101 code, the code that I had been writing for years — but then, on second and third glance, there’s the realisation that, wait, what, what’s going on here, that *has* to work differently.

Today I know exactly what the code does and feel comfortable writing it, but still, when I came across that snippet and saw all of the things I didn’t know about for years, compressed into a dozen lines, I couldn’t help but wonder:

3 years! 15k lines of code in a compiler, an uncounted number of side-side projects, worked through multiple books and yet I never came close to code like this!

Fascinating, isn’t it? How a language can be so big that you can comfortably live in one corner of it for years without seeing or hearing about anything else that’s going on on the other side.

---

# Joy & Curiosity #11

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 19, 2024

---

Not a lot of reading, listening, watching this past week. The pendulum has swung into the other direction again and I ended up putting quite a bit of time into this week’s post, [How I use git](https://registerspill.thorstenball.com/p/how-i-use-git). There’s also been a ton of code to write at work — not complaining, I’ve been enjoying it very much. (I’ve also done [a nearly 4 hour stream this week](https://www.twitch.tv/videos/2278230650), hacking on Zed, in case that’s your thing.)

And yet!

There have been some very interesting & joyful things I came across this week.

---

- This article, [Always Measure One Level Deeper](https://cacm.acm.org/research/always-measure-one-level-deeper/), by John Ousterhout (*the *[John Ousterhout](https://web.stanford.edu/~ouster/cgi-bin/publications.php), yes) is exceptionally good. Mostly, I think, that’s because it’s based on practice, not theory. “Performance measurements should be considered guilty until proven innocent. When students come to me with measurements, I often challenge them by asking: ‘Suppose I said I don’t believe these measurements. What can you say to convince me that they are correct?’” It reminded me of so many situations in which I “just” wanted to record some benchmarks and numbers and ended up wondering what’s real and what isn’t, what’s a symptom and what’s a cause, what’s an improvement and what’s an accident. Highly recommended.
- These [Reflections on Palantir](https://nabeelqu.co/reflections-on-palantir) are fascinating. If nothing else, Palantir is a very interesting company, and reading this was probably the closest I’ve ever gotten to figuring out what they do. There are some very real software-rubber-meets-the-customer-road moments described in there and some interesting observations of a company culture. “I’m not sure if they still do this, but at the time when you joined they sent you a copy of Impro, The Looming Tower (9/11 book), Interviewing Users, and Getting Things Done.” More companies should hand out books to new employees (I’ll never forget that [Nick](https://www.linkedin.com/in/nickdsnyder/) at Sourcegraph recommended I read [Orbiting the Giant Hairball](https://www.penguinrandomhouse.com/books/330616/orbiting-the-giant-hairball-by-gordon-mackenzie/) and now I’m looking at it, because it’s sitting on my shelf right here, cherished.)
- I spent Thursday morning reading through, [whorl, “a single file, std only, async Rust executor](https://github.com/mgattozzi/whorl)” in ~600 lines. It nails what it set out to do and made me think of three things: [Phil’s tweet](https://x.com/eatonphil/status/1846529491855688042?s=46) that I came across a day earlier saying that “when writing pedagogical code, please please please put it all into a single file”, Patrick’s [200 and change](https://github.com/pdubroy/200andchange) project, and the [500 lines of less](https://github.com/aosabook/500lines) book.
- There are [new Kindles coming out](https://www.aboutamazon.com/news/devices/new-kindle-color-scribe-paperwhite-entry)! I bought a new Paperwhite last year (after trying the Oasis and not liking it) so there’s really no need. Right? No need to get one with color, right? That’d be dumb, right? Who needs highlights in color, right?
- Very much enjoyed [this Acquired.fm episode with David Senra](https://www.acquired.fm/episodes/sessions-david-senra-founders-podcast), host of the Founders podcast (which I also enjoy very much). If I had to pick one word to describe this episode: meta. In the best possible sense. “The conclusion I've come to is, advice is an average, and reality is a distribution. Averages suck because they hide the distribution. You want to know the shape of the distribution.”
- [“Jim Sinegal, the founder of Costco, says: ‘If you don’t spend 90% of your job teaching, you’re not doing your job’”](https://open.spotify.com/episode/4ZENG3y1lFVRjPBbMREibt?si=q4L7beGyQ_a6RK1i-fPBDg&t=968&context=spotify%3Aplaylist%3A37i9dQZF1FgnTBfUlzkeKt) — made me think of all the most shallow of all the trite phrases: “those who can, do; those who can’t, teach.”
- [This](https://x.com/andrewglynch/status/1843789322396320141)is a good tweet.
- And [this](https://twitter.com/nearcyan/status/1845887854054199730) made me want to play Factorio again.
- [“We must remember something important: life is not meant to be rushed through. It is not a race, nor is it a problem to be solved. It is an experience to be lived, and living well requires presence.”](https://billwear.github.io/art-of-attention.html)

---

---

# How I use git

By Thorsten Ball • October 16, 2024

---

Recently I tried to explain to a colleague my mental model for when to put something in the same pull request and when not to. I caught myself saying “well, except…” a few times, I decided to write down how I use git — to examine my idiosyncracies, see where I could improve, and possibly share something useful.

Since this is the Internet, let me add the disclaimer right here at the top: how I use git is based on the last 12 years of working in companies with smallish (less than 50) engineering teams. In every team, we used git and GitHub exclusively; changes were made in branches, proposed as pull requests, and then merged into the main branch. In the last few years, after GitHub introduced [squash-merging](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/configuring-commit-squashing-for-pull-requests), we used that.

I’ve never used any other version control system. I’m unable to and won’t compare git to Mercurial, jj, Sapling, ….

With that out of the way, here’s how I use git.

---

### Technicalities

Everything is in git, all the time. Every side-project, large or small, finished or abandoned, is in a git repository. Running `git init` is the first thing I do in a new folder. I do not know why I wouldn’t use git if I could.

The git part is the most important piece in my shell prompt. I feel naked when I don’t have it. It shows the current branch and whether the repository is dirty, i.e. whether it has uncommitted changes:
[![](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/910aaa11-1146-4ef1-8023-54f76368af3a_1166x384.jpg)](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/910aaa11-1146-4ef1-8023-54f76368af3a_1166x384.jpg)
When someone asks me to help them with some git thing and I notice that they don’t have git information in their shell prompt, that’s the first thing I tell them to do.

I use git on the CLI 99.9% of the time. I never used a GUI for git and don’t see a reason to.

The exception: git blame. For that I always use built-in editor support or the GitHub UI. Previously and for over a decade I used [vim-fugitive’s](https://github.com/tpope/vim-fugitive) blame functionality. Now: the [git blame support we added to Zed](https://github.com/zed-industries/zed/pull/8889).

I use git aliases and shell aliases as if possible future athritis were standing behind me, whispering “soon” into my ear, waiting for every wasted keystroke. They are [stored in ~/.gitconfig](https://github.com/mrnugget/dotfiles/blob/c4624ed521d539856bcf764f04a295bb19093566/gitconfig) and [my .zshrc](https://github.com/mrnugget/dotfiles/blob/c4624ed521d539856bcf764f04a295bb19093566/zshrc#L152-L179). My most used aliases, according to [atuin](https://atuin.sh/):

```
gst - for `git status`
gc — for `git commit`
co — for `git checkout`
gaa — for `git add -A`
gd — for `git diff`
gdc — for `git diff —cached`
```

I *spam* these. There’s a direct connection between muscle memory and the keyboard, no brain involved. Especially `gst`, for `git status` — I constantly run this as confirmation that whatever I did worked. I `git add` some files and run `gst`, I `git add -p `some files and run `gst` and `gdc`, I `git restore` and `gst`, I `git stash` and `gst`.

Here, for example, is how I check what changes I just made, stage them, and commit them:

```
~/code/projects/tucanty fix-clippy X φ gst
# [...]
~/code/projects/tucanty fix-clippy X φ gd
# [...]
~/code/projects/tucanty fix-clippy X φ gaa
~/code/projects/tucanty fix-clippy X φ gst
# [...]
~/code/projects/tucanty fix-clippy X φ gdc
# [...]
~/code/projects/tucanty fix-clippy X φ gc -m "Fix clippy warnings"
~/code/projects/tucanty fix-clippy OK φ gst
# [...]
```

Why? I’m honestly not sure — maybe it’s the lack of feedback from the git commands, maybe because the prompt doesn’t tell me everything, I don’t have a UI and `gst` *is* the de-facto UI?

I use [this pretty_git_log function](https://github.com/mrnugget/dotfiles/blob/c4624ed521d539856bcf764f04a295bb19093566/githelpers#L11-L15) in [~/.githelpers](https://github.com/mrnugget/dotfiles/blob/c4624ed521d539856bcf764f04a295bb19093566/gitconfig#L13-L17) a hundred times every day. I got it from this [Gary Bernhardt screencast](https://www.destroyallsoftware.com/screencasts/catalog/pretty-git-logs) and haven’t changed it in 12 years. It looks like this:
[![](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/bf41b48e-523f-4f82-abc0-db4b1d27c689_2310x1374.png)](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/bf41b48e-523f-4f82-abc0-db4b1d27c689_2310x1374.png)
(Is there a reason why `git lr` is not aliases to `glr`? No, except that I’m lazy and would probably never pick up the alias after years of `git lr`.)

---

### Committing

What I commit and how often I commit is guided by what ends up on the main branch of the repository I’m working in. Is it a commit? A squash commit? Or a series of commits? That’s what I optimize for.

What ends up on the main branch has to be

1. Easy to understand by others as a self-contained change.
1. Revertable. If I made a mistake while making the change and I realise that after merging it, can I revert my change with a `git revert` or will that also revert 12 other unrelated changes that very likely won’t be an issue?
1. Bisectable. If we notice that a regression slipped into the main branch in the last week, will that regression be easy to find if we go through each commit and test them? Or will we end up saying “this commit introduced it” with the commit in question being 3k changed lines that updated an OpenSSL dependency, changed marketing copy, tweaked the timeout settings of the default HTTP client, added a database migration, changed business logic, and updated the default logger? That’s something I want to avoid.

I don’t think all three are 100% achievable all the time, but the general ideas — is something easy to undo? is something easy to debug as a potential regression? — I try to keep in mind when deciding whether to put something in a separate pull request, or a separate commit.

I commit early and commit often. My mental model for a commit: a quicksave in a video game. You survived those three zombies hidden behind the corner? Quicksave. You fixed that nasty bug that required changes that you don’t really understand yet but it works? Quicksave. Quicksave and then worry about doing it properly.

I see commits and their history** ***in my branch* as malleable. I can always reword them, squash them, rebase them — as long as I haven’t asked someone for review, as long as they’re still “mine.”

Why? Because in nearly every repository I worked in (except for open-source repositories I contributed to), the merged pull request is the thing that ends up on the main branch, not the commit.

So I commit as much as I want, when I want, and then make sure that the *merged pull request* is optimized for ease of understanding, revertability, bisectability. That brings us to…

---

### Pull Requests

The *merged pull request* is more important than a commit made on a branch, because that’s what ends up on the main branch and that’s what I want to optimize for.

If we use squashed commits when merging, then merging a PR results in a single commit and I will worry about what that single commit will look like and if that commit is easy to understand, easy to revert, easy to bisect.

If we don’t use squashed commits, but instead merge all commits from a branch into the main branch, then I will worry about those commits. In that case I might do interactive rebasing on my branch and squash my commits as needed into single units of works so that they in turn are easy to understand, revert, bisect.

Reviews create exceptions to this rule. Because reviewers’ or colleagues’ needs trump my own. For example, if the PR is reviewed commit by commit, I'll put effort in the commits. If the PR is reviewed as a single change, with 3 lines in 2 files changed, I'm happy to add a "fix formatting" commit, and ignore the message.

The general rule stands though: I only really care about the final PR and how it's reviewed and what it will turn into once it’s merged, not the single commits that lead up to the review and the merge.

I open PRs very early. As early as I have the first commit. Previously I marked those PRs as “WIP” by putting that as a prefix in the PR title, but nowadays we have the draft status in GitHub. I open them early, because after I push, while I keep working, CI is already kicking off and running. I get feedback from longer-running test suites, linters, style checks, and other things that run in CI, while I continue to work.

My mantra for pull requests: small PRs, eagerly merged. Sometimes they’re 3 lines. Sometimes 300. Basically never 3000. If they’re open for more than a week, that’s a warning sign.

Example: say I’m working on a feature that changes how user settings are displayed in the UI. While working on that, I notice that I need to change how user settings are parsed. It’s a two-line change. I will put that two-line change in a separate PR, separate from the UI changes even if that’s where I found the need to make the change. Why? Because if two days later someone says “something’s wrong with our settings parser”, I want to be able to directly point to either the UI change or the parsing change and revert one or the other.

I rebase my PRs on top of the main branch and don't merge the main branch back into mine. Why? Because when I use `git lr` (my alias to show the git log in my branch) I just want to see the commits made on my branch. I think it’s cleaner to be rebased on the latest main. I don’t like having merge commits in my branch. An interactive rebase also allows me to look at all commits I made and get a feel for what’s on the branch.

When I rebase, do I not worry about destroying the original, pristine commit history? Again: the unit of work is the merged PR and I don’t care whether the commits inside my branch reflect what happened in real time. What matters is what ends up on the main branch and if we use squashed commits, then all that pristine commit history will get lost anyway.

But, again, exceptions are made by reviews and the requirements of reviewers — I sometimes rebase interactively in my branch to squash or edit commits to make them easier to review (for myself and others), even though, again, I know that those commits will get squashed two hours later.

I also use pull requests in my side-projects even if I’m the only person working on that project and even if I will forever be the only person working on it. I don’t do it for every change, but sometimes, because I like keeping track of some bigger changes in GitHub’s UI. I guess I do use *a* UI?

---

### Commit Messages & Pull Request Messages

I care about commit messages, but not too much. I don't care about the prefixes and formulas etc. I do care about well written messages. I read Tim Pope’s [A Note About Git Commit Messages](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) in, what?, 2011, and haven’t forgotten about it since.

If we’re doing squashed commits when merging, then the PR description is often the message for the resulting PR and I make sure to put effort into the PR message.

The most important thing about a git commit message or a pull request message is the *Why* behind a change. I can see the *What* in the diff (although sometimes a short explanation in the message helps), but what I want to know when I end up reading your commit message is *Why* you made the change. Because usually, when reading commit messages, isn’t not because something good happened.

I think things like [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) are largely a waste of time. Teams end up bike-shedding the right commit prefixes for very little benefit. When I’m hunting down a regression through the commit history, I’m going to look at every commit anyway, because we all know that yes, a regression can even hide in a `[chore]: fix formatting` commit.

I do sometimes add prefixes to commit messages or pull request titles, like “lsp: “ or “cli: “ or “migrations: “. But I mostly do that to keep the message short. “lsp: Ensure process is cleaned up” is shorter than “Ensure language server process is cleaned up” and conveys the same thing basically.

If possible I try to have a demo video in the PR, or a screenshot. A screenshot is worth a thousand words and ten thousand links to other tickets. A screenshot is *proof*. Proof that it actually fixes what you said it would fix, proof that you actually ran the code. It also takes far less time than people usually think it does. Here’s [an example](https://github.com/zed-industries/zed/pull/16534):
[![](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/cbb8ccfe-3d31-4302-8e96-2e6ca5126db0_1408x1740.jpg)](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/cbb8ccfe-3d31-4302-8e96-2e6ca5126db0_1408x1740.jpg)
If needed I reference other commits and pull requests in messages. The idea: leave breadcrumbs. Instead of “Fixes parsing not working” I try to write “Fixes parsing not working, after the change in 3bac3ed introduced a new keyword”

At Zed, when pairing, we add ``Co-authored-by: firstname <email>`` to our commit messages so that the commit is attached to multiple people. [Like this:](https://github.com/zed-industries/zed/commit/25a97a6a2be277c2c0897a651658254de34d0bcd)
[![](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/d822d0dc-4900-45fd-ab20-4a234893faf1_946x608.png)](https://archive.thorstenball.com/data/images/150226089.how-i-use-git/d822d0dc-4900-45fd-ab20-4a234893faf1_946x608.png)
With commit messages especially, it’s all about context, context, context. When I'm working alone I use different commit messages than when I'm working with a team. When we're doing reviews it's different than when pairing.

Who are you talking to with your commit message and when and why? That’s the question that should influence the message.

When I’m alone in my own personal repository, trying to get CI running, you can bet on single-letter commit messages showing up on `main`. But even when I’m alone, if I fixed a really nasty bug, I’ll write a nice message. When I’m working with others, I try to write commit messages that explain to them what I was trying to do and why.

---

### Reviews

Before I ask someone to review my PR, I read through the diff on the pull request page myself. Something about it being not in your editor makes you spot more bugs and left-over print statements.

I try not to ask for reviews when CI isn’t green. Exception: I know how to fix CI already and we can parallelize by reviewer starting while I fix CI.

When I review someone elses code, I always try to check out the code and run it and test that it actually does what the pull request message says. You’d be surprised by how often it doesn’t.

---

### Workflows

The basic workflow is always the same when I’m working with others: open a branch off of the main branch, start working, commit early & often, push early & often, open a pull request as a draft as soon as possible, finish work, make sure the commits in the branch *somewhat* make sense, ask for a review, merge.

When I’m working alone, I commit on the main branch 99% of the time and push after each commit.

Sometimes, when working on a branch, I notice that I need to make a new commit in a separate branch so that I can turn it into a separate pull request. There are multiple different strategies that I use here.

- `git add -p && git stash `the things that I later want to commit on this branch, branch A, then switch to a new branch, B, that’s branched-off of main branch, make a commit there, and push.
- `git add -p && git commit `what I want to keep on the branch. `git stash` the things I want to put on a different branch, switch branches, `git stash pop`, commit.
- `git add -p && git commit -m “WIP” `what I want to keep on the branch. Then, again, stash the things I want on another branch, go there, commit them. Then go back to original branch, undo the “WIP” commit by doing `git reset —soft HEAD~1`, go back to work.
- `git add -p` what I want to move to another branch, then `git stash`, then `git reset —hard HEAD`, to throw away every other change I have made on that branch, because it’s not worth keeping it around. Then switch branches, `git stash pop`, commit.
- Sometimes I even turn changes I want into two commits on the same branch, then switch branches, `git cherry-pick` one of the two commits over, go back to the old branch, do `git rebase -i `and drop the commit that’s already moved over.

When do I chose one strategy over the other? It depends on how big the change I want to make on another branch is and how much I uncommitted things I have in my working directory. 

I don’t care that much about branch names, as long as they make *some sense*. I use the GitHub UI to get[an overview of my currently open pull requests](https://github.com/pulls?q=is%3Aopen+is%3Apr+author%3Amrnugget+archived%3Afalse+user%3Azed-industries) (this URL is a quicklink in Raycast, so I can just type “prs” in Raycast and open the URL.) That helps me to know what PRs I currently have in flight and which ones are ready to merge.

I either create pull requests by clicking that URL that’s printed after `git push`ing to GitHub, or by running `gh pr create -w`. That’s really the only thing that I use the [GitHub CLI](https://cli.github.com/) for. 

The other thing that I use `gh` for is to switch between open pull request branches. Especially when I check out contributors’ pull requests, which sit in a fork.

I also have these two, [very neat aliases](https://github.com/mrnugget/dotfiles/blob/c4624ed521d539856bcf764f04a295bb19093566/zshrc#L162-L169) to fuzzy-switch between my open PRs and wish I would remember them more often.

It’s been many years since I last had to delete and reclone a repository because of git problems. Nowadays I can wiggle my way out of most problems that could show up by using the `git reflog`, a bit of `git reset`, and some duct tape.

---

### It’s all there

You can see all my work of the last 5 years on GitHub:

Here’s [1368 merged pull requests in sourcegraph/sourcegraph-public-snapshots](https://github.com/sourcegraph/sourcegraph-public-snapshot/pulls?q=is%3Apr+author%3Amrnugget+is%3Aclosed).

Here’s [195 merged pull requests in sourcegraph/src-cli](https://github.com/sourcegraph/src-cli/pulls?q=is%3Apr+author%3Amrnugget+is%3Aclosed).

Here’s [391 merged pull requests in zed-industries/zed](https://github.com/zed-industries/zed/pulls?q=is%3Apr+author%3Amrnugget+is%3Aclosed).

---

If you click on those links and then look through my PRs you will find that I’m not 100% consistent with everything I wrote here.

Depending on the context — how big is the change, how risky is the change, who am I working with, how often have I tested it, when is the next release, who reviewed my code — I put a lot of effort into how I use git or not. I’ve written some very thorough, highly-detailed, technical commit messages and I wrote one-liners with swear words (sometimes that’s all the line contained.)

And that’s it — how I use git!

---

# Joy & Curiosity #10

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 13, 2024

---

Last week we took the kids to a small amusement park. We got there early and when we walked in, employees of the park were still getting the park ready for the day: sweeping, feeding animals, raking leaves, putting new bags in trash cans. And I kept thinking: “this is exactly like in Rollercoaster Tycoon!”

So this week, let me remind you: “[Sawyer wrote 99% of the code for](https://en.wikipedia.org/wiki/RollerCoaster_Tycoon_(video_game)#Development)*[RollerCoaster Tycoon](https://en.wikipedia.org/wiki/RollerCoaster_Tycoon_(video_game)#Development)*[in x86 assembly language for the Microsoft Macro Assembler, with the remaining one percent written in C](https://en.wikipedia.org/wiki/RollerCoaster_Tycoon_(video_game)#Development).”

---

- Patrick and Mariano are organizing [a meetup in Munich called Hombrew Systems Club](https://twitter.com/dubroy/status/1844723902066422242) and it sounds wonderful. I’m going to give a short talk on writing Tucan, the optimizing compiler in Rust that I hacked on for a few years. Filling 10 minutes won’t be an issue, but I’m really worried about creating slides that match the “~~Vibes~~”
- [Derek Sivers was on the Andrew Wilkinson podcast](https://www.youtube.com/watch?v=1bZOWiXh8mo). Derek’s books have meant a lot to me over the years and listening to him talk like this for an hour created some very enjoyable moments of reflection. Super interesting bit from the episode: the Derek Sivers as I know him — author of books, TED talker, blogger, /now-page haver — only started to exist when he was 38.
- [Where did the](https://rodarmor.com/blog/whence-newline/)`\n`[in the Rust compiler come from?](https://rodarmor.com/blog/whence-newline/) Mind-bending, to-the-point, fun blog post. “[perfect blog post](https://x.com/davidcrawshaw/status/1843410305134760018)” indeed.
- As a response to my post here, [Glad I did it in Go](https://registerspill.thorstenball.com/p/glad-i-did-it-in-go), a reader sent me an email to share a document he authored with me: [Argument against Python in Education](https://docs.google.com/document/d/1dpKjHGzzmpGe2-34x6fb3fhtEBW25OCwL9UvVEOwrPc/edit?tab=t.0#heading=h.ceto79q9te33). I don’t enjoy a lot of discussions around language design because most of them are very abstract and very academic — this document though, it’s refreshing and interesting because it’s grounded in practice, in *reality*. Really enjoyed that, thanks for sharing Patricio!
- And as a response to my post this week, [Use data that looks like data](https://registerspill.thorstenball.com/p/use-data-that-looks-like-data), Sam [shared](https://twitter.com/samwhoo/status/1844061593329451465) this blog post: [Greppability is an underrated code metric](https://morizbuesing.com/blog/greppability-code-metric/). Again: this is as real, as rubber-hits-the-road, as practical as it gets. I love it. I’ve used greppability as a metric in the past and it makes me happy that I now have something to link to.
- I’ve thought a lot about the PATH environment variable in the past few months (due to fixing or improving a lot of environment-handling things in Zed — [I wrote a long doc about it here](https://github.com/zed-industries/zed/blob/main/docs/src/environment.md)) and then came across this blog post this week:[Modern PATH environment variable](https://blog.izissise.net/posts/env-path/). “as of the year 2024 that's it”, they write, and present a really short PATH — I’m telling you: if everyone would have a well-managed PATH like this, 50% of the world’s bugs would disappear (not really, but still.)
- [Deno 2 was announced this week](https://deno.com/blog/v2.0) and, again, it’s all about practice and tooling. I guess that’s a given, since Deno is a runtime and tooling and not a new language, but it still made me think back to what a friend said last year: “Ruby missed the boat because Matz thinks developer happiness is purely about the language and they missed that it’s more and more about the tooling.”
- A Haskell programmer wrote about their “[negative views on Rust](https://chrisdone.com/posts/rust/)”. I agree with some of it (on the Good and the Bad side), but what stuck with me was use of “tamagotchi”: “This aspect of Rust puts me off. I don’t need another [tamagotchi](https://chrisdone.com/posts/tamagotchi-tooling/).”
- This whole [discussion around the Deppenapostroph in German](https://news.ycombinator.com/item?id=41787647) was *fascinating — *so many flashbacks to early 2000s internet and people being annoying and annoyed by wrong punctuation on forums and IRC. [Plenking](https://de.wikipedia.org/wiki/Plenk) was a capital offense just like Deppenapostroph and while I haven’t thought of that term in ten years, I still get shivers when someone puts a space in front of puncutation mark.
- Keep thinking about this [Patrick Collison tweet on distraction.](https://twitter.com/patrickc/status/1843330133895323792) I only have half-formed thoughts here, but Zed’s Slack is the quietest Slack I’ve ever had in a workplace and over the past year I’ve been thinking a lot about that and which effects it has.
- Another good tweet: “[capital structure ripples through management and ultimately ripples through employee experience.](https://x.com/trumav/status/1842588495488983454?s=46)” Nice lens to look through at past experiences working at startups — in Germany, in US, inside large corporation.

---

---

# Use data that looks like data

*Maybe the #1 best programming tip of all time?*

By Thorsten Ball • October 9, 2024

---

Time for me to pass on something I've been practicing for years but haven't found written down somewhere.

It's a simple thing. A practical thing. Forged in the trenches. It won't win any contests in which the audience gasps and says "oh, now that is clever." But it’s easy. Simple even. And it can save a lot of time and tears and, at the end of the day, isn't that some of the best stuff?

Here it is:

When debugging or testing your program, do not use data that looks like a variable or type name. 

Do not use data that looks like a label or a column name or something your operating system has tons of.

Do not use data that looks like it’s part of the program.

Do not do this:

```
user = User::new(name: "user")
```

Do this instead:

```
user = User::new(name: "my-test-user")
```

Instead of this:

```
testpath = "folder/file"
```

Do this:

```
testpath = "my-folder/its-subfolder/moo-sounds.wav"
```

(If someone comes running now, fists clenched, eager to complain about the additional typing: I hope you slip on a banana peel.)

Never, ever do this, not in production code, but not even when testing and debugging:

```
return new Error("error")
```

Do this instead:

```
return new Error("uh-oh someone slipped on a banana peel")
```

Same goes for numbers. When you have to use a number somewhere, do not — never! even if you just slipped and fell and are hurting — use 1 or 0, like this:

```
sizeKilobytes = 1
```

Use a 9, or a 44, or go all in, baby:

```
sizeKilobytes = 999

user = User::new(id: 666)
```

Why?

What's code and what's data — user-input data, runtime-generated data — should be clear at first glance.

You’re testing, you’re debugging. The last thing you want is to be confused about what’s what when looking at logs, error messages, or a UI you’re trying out.

The first glance should tell you whether you’re looking at data you put in, or default values, or something else that floats around your system.

You do not want to waste time thinking:

*“It says ‘username’ here. Wait, is that the label or the value? Is that the column name or the value of the username?”*

When you see the error message “folder not found” you don’t want to ask yourself, whether that’s your test folder called ‘folder’ or some other folder.

Using *data that looks like data*, helps you avoid these:

*“The log says ‘Creating entry failed: error’ — wait, is that our error we just put in or… any error?”*

*“It says ‘failed to create file’ — does that mean it failed to create another file or my file that I called ‘file’?”*

*"User 1 not found — is that mine or another one? How many do we create in this test?"*

*“Invalid size: 1 — wait, did that use the size I specified, or is that the default value?”*

Maybe these examples sound contrived, maybe it sounds cute, but— look, just trust me on this one. This is not an artificial, feel-good tip. This tip is scar tissue turned into words. It has saved me hours. It stopped me from looking dumb quite a few times and, again, isn’t that what we all want?

Might not be number one, but certainly top five.

---

# Joy & Curiosity #9

*Interesting & joyful things from the previous week*

By Thorsten Ball • October 6, 2024

---

After being so sick for a week that I couldn’t work out and my daily routine falling apart, I went to Montreal and got sick again on the flight home, which left me, again, unable to follow my hammered-in daily routine. It’s now been three weeks and my cough is finally, finally disappearing (I feel like I’m jinxing it by writing this), but so did my daily routine.

In the past week, I’ve embraced it: ignored my usual side-projects, did whatever I wanted in that now-free time, worked more, read more, wrote more. That’s why the last two issues of this newsletter have not included a [Joy & Curiosity](https://registerspill.thorstenball.com/p/joy-and-curiosity-8) section. I just wasn’t in the mood.

Now I am.

---

- [This blog post by John Calhoun](https://engineersneedart.com/adam74/adam74.html), who has worked at Apple for 26 years, is lovely and contains the cutest ASCII art I’ve seen in a while. The whole blog is a treasure chest. This [tribute to fellow Apple engineer Tom Dowdy](https://engineersneedart.com/blog/dowdy/dowdy.html) is wonderful.
- Some discoveries don’t just leave you with new knowledge, but in awe, marvelling at the complexity that can be contained in the tiniest possible details and how much work and care others put into figuring out that complexity. The [bytecount](https://github.com/llogiq/bytecount) crate left me with that feeling: it “uses the ‘hyperscreamingcount’ algorithm by Joshua Landau to count bytes faster than anything else.”
- Mitchell Hashimoto [wrote about Zig’s comptime](https://mitchellh.com/writing/zig-comptime-tagged-union-subset) and the examples he used are great: small and simple enough to understand for anyone, but showcasing the feature well enough. Very hard to do.
- I wish I could remember how, but I did end up on this website by a guy in California who [builds strange-looking headphones by hand](https://pud.com/). No, you won’t guess what they look like before clicking.
- This blog post, [Rewriting Rust](https://josephg.com/blog/rewriting-rust/), was very interesting. “I swear, it took more effort to learn pinning in rust than it took me to learn the entire Go programming language.” Some day (in the far future) I might write more about my feelings on Rust, but while reading this post I kept waiting for the paragraph in which they say what they would *remove* from the language. That paragraph never came and I think that’s one of the biggest sources of friction between me and Rust.
- My former coworker-at-Sourcegraph Varun [wrote about leaving his previous job at Apple](https://twitter.com/typesanitizer/status/1840308567133577310). The section about recruiters stuck out for me. In the past, I’ve interviewed at two companies that I respected *a lot* and the technical recruiters I was in contact managed to destroy that reputation completely within a week. One of my niche beliefs is that tech companies greatly underestimate how reputation-destroying recruiters can be and the whole system works in a way that makes it very hard to find out.
- This [tweet](https://x.com/hsvsphere/status/1840062782537957719) made me re-discover [the original blog post by Lennart Poettering](https://0pointer.net/blog/projects/systemd.html), the author of systemd, on systemd. I vaguely remember reading it years ago, but now, re-reading it, I’m amazed by how much knowledge is in there.
- The team behind iA Writer [wrote about developing for Android](https://ia.net/topics/our-android-app-is-frozen-in-carbonite). “Developing for Android you navigate an asteroid field. Bugs surface across thousands of device types, Android versions, and flavors—One UI, MIUI, OxygenOS, Pixel Experience, you name it.” (Be sure to read the footnotes.) It made me think of our experience [building Zed for Linux](https://zed.dev/blog/zed-decoded-linux-when). It ain’t easy.
- Somehow came across this blog post on Visual Studio Code being “[designed to fracture](https://ghuntley.com/fracture/)” and, man oh man. It made me jot down a note, telling myself that I should write about how tied to VSC the whole language server ecosystem is.
- When I was a teenager eager to learn Linux, the #1 recommendation I came across was to “buy the Kofler book” — a reference to Michael Kofler’s book [Linux](https://kofler.info/buecher/linux/). It was already a very big, very heavy book back then, but now it’s in its 18th edition and has 1410 pages. And, fascinating to me and why I’m writing this after not having heard the name Kofler in a long time, I learned last week that Michael Kofler is still actively blogging, [about such things as running Ubuntu on macOS](https://kofler.info/ubuntu-24-04-utm/). Clicking through his blog felt like discovering a wormhole connected to 2003.
- [Craig Mod wrote something beautiful about meeting Kevin Kelly](https://craigmod.com/ridgeline/194/).
- [This interview with Mark Zuckerberg](https://open.spotify.com/episode/5CwiK7ZAw20YqTbyv8rl9M?si=LxTrYecRQ4KhKwqrfoGn1Q&context=spotify%3Ashow%3A7Fj0XEuUQLUqoMZQdsLXqp&t=1377) was fascinating. Fascinating because here’s the CEO and majority shareholder of Meta saying the same things that any tech lead in a small, 5-person shop says too: you need to ship fast and early, you need to have a great feedback loop and then iterate and iterate. When Zuckerberg says it, though, it doesn’t sound empty. But then another interesting bit was that he essentially downgraded the importance of innovation. He said that you have to innovate one or two things, otherwise you won’t be on the map of tech companies, but their strategy is also to wait and see what others do and then do it better. Might sound trivial, but not if you hold it against a whiteboard full of tech leader quotes saying how important innovation is. (Reminder to listen to this [podcast with Kent Beck on Facebook Engineering Process](https://softwareengineeringdaily.com/2020/12/10/facebook-engineering-process-with-kent-beck-repeat/) — an all-time top 5 podcast episode for me.)
- I just ordered the [2025 CALENDAR OF EXTREMELY ACCURATE BIRDS](https://tommysiegel.net/shop/2025-calendar-of-extremely-accurate-birds).

---

Have a great Sunday, friends. I’ll see you on the Internet.

---

# Glad I did it in Go

*Go, the greatest teaching language?*

By Thorsten Ball • October 2, 2024

---

The eight year anniversary of [Writing An Interpreter In Go](https://interpreterbook.com/) is coming up. This year again, just like every time I look back to November 2016, I find myself thinking: man, I’m glad I used Go for these books.

Look:

```
$ wget 'https://interpreterbook.com/waiig_code_1.0.zip'
$ unzip waiig_code_1.0.zip
$ cd waiig_code_1.0/code/04/src/monkey/
$ GO111MODULE=off go run .
Hello thorstenball! This is the Monkey programming language!
Feel free to type in commands
>>
```

Contained in that `waiig_code_1.0.zip` is the code from the very first release of Writing An Interpreter In Go. Code written in 2016 using Go 1.7, frozen in time — compiling and running today, using Go 1.23. No warnings, no errors.

Just as impressive, I think: the code in the books has barely changed since then. I had to fix some typos and bugs over the years, but really the only change I had to do in order to keep the code up to date was to drop a three line `go.mod` in there, so that users with G 1.13 or later don’t have to use the `GO111MODULE=off` environment variable. I [added the](https://interpreterbook.com/changelog/)`go.mod`[in 2020](https://interpreterbook.com/changelog/), four years ago and four years after the original release.

I had a hunch that Go would be good choice. Here’s what I wrote in an introduction section called *Why Go?*:

> I’d bet that you can follow this book along even if you’ve never written a single line of Go in your life.

Or about the Go tooling:

> The focus of this book is the interpreter we are writing - the ideas and concepts behind it and its implementation. With Go’s universal formatting style thanks to `gofmt` and a testing framework built-in, we can concentrate on our interpreter and not worry about 3rd party libraries, tools and dependencies. We won’t be using any other tools in this book other than the ones provided by the Go programming language.

I also made the bet that the “Go code presented in this book maps closely to other and possibly more low-level languages”, adding:

> Maybe the reason for this is Go itself, with its focus on simplicity, its stripped-down charm and lack of programming language constructs that are absent in other languages and hard to translate. Or maybe it’s because of the way I chose to write Go for this book.

My predictions for the future of technology aren’t always great (in 2013 I said that no one will ever use a mobile phone to do anything serious on the internet, like shopping), but I think using Go for this book (and its sequel, [Writing A Compiler In Go](https://compilerbook.com/)) was a bet I won.

The code is still idiomatic. If I run `golangci-lint` over it, the few warnings I get are the same ones it would’ve returned in 2016. It’s still how I would write Go today.

It’s still formatted just like any other Go code. `go fmt` hasn’t changed, it still has no knobs to turn.

As for the suspicion that Go is easy to understand and to translate — I think I now have the evidence to prove it.

In the first few years of the books being released, people asked whether they need to know Go to understand the books. Cautious about being judged in a contest I didn’t enter, I said: well, you should know *some* Go, at least work through [the tour](https://tour.golang.org) before you start reading.

But then, over time, more and more readers told me: hey, I’ve never done any Go before, I don’t know Go, but I read the books, enjoyed them, and translated the code into my favorite language.

Take a look at [monkeylang.org](https://monkeylang.org): readers have written Monkey interpreters in Rust, Elixir, C++, TypeScript, Dart, Python, Java, V, C, PHP, Kotlin, Crystal, Scala, Lua, OCaml, Julia, Swift, F#, Elm — and others. Quite a few of these implementations — I know because their authors told me — were made on the fly, while reading the books, without typing out the Go code before.

Code that’s easy to understand and translate for readers that don’t know the language and that has shelf life that’s hard to believe, tooling that’s easy to install and use for newcomers and that *also* didn’t change in eight years, the ability to let you write an interpreter and bytecode compiler without using any third party dependencies — I know and love many other languages than Go, but I’m not sure which one would fit the bill quite like Go does.

Like I said: glad I used Go.

---

---

# Skin-Shedding Code

By Thorsten Ball • September 27, 2024

---

Here’s a bit of lingo that I learned working at Zed: shredding. Or: going on a shred.

What it means is to rewrite code. To take something apart — to feed it into the shredder — and put it back together again, but in a different, better way. It’s refactoring, but switching the scalpel for a sledgehammer.

When you say you refactor something, it might mean you change a single class, method by method, ensuring it works after each change.

Shredding, on the other hand, means to embrace destruction. To go on a shred is to delete five load-bearing functions all at once and recreating them. Deleting a type and its definitions, rebuilding it from the compiler errors. Creating an empty file and building from scratch a better version of what already exists in another file. Shredding is ripping out a page and redoing it.

The concept — taking something apart to recreate it — wasn’t new to me. What surprised me was how often it happens at Zed.

When I pair with Antonio, for example, he will often say “let’s delete this.” My response is usually to chuckle, but then he goes and deletes the whole thing in the time it takes for my pupils to dilate and a single syllable to leave my mouth: “uhm?”

Or when Nathan and Antonio pair, they might bump into something that doesn’t quite do what it should with their new requirements and instead of — clink clink clink — hammering it into shape, they will throw the whole thing out and rebuild it to fit the old and new usecase.

The whole team went on an [exceptional, multi-week shred](https://zed.dev/blog/why-the-big-rewrite), right before I joined. They rewrote Zed’s underlying UI framework, GPUI, and moved the whole of Zed onto new stilts, resulting in a final `+42,150 -330,105` pull request.

“What I really like is that no code here is considered holy,” a colleague said to me, “no code is untouchable.”

Widely practiced, part of the culture — but it’s not easy. Another colleague and I were together working on something and he said, “man, to rewrite such a component — the confidence…” Yes, I said. I knew what he meant: it takes guts to look at something that’s working and decide to break it, confident that you can rebuild it in a better way — instead of changing the tiniest possible part to make your change. It takes experience and self-awareness to know when a shred is a good idea and when it isn’t, when it’s better to make the small change instead.

Eight months after joining Zed, I still don’t know why the shreds work that well. Why doesn’t this codebase fall apart if parts of it are constantly being taken apart and reassembled?

Is it because the founders wrote the whole editor from scratch and know essentially every file in its codebase? Is it because they have been working on text editors for over a decade and know the domain well and how things should work and how they currently work is just a detail? Is it because the whole team is full of excellent programmers? Is it because of… Rust?

Or is it because the shreds aren’t manic destruction sprees, but scoped teardowns? Not a scalpel, not a wrecking ball either, but sledgehammers carefully aimed? Is it because the one who goes on a shred here is careful to not fall into the “… and when it’s rebuilt it should *also* do this and that” trap?

What I do know is this: I think these regular shreds are healthy for the codebase.

They remove the small things that pile up over time and that no one would put in again if they had to redo it. Controlled wildfires that burn away the underbrush — the most flammable part of a forest — leaving only the trees.

They allow you to throw away local maximums, by giving you the chance to ask: if I had to redo this part, what would it *ideally* look like? Ignoring sunken costs is what makes a shred a shred.

With regular, scoped rewrites — shreds — that recreate at most a handful of files, the codebase is in a constant state of renewal. Like a snake shedding its skin, it loses what it doesn’t need anymore.

---

# Joy & Curiosity #8

*Interesting & joyful things from the previous week*

By Thorsten Ball • September 21, 2024

---

After travelling and meeting and talking the previous week, this week was full of just pure coding. Wrote a lot of code at work and [streamed about 5 hours of it](https://www.twitch.tv/thorstenball), which was a lot of fun.

---

- In reply to [last week’s issue](https://registerspill.thorstenball.com/p/joy-and-curiosity-7), Muhammad [commented](https://registerspill.thorstenball.com/p/joy-and-curiosity-7/comment/69294245) with a link to [github.com/charlax/professional-programming](https://github.com/charlax/professional-programming) which contains a lot of links to great programming articles. It actually made me think that if someone were to ask me about how to start programming, I’d probably say: try to read most of what’s on here in the next 1-2 years (besides also actually learning to program.)
- Watched Andy Allen’s talk [Serious Play](https://www.youtube.com/watch?v=wBnIyD5I8mM) and thought: I like the ideas, I like the approach, I like the “happy accidents”, I like the whimsical stuff, but at the same time I don’t want animations or sounds in the software I use. Software should be as fast and as immediate as possible.
- I haven’t linked to it yet, because I thought I’ll wait until they come out with a third episode, but I can’t wait any longer: if you haven’t, I highly recommend that you listen to the two episodes of the Acquired podcast on Microsoft: here’s [Volume I](https://www.acquired.fm/episodes/microsoft) and here is [Volume II](https://www.acquired.fm/episodes/microsoft-volume-ii). Acquired hasn’t just become one of my favorite podcasts of all time in the last year (I seriously don’t know how they do manage to pull of the casual-conversation-style *this well*), but these two episodes on Microsoft (a combined 9+ hours) are fantastic. I’m saying this as a complete non-Microsoft-guy (I spelled it as “micro$oft” when I was 14 and switched to Linux shortly thereafter), but Microsoft is an impressive company and its history is also the history of the personal computer which is also… my — our? —  history. At least to a certain extent. These 9 hours probably had more moments that made me go “ah I remember that!” than a potential 9 hour documentary on the last 30 years of the state of Germany. I remember when Windows 98 came out, when the new Aldi PC came out, when I finally got a Pentium 3, how calm Windows 2000 felt, the license code for that one widely-distributed cracked version of Windows XP, using Frontpage to build my first website, using Paint.exe in my dad’s office on a Saturday, Windings, Word, Clippy, …
- This week a leaked version of a MrBeast company handbook, titled “[How to Suceed at MrBeast](https://drive.google.com/file/d/1YaG9xpu-WQKBPUi8yQ4HaDYQLUSa7Y3J/view)”, made the rounds. I find that whole handbook incredibly fascinating. I’ve always had a thing for company handbooks, including the famous [Valve handbook](https://steamcdn-a.akamaihd.net/apps/valve/Valve_NewEmployeeHandbook.pdf) or Facebook’s [Little Red Book](https://facebookcollection.wordpress.com/wp-content/uploads/2018/10/facebooks-little-red-book-office-of-ben-barry.pdf) or Reed Hasting’s not-really-a-handbook [presentation on Netflix culture](https://www.slideshare.net/slideshow/culture-1798664/1798664), and this one hits all the right buttons for me. That doesn’t mean I agree with all of its contents, but rather that I admire when someone in a leadership position writes down how they see the world. I think it’s one of the most useful things that can be done for a company’s culture.
- Some very interesting in this post on “[What's Wrong With Journalism](https://aiascendant.substack.com/p/whats-wrong-with-journalism)”. As someone who wanted to become a journalist twenty years ago, the difference between the world back then and now is stark. What stood out was the thought whether “we have returned to the word-of-mouth era.”
- I loved [this post](https://www.experimental-history.com/p/blog-extravaganza-the-winners) for sharing that Donald Miller quote: “Sometimes you have to watch somebody love something before you can love it yourself.”
- After sharing a James Mickens talk last week, I now [came across](https://x.com/patrickdward/status/1836083885421048294?s=46) a piece of his writing which I totally forgot about but that’s still very, very funny: [This World of Ours](https://www.usenix.org/system/files/1401_08-12_mickens.pdf).
- Read [this tweet today](https://x.com/stylewarning/status/1837288661714620571?s=46) and thought it’s a fantastic summary of (and maybe a replacement for) thousands of thoughts I have around different types of programmers and programming in different contexts.

---

---

# Joy & Curiosity #7

*Interesting & joyful things from the previous week*

By Thorsten Ball • September 14, 2024

---

Greetings from Montreal! Been here since last Sunday for RustConf and a Zed team summit. I haven’t seen a single talk at the conference, because I spent all day at the Zed booth, talking to people, hacking, demoing. Then there were long, relaxed team dinners, great conversations, and a bike tour. Good times.

---

- I found this [discussion about asynchronous IO and whether it’s “the next billion dollar mistake”](https://lobste.rs/s/ja3oaw/asynchronous_io_next_billion_dollar) very interesting. Someone in there commented: “All IO is asynchronous. Synchronous IO is an illusion created to simplify the life of the programmer.” I wonder whether the debates around async — which I’ve been witnessing for the past ten years — will settle on something in the next ten, or whether it’s just a “this fits your brain, this fits mine” kind of thing.
- [Vicki Boykis asked](https://x.com/vboykis/status/1832598469258690678?s=51https://x.com/vboykis/status/1832598469258690678?s=51)whether there is “a website that keeps track of the best essays and blog posts about programming and computer science?” I’ve been thinking all week long about this question. It immediately reminded me of Kevin Kelly’s [The Best Magazine Articles Ever](https://kk.org/cooltools/best-magazine-articles-ever/) list and *that* in turn made me wish for a programming equivalent.
- What would be on my list? Interestingly enough, what comes to mind first are things that aren’t highly technical. [On Being A Senior Engineer](https://www.kitchensoap.com/2012/10/25/on-being-a-senior-engineer/), for example. Chad Fowler’s [job description](https://medium.com/@chadfowler/the-best-job-description-for-an-engineer-ever-written-57b42919cc2f). Recurse Center’s [social rules](https://www.recurse.com/manual#sub-sec-social-rules). stevey’s [Rich Programmer Food](https://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html). Pieter Hintjen’s [blog post on optimistic merging](http://hintjens.com/blog:106). Jason Fried saying [give it 5 minutes](https://signalvnoise.com/posts/3124-give-it-five-minutes). Kent Beck’s[StackOverflow comment on how much tests to write](https://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests/153565#153565) and [this twelve year old tweet of his](https://x.com/KentBeck/status/250733358307500032). Not highly technical, as I said, but all things I constantly think of in the context of programming. (And now I kinda want to compile a full list.)
- I really enjoyed reading about[Fatih’s homelab](https://arslan.io/2024/09/10/my-homelab-setup/). It made me want to take a vacation just to rewire everything in my house.
- Had to smile when reading Derek Siver’s [blog post on syncing files between macOS and Linux/BSD machines.](https://sive.rs/macx) Derek Sivers, the guy who publishes these amazing books and blog posts about *life*, is also still blogging about rsync commands.
- There are some gems in [this Kent Beck post from this week](https://tidyfirst.substack.com/p/scope-management-101): “Plan incrementally. The team, every week, must be prepared to decide what to do that week. […] Deliver incrementally. The team must be prepared to support production while developing.” That last sentence will be reused, I’m telling you.
- In one of the conversations this week we ended up talking about when each of us starting programming and with which language. I don’t think it was my first language, but the conversation made me remember that I *did* write quite a lot of code in the [mIRC Scripting Language](https://en.wikipedia.org/wiki/MIRC_scripting_language) back in the day. What a thing, huh?
- At a team dinner this week, [Richard](https://github.com/rtfeldman) asked us: what are your favorite technical talks of all time? I immediately said: [Rich Hickey - Simple Made Easy](https://www.youtube.com/watch?v=SxdOUGdseq4). Then, thinking about it some more, I said that James Mickens’ [Computers are a Sadness, I am the Cure](https://vimeo.com/95066828) would make my top five. As would Gary Bernhardt’s [Wat](https://www.destroyallsoftware.com/talks/wat). This lightning talk about [deleting your code](https://www.youtube.com/watch?v=0lKjFLYkXTE) is also always with me, ever since seeing it live twelve years ago. I often think of Kathy Sierra’s [Badass: Making Users Awesome](https://www.youtube.com/watch?v=FKTxC9pl-WM). There’s a lot more — quite a few 30 minute talks have been with me for years because some 30 seconds in them were special.
- Funnily enough: I tried to find some “best talks of all time” lists and Richard’s talk [Making Impossible States Impossible](https://www.youtube.com/watch?v=IcgmSRJHu_8&t=1s) made it on quite a few of them. I haven’t seen it but am now looking forward to that.
- [“All you have to do is write one true sentence.”](https://x.com/infiniteb88ks/status/1833540805338009827?s=46)

---

---

# Joy & Curiosity #6

*Interesting & joyful things from the previous week*

By Thorsten Ball • September 7, 2024

---

I’m going to try something new again. This Register Spill consists of *only* the Joy & Curiosity section. Why? I want some writing time back for other side-projects, but I also think the writing might get better of it’s not on a weekly schedule. I’ve also really enjoyed compiling a list of links, so let’s focus on that for a while.

---

- Somehow I ended up reading about [Apple’s Presto machines](https://www.theverge.com/2024/3/27/24113561/apple-retail-presto-iphone-update-machine): machines that can update iPhones while they’re still in the box. This [again](https://registerspill.thorstenball.com/p/a-feat-of-engineering) is an easy-to-miss sentence that only makes you pause when you really think about it. How do you update iPhones *in boxes*, while they’re *not even turned on*? I found some[more information here](https://9to5mac.com/2024/04/05/apples-presto-system-in-detail/) — fascinating stuff.
- [This post by Tim O’Reilly](https://www.oreilly.com/radar/how-i-failed/) (of animals-on-the-covers O’Reilly books) made the rounds this week and I re-read it — again. It’s one of the realest things I’ve ever read on building a company, a *business*. O’Reilly: “One of my big mistakes was to let people build products, or do marketing, without forcing them to understand the financial impact of their decisions. This is flying blind — like turning them loose in an automobile without a speedometer or a fuel gauge.” While reading, keep in mind that this is from *2013*! Pre-ZIRP, if you will. And yet.
- I’m going to reference [this tweet](https://x.com/economeager/status/1830271859671327153) in the future when someone asks whether it’s worth learning or understanding something that one might not use in their day-to-day: “knowing about architecture means buildings are legible in a different way; knowing about plants and birds makes hikes more stimulating, playing music makes listening to it richer, etc”
- Thanks to [this Pragmatic Engineer post](https://newsletter.pragmaticengineer.com/p/paying-down-tech-debt) I re-read [Joel Spolky’s Things You Should Never Do - Part 1](https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/), the classic post in which he argues that one should never do a big rewrite. It’s been a while since I last read it. This time, the following section jumped out at me: “Programmers are, in their hearts, architects, and the first thing they want to do when they get to a site is to bulldoze the place flat and build something grand. We’re not excited by incremental renovation: tinkering, improving, planting flower beds.” My immediate reaction was: *but I love incremental renovation and tinkering and improving and tweaking and fiddling and listening to the engine!*
- Paul Graham published a new essay. It’s called [Founder Mode](https://paulgraham.com/foundermode.html) and I enjoyed it. What I found interesting: it seems to be yet another sign that the tide is shifting, that the previous 10 years are coming to a close. And every time I think about that tide, I wonder whether it will also take away the idea that it’s worthwhile to [emulate Google](https://abseil.io/resources/swe-book), even if you don’t have a money fountain in your company.
- Kent Beck published [something in response to the Graham essay](https://tidyfirst.substack.com/p/the-founder-mode-tradeoff) and that too is an interesting read. What stuck with me was something orthogonal to his main point, a small side-observation really. Beck writes about decisions by CEOs: “Each decision has 2 outputs. (1) The consequences of the decision itself. (2) A new organization more or less prepared to make the next decision.” — how interesting is that (2) point? What a lens to look through!
- I was talking to a younger colleague this week about stock options and forwarded him the [all-time classic about stock options by Julia Evans](https://jvns.ca/blog/2015/12/30/do-the-math-on-your-stock-options/). I also realized that (1) I know quite a lot about stock options compared to, say, 5 years ago and (2) I bet that the single most-helpful thing I ever read on business and stock options was Phil Knight’s memoir [Shoe Dog](https://en.wikipedia.org/wiki/Shoe_Dog).
- Last week I was talking to [Dave](https://davidbalbert.notion.site/Hire-David-Albert-47686f4e44a44295bb6f2f2b375a4637) and I got lucky because we both realized Dave didn’t know about the [Qlobe](https://mamememo.blogspot.com/2010/09/qlobe.html): a quine (a program that prints itself) that prints itself as a globe and each time you run it (and thus print it) it rotates the globe. My recommendation to you: clone it from [here](https://github.com/knoxknox/qlobe), run it in the terminal, smile.
[![](https://archive.thorstenball.com/data/images/148604342.joy-and-curiosity-70/2ea85961-61cf-42d2-8ce2-f652795a2992_800x536.gif)](https://archive.thorstenball.com/data/images/148604342.joy-and-curiosity-70/2ea85961-61cf-42d2-8ce2-f652795a2992_800x536.gif)
---

---

# Leave something for tomorrow

*Did I get it from Holman, or Hemingway?*

By Thorsten Ball • August 31, 2024

---

One of my favorite things to do:

Stop working right in the middle of something and leave the unfinished work for the next day. On the next day, you know exactly where to pick up and can start right away.

This week I managed to pull it off twice.

On Monday afternoon, we were hacking on performance improvements when someone interrupted us. At that point, all that was left to do was to fix compiler errors. Yet after the call, I didn’t fix them. I did something else instead. Tuesday morning, I unlock my screen, see the compiler errors, and start typing. Right back in it.

On Wednesday, I was trying to figure out where to make my code changes. Someone helped me out and told me about a mechanism in the codebase I didn’t know. With that, I knew exactly which code to write. But I only had about twenty minutes left in the day. I went and did something else, leaving the code untyped. Thursday morning I unlock the screen, the cursor still where it should be, and start typing.

I’ve [shared this little trick before](https://thorstenball.com/blog/2022/05/17/professional-programming-the-first-10-years/) but I’m not sure where I got it from. I think it was [Zach Holman](https://zachholman.com/). I don’t know whether it was in a talk or a tweet in which he shared it, but a search led me to his AMA repository in which [he comments](https://github.com/holman/ama/issues/690): 

> The best advice I have for that is to **always leave your code unfinished** the day before. That way I always know I can come back to a small problem that may only require three minutes to fix a test, or write a new method, or whatever the case is. Once I've been doing code for five or ten minutes, I tend to quickly become sucked into the problem and it's much easier to jump into the harder code at that point. Same rationale for stretching before doing exercise, basically.

Maybe I got it from this very comment — 9 years ago.

In the years since, I’ve come across the same trick in another context: writing — prose, not code. Hemingway, apparently, [had the same habit](https://www.bbc.com/worklife/article/20191205-how-to-conquer-work-paralysis-like-ernest-hemingway). In [a piece of writing published in Esquire in 1935](https://dianedrake.com/wp-content/uploads/2012/06/Hemingway-Monologue-to-the-Maestro1.pdf) he had two characters say the following:

> **Mice:** How much should you write in a day?
> 
> **Y.C.:** The best way is always to stop when you are going good and when you know what will happen next. If you do that every day when you are writing a novel you will never be stuck. That is the most valuable thing I can tell you so try to remember it.
> 
> **Mice:** All right

Here’s the crucial bit: “stop when you are going good and when you know what will happen next.”

Stopping in the middle of something when you’re confused about what to do — no good. You’ll start the next day sighing big sighs.

It only works when you know know what to do next, when you know “what will happen next” — that’s what you leave for tomorrow.

---

## Joy & Curiosity

- Last week I’ve linked to [an article](https://onethingnewsletter.substack.com/p/boutique-dreams) about Peter Miller’s book [Shopkeeping](https://www.goodreads.com/book/show/198498336-shopkeeping). This week I can report that I read the book in one evening and it’s wonderful, wonderful, wonderful.
- [Cormac McCarthy on the Kekulé Problem](https://nautil.us/the-kekul-problem-236574/). What a writer. I’ve read three of his novels and assumed (hoped) that McCarthy’s style — biblical language, barely punctuated — is so much his, that it’s foolish to try to measure up against him. Then you read this and think, god damn.
- [This long piece on Palmer Luckey](https://www.tabletmag.com/feature/american-vulcan-palmer-luckey-anduril)was very good. I barely knew anything about Luckey going in. Going out I’m fascinated by quite a few things — Luckey, Anduril, the US defense industry.
- Came across [this blog post by a VS Code developer](https://rayzz.me/articles/programming/developing-vscode-notes.html) on “some snippets and links that I often refer to or refer others to”. I found it interesting for two reasons. One: some of the debug tooling described in there seems like it can save a lot of time. Two: you rarely see stuff like this — the things that are passed on from coworker to coworker — documented in a form like this.
- I’ve enjoyed this blog post on "[Consistently Making Wrong Decisions Whilst Writing Recreational C](https://amodernist.com/texts/fun-c.html)” a lot. What stuck with me was this line: “the best part about this is watching the output of make” — there is *something* about orderly and neat make output.
- [Patrick](https://dubroy.com/blog/) shared this with me a couple weeks back: [Do the Real Thing](https://www.scotthyoung.com/blog/2020/05/04/do-the-real-thing/). It resonates so much with me that I’m considering getting the whole thing tattooed (not really but you get it.)
- Now [this](https://josephg.com/blog/crdts-go-brrr/) is what technical writing should be. There’s a first person, there’s a story, there’s technical details, it’s neatly formatted. Fantastic.
- ["May your writing week be better than Kafka's."](https://x.com/anna_mazz/status/1828714403300053395)

---

---

# No, really: YAGNI

By Thorsten Ball • August 25, 2024

---

Friday evening I had dinner with [Felix](https://felixge.de/). Among other things, we talked about good code. Good code, we both agreed, is simple. It's code boiled down to its essence.

"Perfection is achieved when there's nothing left to take away", Felix half-quoted Antoine de Saint-Exupéry. 

Good code, he said, looks as if it had been rewritten five times and the author learned with each iteration what's important and what isn't, what the essence of the code is and removing what isn't.

Not only do I agree, but I also think this is yet another exclamation point after [YAGNI ("You aren't gonna need it").](https://en.m.wikipedia.org/wiki/You_aren%27t_gonna_need_it)

YAGNI, I truly believe, is one of the most important principles required to write good code. YAGNI, to me, means that you don't clutter your code with optionality for a tomorrow that might never come.

Don't add code because "in the future we might …” *Even if. E*ven if the intentions are good, even if the code would be neat, even if, yes, should the day come that we need to solve this problem, this code would solve it well — even then: don't add it.

You can't predict the future, no one can. What looks probable today might look laughable tomorrow and code added based on what's likely today might be dead code in a few months.

Until then it's zombie code: code that isn't strictly dead — it *is* executed — but it doesn’t affect functionality. It’s there because it *might* affect functionality some day. And code — dead or alive or something in between — ain't free: it needs to be read, maintained, its tests need run. The less we have, the better off we are.

If we can we remove it, let’s remove it, and if we know we could remove today, let’s not add it.

---

## Joy & Curiosity

- Came across [Kelly Johnson’s 14 Rules of Management](https://en.wikipedia.org/wiki/Kelly_Johnson_(engineer)#Kelly_Johnson's_14_Rules_of_Management) in the [Acquired episode on Lockheed Martin](https://www.acquired.fm/episodes/lockheed-martin). Johnson ran [Skunk Works](https://en.wikipedia.org/wiki/Skunk_Works) and knew a thing or two about shipping with a small team: “The number of people having any connection with the project must be restricted in an almost vicious manner.”
- The same episode contains a mind-blowingly good story about how they got photos from space down to earth, in the 50s. Listen to [the 3-5min starting at 1:34 here.](https://open.spotify.com/episode/7BEVSm4QydO66SEfwiOZQc?si=B1vCN2rfSAqSx3GPk3-q0Q&t=5655&context=spotify%3Ashow%3A7Fj0XEuUQLUqoMZQdsLXqp)
- This post on the [3 motivational forces of developers](https://www.bennorthrop.com/Essays/2013/developer-motivation.php?) is interesting because I also often think in 3 buckets of motivation, except they don’t match exactly the ones mentioned here. For example, I think the “Technology Motivated” bucket here is too narrowly-scoped and was reminded of what Dave Draper wrote in his foreword to [Dan John’s Never Let Go](https://www.goodreads.com/book/show/6500848-never-let-go): “Dan craves knowledge and understanding, and is compelled to pass along what he discovers. Knowing is not enough; applying what he knows helps; instructing makes him complete.”
- There’s been an update in a [2.5 year old issue](https://github.com/tailscale/tailscale/issues/4674#issuecomment-2282827155) on the Tailscale issue tracker that I’ve been watching since 2.5 years. I love issues like these, in which everybody’s helpful, shares tips and custom solutions and scripts, and then everybody’s happy if there’s a big breakthrough in the case.
- Came across [John Tromp’s personal website](https://tromp.github.io/) and it made me think how much I miss these very personal websites that when you open them make you feel like you entered a person’s universe, with arrows pointing to all their interests and passions.
- [“Chores aren’t a distraction; they are the act itself.”](https://onethingnewsletter.substack.com/p/boutique-dreams)

---

---

# Second's an Eternity

*What digging into text rendering made me appreciate*

By Thorsten Ball • August 17, 2024

---

Do you know how long a second is for a computer that’s built today? How much such a computer can do in the time it takes you to say Mississippi? What a computer does while you type out Hello?

If we had a magical printer that could print out every instruction a computer is executing and why it’s executing it, *while* it’s executing it, in real time, we’d never ever again wiggle our cursors in boredom for the shock following the realisation of how much power that cursor wields won’t let us.

There are many examples to pick from — how many times is data equivalent in size to [all of Shakespeare’s writing](https://github.com/TheMITTech/shakespeare/) moved around in memory in the time it takes one to butcher a double-click? how many requests originating from how many people could a standard MacBook Pro handle per second without a fan turning on? — but lately I’ve been digging into text rendering and knowing that *all of that* happens *all the time* is marvelous.

Naively, you’d think that displaying text is second nature to a computer by now. After a good 50 years of computers displaying text, surely that’s baked in by now, somehow, and not something a computer really has to strain for — right?

But no, rendering text is all strain and it happens all the time.

Rendering text requires [shaping text](https://harfbuzz.github.io/what-is-harfbuzz.html), to figure out how to display the text you have with what’s in the font file you want to use. Finding the right glyph for each character (what’s a *character* by the way?), paying attention to ligatures and position-dependent variants of glyphs and marks and combinations of characters and kerning and, of course, your custom ligature and font feature preferences.

Once you’ve shaped the text and know which glyphs to render you need to, guess what, actually render them and that means taking the contours contained in the font file and turning them into curves and paying attention to [the nine required tables in TrueType files](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6.html) and knowing what compound glyphs are and then once you know what the glyph should look like, guess what again, you need actually display it.

That means turning the curves into pixels, as best as you can because no one likes blurry text, and maybe doing that with the CPU or maybe doing that with the GPU but ultimately ending up with pixels on the GPU and then the GPU positions the pixels according to all the calculations you did for positioning, line-breaks, character spacing, line spacing, font weight, and every other damn thing you can apparently do with fonts.

And then the GPU and the CPU and the OS and the whole family turn this into the thing that you can then look at, including all the other things that all the other applications also want to display, including your wishes for transparency and blurry backgrounds and scaled display resolutions and zoom levels.

And all of this happens, at the swipe of your finger, one hundred and twenty times per second.

So, look at this line, look at where the letters and the commas sit and recognize it for what it is: a miracle.

---

## Joy & Curiosity

*This is a new section of Register Spill that I want to experiment with, true to the original idea of this newsletter containing [“what I’d send you if you were to ask me what’s on my mind this week.“](https://registerspill.thorstenball.com/about) In this section I want to share things from the previous week I find interesting.*

- The flickerless animations of text in a terminal, [shown in the first video here](https://www.textualize.io/blog/7-things-ive-learned-building-a-modern-tui-framework/), made me go: whoa.
- [This HN comment](https://news.ycombinator.com/item?id=41224916) in which someone explains that the feature keeping them in iTerm2 is “selection respects soft-boundaries”, so they can select text between two | characters, for example in weechat. Mind-blowing how niche and yet must-have features in developer tooling can be. That matches by experience now with the Zed issue tracker.
- I found [these thoughts by Nick Hobbs](https://docs.google.com/document/d/1_W98tj_Sz6pnpJz3cXNQbxwntkELMHmSUYPy0s1K0Yo/edit), who works at Google on AI, very interesting: “Instead of shipping something great, the team reverts to the obvious tiny step: let's throw a sparkle icon somewhere that writes you a draft!”
- [This article by Aaron Francis](https://x.com/aarondfrancis/status/1823048614681494018) is now in my hall of fame of writing about attention management in times of social media. Notable other member: Craig Mod’s [How I Got My Attention Back](https://craigmod.com/essays/how_i_got_my_attention_back/).
- [How to force the `true` command to return `false`](https://blog.robertelder.org/force-true-command-to-return-false/): reminded me that “[it’s extraordinarily important that we in computer science keep fun in computing](https://sarabander.github.io/sicp/html/Dedication.xhtml).”
- I tweeted about a user keeping files unsaved in Sublime Text for 9 years and someone [replied](https://x.com/kai_h/status/1823613984169496588)to say that they had a user who kept all their email folders as subfolders of the Trash folder. There’s more horror/fun stories like that in the other replies.
- Had a bit of a mind-blow moment last week with AI. I was sick, lying on the couch, watching YouTube coding videos. Watched a video on RAII and saw some C++ code I didn’t understand. Then I thought “maybe…?” and took a screenshot of the code in the video, sent it to ChatGPT, said “explain this line by line to me”, which it did, and then I said “isn’t this part weird?”, and ChatGPT said “yes there are two bugs in this program”, and the two bugs it pointed out were exactly the two bugs all YouTube commenters had pointed out.

---

---

# It's in the stories

By Thorsten Ball • August 10, 2024

---

It’s been a few weeks since I listened to [this German podcast episode about the downfall of a company called Schlecker](https://www.handelsblatt.com/audio/crime/der-fall-schlecker-teil-2-der-abstieg/29874088.html) and I keep thinking about an anecdote one of the hosts shared.

The anecdote isn’t about Schlecker, but about its competitor, the [dm-drogerie markt](https://en.wikipedia.org/wiki/Dm-drogerie_markt), which is not only a very successful company, but also one of the most beloved brands in Germany. Some part of that is probably due to dm’s founder and CEO [Götz Werner](https://en.wikipedia.org/wiki/G%C3%B6tz_Werner), who’s done and said quite a few unusual things. Unusual in the German corporate landscape, at least. Saying publicly that the well-being of his employees is more important to him than shareholder value, for example. Or that he doesn’t see salaries as “personnel costs” (which is what it would be called on a balance sheet in Germany), but as “employee income”. Or creating a company that has free-to-use diaper changing tables, including free diapers and wet wipes and all of that. (My wife and I changed our kids’ diapers quite a few times in our local dm and, of course, walked out buying something we didn’t intend to buy when walking in.)

The anecdote goes like this. The host of the podcast, a journalist, was shadowing Werner — at this point already CEO of one of the most successful German companies and probably one of the richest people in Germany — for a day and together they walked into a dm store. Routine visit. Werner walked around the store, noticed something, and asked an employee to get him a broom. Wait, are you going to sweep the floors now, the journalist asked. Werner took the broom and used it to adjust ceiling lights above a product shelf so the products are properly lit. But Herr Werner, the journalist said, you surely can’t be serious, is that a good use of your time, going into stores and poking at lights with a broom?

Werner said to the journalist: the woman who handed me the broom, the woman at the cash register — they won’t ever forget that I just walked in here, took a broom, and adjusted the lights. They will tell their colleagues and they in turn will tell *their* colleagues. And they’re all going to pay attention to the lights from now.

I’ve got anecdotes like this too.

When I was working at UPS over a decade ago, unloading trucks in the night shift, we had a shift leader that would give us Braveheart-like speeches before a big night. Around Christmas time, say, when we’d expect double the volume of packages. He’d stand in front of us and assign us to our positions that day, giving us specialty names and stroking our egos: “Marco and Thomas, you’re beasts at sorting and I’m counting on you today, I need you because we got big shipment going to north east. Andy and Lukas and Thorsten - you’re the unloading A-Team and I need you guys to go all-in today. This is going to hurt, sorry, but we’re going to get through this.” Now you know how you can get me to break my back: tell me I’m part of the A-Team. One night when we were still going at it at 3am, our shift leader would hop into the trucks with us and help us unload — urgently, furiously, dripping with sweat.

I’ll never forget that. I also told all new colleagues about our shift leader and now I told you.

I’ve got stories like this about many people I’ve worked with — team leads, CEOs, CTOs, Head-Ofs, colleagues. Things I’ve experienced myself or stories that coworkers told me.

I’ve got a story about a CEO who flew across the Atlantic, landed, and immediately replied to a message that I had sent because I was worried about a few things, hopped on a call with me while he was in a taxi, and talked to me for an hour while driving into the city, and never, not once, breaking eye contact. I shared that story with quite a few people. They all said: yes, he’s a machine.

I’ve got a story about a CEO who sat in a 1:1 with me, a very difficult and exhausting 1:1 in which he stayed calm and kind and kept a smile the whole time. I asked him: how come you’re smiling, am I not a pain in the ass right now? And he said: you won’t believe this, but I pull energy out of conversations like these. I didn’t and still don’t believe it, but I keep thinking about it.

I’ve got [a story]() about a Head of Engineering sending me fish because he thought I’d get a laugh out of it. I’ve got a story about a manager who would always, always, always start meetings on time — no matter how many people were still out of the room. I’ve got a story about a CEO ending meetings on time, even cutting executives off mid-sentence. I’ve got a story about a CEO who hacked together a small prototype in HTML and jQuery for a whole day and when we asked why he didn’t just ask us to do it he said he doesn’t want to distract us.

Sometimes, I think that this is what it’s all about: stories.

And that, maybe, leadership is the act of producing the right stories, the anecdotes that are repeated by those around you, that carry the message you want out there.
[![](https://archive.thorstenball.com/data/images/147549400.its-in-the-stories/f107fc98-93fa-4446-8b84-207f0b2d8b68.png)](https://archive.thorstenball.com/data/images/147549400.its-in-the-stories/f107fc98-93fa-4446-8b84-207f0b2d8b68.png)
## Joy & Curiosity

*This is a new section of Register Spill that I want to experiment with, true to the original idea of this newsletter containing [“what I’d send you if you were to ask me what’s on my mind this week.“](https://registerspill.thorstenball.com/about) In this section I want to share things from the previous week I find interesting.*

- I loved [this article](https://jimmyhmiller.github.io/ugliest-beautiful-codebase) by Jimmy Miller on the “best, worst codebase” he worked on. I love that he said he missed it: “I miss that direct connection. The fast feedback. The lack of making grand plans. The simple problem and code connection.” Reminded me of a friend who once said, dismissingly: some programmers truly believe that good code will get them into heaven. Jimmy ain’t one of them.
- Murat Buffalo with some [great advice](https://muratbuffalo.blogspot.com/2024/07/advice-to-young.html): “A bee that doesn't produce honey is just a pest.  Producing something small each week is key to keep your muscles from atrophy.”
- [This post](https://nicholas.carlini.com/writing/2024/how-i-use-ai.html)by Nicholas Carlini on how he uses AI was refreshing. Refreshing like a walk from the booth at the Hammer Fair, where a Hammer sales person told you all about the new hammer and what it can do for and how life-changing it is, over to the construction site where a guy says: this is a hammer and this is how I use it to smash nails into a wall.
- Murat, [again](https://muratbuffalo.blogspot.com/2021/03/your-attitude-determines-your-success.html): “Manage the stories you tell yourself” — Reminded me a lot of Derek Siver’s wonderful [Useful Not True](https://sive.rs/u).
- “PostHog is a web product and [cannot be installed by CD](https://posthog.com/). We *did* once send some customers a floppy disk but it was a Rickroll.” —[I loved that.](https://x.com/thorstenball/status/1820396257187074294)
- I’ve been [paying for a domain since 2003](https://x.com/thorstenball/status/1820379896062804254). We’ve now entered the age of the Internet in which we can say: “my dad has been buying his domains here for decades, so I’ll buy my domains here too”
- [Insightful comment by Francisco Tolmasky](https://mastodon.social/@tolmasky/112487141674376869) on programming language development not being lead by application developers. That rings true and I have a lot of thoughts on that but I don’t want to name names in a paragraph like this. The pragmatism in that thread reminded me again of something a friend once said. When someone was making fun of Go for not having a package manager (this was in 2014), he replied: "turns out, it’s not a big issue”
- Enjoyed [Casey Muratori riffing on RAII and smart pointers](https://youtu.be/xt1KNDmOYqA?si=CZJOd5VFhmqN2U6G). Especially liked the admission that there are phases we all have to go through, that we can’t skip, no matter what.
[![](https://archive.thorstenball.com/data/images/147549400.its-in-the-stories/04825e1e-4895-403a-85db-f1b9e5ba9643.png)](https://archive.thorstenball.com/data/images/147549400.its-in-the-stories/04825e1e-4895-403a-85db-f1b9e5ba9643.png)

---

# Things you can do with codebases

By Thorsten Ball • August 4, 2024

---

It's easy to forget that we're surrounded by millions and millions of lines of code that we can access and build and run and modify and tweak — whenever and however we want.

Maybe we forget because open source has become the new normal? Or maybe because we all have some public repositories and don’t think much about it? Or maybe — and this is the one I’m putting my money on — it’s because we never stop to think about how amazing that really is?

So let’s let that sink in together: there are over [200 million public repositories on GitHub](https://github.com/search?q=is%3Apublic&type=repositories), ready to be cloned, just there for the taking and tweaking.

And yet what most of us think of to do with all that code is reasonable, sane, grown-up, mature: fixing bugs, adding features, cleaning up documentation, helping out in the issue tracker.

But — isn’t a But a beautiful thing sometimes? — here’s a thought: there are millions, billions of lines of code available to play with and you can do whatever the hell you want with them.

Here are some suggestions:

- Check out the first commit. See what the project was like as a baby. [Here is Redis at its first commit.](https://github.com/redis/redis/tree/ed9b544e10b84cd43348ddfab7068b610a5df1f7) Nine C files in the root directory. A very clean, nicely commented Hash Table implementation in [slightly more than 500 lines](https://github.com/redis/redis/blob/ed9b544e10b84cd43348ddfab7068b610a5df1f7/dict.c). It’s grown to [2000 lines now.](https://github.com/redis/redis/blob/8038eb3147ad1c528a58142464584ada376936ee/src/dict.c)
- Put log statements in, run it and see what it actually does. I mean, why not quadtruple the amount of log statements in [TigerBeetle’s state machine and see what it does](https://github.com/tigerbeetle/tigerbeetle/blob/fc11bec55efa40e9882613d008a91d0f93a43957/src/state_machine.zig)? That sounds like a nice morning.
- Break it. Again: why not? How hard could it be to modify PostgreSQL to never write to disk again? What would you learn in the attempt?
- Cut it apart. One of my favorite things to do when debugging: taking a codebase and deleting everything that I don’t think is relevant to the bug. You learn quite a lot about a project’s structure when deleting folder after foldering and trying to get it to run again. Can you, for example, take [Go](https://github.com/golang/go) and delete the code for all of the architectures on which you don’t want to run it?
- Copy out parts and see how they tie in with the rest of the system. Take Redis again: can you simply copy out the Hash Table implementation and run it in your own main.c file?
- Change constants. Hardcode values in it. That’s how I started programming in school when I was 12 years old: we played around with JavaScript and DHTML and this code that generated some floating balls following the mouse cursor, as if they were elastic. I had a big lightbulb-moment when I changed some constants in the code and realised how they affect distance, width, height, and elasticity. (I *think* it might actually have been [this code](http://jsmadeeasy.com/javascripts/cursor%20effects/elastic%20bullets/template.htm), but 25 years ago. I should try to get it to run again.)
- Remove all the features you aren’t interested in. Can you delete all the graphs you aren’t interested in from [stats](https://github.com/exelban/stats) and still have it run okay? How much faster can you make something start up if you remove all the things you never use?
- Print it out.
[![](https://archive.thorstenball.com/data/images/147330766.things-you-can-to-with-codebases/62cb77ac-d082-442c-bbc0-109623a9a2ff_2598x1920.jpg)](https://archive.thorstenball.com/data/images/147330766.things-you-can-to-with-codebases/62cb77ac-d082-442c-bbc0-109623a9a2ff_2598x1920.jpg)The Meta-Circular Evaluator from Structure and Interpretation of Computer Programs, printed out, sitting on a shelf here in this room.

[![](https://archive.thorstenball.com/data/images/147330766.things-you-can-to-with-codebases/1bb9586d-d128-4370-93f5-8731d04bdadc.png)](https://archive.thorstenball.com/data/images/147330766.things-you-can-to-with-codebases/1bb9586d-d128-4370-93f5-8731d04bdadc.png)
## Joy & Curiosity

*This is a new section of Register Spill that I want to experiment with, true to the original idea of this newsletter containing [“what I’d send you if you were to ask me what’s on my mind this week.“](https://registerspill.thorstenball.com/about) In this section I want to share things from the previous week I find interesting.*

- Came across the [vim-sneak](https://github.com/justinmk/vim-sneak) README this week, thought “why not use / in Vim to navigate?”, and had to laugh out loud when this was addressed in the README with: “`/ab<cr>` requires 33% more keystrokes than `sab`” — That’s fair.
- I keep thinking of [this HackerNews comment](https://news.ycombinator.com/item?id=41111324) in a thread about advice and why advice doesn’t work. I’ve also thought a lot about the general idea of “advice” in the past few years and how hard it is to give advice and how many lessons are tied to the context from which they come. I thought this comment about storytelling being a replacement for advice and how “stories are essentially beneficial viruses” was very interesting.
- [Patrick](https://dubroy.com/blog/) forward this to me:[The Five Year Rule of Software Transitions](https://blog.robenkleene.com/2023/06/19/software-transitions-the-five-year-rule/). The part about VS Code and text editors stuck out. “Atom was known as being slow, and VS Code has a reputation of being snappy in comparison.”
- After seeing GitHub announcing [Github Models](https://x.com/ashtom/status/1819041110200906202) I’m now idly wondering whether we're entering the phase of AI in which it's becoming clear that models are a commodity.
- I’m a big fan of [Dan John](https://www.youtube.com/channel/UCrf_X-KnNGBy75IGsPuI7AQ) and his thoughtfulness. I tried to find a quote of his about the best workout being the one you can repeat every day, not the all-out workout that leaves you hurt for days. Couldn’t find it. Instead found [this interview](https://www.trainheroic.com/blog/simplify-the-weightroom/) with him that contains this precious line: “There was always someone else who was far better than me, but they didn’t show up".”
- I love using [HandBrake](https://handbrake.fr/) and especially [this little detail](https://x.com/thorstenball/status/1817889819344748936?s=46).
- Everbody had something to say about [the Friend.com announcement this week](https://x.com/AviSchiffmann/status/1818284595902922884) and, as often, I don’t think I have a fully-formed opinion yet. It does look dystopian. And yet I started to wonder: what could you do with an “assistant” that can interrupt your thoughts? I’ve read [Don't feed the monkey mind](https://www.goodreads.com/book/show/33977140-don-t-feed-the-monkey-mind) earlier this year and one big idea in it is to try to break bad patterns your mind falls into. When you catch yourself going back to the same thoughts, you need to stop the cycle. Now I’m wondering: could something like the Friend.com thing help you stop your thoughts? Could it message you after listening in to a conversation with your boss, saying, “hey, don’t overthink this, I know you assume that what he said about X, Y, Z and is about you, but it’s not.” Again: not sure what my opinion will be (if I will have any), but I sure wish I could re-program my thought patterns sometimes.
- This horror story in the form of a [HackerNews comment](https://news.ycombinator.com/item?id=41147787). Pow: “The solution was obvious: installing Visual Studio for each customer on site and teaching the users to run the app in debug mode from Visual Studio” And bang: “What happened next was even worse.”
[![](https://archive.thorstenball.com/data/images/147330766.things-you-can-to-with-codebases/e567c301-07bf-48d1-8c45-ea4ae008b7eb.png)](https://archive.thorstenball.com/data/images/147330766.things-you-can-to-with-codebases/e567c301-07bf-48d1-8c45-ea4ae008b7eb.png)

---

# Database Indexes & Phone Books

*One of the best analogies I’ve ever been taught*

By Thorsten Ball • July 27, 2024

---

When I was a junior programmer I was sitting next to an experienced senior programmer that not only loved our PostgreSQL database but also knew SQL very well and a lot about databases in general.

Often, when I’d loudly ask the room why such is such or why something works the way it did, he would perk up, his spine seemingly realising that it’s lesson time, slide over with his chair, and start a first-principles explanation.

One day I was wondering what an index-only scan is.

Database indexes are like phone books, he said. You know how in a phone book you have the first name, last name, name of the street, number of the house, and phone number for each person living in a city?
[![](https://archive.thorstenball.com/data/images/147060181.database-indexes-and-phone-books/db387929-8088-493d-b599-1429da0f6431_816x499.jpg)](https://archive.thorstenball.com/data/images/147060181.database-indexes-and-phone-books/db387929-8088-493d-b599-1429da0f6431_816x499.jpg)Typical entries in a phone book. (Photo credit: [Brewer Bob, CC BY-SA 4.0](https://commons.wikimedia.org/w/index.php?curid=39775673))
Say you want to find a person and ask them how old they are, but you don’t know where they live. You could, of course, walk down every street in the city, knock at every door, and ask everyone who opens: are you who I’m looking for? That would be a sequential scan in a database — no index used. You look at every row in the table until you find the one you’re after.

With a phone book you don’t have to walk down every street. The phone book is an index of the columns first name, last name, street, house number, phone number. If you want to find someone named Enzo McNacho you look them up in the phone book by opening the pages that have the names starting with M, find the exact page that has Enzo, get their address, and walk to their house. Index used — no sequential street walking and door knocking needed. Find where the row is and open it directly.

So what’s an index-only scan then, I asked.

Say you want to find out on which street someone lives or what their phone number is. Both pieces of data are contained in the phone book itself — in the index. You don’t have to walk to their house, knock, and ask them. You find their entry in the phone book by looking up their name and there it is — street and phone number.

That’s what an [index-only scan means in database land](https://www.postgresql.org/docs/current/indexes-index-only-scans.html) too: it gets you the data you want by only looking at the index, without having to actually open the main database files on disk. It’s a `SELECT name FROM people WHERE name = ‘Enzo McNacho'` with an index on `name`.

I’ve thought of that analogy many times in the past ten years because it’s so great, but only now did I realise that it also helps explain why sometimes [a sequential scan is better](https://www.pgmustard.com/docs/explain/sequential-scan): if you want to query a whole lot of rows, or all the rows of a tiny table, it makes sense to find the first entry via the index and then just scan the rest of the rows that are next to it. That’s faster than finding an entries and opening each row you come across.

Just like it’s faster to walk down every street in sequence if you want to create a survey and actually do want to knock on every door. Or when you live in a tiny town with a single street and you want to ask everybody what their favorite meal is.

In those cases, you don’t want to carry the phone book with you and instead just go knocking.

*(Cover photo is also by [Brewer Bob, CC BY-SA 4.0](https://commons.wikimedia.org/w/index.php?curid=39775676)))*

---

# Did you know about Instruments?

By Thorsten Ball • July 20, 2024

---

For the longest time, I thought [Instruments](https://en.wikipedia.org/wiki/Instruments_(software)) on macOS wasn’t for me. Whenever I saw its icon show up in the `/Applications` folder or pop up in a launcher, I assumed it’s part of Xcode and Xcode is an IDE for Objective-C and Swift programmers and that’s not what I do and that’s why Instruments isn’t for me.

I was wrong.

Shortly after joining Zed at the start of the year, I realised two things:

1. Instruments is an amazing performance-analysis tool
1. It can be used with anything! Well, at least any binary that uses the native stack

As is my wont, I then went on an Instruments evangelism tour and told everybody who would listen (or, to be honest, wouldn’t) about it.

Now it’s time I tell you about Instruments, in case you’ve been missing out.

The first thing we have to get out of the way is that getting started with Instruments is weirdly hard. It’s not hard-hard in the sense that you need to have read four books to make sense of the menu entries, but hard in the sense that it’s easy to miss which button to click and end up unimpressed.

To avoid that, let me hold your hand while you do your first steps with Instruments.

First: launch `Instruments.app`. You’ll see a window like this:
[![](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/62e8e345-e547-456b-8e9f-2f3765ce6447_1672x1304.png)](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/62e8e345-e547-456b-8e9f-2f3765ce6447_1672x1304.png)
There’s two things to note here:

1. Wow, does it actually say Zombies on that button there? Yes, it does.
1. A lot of people give up on Instruments at this point, because it’s not obvious what to click.

So, let’s choose the most straightforward option and select `CPU Profiler`, then click `Choose.`

What you’ll see next is a screen that doesn’t improve on the previous screen’s self-explanatory attributes:
[![](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/80b197e2-f0a7-40ac-bc70-9bb7d95f4285_2024x1444.png)](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/80b197e2-f0a7-40ac-bc70-9bb7d95f4285_2024x1444.png)
Fear not! This screen tells us that we’re ready to record a profile, but we haven’t done so.

What we need to click is `All processes` in the top left (the label might be different) and then select the process we want to profile. Once you click it you’ll see a drop-down in which you can select an already-running process to analyse, or you can start a new one.

As an example, I’m going to launch the amazing [atuin](https://github.com/atuinsh/atuin) in my terminal and keep it running so I can profile it. To do that, I click on said `All processes` and — weirdly enough — atuin shows up under `System processes` (I guess that’s what Instruments calls all non-GUI processes). I select it and now I end up with this:
[![](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/8798c548-8648-4940-bf4a-5ef0e9f07037_682x208.jpg)](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/8798c548-8648-4940-bf4a-5ef0e9f07037_682x208.jpg)
Now you need to click on that red button on the left that should be roughly 50 times bigger and have a big, fat label that says “The Button”. Clicking it will record the process.

Once it’s recording, I switch over to atuin (or whatever application I want to profile) and do the thing I want to analyse. In this case, that means I’m just going nuts and type a bunch of stuff into atuin, so it fuzzy-searches my shell history. Once I’m done, I click the stop button in Instruments and end up with this:
[![](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/579960c0-30a5-4b63-8921-eaf21a619dab_2050x1538.png)](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/579960c0-30a5-4b63-8921-eaf21a619dab_2050x1538.png)
How sweet is that? A full CPU profile of atuin and all its threads.

You can zoom in, walk up and down the call tree, order functions by weight (which — roughly — means how much time they took up), filter functions, only select specific threads, and so on.

And that’s only the start!

On that first screen, the one on which we choose `CPU Profiler`, there are many more interesting profile templates. Here, for example, is what I recorded using the `System Trace` profile, also pointing it at atuin:
[![](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/0816c7b9-9b94-40cc-b958-338c505e8b35_2880x2112.png)](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/0816c7b9-9b94-40cc-b958-338c505e8b35_2880x2112.png)
Look at that! Isn’t that beautiful! You can see when which thread is running, or when they’re blocked, when they’re doing syscalls or are blocked by them.

In this specific example, you can see that the two `sqlx-sqlite-worker` threads  atuin apparently has are taking turns on the CPU: when one is blocked, the other is running. You can see the system calls, you can see the CPU usage, you zoom in endlessly. It’s fantastic.

Or, here, a `Metal System Trace` of [Ghostty](https://mitchellh.com/ghostty):
[![](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/e0ac3225-4c69-46a8-98ed-18e7a9897f1d_2050x1538.png)](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/e0ac3225-4c69-46a8-98ed-18e7a9897f1d_2050x1538.png)
You can see when VSync events happen, you can see render times, you can correlate that with CPU use, you can then drill into which thread is doing what when a frame is missed — so good.

Look. I could go on and on and on and show you more screenshots or even videos and tell you how amazing Instruments is, but what I want to leave you with are two things.

One: if you’ve ever bumped into Instruments and thought that it isn’t for you, you might want to reconsider. Give it another shot. It’s a bit weird to get started, granted, but it has a lot to offer. 

Second: I can’t believe how good this tool is! So much work must have gone into it that it’s actually hard to believe. 

I mean, look:
[![](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/084aeb64-d299-4526-997e-c6cc60f2d135_2572x1538.png)](https://archive.thorstenball.com/data/images/146812196.did-you-know-about-instruments/084aeb64-d299-4526-997e-c6cc60f2d135_2572x1538.png)
I can drill into every milli— no, *micro*second of every frame that Zed renders and see exactly what’s going on in which thread, with basically no noticeably overhead. That’s *nuts. *The UI — despite the hurdles when getting started — and how easy it then is to drill into data and examine different things going — that’s far ahead of every other profiling tool I’ve used — on macOS and on Linux, with any other programming language. 

Don’t sleep on Instruments.

---

# Matrix Theory of Mind

By Thorsten Ball • July 13, 2024

---

A few months ago I listened to [this episode of the Search Engine podcast](https://pjvogt.substack.com/p/how-do-i-use-the-internet-now) in which PJ Vogt, the host, talks to Ezra Klein about the internet and media consumption in general.

In the episode, Ezra Klein shares what he thinks of as the “Matrix Theory of Mind”. Here’s my (slightly cleaned up) transcription of [that part](https://www.youtube.com/watch?v=NiM5rJO_WYc&t=395s):

> **Ezra Klein**: The Matrix Theory of the Mind is that… if only you could have that little [jack in the back of your neck](https://matrix.fandom.com/wiki/Headjack), into it would come the information.
> 
> **PJ Vogt**: Oh, like how in the Matrix they can plug in the jack and now they know kung-fu and French?
> 
> **Ezra Klein**: Exactly. A lot of people have the Matrix Theory of the Mind. The Matrix Theory of the Mind is this idea that you just download information into your brain and then you know it, that that’s what a book is doing.
> 
> When you hear these guys like Sam Bankman-Fried and others who famously say, like, there should be no books, it should be a blog post, like books are too long — what they’re saying is that they’re not information dense enough. Like you could just get the gist and then you’re there.
> 
> I’ve come to think that that’s not what any of this is actually about, that the time you have to spend with information, wrestling with it, being attentive to it — that’s where you draw connections, where you come to insights, where parts of you come into relationship with parts of it and something new emerges.
> 
> If you do creative work, that’s what you’re looking for, that kind of emergence of something new. And that’s about the attention, not just the information.
> 
> The same piece of text (or movie or music) read in a fractured way — for me: over 32 days in 15 or 17 minute chunks before I fall asleep — and that same book or same piece of culture consumed on an airplane, where I have no distractions, or in a movie theater — my relationship to that, what I will get out of it, what I will create from it in my own head are completely different.

This stuck with me. Not just because Matrix Theory of Mind is a [great name](https://thorstenball.com/names/), but because quite a few of the “this book should’ve been a blog post” comments I’ve come across over the years felt off. I couldn’t articulate why until I listened to Klein say the above.

Admittedly, some books *are* 15 pages stretched to 300. You read them and constantly wonder what the deal between the author and the publisher includes — minimum page count? this number of words? *thickness*?

But other books do need their 300 pages. Repetition, stretching, or taking time with it are essential to these books. Maybe to drive the same point home again and again. Maybe from a slightly different perspective, with a slightly different tone, with a different detail in focus on each repetition.

In 2016 I quit smoking after reading Alan Carr’s [The Easy Way to Stop Smoking](https://en.wikipedia.org/wiki/The_Easy_Way_to_Stop_Smoking) — a classic of the genre. That book is unbelievably repetitive. If you haven’t read it, you might think you know what a repetitive book is, but you don’t.

When I read it, it took me until the second chapter to think: I get it. The book has 44 chapters. I kept on reading and Carr kept on making the same point, again and again, chapter by chapter. Each time I thought: I get it. But then he made the same point *again* and that time I thought: oh, now I *get it*.

I didn’t stop smoking after the second chapter. I stopped (and haven’t smoked since) after chapter twenty something.

Some books, I feel, need to be massaged into you; they can’t be uploaded through a jack in your neck.

That, to me, isn’t just a reminder to be patient, but also comforting. If I don’t understand something right after having been presented with all of the relevant facts, that’s not an indication that I’ll never understand it, but rather that I still need to wrestle with it some more.

---

# With Nothing to Do

By Thorsten Ball • July 6, 2024

---

It was eight years ago that I lived through some of the worst weeks of my life as a professional software engineer. I was working for a small startup that was about to be acquired. Or about to go bankrupt.

There was no other possible outcome anymore. Acquired or bankrupt, it was one of these two and every week for several months the odds would tip from one to other and back again.

We were a funded startup that didn’t have any revenue, running out of money. We had used up all our funding hoping to either grow and get more funding or to get acquired by one of the two large companies that we had been partnering with.

One week it was: this is it, maybe we won’t get paid this month and then that’s that. And then the next week: they’re going to acquire us, 100%, I mean, why would they say something like that if they don’t plan to acquire us?

Leadership kept us in the loop and told us as soon as there was anything to tell. They had already put more of their private savings into the company, just to stretch the time we have left, hoping that we make it until we’re acquired. Any day now, surely.

At that point, I had been working there for more than three years. And in those three years, I had done everything there is to do as an engineer in a small startup with less than five engineers: build features, scale the database, rebuild features, build internal tooling, go to sprint workshops, do performance optimizations, write SQL, fix CSS, give talks — everything. We all did everything — whatever was needed at any moment — all the time.

But in those weeks, when we were all closely watching the movements of the acquired-or-bankrupt scale, we found ourselves with nothing to do.

*Yes*, there’s always something to do — you can always refactor some code, clean up some README, remove that moldy TODO comment in that file no one has seen in years — but *do you*? Is that really what you do when you know that it won’t, no: *can’t*, affect the outcome, that it won’t the tip the scale, and won’t save the company?

Two large corporations were about to decide what happens with us. They didn’t care about new features or performance optimizations — we had already gone through a due-diligence process, they had looked at the codebase, poked the servers, interviewed us engineers (good story for another time). They knew what the product and the engineers are capable of. What they had to answer was: do we have the money to acquire them? Can we get the money to acquire them? *Should* we acquire them?

And that last question had everything to do with financials and strategy and politics and nothing to do with what a handful of engineers does in a small office.

When I asked one of the co-founders what we should do, he said, with a shrug, something like: I don’t know — come up with some new features? What else was he supposed to say? You don’t tell your engineers “there’s nothing to do but wait, do whatever.” And yet that’s exactly what the situation was.

We had nothing to do. We could do whatever we wanted.

Sounds like a dream setup, doesn’t it? Be [Big Head from Silicon Valley](https://silicon-valley.fandom.com/wiki/Big_Head). Sit in front of a computer for eight hours, do whatever you want, get paid. Maybe write some code, maybe don’t, maybe do something else.

But — to my big surprise — I hated it.

The first few days were fine, but then, very quickly, I started to dread it. In the second week I didn’t want to go to work anymore. But I did. Every day I would get up, walk to the train station, sit in the train, walk to the office, go up the stairs, sit down, sigh, and think: okay, so now what?
[![](https://archive.thorstenball.com/data/images/146332884.with-nothing-to-do/1a14c932-d157-4417-a904-a313ccf2baff_2628x1792.jpg)](https://archive.thorstenball.com/data/images/146332884.with-nothing-to-do/1a14c932-d157-4417-a904-a313ccf2baff_2628x1792.jpg)Took this on the train on one of these mornings
Don’t get me wrong: we did do something. We did some refactoring, we did try out some new features, we did tune some servers. I also worked through Real World Ocaml, set up a nice, pristine VM running Linux on my MacBook, made my dotfiles cross-platform compatible, switched colorschemes.

All the while, running through my head in a loop that I couldn’t stop: none of this matters, whatever you do doesn’t matter, someone else decides what happens with the company.

Never would I have predicted how horrible that is, this constant feeling that I’m wasting my time, wasting someone else’s money, that I’m doing things that just do not matter.

It lead me to write something in a note that I still have on my computer and that I’m looking at right now. It’s what I learned about myself in those weeks. It says: “I want my work to count. It should *matter*.”

I guess everyone says that when you ask them, but what I learned about myself was that I’m hyper-sensitive to it, that I *need* it.

I learned that I could never work in a research lab, for example. Work on something for a year that then might get scratched? Research something that might turn out to be a dead end? I wouldn’t be able to get up in the morning.

I learned that maybe that’s why I don’t like greenfield projects that much — the projects haven’t proven themselves and might get scratched at any point, maybe independent of what you do.

I learned that I like working for companies where the technology counts, where success and failure are also influenced by engineering and not just by a marketing budget.

I learned that if someone were to tell me “go build this, knock yourself out, but know that it might get thrown away” I wouldn’t even start.

I learned that that’s what I loved about writing and self-publishing a book: everything I did *mattered*. From writing the book, to designing the cover, to building the landing page, to promoting it. I knew exactly how my input would translate into output. The more I put in, the more I got out.

It’s a lesson that I thought of every time I felt unhappy at work and talked with a manager about it. I thought of it every time I interviewed for a new job, every time I read about someone else’s experience at their job. It’s a lens through which I view many things now: will I feel like my work matters?

In the end, our startup wasn’t acquired. Not how I imagined it would be acquired anyway. Half the team (myself included) were hired by one of the large corporations, the rest of the team and company were acquired by the other corporation. It didn’t feel like a happy end, just like *a end*, like a fizzling-out. It felt so anti-climactic to me that I forgot quite a few things about it, but what I’ll never forget is what it felt like having nothing to do.
[![](https://archive.thorstenball.com/data/images/146332884.with-nothing-to-do/0eef3b67-576c-4af7-8991-736b65e0d6dc_1450x1096.jpg)](https://archive.thorstenball.com/data/images/146332884.with-nothing-to-do/0eef3b67-576c-4af7-8991-736b65e0d6dc_1450x1096.jpg)Packing up our stuff after the acqui-hire/sition. Some of us got into lock-picking in the preceding months.

---

# Note From the Bouncy Castle

By Thorsten Ball • June 8, 2024

---

In one of my more philosophical moments two years ago, I said to a friend: you don’t need much more for a good time than a grill with bratwurst on it, beers, and a bouncy castle for the kids. Well, they said, do it then. I will, I said, but then didn’t. Every time we met, though, I was reminded: when’s the bouncy castle party?

This year, after once more being reminded that one can’t just talk the talk when it comes to bouncy castles, it’s happening. It’s happening today. There’s a fridge full of beer. Another fridge full of bratwurst. And there’s a bouncy castle folded-up in my driveway, waiting to be filled with air, eager to do what it’s made to do.

Let me tell you this: when you’re waiting to put up a bouncy castle in your garden — that’s not a time for Thinking or Writing. When you’re about to go outside into the sun, to hop around on an inflatable structure that looks like a mountain hut decorated for Christmas (I didn’t get to pick the design), the part of your brain responsible for Deep Thoughts turns off.

So let me leave you with a little thought that’s been bouncing around my head (I just did, yeah) for a while now.

It’s going to sound trivial and I guess I should’ve had this realisation a long time ago, but I didn’t and maybe that’s why the surprise was that big for me. Here it is:

I’ve always thought of my strengths as things I can do even though they’re hard. Things that I’ve worked on, that are exhausting, that I’ve trained for, that take me a lot of effort, but that I can still do. These are my strengths — things not everybody can do, but I can, because I worked hard at it.

Then someone said to me about something: that’s a strength of yours. No, it isn’t, I said, that’s very easy to do. *For you*, he said, but just because it’s easy for you, doesn’t mean it’s easy for others, and just because — or maybe: *because of that* — it’s easy for you or comes naturally to you, doesn’t mean it’s not a strength of yours. Things that come easy to you, he said, can be strengths, there’s no requirement that strain or lots of effort have to be involved.

He’s right and it’s obvious when put like that, but it took his explanation for me to see it.

Now that I do see it, a lot of things and ideas look different — better. A conversation that didn’t take more than two minutes gave more optimistic, healthier perspective on everything relating to personal strengths: what it means to play to one’s strength, how to take pride in one’s work, and all that.

Maybe this little idea — personal strengths can be things that come easy to you — also changes something for you.

And with that: to the bouncy castle.

---

# Be findable

By Thorsten Ball • June 1, 2024

---

“But isn’t that self-promotion?”, said with a disgusted face.

Or, equally disgusted: “Ugh, that’s bragging. Narcissistic. I don’t want to do that.”

Or, frustrated: “Can’t I just do good work?”

Whenever I hear one of these, I want to quote or, better yet, link to a snippet of an episode of [Comedians in Cars Getting Coffee](https://en.wikipedia.org/wiki/Comedians_in_Cars_Getting_Coffee).

That’s right. There’s wisdom about doing good work and getting rightful recognition for it contained in episode 11 of season 10 of Comedians in Cars Getting Coffee. Alec Baldwin is the guest.

But I could never quote nor link to the dialogue I wanted to share, because it’s stuck inside Netflix. So, back from vacation, I sat down and transcribed it.

Here it is, Seinfeld and Baldwin talking about the fallacy that’s thinking “just doing good work” is enough:

---

**Baldwin**: In this business, which is filled with people you and I know, are very talented people, who aren’t going to make it.

There’s a higher degree of luck involved in this than other businesses, I think. You know?

**Seinfeld**: No.

**Baldwin**: Okay. I was afraid you’d say that.

**Seinfeld**: What I find is, the talent is there, but it’s not cultivated. It’s assumed— It’s thought of as some magic carpet. “Well, they’ll find me. They’ll take me there.”

**Baldwin**: What I used to call the Show Business Commission.

You’re in your apartment watching TV, and they knock on the door, like “Jerry, I’m Dave Addison from the Show Business Commission. We understand you got enormous talent and tremendous potential and you don’t know what to do with it, and there’s really no bridge or no other conduit which will carry you over to the next level, which is why we’re here. We’re the Show Business Commission. We’re here to sort of collect you up.”

**Seinfeld**: “You keep a very low profile. I haven’t even heard of you.”

**Baldwin**: “I have to say when your name came over the wire, we were stunned. We’ve heard absolutely not a peep about you. They tell us you’re very talented, and we said, ‘We’ll take your word for it.’”

**Seinfeld**: Yes.

**Baldwin**: Someone’s gonna come and get you and carry you there. No, they’re not.

---

Austin Kleon, in his delightful [Show Your Work!](https://austinkleon.com/show-your-work/), said it like this:

> I hate talking about self-promotion. Comedian Steve Martin famously dodges these questions with the advice, “Be so good they can’t ignore you.” If you just focus on getting really good, Martin says, people will come to you. I happen to agree: You don’t really find an audience for your work; they find you. But it’s not enough to be good. In order to be found, you have to be findable.

It’s not about screaming “I am the greatest” from the rooftops, it’s about saying, hey, I did something, I think it’s neat, you might find this interesting.

It’s not about playing up something that isn’t there, it’s about making sure that you and your good work are *findable*.

Who knows whether a tree makes a sound when falling in the forest with no one around to hear it. But I know that great work can’t be appreciated when no one can find it.

---

# From Any Spot on the Field

By Thorsten Ball • May 17, 2024

---

A few days ago, I came across [this tweet from antirez](https://twitter.com/antirez/status/1782323210085626073), author of Redis:

> A soccer player can have a great idea of the game tactic and strategy, the sense of her/his buddies in the field of game, but anyway to be able to kick the ball well is absolutely required. It’s the same for programmers: I’m proud to be a coder.

Years ago I was talking to a younger programmer about how he wanted to grow as a programmer.

He was officially a junior, but in some ways already ahead of that title. A remarkable written communicator, for example. His commit messages were extensive, nicely formatted, describing the Why, the What, the How. He was empathetic and humble in the way he wrote, always open to the possibility that he “might be missing something here. Can you explain?” Every *i* dotted, every list bulleted.

When I asked him what his goals were, he said: have you ever seen Formula 1? There are these guys in each racing team. They sit next to the track, in these boxes, and wear headphones. They monitor the race and give directions. I want to be like them! Thinking strategically, communicating directions and ideas.

Ah, I thought, I know what he’s getting at. He wants to be a tech lead, or staff engineer.

From where I was sitting, though, it looked to me like he could still get a lot better at *coding*. At testing, at debugging, at changing complex pieces of code, at anticipating side-effects of changes he was making, at understanding his tools and languages. I also thought it was still possible and useful to get *faster*: faster at producing working code, faster at reading and understanding code, faster at fixing failing tests and reproducing bugs, faster at shipping.

I said: yes, I know that position in Formula 1. Have you ever watched soccer? There are guys like this in soccer too. Midfielders, strategists, high-level thinkers. Players like Zidane, who can read the game like barely anyone else and know exactly who will be where on the pitch and when. They are not known for their running, but for their thinking. But make no mistake: even Zidane can run for 90 minutes and kick the ball into the goal from any spot on the field. No one would care about his pitch-reading if he couldn’t score when he had to.

---

# Exploring the c4... compiler?

By Thorsten Ball • May 10, 2024

---

This week I found myself digging through the code of [c4](https://github.com/rswier/c4), an implementation of C “in four functions”, by Robert Swierczek.

I remember coming across c4 when it was released ten years ago. It got me excited: hey, C in four functions, that means it’s easy to understand right?

That excitement turned into “oh, I see” as soon as I scrolled through the code. c4 is *dense*, barely commented, and, frankly, strange. It’s unlike anything else I had come across in compiler land.

After reading through the code this week here are the other adjectives I would add to the list: clever, tricky, fascinating, cool. It’s a compiler, it’s a VM, it’s an interpreter, it’s a parser, it’s art, it’s trickshot programming.

I mean, look at this:
[![](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/94b33d1e-9dd1-4fa5-9fe7-55c9b87c504c_1802x1924.jpg)](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/94b33d1e-9dd1-4fa5-9fe7-55c9b87c504c_1802x1924.jpg)Yes, this is a screenshot. Substack doesn’t have syntax highlighting.
Let’s start at the top: it’s C in *four functions* — what? And if you open the code you’ll see that, yes, this is true, no cheating:
[![](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/9aea94b9-0e35-4b90-b261-55c8b335cc05_1032x460.jpg)](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/9aea94b9-0e35-4b90-b261-55c8b335cc05_1032x460.jpg)
And it *works!*

First you need an existing C compiler to compile c4 and then you can use c4 to run another C program.

Say I have this program:

```
// my_program.c

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    int a, b, c;

    a = 99;
    b = 20;

    c = add(a, b);

    printf("c: %d\n", c);
    return 0;
}
```

Once I compiled c4, I can run `my_program.c` with c4:

```
$ gcc -m32 -o c4 ./c4.c && ./c4 my_program.c
c: 119
exit(0) cycle = 39
```

c is 119. Correct. So how does that work? Did it compile it? Did it run it?

The README gives us a hint: c4 takes an `-s` flag. I assumed that’s to give us the assembly, but no:
[![](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/0e215c11-6c56-4071-b48b-ecebf2fb098f_1816x1936.jpg)](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/0e215c11-6c56-4071-b48b-ecebf2fb098f_1816x1936.jpg)
That’s not x86 assembly, right? I mean, some of it sounds like x86 — `LEA, ADD — `but then there’s `PSH` and `LEV` and `PRTF`. I’m pretty sure `PRTF` corresponds to our `printf` statement and `PRTF` is *not* an x86 statement.

Turns out it’s *bytecode.* This week I figured out that c4 is a bytecode compiler and virtual machine.

Here’s the high-level overview of how the four functions work, as best as I can tell:

- Function `next` is a tokenizer/lexer function that produces the next token whenever it’s called.
- Function `expr` parses expressions (by calling `next` too) and emits bytecode right away.
- Function `stmt` parses statements (calling `next` and `expr)` and is also emitting bytecode right away.
- `main` ties it altogether: it allocates memory for various structures, then kicks off the parsing that will result in bytecode being emitted, and then it sets up a “virtual machine” to run the bytecode.

Look at that virtual machine, it’s the very last code in all of `c4.c` and it’s beautiful:
[![](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/f5e9336e-73b7-47f1-91a0-e29e57ce4bdb_1800x1858.jpg)](https://archive.thorstenball.com/data/images/144463594.exploring-the-c4-compiler/f5e9336e-73b7-47f1-91a0-e29e57ce4bdb_1800x1858.jpg)
Look at how *dense* this is, look at the terse comments, how it’s formatted, how the operators are aligned, how the nasty side-effect-having stuff is all crammed together at the bottom where it belongs.

C implemented as a bytecode compiler and virtual machine, in four functions — and it’s *self-hosting*, too. Yes, c4 can run c4:

```
$ gcc -m32 -o c4 ./c4.c
$ ./c4 c4.c my_program.c
c: 119
exit(0) cycle = 39
exit(0) cycle = 59822
```

This is c4 running `c4.c` which then runs `my_program.c`. You can see that it takes 39 VM cycles to execute `my_program.c` and 59822 cycles to execute `c4.c` executing `my_program.c`.

If you just didn’t say “dude, that’s sick” out loud, I’m sorry to tell you, but you might not be alive.

What I realised this week: the self-hosting aspect is a very big part in the puzzle. Because which language is the easiest to self-host? A small language. A language that’s just small enough so you can build a compiler in it — a compiler that’s just big enough to compile the language it’s written in.

The snake has to be just long enough to be able to eat itself. If it’s not, it’s a dog chaising its tail.

Here’s an example. In order to keep the language as small as possible, there are no *structs* in c4. Yes, that very fundamental data structure — it does not exist in this self-devouring compiler/machine beast. Integers, chars, enums, pointers, functions. That’s it.

That leads to some fascinating code. Here’s a definition from the top of the file:

```
// identifier offsets (since we can't create an ident struct)
enum { Tk, Hash, Name, Class, Type, Val, HClass, HType, HVal, Idsz }; 
```

This enum is used to simulate structs when tokenizing. It’s pretty clever.

Here are the two relevant declarations at the top:

```
int *id,      // currently parsed identifier
    *sym,     // symbol table (simple list of identifiers)
```

And here’s the part of `next` that tokenizes identifiers:

```
else if ((tk >= 'a' && tk <= 'z') /*...*/)) {
   pp = p - 1;
   while ((*p >= 'a' && *p <= 'z') /* ... */)
     tk = tk * 147 + *p++;
   tk = (tk << 6) + (p - pp);
   id = sym;
   while (id[Tk]) {
     if (tk == id[Hash] && !memcmp((char *)id[Name], pp, p - pp)) {
       tk = id[Tk]; return;
     }
     id = id + Idsz;
   }
   id[Name] = (int)pp;
   id[Hash] = tk;
   tk = id[Tk] = Id;
   return;
}
```

I simplified it a bit. But the core part is there:

- `tk` is reused to become a hash of the identifier
- `id` (the “currently parsed identifier”) gets set to the start of the symbol table
- the symbol table is then traversed, checking whether there is already a symbol with the same hash in there (`tk == id[Hash]`) and the same name (`memcmp` returns 0 if the strings are the same, remember, that’s why the ! is there)
- if no match is found, `id[Name]` and `id[Hash]` get set, `tk` gets set to the current token type (`Id, identifier`), and function is done

There’s *a lot* going on, but see how the enum fields are used to simulate a struct?

`Tk, Hash, Name `— these all come from the enum. And in the enum, the values are integers according to their position in the enum. `Tk` is 0, `Hash` is 1, etc. So these offsets are used to index id, which points to the symbol table.

So `id[Hash]` points to the Hash field in the “struct”. `id = id + Idsz `advances to the next “struct” in the list by advancing the cursor by a full “struct” length.

Blew my mind.

There’s more mind-blowing stuff in these 525 lines that are c4.

`#include` statements, for example, are completely skipped. Instead c4 has its own stdlib in the form of these bytecodes we saw above:

```
else if (i == OPEN) a = open((char *)sp[1], *sp);
else if (i == READ) a = read(sp[2], (char *)sp[1], *sp);
else if (i == CLOS) a = close(*sp);
else if (i == PRTF) { t = sp + pc[1]; a = printf((char *)t[-1], t[-2], t[-3], t[-4], t[-5], t[-6]); }
else if (i == MALC) a = (int)malloc(*sp);
else if (i == MSET) a = (int)memset((char *)sp[2], sp[1], *sp);
else if (i == MCMP) a = memcmp((char *)sp[2], (char *)sp[1], *sp);
else if (i == EXIT) { printf("exit(%d) cycle = %d\n", *sp, cycle); return *sp; }
```

All the other instructions and their implementations are C at its … most C — very, very dense.

Then there’s the fact that the base type is an integer. Or that it has a debug mode. Or that the order of the token types in the enum definition also define their precedence. Or…

Isn’t it amazing what code is floating around, out there in the world, ready to reveal secrets and delight, if one takes the time to dig?

---

# My favorite teacher

By Thorsten Ball • May 4, 2024

---

My favorite teacher wasn’t a very popular guy. He was confident, had strong opinions, and didn’t exactly teach like the other teachers.

He was our history & sociology teacher in 12th and 13th grade and he made us *summarize*. He made us summarize everything. Through summaries, he taught.

As a class, we would read a page in our history books about the Ems Dispatch in 1870 and he’d ask us: what does this text say, in three sentences?

Someone would raise their hand and try to summarize what we had just read, in three sentences. Sometimes it would be three sentences, sometimes not quite, and very often our teacher would say: no, that’s not what the text says, here’s what it says.

Then he would say three very clear and grammatically flawless sentences that perfectly summarized what the text said. You couldn’t help yourself and think that, god damn, this is exactly what the text said.

We would have to summarize newspaper articles in three sentences, summarize a letter in five sentences, summarize what we just heard in a radio recording in four sentences. He made us read the newspaper every day and ask us, every week, to summarize what had happened in the previous week: why did minister so-and-so step down, in three sentences?

We would struggle to get three sentences out, fighting grammar, memory, and understanding. He’d nail it every time.

He taught us that you can summarize *anything*, in whatever length you want. He could summarize the Cold War in two sentences. A new law around unemployment benefits and social security? Four sentences. Bismarck’s forced resignation and all the political maneuvering that proceeded it? Three.

*Anything*, he taught us, can be summarized in one, two, three, four, five sentences, but you need to know what you’re talking about and think clearly. Whenever someone would fail to summarize something, he’d say: “you’re not thinking clearly.”

Summarizing *is* thinking clearly.

What do you keep in a three-sentence summary and what do you leave out in the two-sentence version?

You can’t answer that without having thought deeply through a topic. Event by event, fact by fact, you have to extract what’s essential, skipping what’s merely a detail, always paying attention to causality and other forms of relationship between events and facts.

A way of thinking is what he taught me.

Often, when I write, I start with bullet points: what are the three things that I want to say? Then I flesh out the rest.

To test my knowledge of something, I ask myself: what’s being proposed in this RFC? In two sentences. Three sentences.

Or: wait, what did we just decide in this meeting? Two sentences. What does this code do? In one sentence? Two? Three? Do I *know* this code well enough to summarize it in different lengths?

I also flip it around and test by summarizing: *can* I summarize what I just wrote in three sentences? Or, as it often turns out, can I not because there’s no real structure to it and it’s trying to say too many different things without any order at all?

This code, this file, this method - what does it *do*? What’s its job - in one sentence, two, three? Turns out I can’t go lower than eight sentences because it does eight different things - maybe it’s time to rethink the code.

It’s been nearly twenty years and I very often think of the summaries we had to do, how our teacher shook his head, said “no, that’s not what it says”, and how right he was.

---

# My Setup, April 2024

By Thorsten Ball • April 28, 2024

---

Last week I got a new monitor, after my old one has shown worse and worse signs of what looked like burn-ins.

The new monitor allowed me to get rid of two (!) cables in my setup, which pleased me quite a bit. And since there are people reading this whose eyebrows went up at the “two cables”, I thought I’d use this as an occasion to write about [my desk and computer setup](https://thorstenball.com/my-setup/) a little bit.

Here’s a photo. Feel free to print it out and keep as a reference as you read on.
[![](https://archive.thorstenball.com/data/images/144094123.my-setup-april-2024/7a16cbf4-2eac-4cd6-b310-d1137fec02f0_2016x1512.jpg)](https://archive.thorstenball.com/data/images/144094123.my-setup-april-2024/7a16cbf4-2eac-4cd6-b310-d1137fec02f0_2016x1512.jpg)
Let’s do this bottoms-up.

**Chair**: I’ve had this Steelcase Gesture for six years now and highly recommend it. I know, I know, these chairs are expensive and the IKEA Markus chair is also pretty comfortable, but believe me when I say the same thing that everyone else also says: investing in a good chair really pays off.

As for Aeron vs. Gesture: I don’t like the Aeron. I think it’s a “world population is split 50/50 on this” kind of thing. Try both, chose one.

Also worth noting: in the past few months I thought the chair would’ve given up on me, but turns out [it was my butt, not the chair](https://twitter.com/thorstenball/status/1781317912470446351) — somehow something happened in a workout that made it uncomfortable to sit on this chair for more than two hours. Changed workout program and chair’s comfortable again. Meaning: investment still pays off!

If you came here to read about cables and are now wondering how we ended up talking about my butt: sorry but not really! Wait until we get to the desk mat.

**Desk**: also a Steelcase, the height-adjustable Steelcase Ology. Bought it at the same time as the chair and have to admit that I very rarely put it up and use it in standing position. When I went through the whole working-out-made-my-butt-hurt ordeal (see previous section), I used it *a lot*, but now that everything’s fine again down under, I enjoy sitting in very unergonomic positions.

Big plus of the desk: the cable tray. Everything’s stuffed in there, including a very large power strip, power adapters and multiple chargers.

**Desk mat**: Always wanted a desk mat. Don’t know why. Seemed comfortable. Then, last year, when it got so hot in summer that I’d sweat just sitting here, with my forearms sticking to the desk (see? told you), I thought that a mat could solve this.

First I ordered a mat made out of felt. Bad move. Felt feels horrible when you constantly move your arms on it. Then, thinking that I could get rid of the mouse pad at the same time, I ordered a gaming desk mat, from Razer. It’s called: Razer Pro Glide XXL. What a name. But it’s good! And even though it’s in light grey, it doesn’t look that disgusting yet, even six months later.

**Audio interface**: this is a Focusrite Scarlett 2i2 and I’ve had it for years too. No complaints about it, does what it’s supposed to and even works under Linux nowadays without a lot of fiddling.

Few months back I mounted it under the desk. Pro: less stuff on the desk — less cables, less audio interfaces. Con: not that comfortable anymore to change volume or turn it on/off.

Last point is a bit of a pain in the butt (like the chair was, yes): whenever I switch computers, I have to turn the audio interface on again, which means I’m in a lot of calls in which people say “thorsten? can you hear me?” because they didn’t hear my “hello” because I forgot to turn the thing on again. I know that there’s a setting in the driver to permanently turn it on but last time I did that, I could see sparks flying when switching the USB-C cable to a different machine. I’ll take “can you hear me?” over sparks any day, so I keep it off.

**Microphone**: I bought the Shure Beta 87A also years ago after reading through Marco Arment’s [microphone reviews](https://marco.org/podcasting-microphones). I really don’t know enough about microphones to know how this one stacks up against a lot of others, but I do know that it sounds better than the Blue Yeti I had before.

I never really think about this microphone because it really just does its job, so: A+.

**Microphone Arm**: it’s an Elgato Wave Mic Arm LP. Quite the name and also quite new. I bought this a couple of months ago after getting fed up with the cheap-ish microphone arm that I had before. The old one started to squeak and the microphone didn’t stay in place and the arm would also cover the laptop on the side and I thought there has to be a better way. Turns out there is.

This microphone arm is amazing. Yes. It’s incredibly solid, it’s quiet, it keeps the microphone where it should, I can hide the mic *and* my headphone cable in it — should’ve bought this one sooner. Highly recommend it.

**Headphones**: these are Bose QC-45 that I’ve bought after years of using Bose QC-25.

Headphones are very important to me. I wear them for ten hours on a workday, easily. And I always, always have noise-cancelling on. I don’t listen to a lot of music anymore when working, but in a house with two small kids the barely-perceptible hum of the active noise cancelling doing its job is one of the sweeter sounds in my life.

But after years of using the QC-25 (and loving them!) it started to feel a little bit dumb to recharge the batteries every couple of days. I would constantly have batteries lying around here and the charger would always be plugged in. “Don’t they build these headphones with built-in batteries nowadays?” I thought and then bought the Bose 700.

The Bose 700 were great, but they’re too tight and after wearing them for ten hours per day, my ears would start to sweat (did *you* expect that there’d be this much sweat in this post? I didn’t) and things would become uncomfortable.

Then someone told me that the QC-45 are basically the QC-25 but rechargeable via USB-c and, bingo, that’s exactly what they are and why I love them. Very comfortable, great-sounding (to my sweaty ears) headphones.

**Mouse**: this mouse has probably the greatest of all the names in this line-up — it’s a Razer DeathAdder V2.

Yes, it’s a gaming mouse that has colored lights in it and it’s called DeathAdder. Don’t I have some self-respect? Well, I thought we answered that with No when we talked about butt pain, but listen: this mouse is amazing.

For years I’ve used Apple’s Magic Trackpad and loved it. Then I developed some pain in my right hand and went looking for a mouse. At first I used a cheap, vertical mouse that I found on Amazon and that was *okay* but it wasn’t great.

(Also: using a vertical mouse feels as cool as wearing compression socks on a long flight - sorry vertical mice users.)

Then I bought a gaming mouse from Steelseries. I can’t remember the name but I’m sure it also sounded like an Iron Maiden album. That impressed me. It felt comfortable and precise and a lot of the annoyances I’ve had with the Magic Trackpad or other mice just went away.

But then the scroll wheel broke and I bought the (I wish I could play some music here:) *Razer DeathAdder* and it changed my life. It’s so good. The *click*, man. Just that click alone makes you reconsider why you ever used a trackpad at all. Then you notice how light it is, then you notice that the cable is also very light and basically feels wireless, and then you notice that pointing at stuff on the screen and resizing things and selecting stuff is suddenly easier and, oh my god, the two buttons on the side allow you to go forward and back in the browser? I don’t know how else to put it, but after years of using only trackpads switching to a very good mouse feels like waking from a bad dream. Try it.

(I’ve convinced three other people to switch to gaming mice and they *all* say it’s life-changing.)

**Webcam**: probably one of the oldest pieces of hardware I still have. It’s a Logitech C920 HD Pro Webcam and I think it’s pretty, pretty good for how much it cost.

Yes, there are better cameras, and I’m curious to try one, but I think in webcam land there are these ~100 bucks webcams on one side, then there’s a very wide and deep valley, and then there are the professional cameras on the other side for which you pay hundreds if not thousands of bucks. I don’t know whether I want to cross that valley. I’ve heard that you have to use HDMI adapters and battery adapters and that the cameras overheat and don’t reliably work and it all sounds like a (sing it with me:) big pain in the butt. So I’m sticking with this one until someone tells me “buy this one, it’s twice as good and you don’t ever have to worry about it.”

**Lights**: the one on the left is a Elgato Key Light Air and the one on the right is an Elgato Ring Light (that name probably would’ve been enough for you to distinguish them, huh).

I first bought the Ring Light because I thought I could get away with only a single light. Quickly realized that when you have glasses and you mount a ring light right behind the camera it constantly looks like you have two small ring lights in your face. Stay away from ring lights if you have glasses.

So then I ordered the smaller Key Light Air and moved both to the sides of the desk. Now they work pretty well. I can adjust the light on my phone, or in the menu bar on macOS, or through Home Assistant.

And let me tell you something: before you worry about your webcam or camera, you should get a good light. Consistent lighting makes a huge difference.

That’s also why I bought these. I don’t have strong lights in this room, so in Zoom calls or in video recordings, the lighting and thus the quality of my webcam video was determined by what I had open on screen. If I had a blank, white page open everything would look crisp and properly lit. When I then switched to the dark terminal, quality dropped.

So I got some lights to have consistent video quality, no matter what time of day or what application I have maximized. Recommended move.

**Mug**: this is an Ember Smart Mug. A smart mug. A *smart* *mug*. Yes. I can connect to it via Bluetooth and tell it to keep my coffee at a certain temperature and the Ember app even allows you to connect to “multiple devices” and you can create an account to sync your “device settings” and I can configure the color of the light on the outside of the mug — yes, it’s all very ridiculous. But! (No, only one T in this one)

But I won it in a quiz at Sourcegraph (which is also why there’s a Sourcegraph logo on it), so no, I didn’t spend money on a smart mug, but yes, I’ve been using it every day since then and the battery is often empty and I forget to recharge it but when it’s charged and I forget to drink my coffee and get a push notification that says “Your coffee has reached perfect temperature” I feel a bit embarrassed but also happy.

So, take that for what it’s worth.

**Keyboard**: it’s Keychron Q3 with Gateron G Pro Brown switches.

It’s great, it works flawlessly, the switches sound nice, I can type up to 140wpm on it, it’s *fucking heavy*. It’s so heavy that the package arrived and the guy handed it to me I thought “what the fuck did I order?! this can’t be the keyboard.” It’s so heavy that it never, ever moves, which is great.

I don’t know what else to say here, though. I think I kinda lost my appetite for mechanical keyboards over the years. I started using a KUL ES-87 in 2015. Back then with Cherry MX Blue switches. I loved it and also convinced my colleagues to switch to mechanical keyboards (quite the sound in that office). Then I got a Topre and didn’t fall in love that much. Then, years later, I got a cheap one off of Amazon and that was also nice but started to fall apart, so now I got this Keychron Q3.

But… I also wonder whether I shouldn’t switch to the Apple Magic Keyboard again. I don’t think I’ve ever typed faster on any keyboard than on the tenkeyless Apple Magic Keyboard.

**Monitor**: this is a brand-new Dell U2723QE. It’s a 27-inch 4k monitor with a built-in USB hub and it’s really nice.

I’ve had an HP Z27 for the past 5 years and, like I wrote above, it started to break down so I went looking for a replacement.

One big requirement for me was that the monitor has a built-in USB hub, because I want to connect all the peripherals to the monitor so that I can just switch which computers is attached to the monitor and all the peripherals go along with it.

With the HP Z27 I could do that: mouse, keyboard, audio interface, and webcam were all connected to the monitor. I could then use a single USB-C cable to connect the monitor and peripherals to a MacBook, while also charging the MacBook. The desktop computer was connected to the monitor via DisplayPort and a separate USB-A-to-USB-C cable was used to connect the USB-Hub part of the monitor to the desktop computer. That means I had a small USB-C cable attached to the monitor and I could then plug either the MacBook or the desktop computer into this USB-C cable to connect one or the other.

Now, with the Dell U2723QE (DeathAdder isn’t such a bad name after all, is it?), I don’t have to change a single cable! I just have to press a button on the back of the monitor to switch between computers.

I know you’ve been waiting for it, so here’s a diagram:
[![](https://archive.thorstenball.com/data/images/144094123.my-setup-april-2024/3f77074f-21f5-4044-99a9-6805d91812de_1144x702.png)](https://archive.thorstenball.com/data/images/144094123.my-setup-april-2024/3f77074f-21f5-4044-99a9-6805d91812de_1144x702.png)How it’s all connected. (Diagram created with Monodraw, a beautiful piece of software)
Like I said: switching to that monitor allowed me to get rid of a small adapter cable and another USB-A-to-USB-C cable — isn’t that a huge payoff that makes talking about butt pain and forearm sweat worth it?

---

# Glitching on the Sea

By Thorsten Ball • April 20, 2024

---

This week, we’re back the original idea behind this newsletter – a newsletter that’s informal and “what I’d send you if you were to ask me what’s on my mind this week.”

On my mind this week: the sea.

It started last weekend when I read [William Langewiesche](https://en.wikipedia.org/wiki/William_Langewiesche)’s [“Leave No Soldier Behind”](https://www.vanityfair.com/news/2019/01/the-unsolved-mystery-of-the-soldier-who-died-in-the-watchtower). The writing was so good that it made me look up Langewiesche and go through his bibliography. In there I found out he’s written a book. It’s called the [The Outlaw Sea](https://www.goodreads.com/book/show/54426.The_Outlaw_Sea) and I immediately bought it on my Kindle. On the very same Kindle that three other unfinished books are waiting for me.

I couldn’t help it after peeking into the sample. Here’s the first paragraph on the first page:

> Since we live on land, and usually beyond sight of the sea, it is easy to forget that our world is an ocean world, and to ignore what in practice that means. Some shores perhaps can be tamed, but beyond the horizon lies the wave-maker, an anarchic expanse, the open ocean of the high seas. Under its many names, and with variations in color and mood, this single ocean spreads across three fourths of the globe. Geographically it is not the exception to our world but by far its greatest defining feature. By social measures it is important too. At a time when every last patch of land is claimed by one government or another, and when citizenship is treated as an absolute condition of human existence, it is a place that remains radically free.

If you were to divide humanity into mountain and sea people (right after describing everyone as either a cat or a dog person) I’d very much be one of the mountain folk. I don’t like beaches that much, I’ve never had a thought other than “it’s pretty flat, alright” when staring at the sea, and every time I’ve been on a boat I was disappointed like someone who saw their favorite band play live for the first time and after two hours of standing and expensive drinks realized that they prefer to watch concerts from their couch on the TV.

Describe the ocean world as an “anarchic expanse” though and you got me hooked.

But here’s the interesting bit, the thing that truly put the sea on my mind this week: while I’m reading The Outlaw Sea, The Verge publishes [this piece called The Cloud Under The Sea](https://www.theverge.com/c/24070570/internet-cables-undersea-deep-repair-ship), which starts with these two sentences:

> The internet is carried around the world by hundreds of thousands of miles of slender cables that sit at the bottom of the ocean. These fragile wires are constantly breaking – a precarious system on which everything from banks to governments to TikTok depends.

Hell yes. I haven’t read the article yet – I’m saving it for when I finished The Outlaw Sea – but even if you tried you couldn’t make me hit that bookmark button (actually: the “email to myself” buttons) faster than with these two sentences.

That opening made me immediately think of *the article* on undersea cables: Neal Stephenson’s [Mother Earth Mother Board](https://www.wired.com/1996/12/ffglass/), published in Wired magazine in 1996. It now sits behind a paywall, but it seems like [people want to share it anyway](https://efdn.notion.site/Mother-Earth-Mother-Board-WIRED-a8ff97e460bc4ac1b4a7b87f3503a55c) - and who’s to tell them they’re wrong? It’s an amazing piece of writing. It’s very long (the senior editor who edited it back in 1996 [commented](https://www.wired.com/1996/12/ffglass/?commentID=38a1884e-a8e1-4342-8697-67cfc87ef543) on it to say “a typical feature piece in a magazine is 5000 words, and a long one hits 10,000 words. This was 42,000 words.”) and very good.

Thinking about Stephenson’s article, I remembered another another fantastic Wired article, that’s also about technology and the sea: [High Tech Cowboys of the Deep Seas: The Race to Save the Cougar Ace](https://www.wired.com/2008/02/the-race-to-save-the-cougar-ace/). Also behind a paywall, but it seems like they still [have it available under a different name](https://www.wired.com/story/cowboys-of-the-deep/). I just said “remember” as if I hadn’t thought of the following two paragraph every few months for years now:

> Jolted awake in Wyoming, Habib pushes himself out of bed. His dogs cluster around him. Clearly they want to go along, but he’ll need a little more help than they can give. It’s time to mobilise the Titan A-Team.
> 
> In Seattle, it’s warm and breezy as Marty Johnson zips through the traffic in his black BMW Z3 convertible. He’s wearing shades and, although he just turned 40, he has a boyish look that suits the car. Since graduating first in his class from New York’s Webb Institute, a pre-eminent undergraduate naval architecture school, he has travelled the world with his laptop, building 3D models and helping refloat sunken things. He oversaw a system to lift a submerged F-14 from 70 metres of water near San Diego in 2004.

While I’m following the associations in my head - the sea, undersea cables, mother board, cowboys of the deep - [someone recommends](https://twitter.com/oriordankevin/status/1780189086013170146) another Langewiesche article to me: [What Really Happened to Malaysia’s Missing Airplane](https://www.theatlantic.com/magazine/archive/2019/07/mh370-malaysia-airlines/590653/), an article about flight MH370, the one that “vanished into the Indian Ocean.”

Again: the sea. Again: technology versus the sea.

That’s what Langewiesche’s book and these articles point at and what will forever fascinate me - that’s why the sea’s been on my mind this whole week.

We might feel as if we’re living in a digital world - detached from the physical one once we’re inside our houses, living more or less in an ether called the internet - but that feeling only holds as long as the physical world plays along. When it doesn’t, our world glitches - things that seem impossible, that *can’t* happen, happen.

Here’s Langewiesche on MH370 and the absurdity of a plane simply disappearing in a world that can be examined, step by step, on Google Maps:

> The idea that a sophisticated machine, with its modern instruments and redundant communications, could simply vanish seems beyond the realm of possibility. It is hard to permanently delete an email, and living off the grid is nearly unachievable even when the attempt is deliberate. A Boeing 777 is meant to be electronically accessible at all times.

And yet.

With that: happy reading!

---

# A Feat of Engineering

By Thorsten Ball • April 14, 2024

---

Whenever I talk with programmer friends about Apple I try to sneak the following story in. Usually I start with “did you know that Apple…?” and end by leaning back in the chair, my index finger pointing at the table, and me saying “… now that’s engineering.”

In 2017 Apple [released iOS 10.3](https://www.theverge.com/2017/3/27/15076244/apple-file-system-apfs-ios-10-3-features). A minor release that didn’t include any major features but something else:

> Apple is actually undertaking a pretty huge shift for all iPad and iPhone users today. Within iOS 10.3, Apple is moving supported devices to its new Apple File System (APFS).

The Verge also noted:

> Most iPhone and iPad users won’t notice a difference after today’s iOS 10.3 update

Let that sink in.

They shipped an update that migrates the file system of “all iPad and iPhone users” — already hundreds of millions in 2017 — and “user’s won’t notice a difference.”

Shipping a file system migration that users won’t even notice, over night, silently, to hundreds of millions of devices.

Automatic file system migration of hundreds of millions of devices.

I don’t know, maybe I get nervous just thinking about having to program a migration like that because my personal success rate with file system changes isn’t the greatest. Multiple times in the past I’ve accidentally destroyed Linux and Windows installations by messing something up on the CLI. But personal clumsiness aside: whenever you touch the file system you have to acknowledge there’s a very real chance you brick your machine. It doesn’t get a lot more load-bearing than the file system.

Obviously there are differences between 15-year-old me messing up an `mkfs` command and a team at Apple writing a file system migrator: for one, they know what a file system actually is, but they also wrote the new file system, have experience migrating from the old to the new one, probably test their migrator for multiple months on hundreds or thousands of testing devices, have excellent tooling for such migrations, and can lean on the experience that Apple as a company has with automatically updating iOS devices.

In other words: they’re pretty good at what they’re doing and chances that their file system migration would end up bricking devices were probably very, very slim. Near zero, possibly zero.

But, still. Take near-zero and multiply it with hundreds of millions and I ask you: would you click the button that rolls out that update? How much testing would you want to do before you press it? How many test devices? How many different configurations? I don’t know how to answer these questions with anything except “a lot”, but I do know this: more than sweat would leave my body before clicking that button.

They did click that button and the update rolled out and it migrated hundreds of millions of devices, over night, and as far as I know no device was bricked and only a few even noticed that something happened.

Now that’s engineering.

---

# From Vim to Zed

By Thorsten Ball • April 5, 2024

---

After around 20 years of using Vim, in December last year I switched to Zed as my main editor. Since some friends have asked me about the switch — “Now that you work at Zed, are you using Zed instead of Vim?” — I thought I’d write about it. You now know that I did switch, yes, so what’s left to talk about is the Why.

Before we do that, though, let me make something clear: I love Vim and Neovim. I’ve used Vim professionally, intensely, admiringly, loudly (guess that’s why people ask me whether I switched) for the last 13 years. I wrote [a blog post about getting better at Vim](https://thorstenball.com/blog/2012/07/09/vim-learning-resources/) 12 years ago and haven’t lost interest since. 5 years ago I switched to Neovim. Discovering what Neovim and its community had to offer brought me a lot of joy. I got my 10000 hours in Vim.

“Okay, we get it: you used to use Vim and you’re old” — that’s right. But I have to tell you all of this, since I [wrote about testing](https://registerspill.thorstenball.com/p/a-few-words-on-testing) before and put a paragraph with credentials in it and people *still* thought I just hadn’t written enough tests yet.

So, let me say it again, in a second paragraph: I love Vim, I know Vim, I’m very good at Vim. I can hear [Drew Neil’s accent](http://vimcasts.org/) when I close my eyes. I know who my [pope](https://github.com/tpope) is. I remember when [Derek said “Vim the Wonder Horse”](http://derekwyatt.org/vim/tutorials/). I’ve learned [Vim tricks from Gary Bernhardt](https://www.destroyallsoftware.com/screencasts/catalog). I was there [when TJ read the Vim manual](https://www.youtube.com/watch?v=rT-fbLFOCy0). I live on home row. I once spent a Christmas vacation reading through the [Best Vim Tips](https://vim.fandom.com/wiki/Best_Vim_Tips?printable=yes) back when it was a single `.txt` file on vim.org. Others leave `:w` lying around, I twitch `vapgq` when writing prose. Grown-ups I brought to tears with my use of Vim macros. It’s not clear whether it was awestruck-weeping or “just stop and do this by hand so we can move on”-weeping, but that shall not matter for this discussion.

What’s hopefully clear now is that I don’t switch editors lightly. Yet I did. Why?

Let’s start with the obvious, even though it’s more a requirement than a reason: [Zed has a Vim mode](https://zed.dev/docs/vim). Without that, I wouldn’t have switched. But what’s intriguing to me, what lured me to Zed, is that its Vim mode is composable with the rest of Zed. And Zed has a lot of things I’ve always been curious about: multi-cursors, multi-selections, undo/redo stack for selections,… In Zed, I can use them all while also using Vim motions and operators. Imagine, as I did: the powers of a Vim mode combined with multi-cursors, multi-selections? That’s what got my curiosity. (Conversely, that’s also why I find the idea of just embedding Neovim into Zed a bit boring. In my eyes, it would make Zed just another GUI wrapper.)
[![](https://archive.thorstenball.com/data/images/143301133.from-vim-to-zed/fcdaec9e-95e0-469c-a545-e757be95c950_800x577.gif)](https://archive.thorstenball.com/data/images/143301133.from-vim-to-zed/fcdaec9e-95e0-469c-a545-e757be95c950_800x577.gif)Using `cmd-d` to create multiple selections and combining it with Vim motions
Then there’s the multi-buffer. Oh, the multi-buffer. What a thing of beauty. In short: the multi-buffer allows you to view multiple excerpts from multiple buffers (files) in a single tab and (here’s the amazing part) *edit them as if they were all in the same file!* Yes! You can search for `my_dumb_typo` or find all references of a variable or find all implementations of an interface and the results all get displayed in a multi-buffer and in the multi-buffer you can *edit* all of the excerpts! It’s glorious. Vim users: imagine if you could edit the quickfix list. Emacs users: yes, you already know this and call it [Occur mode](https://www.emacswiki.org/emacs/OccurMode), thanks for tuning in.
[![](https://archive.thorstenball.com/data/images/143301133.from-vim-to-zed/f5d2cfaa-3b3e-42cf-9e19-b49368da33f0_800x577.gif)](https://archive.thorstenball.com/data/images/143301133.from-vim-to-zed/f5d2cfaa-3b3e-42cf-9e19-b49368da33f0_800x577.gif)The multi-buffer in action: I’m editing two files in the same tab.
Multi-cursor, multi-buffer, multi-selection, in combination with a Vim Mode — the powers seem endless. How could I not try that?

To linger on the practical matters before switching to the abstract: yes, I work at Zed, that’s also *a* reason for why I use it. Would I use it even if I didn’t work there? Yes, I did, *before* I joined Zed. Now I use Zed because I work on Zed, I work on Zed because I used Zed and found it very interesting. Pulling this apart into hypotheticals seems pointless. What I can tell you is that I wouldn’t work at Zed without using it — that seems hypothetically absurd to me. (Would I write this post if I didn’t work there? Yes, absolutely. Do I work there because I’m the type of guy who writes blog posts about switching editors?)

Now, as for the abstract that made me try it out and switch and makes me keep using it: the values behind Zed — the editor & the team — overlap with my own. Performance, simplicity, focus, aesthethics, love for the craft — that’s what I saw when I first used it and what resonated with me. Whether the founders would sign off on this list I’m not sure about, but does it matter? Sometimes you use software and it’s as if you’re walking past a bar, hear music coming out of it, and you immediately start to nod your hear — do you go in, or go home and listen to the same music you’ve always been listening to?

“But, Thorsten, values schmalues — what I want to know: does it support Vim macros, registers, marks, does it have jumplist? What about those rainbow parentheses?” — it supports *some* of these, will support a lot of the others, might never have 100% feature compatibility with Neovim. But, I have to admit, I don’t care that much. I need it to feel 90% Vimmy so I don’t curse, but what’s more important than getting the other 10% to me is that it’s something *new*.

I try out and sometimes even switch to new tools on a regular basis. Why? Because you’ll never know what you’ll find and very often there is something interesting to be learned, or to be adapted into your old workflow.

Here’s some examples. Until a few years ago I didn’t use any autocomplete, only Vim’s filename completion. Then I tried language servers and autocomplete and now I can’t live without it. Inlay hints — first time I saw them in VS Code, had to try it out when writing Rust, ended up writing Rust in VS Code for a few months purely because of inlay hints, then switched back to Neovim when inlay hints landed there, and now I’m convinced inlay hints are a game changer in developer tooling. This year I also ditched tmux from my regular setup, purely because I wanted to know what it’s like to use [Ghostty](https://mitchellh.com/ghostty) without tmux in the middle, to get more performance out of it. Back in 2017, I [flirted with Emacs](https://github.com/mrnugget/emacs.d) and still think of the ideas I found on a regular basis.

So there you go, I switched because Zed has a Vim mode, there’s some very intriguing text editing mechanics in it, because its values resonate with, because I wanted to try something new.

Do I still use Vim? Yes, for some config files, or when I want to edit a directory using [oil.nvim](https://github.com/stevearc/oil.nvim), but my main editor for programming is Zed. There’s a lot to learn.

---

# Noticing & Writing

By Thorsten Ball • March 30, 2024

---

I started writing this newsletter with the idea that [“once a week I set myself a timer for 60min and what I write in that time gets published”](https://registerspill.thorstenball.com/p/coming-soon). Sit down, write what’s in my head, spill the registers.

It’s now been a year since the [first post](https://registerspill.thorstenball.com/p/flipping-the-switch) and while the idea at its core — don’t overthink it, write about what’s on my mind, keep a deadline, bias to publish — is still the same, the way I go about it has changed.

After a few weeks I started to get anxious about possibly coming up empty when I would sit down on a Sunday morning to write. As a remedy to that I started to keep a note on my phone with ideas for posts. Nothing fancy, really: a single note in Apple Notes with that grandiose title “Newsletter”, that contains ideas in the form of possible titles, half-sentences, screenshots, fully-fleshed out paragraphs.

Keeping this note had effects not only on how I kept track of ideas and used them, but also on the ideas themselves.

As expected, I no longer had an empty page defiantly grinning at me on Sunday mornings. I could open my note, scroll up and down, and pick an idea that spoke to me that morning. Sometimes I’d get a new idea while reading through the collected ones and wrote about that instead. Sweet, the note worked.

Less expected: with the note always available to keep track of what I found interesting, I found *more interesting things*. Instead of only thinking about this newsletter when sitting down to write it, it now was always on my mind, since everything could potentially be a good idea to keep track of.

I started to notice more: how someone went about fixing a particularly nasty bug stood out more, conversations with friends stayed with me longer because I plucked two sentences from them and turned them over in my note, a moment in a TV show that reminded me of programming turned into multiple moments of reflection, I also realized that setting up a new computer is quite the ceremony for me.

Turns out, when you walk through life constantly wondering whether something would make for a good story, you’ll end up finding good stories. Someone told me that’s what makes gratitude journals work: by taking time each day to write down what you’re thankful for, you become more mindful of what’s good in your life.

After a year and 51 of these posts, instead of throwing stats at you and or a bulleted list of all the things I learned, here’s my most cherished realization: there’s a lot of wonder that only appears upon second glance, so keep your eyes open and try to notice.

---

# The Basics

By Thorsten Ball • March 23, 2024

---

Here’s what I consider to be the basics. I call them that not because they’re easy, but because they’re fundamental. The foundation on which your advanced skills and expertise rest. Multipliers and nullifiers, makers and breakers of everything you do.

They don’t usually show up in technical books and yet without them a lot of brilliant effort can go to waste. I constantly have to remind myself of them, sitting on my own shoulder and wagging a finger in my face.

Here they are:

Test it manually. Even if you wrote and ran automated tests, test it manually at least once before you ask for a review. Record yourself testing it manually. You’ll be surprised by what you find.

Think through the edge cases. That doesn’t mean you have to handle them all right away, but you should have an answer to them.

Keep your change free of unrelated changes.

Make sure that your PR is up-to-date against latest on your main branch.

Before you comment on something, read the whole thing.

Do the homework before the meeting. You’ll stand out.

Understand what problem you’re solving. Knowing *why* you’re doing something is a requirement to knowing whether you’re actually solving the problem.

Accept that sometimes you’ll have to do things that you don’t find interesting or exciting or that don’t bring you joy. Sometimes it’s just work.

Write bug reports that are clear and understandable. Don’t write “it doesn’t work for me.” Give the reader information on what you did, what you expected to happen, what happened. Think about what might be useful to debug this, then put it in the ticket.

Bonus points: try to find a minimal set of steps to reproduce before you open a ticket.

Read the error messages.

Read the manual, the docs, the instructions, the ticket.

Be on time.

Know why your fix is a fix.

Every time you add a test, actually test that it would fail. Yes, literally: go and comment out the code that you think makes the test pass, then run the test, see it fail, comment the code back in, run test again, see it succeed. Only then have you written a test.

Do what you said you’ll do. If for some reason you can’t, let the person assuming you’re doing something know about it.

Don’t ask for “quick” reviews when you never review other people’s code.

Always keep an eye out for bugs.

Make it a goal that people want to work with you.

---

# A Few Words on Testing

*Or: Losing Faith*

By Thorsten Ball • March 16, 2024

---

First, my credentials. More than half of all the code I wrote in my life is test code. My name is attached to [hundreds](https://interpreterbook.com/) of [pages](https://compilerbook.com/) of TDD. In my first internship as a software developer I wrote tests and did TDD while pair programming in my first week. I’ve written unit tests, integration tests, tests for exploration, tests to stop problems from reappearing, tests to leave a message, tests using testing frameworks and BDD and no framework at all, tests in Ruby, JavaScript, C, Go, Rust, Scheme, Bash. After two drinks, I’m willing to say that I know more about testing than many others. Right now — no drinks — I’m willing to say that I love testing and that writing tests has brought me a lot of joy.

Yet I can no longer say that I’m free of doubt. To stick with the theme: I’m much more sober about testing today than I was ten years ago. Recently, in the past few months, the doubts have grown.

Too many flaky tests. Too much time spent getting the tests to pass after making a tiny change that I knew was correct but the tests didn’t. Too many integration tests that made people wait 20, 30, 40 minutes until they could merge their change, only to reveal — months later — that they never tested anything. Too many times have I fixed a bug and *knew* it was fixed because I tested it manually, thoroughly, and was 100% sure that I know how the code works and that this can’t happen again, but then spent hours — 10 times longer than it took me to fix the bug — to write a test only to prove what I knew all along, that the bug is fixed.

It’s not that I was ever a capital-b Believer in tests. I never believed in testing coverage as a metric, never really cared whether someone wrote their tests first or last (although I think too few people have seriously tried TDD), came to think that most discussions around functional vs. intergration vs. whathaveyou tests are a big misunderstanding and that people who say you should never hit the database in tests should get real and probably haven’t written enough tests yet.

Still, I’ve always thought of tests as good and untested code as bad. Whenever I merged something that didn’t have a test I felt guilty, even when deep down I knew that the test might not be worth it. Tests, I thought, are a sign of quality and the better tested something is, the higher the quality of the product.

Enter [Ghostty](https://mitchellh.com/ghostty) and [Zed](https://zed.dev/).

Both are among the highest-quality software I have ever used and hacked on.

Both have less tests than I expected.

Both do have tests, of course. Ghostty has extensive tests for its core: the terminal state, the font rendering, the parser of escape and control sequences, and so on. Zed also a lot of tests for its foundational data structures — the rope, the SumTree, the editor, and so on — and tests for big features, and [very smart, very cool property tests for async code](https://www.youtube.com/watch?v=ms8zKpS_dZE).

But neither codebase has tests, for example, that take a long-ass time to run. No tests that click through the UI and screenshot and compare and hit the network. Zed’s complete testsuite takes 136 seconds to run 1052 tests in CI. Ghostty’s takes 38 seconds, including compilation. Many tests, but less than I thought.

In both codebases I’ve merged PRs without any tests and frequently see others do the same. And the world didn’t end and no one shed any tears and the products are still some of best I’ve ever used and the codebases contain some of the most elegant code I’ve ever read.

So now I’m writing this and it feels like a confession to say that I’m beginning to think that maybe there’s no correlation between software quality and tests. Maybe the tests are only a symptom. A symptom of something else that causes the quality.

Maybe the wisest thing about testing that’s ever been said and maybe the only thing that you need to know about testing — forget about the testing pyramids, and the mocks vs. stubs debates, and the dependency injectors, and the coverage numbers — is what Kent Beck said [16 years ago in an answer on Stack Exchange](https://stackoverflow.com/a/153565):

> I get paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence […]. If I don’t typically make a kind of mistake (like setting the wrong variables in a constructor), I don’t test for it.

Maybe that’s all you need. That and people who give a damn.

---

# How to Lose Control of your Shell

*An investigation.*

By Thorsten Ball • March 9, 2024

---

A few weeks ago I was hacking on language server support in Zed, trying to get Zed to detect when a given language server binary, such as `gopls`, is already present in `$PATH`. If so, it should use that instead of downloading a new binary.

The challenge: `$PATH` is often dynamically modified by tools such as `direnv`, `asdf`, `mise` and others, which allow you to set a specific `$PATH` in a given folder. (Why do these tools do that? Because it gives you the ability to, say, prepend `./my_custom_binaries` to `$PATH` when you’re in `my-cool-project`.) So we can’t just use the `$PATH` associated with the Zed process, we need the `$PATH` as it is when you `cd` into your project directory.

Easy, I thought. Just launch a `$SHELL`, `cd` into the project to trigger `direnv` and whathaveyou, run `env`, store the environment, pick out `$PATH`, find binaries in there.

And easy it was. Here’s some of the code, the part that launches `$SHELL`, `cd`s and gets the `env`:

```
fn load_shell_environment(dir: &Path) -> Result<HashMap<String, String>> {
    // Get the $SHELL
    let shell = std::env::var("SHELL")?;

    // Construct the command we want the $SHELL to execute
    let command = format!("cd {:?}; /usr/bin/env -0;", dir);

    // Launch the $SHELL as an interactive shell (so the user's rc files are used)
    // and execute `command`:
    let output = std::process::Command::new(&shell)
        .args(["-i", "-c", &command])
        .output()?;

    // [... check exit code, get stdout, turn stdout into HashMap, etc. ...]
}
```

Except for one thing: after starting a Zed instance in my terminal that executed this function, I could no longer kill Zed by hitting `Ctrl-C`.

What?

I could spam the terminal with `^C` and nothing happened. Lines and lines of desperate `^C`s that never hear their own echo.

How? Why? … What?

After saying “What?” 20 times and hitting `Ctrl-c` even more, I asked [Piotr](https://zed.dev/team#piotr-osiewicz) for help, because I wasn’t 100% confident in how Rust spawns processes and he’s a Rust wizard. What I did know was that there would have to be `fork` and `exec` syscalls somewhere inside `std::process::Command` but I wasn’t sure whether Rust doesn’t do something clever with the signal handlers or has default signal handlers setup that mess with `Ctrl-c`. Because `Ctrl-c` *should* result in an [interrupt signal being sent](https://en.wikipedia.org/wiki/Signal_(IPC)#Sending_signals) to the processes which should cause it to terminate, but clearly that stopped working.

We started to poke at all kinds of things to test all kinds of hypotheses, as outlandish as they might be.

Are we *sure* that the shell is not running anymore? Yes, we are, because `.output()` up there only returns once the command has finished running.

Is this about `cd`? Do `direnv` or `asdf` or other tools fire some hooks that take control of the terminal? No, turns out when we just run `/usr/bin/env -0;` without `cd` it also takes control over the shell.

So is it the `-0` that we pass to `env`? It shouldn’t be, clearly, because that’s just formatting. But: desperate times breed desparate debugging attempts. So we tried it and it wasn’t `-0` either.

Wait, is it `env`? Does it do something weird with my terminal? Huh.

So we changed the `command` from

```
let command = format!("/usr/bin/env;");
```

to

```
let command = format!("echo lol");
```

… and guess what? `Ctrl-c` worked again.

What?

Okay, another attempt. What if we do *both*?

```
let command = format!("/usr/bin/env; echo lol");
```

That *also* worked. WHAT!

Okay, wait a second… my gut is telling me something. `/usr/bin/env` isn’t a shell built-in, is it? But `echo` is. Is that a clue?

Let’s try this one:

```
let command = format!("ls");
```

Good old `ls`. Probably the command I’ve ran the most in my life. It’s always there when I need it and on every machine I gain access to I immediately run `ls` just to see that it works. I’d trust `ls` with my life.

And yet: after running `ls` in that subshell, `Ctrl-c` stopped working. Et tu, `ls`?

Next hypothesis: is it something in Zed? Do we setup some signal handlers? Let’s find out. We copied the function to a new, bare-bones Rust project, ran it and… it reproduced. `Ctrl-c` stopped working in that project too.

Okay, is it Rust then? I rewrote the function to Go and in Go too `Ctrl-c` lost control.

At this point we had spent nearly 2 hours on this and couldn’t figure it out. But we did have a workaround:

```
let command = format!("/usr/bin/env; exit 0;");
```

`exit` is a built-in in all the different shells, so it’s safe to run and it fixes the problem. Okay, fair enough. We slapped one hell of a comment above that line to let the next person to come along know that the `exit 0` is now load-bearing and moved on.

But this puzzle got to me. I asked [fellow shell-nerds](https://twitter.com/thorstenball/status/1760693619164393907) whether they know what’s happening but no one had an answer ready. So in my mornings I started to investigate.

I setup a [repository](https://github.com/mrnugget/strange-subshell) in which a small Rust program reproduced the problem: it spawns a shell process, waits for it to exit, then idles for 5 seconds so I can test whether `Ctrl-c` still works. The hunt was on.

The first big light bulb moment came when I realized that I don’t have to send a signal via `Ctrl-c`: I can use the `kill` command. And, alas, it’s *not* the signal handling that’s borked! When I used `kill -INT` the signal arrived and the process stopped. It’s not that my process doesn’t react to signals anymore, but rather that `Ctrl-c` doesn’t deliver the right signals after launching the shell process.

Next attempt: is the terminal stated borked after launching the shell? Okay, so something about the terminal state. [Someone in the tweet replies](https://twitter.com/hugelgupf/status/1760704715111944347) did point me to `stty`, which lets you set options on your terminal device, such as the baud rate (yes) and other things. I modified my program to run `stty -a` before and after the shell process. No luck: no changes in the output.

Desperate, I also used [Ghostty’s terminal inspector](https://mitchellh.com/writing/ghostty-devlog-005) to see whether some state changes in the terminal that results in `Ctl-c` going up in smoke. But no luck there either.

After days of going back and forth on this with ChatGPT (which I [wrote about the last time](https://registerspill.thorstenball.com/p/how-i-use-ai)) it finally gave me a clue:

> The spawned shell inherits the terminal (TTY) control, and since it’s an interactive shell (-i flag), it sets itself as the foreground process group leader for the terminal. This changes how signals, especially SIGINT generated by Ctrl-C, are handled.

Huh. Foreground process group leader. Interesting. Hmmm. Here’s what [Advanced Programming in the Unix Environment (APUE)](https://en.wikipedia.org/wiki/Advanced_Programming_in_the_Unix_Environment), which I pulled out today while writing this, says on process groups:

> A process group is a collection of one or more processes, usually associated with the same job (job control is discussed in Section 9.8), that can receive signals from the same terminal. Each process group has a unique process group ID. Process group IDs are similar to process IDs: they are positive integers and can be stored in a `pid_t` data type. The function `getpgrp` returns the process group ID of the calling process.

The important part: “that can receive signals from the same terminal.”
[![](https://archive.thorstenball.com/data/images/142448006.how-to-lose-control-of-your-shell/8fc5ecc9-b775-4eed-ad37-64d69d54a1cd_4032x3024.jpg)](https://archive.thorstenball.com/data/images/142448006.how-to-lose-control-of-your-shell/8fc5ecc9-b775-4eed-ad37-64d69d54a1cd_4032x3024.jpg)It’s been a while since I last looked up something in a physical book. Pictured: Advanced Programming in the Unix Environment. A fantastic book.
APUE has more clues:

> It is possible for a process group leader to create a process group, create processes in the group, and then terminate.

So is that what happens? The shell spawns, claims it’s the process group leader when it doesn’t run a built-in command, exits, and then doesn’t restore the previous process group leader?

It felt like I was getting closer. So I kept asking ChatGPT how to confirm this and it led me to `tcgetprg`:

> The function `tcgetpgrp()` returns the process group ID of the foreground process group on the terminal associated to `fd`, which must be the controlling terminal of the calling process.

Okay, now we’re talking, this sounds like it could lead us somewhere. I asked ChatGPT to generate me some Rust code for that `tcgetpgrp` call:

```
fn get_process_group_id(fd: i32) -> io::Result<libc::pid_t> {
    let pgid = unsafe { libc::tcgetpgrp(fd) };
    if pgid == -1 {
        Err(io::Error::last_os_error())
    } else {
        Ok(pgid)
    }
}
```

I plugged that into my program so it would print the process group ID associated with STDIN (file descriptor `0`) before and after the `$SHELL` process has run. This is what it printed:

```
process group before: 54530
shell exited with status: exit status: 0
process group after: 54571
```

Well, hello there! This certainly looks like the murder weapon. How can I confirm that it *is* what kills my `Ctrl-c` though? Is there some way I could stop the shell from taking over as process group leader? ChatGPT said that I could use the `pre_exec` hook on `std::process::Command` to put the shell process in a new, separate process session, which will put it in a new process group, which in turn means it won’t be able to become the process group leader of the group associated with STDIN. Like this:

```
let cmd = std::process::Command::new("/bin/zsh");
cmd.args(["-i", "-c", "/usr/bin/env"]);

// Set a hook that will be executed right after `fork`, but before `exec`:
unsafe {
    cmd.pre_exec(|| {
        if libc::setsid() == -1 {
            return Err(std::io::Error::last_os_error());
        }
        Ok(())
    });
}

// Run the command
let output = cmd.output().unwrap();
```

Right there, in the middle: `setsid`. That’s called right after we create a new process with `fork` but before that process is turned into `$SHELL`.

APUE on what happens when a process calls `setsid`:

> 1. The process becomes the session leader of this new session. […]
> 1. The process becomes the process group leader of a new process group. […]
> 1. The process has no controlling terminal. […] If the process had a controlling terminal before calling `setsid`, that association is broken.`

That makes sense. By calling `setsid` it would break any association the newly-spawned shell process has with the terminal and that could help me confirm whether the shell mucking with the process groups leader is the problem.

And — boom! fireworks! loud noises! a small child saying: “ta-da!” — with the `pre_exec` hook this is what the program printed:

```
process group before: 54530
shell exited with status: exit status: 0
process group after: 54530
```

And `Ctrl-C` still worked!

The foreground process group ID *is* the murder weapon. At this point it was clear *what* happens: the shell that’s spawned takes control of the terminal, by setting the foreground process group ID, which means the signal resulting from `Ctrl-C` is sent to the shell process. But if the shell runs a non-built-in command as its last command, it doesn’t clean up after itself and its process ID stays associated with the terminal, leading to all of our `Ctrl-C`s ending up in the void.

With that *What?* the next question is: why?

Why does ZSH (the shell with which this happened for me) not reset the foreground process group leader when it runs a non-built in command?

On my Linux machine I ran `strace -f` to see which syscalls my process and, more importantly, its child processes (including the spawned shell) were making. What I could figure out was this:

When `zsh` is run with `-c` and the last command in that passed command is a non-built-in, such as `ls` or `env`, then ZSH `execve`s into that last process. Meaning: it doesn’t create a child process to run `ls`. No, instead it turns itself into that command. That means at the point in time when `ls` is run in `zsh -c 'echo lol; ls'` the `zsh` process is gone and turned into `ls` and there’s no one left to reset the foreground process group leader.

But when you run `zsh -c '/usr/bin/env; echo lol'`, i.e.: first non-built-in, then built-in, then ZSH doesn’t disappear. It `forks` and `execs` `/usr/bin/env` and then executes the `echo lol` and, somewhere in there, cleans up the foreground process group leader.

Now, listen. I wish I could continue here and end with “… and *this* is why ZSH does it that way!” and someone would finally PayPal me $100 with the message “thanks for your newsletter”, but I have to disappoint you.

I don’t know how and why exactly ZSH does what it does. I cloned the repo, I compiled it, I tried to run it from source, but somehow failed and man `cmake` is a lot and also the folders have names like `Src` and `Doc` and who the hell capitalizes the first letter in a folder name and there’s also a `./configure` you have to run and then you need to make sure it doesn’t use your system library and… You see this shell investigation stuff isn’t easy and I gave up, sorry.

What I *did* [find though](https://sourcegraph.com/github.com/zsh-users/zsh@fa9b3ad5977ede0a4635cd86276dd0f0c2f6f03e/-/blob/Src/jobs.c?L3151-3169) is that ZSH does actively set the process group id for job control. And it also [remembers the original one and resets it](https://sourcegraph.com/github.com/zsh-users/zsh@fa9b3ad5977ede0a4635cd86276dd0f0c2f6f03e/-/blob/Src/jobs.c?L3213-3227). But I gave up when I saw [this part here](https://sourcegraph.com/github.com/zsh-users/zsh@fa9b3ad5977ede0a4635cd86276dd0f0c2f6f03e/-/blob/Src/exec.c?L1114-1153) that does job control stuff in ZSH and realized that I’m not getting paid for this.

I await your letters with the explanation.

---

# How I Use AI

*Protocol of a little over two days of AI*

By Thorsten Ball • March 2, 2024

---

Occasionally I come across comments that make me think “wait, there’s still developers out there who don’t use AI? Like, not at all?” Not just programmers who think that AI is overhyped, no, but programmers who don’t use AI in any shape or form: no ChatGPT, no Copilot, no Cody, no local models, nothing.

And often those comments have a subtle note to them that says “I don’t buy into the AI hype, so I’m not going to use it.” *That* is what confuses me the most. Because here I am, programming day in day out, using AI sometimes and not at other times, using it like I use Google, StackOverflow, or any other tool, and I use it while not having a strong opinion on whether AI is Unquestionably Good or Unquestionably Bad. I use it and say “thank you”, just in case.

Here’s what that looks like, on two normal working days, including my side project hacking hours in the morning.

---

**Thursday, 6:30am**, *ChatGPT4*. I can’t let go of [this shell oddity that I ran into](https://twitter.com/thorstenball/status/1760693619164393907) and have been investigating it in my spare time. I open ChatGPT and ask: `"How do I print what process group the shell process I am belongs to?"`. Not a great sentence, I’ll give you that, but good enough for 6:30am. Answer I get: pretty good. Says I can use `ps` with some special flags and `$$`.

**Thursday, 6:37am**, *Zed inline assist*. Asking it to rewrite a line I just added to a `Cargo.toml` file to enable the `process` feature flag. Did it in a second. Saved a `cmd-tab` to the browser and searching for it.

**Thursday, 6:41am**, *ChatGPT4*. `"How do I find out what the foreground job ID is of a given process group id?"` My grammar’s improving. Answer is interesting and contains a shell snippet to analyze process groups, but while reading I realize that my understanding of how process groups work might be off.

**Thursday, 6:45am**, *ChatGPT4*. I don’t understand why ZSH behaves this way. A Hail Mary attempt: I throw in [my whole Rust program](https://github.com/mrnugget/strange-subshell/blob/84623d7d61f558b269f61336645913e07dca8db4/src/main.rs) and ask ChatGPT why the problem pops up. I just need to get a pointer, anything really. (My coffee hasn’t kicked in yet. Maybe I need a second cup.) Answer repeats a lot of what I already know, because I didn’t give it the output of the program when run. Duh. But there’s 1-2 good pointers in there. Some back and forth happens. God, it’s verbose. But it gives me some Rust code I can use to debug further. The code has `unsafe` at the wrong spot, but `rust-analyzer` corrects me.

**Thursday, 6:52am**, *ChatGPT4*. Turns out the Rust code that ChatGPT4 gave me (to set a new session ID in a `pre_exec` hook for `process::Command`) actually *does* change things and moves me one step further to figuring out this thing (and to enlightenment, I feel). Can’t believe it really and say “motherfucker…” to myself (silently, in my head – kids are still asleep.)

**Thursday, 6:56am**, *ChatGPT4*. Happy about its help, I continue our conversation and casually say: “Motherfucker! That fixes it! Why?” Right after sending I consider whether that wasn’t rude and then, unexpectedly, *two* boxes with answers pop up. Did I land in swearing jail? No, turns out it’s just two alternate answers. That’s kinda neat.

Kids are awake now. School drop off, then gym, then work.

**Thursday, 10:36am**, *GPT4 via Raycast*. Asking it to translate one word from German into English, while typing a Slack message.

**Thursday, 11:35am**, *Zed inline assist*. I’m looking at a ticket in which a user reported they can’t use Zed’s `open permalink to this line` action because they’re on Bitbucket. I setup a Bitbucket account (wow do you have to fill out many textboxes — IDs, names, workspace names, IDs again) to confirm the bug and yes, we don’t support that. Should’ve looked in code earlier. Then I think “how hard could it be to add this?” Then I see the git remote URL parsing that the code does and… It’s not that it’s hard, but you have to handle git URLs, https URLs, with and without usernames, and, hey, maybe I’ve parsed too many URLs in my life. I’m this close to giving up when it hits me: “no wait, let the robots do it.” I manually (humanly!) type out the following tests to get started:

```
#[test]
fn test_parse_git_remote_url_bitbucket_https_with_username() {
    let url = "https://thorstenballzed@bitbucket.org/thorstenzed/testingrepo.git";
    // TODO: fill in the test of the test
}

#[test]
fn test_parse_git_remote_url_bitbucket_https_without_username() {
    let url = "https://bitbucket.org/thorstenzed/testingrepo.git";
    // TODO: fill in the test of the test
}

#[test]
fn test_parse_git_remote_url_bitbucket_git() {
    let url = "git@bitbucket.org:thorstenzed/testingrepo.git";
    // TODO: fill in the test of the test
}
```

Then I select the three test cases and tell Zed’s inline assist to “fix these tests.” Turns out the robots are also lazy, because what it adds is this:

```
let parsed = parse_git_remote_url(url);
assert!(parsed.is_none(), "Bitbucket is not supported, but somehow a value was returned.");
```

Fair enough. That’s one way to do TDD: `assert(it_does_not_work_yet())`.

I try again, this time with a better prompt:

```
// TODO: I want to use TDD and have tests first, before adding support for Bitbucket. Fill in the rest of the test to assert how it should work once we have Bitbucket support.
```

And voila! It works. It fills out the tests.

**Thursday, 12:04am**, *Zed inline assist*. Asking it to implement the thing for which it just wrote tests. It does generate some could-be-correct code, but it’s wrong. Not completely, but… wrong. Wrong in the “what you’re doing there is wishful thinking” sense. Implementing it myself now, which is fine now that I have the tests.

**Thursday, 12:34am**, *ChatGPT plugin in Raycast*. I’m investigating a memory issue and am feeling lazy and quickly ask “Give me a Unix command to find the longest file in a directory.” Its reply just uses `ls` and awk and right away I know that’s not what I want. I want recursion. Ugh. Okay. I go to terminal and type in `find . -name “*.rs” | xargs wc -l | sort -n`. That’s what I want.

**Thursday afternoon**: no more AI for the rest of the day. I investigate language server issues and shenanigans in Zed. Lots of reading of code. Lots of jump-to-definition. Lots of Googling and issue tracking and writing. Nothing makes me think “I could use AI for that.”

**Friday, 6:25am**, *reading again what ChatGPT4 wrote yesterday about Unix process session IDs*. Asking it a follow-up question: “So what do you think happens here? Does ZSH, when it launches a non-built in command, somehow become the process group leader and receive signals? My biggest question is: why isn’t that cleaned up after `zsh` exits? (Which it does!)” ChatGPT’s answer is surprisingly good. Except its formatting (as a lover of bulleted lists: these god damn bulleted lists).

**Friday, 6:34am**, *ChatGPT4*. Asking it how to confirm its hypothesis in previous answer. It says “use `strace`” or `dtruss` and yeah, that’s also what I thought of, but it’s 6:34 am and I’ve never really gotten `dtruss` to work on macOS with good results (`strace` on Linux is nice and easy), but it also gives me some Rust code that uses libc to query the foreground process group, using a libc call I didn’t know existed:

```
fn get_foreground_process_group(fd: i32) -> io::Result<libc::pid_t> {
    let pgid = unsafe { libc::tcgetpgrp(fd) };
    if pgid == -1 {
        Err(io::Error::last_os_error())
    } else {
        Ok(pgid)
    }
}
```

So I just learned that you can get the [“the process group ID of the foreground process group on the terminal associated to fd”](https://man7.org/linux/man-pages/man3/tcsetpgrp.3.html). That’s neat.

Now I’m thinking all that’s left to confirm the hypothesis fully (hypothesis being: ZSH doesn’t properly clean up the process group, or something goes wrong there) is to print the PID of the subprocess we’re launching.

Let’s ask GPT again.

**Friday, 6:42am**, *ChatGPT4*. Eh, the code it comes up with and how to confirm this doesn’t make a lot of sense. Process would be dead when it wants to confirm it. But it gives me enough ideas to play around a bit. Copilot (which is still on somehow, in Zed on my private machine) helps me with some `to_str` and `format!` shenanigans.

**Friday, 6:50am**, *ChatGPT4*. Double-checking and asking it: can I get at PID from Rust’s Command *after* it exited? I don’t think it’s possible. I don’t want to walk through Rust docs. Let’s try. GPT4 says “yes you can” and then shows me how to do it before it exited. Okay, I guess I could switch from `.output()` to `.spawn`. But that’s not what I wanted. Well.

Now I’m gonna ask Zed’s inline assist to rewrite the code for me.

Ah, no, a 2 yr old just walked in.

**Friday morning**: don’t use AI at all. I was hopping on some contributor PRs and changing code in tiny ways. Then paired and mostly watched Antonio write code.

**Friday, 2:43pm**, *Zed inline assist*, hacking on Zed’s git integration, asked it to turn a `&str` into a `Path`, because I’m lazy. It did it!

**Friday, 3:40pm**, *GPT4 in Zed*. Asking it in Zed (because it’s *right there*) for how to set a different git committer on the CLI, because I want to simulate a git commit from a different person. I know it’s 3-4 env vars I have to set but, yes, I’m lazy and don’t want to google and click and cookie banners and ugh. GPT4 in Zed gives me exactly what I want. 4 lines to set 4 env vars and then do a git commit, ready to be pasted into terminal. I copy, I paste, I commit.

**Saturday, 10:10am**, *ChatGPT4*. I’m writing an email I’m afraid to send. I hand the email over to GPT4 with the question: “what could I remove from this email to make it shorter?” Its answer surprisingly (painfully) points out a lot of fluff I added. Its rewrite, though, feels flat and dull. I go back to my email and manually remove some of the things it mentioned.

---

There you go. Mundane and magical. It can be both.

---

# Oh, to turn off your mind!

*In admiration of some of the best programmers I've worked with*

By Thorsten Ball • February 24, 2024

---

Some of the best programmers I’ve ever worked with — I’m thinking of five Personal Hall of Famers here — have one thing in common that I’m desperately jealous of: they have the ability to seemingly turn off their mind.

They can decide to do something and then go and… do it. No rethinking of the How and the Whether and the *Are you sure?* No second guessing. They decided to do it, so they’ll do it.

There’s no loop of these running in their head when they work on something:

*Oh, this won’t be as quick as I thought it would be, should I really do this?*

*If I do this, will I end up only ever doing things like this?*

*What if it takes longer?*

*Is this even fixable? What if this bug is just a symptom of a much larger issue, one that I’ll never be able to fix?*

*Isn’t what I’m doing considered boring? Not cool? Huh.*

*Do others think I’m doing a good job? Will they think I did a good job? Do they think they could do it better?*

They do ask themselves these things — because some of them are valid questions, even beneficial questions for an engineer to ask — but they only ask them *at will*, meaning: when it’s time to ask them, not when they’ve already comitted to something.

I’m not talking about Being In The Zone or Flow here. What I think I’m talking about is conviction, confidence, self-assurance. Whatever it is: they have it. And boy does it change things.

A lot of things have been said and written about the importance of confidence, of *the mindset*, and I’m not going to try to repeat them here, but I’ll say this: seeing someone else with equal or less experience, skills, or knowledge just go and *do something* — something that I would’ve hesitated to start or only seen through with many pauses and restarts — is humbling. Humbling but also impressive. Impressive and beautiful.

It makes me think that the ability to control one’s mind and which questions it asks at what time is the ultimate meta-skill, if not *the skill*. And it sure would be nice if it were easier to learn. Until I’ve figured that out, I’m happy these doers exists and I get to witness what they do.

---

# From 1s to 4ms

*So zero-cost abstractions exist?*

By Thorsten Ball • February 17, 2024

---

When Zed was open-sourced, someone on HackerNews [commented](https://news.ycombinator.com/item?id=39122280) that Sublime Text is faster when searching for all occurrences of the current word in a buffer. Zed takes 1s and Sublime somewhere around 200ms.

Searching all occurrences means: you position your cursor over a word, you hit `cmd-shift-l` and all occurrences of that word in the current buffer are selected and you get a cursor at each occurrence, ready to play some multi-cursor rock’n’roll.

Here, watch this:
[![](https://archive.thorstenball.com/data/images/141759238.from-1s-to-4ms/b9a8002f-5366-4ffc-9ff4-f2acb2f371b3_800x647.gif)](https://archive.thorstenball.com/data/images/141759238.from-1s-to-4ms/b9a8002f-5366-4ffc-9ff4-f2acb2f371b3_800x647.gif)
So, Sublime does this in 200ms and Zed takes 1s? Huh.

[Antonio](https://twitter.com/as__cii), one of Zed’s co-founders, immediately and confidently said “we can make this faster.” My not-yet-too-familiar-with-the-codebase mind silently asked “can we?” before we dove in. Little did my mind know.

We looked at [the code in question](https://github.com/zed-industries/zed/blob/8cc7a023906a283b91b84bd790106500497779aa/crates/editor/src/editor.rs#L6065-L6087). Here it is, in its original, takes-1s form:

```
 pub fn select_all_matches(
     &mut self,
     action: &SelectAllMatches,
     cx: &mut ViewContext<Self>
 ) -> Result<()> {
        self.push_to_selection_history();
        let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx));

        loop {
            self.select_next_match_internal(&display_map, action.replace_newest, cx)?;

            if self.select_next_state.as_ref().map(|selection_state| selection_state.done).unwrap_or(true)
            {
                break;
            }
        }

        Ok(())
    }
```

Ignore the details. What’s important is that keyword right in the middle: `loop`. The code is probably what many people would naturally do to implement a `select_all_matches` method: use the `select_next_match` in a loop until there’s no more matches to select. Voilà, all matches selected.

When looking at it with Antonio, I knew this code as well as you do right now, but he knew what’s going on under the hood. His idea: optimize it by inlining what `select_next_match_internal` does and then do it in batches.

It’s similar to how you’d optimize an N+1 query in a web application. Instead of doing something like this in your request path:

```
loop {
  user = loadNextUser()
  if user == null {
    break
  }
  profilePicture = loadUserProfilePicture(user)
  blogPosts = loadLastFiveBlogPosts(user)

  render_template("user_profile", user)
}
```

you would do this:

```
users = loadAllUsers()
pictures = loadUserProfilePicturesForUsers(users)
blogPosts = loadLastFiveBlogPostsForUsers(users)
for user in users {
  render_template("user_profile", user)
}
```

Or something like that. You get the idea.

And that’s what we did with that piece of code from above. I’m going to show you what [we ended up with](https://github.com/zed-industries/zed/pull/6700), but before you look at the code, keep in mind the following: don’t worry about the details! Just read the code like you’d read instructions for a new toothbrush: confident you don’t need know the line-by-line, but curious nonetheless (because, hey, maybe you’ve done it wrong all your life):

```
pub fn select_all_matches(
    &mut self,
    _action: &SelectAllMatches,
    cx: &mut ViewContext<Self>,
) -> Result<()> {
    self.push_to_selection_history();
    let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx));

    self.select_next_match_internal(&display_map, false, None, cx)?;
    let Some(select_next_state) = self.select_next_state.as_mut() else {
        return Ok(());
    };
    if select_next_state.done {
        return Ok(());
    }

    let mut new_selections = self.selections.all::<usize>(cx);

    let buffer = &display_map.buffer_snapshot;
    let query_matches = select_next_state
        .query
        .stream_find_iter(buffer.bytes_in_range(0..buffer.len()));

    for query_match in query_matches {
        let query_match = query_match.unwrap(); // can only fail due to I/O
        let offset_range = query_match.start()..query_match.end();
        let display_range = offset_range.start.to_display_point(&display_map)
            ..offset_range.end.to_display_point(&display_map);

        if !select_next_state.wordwise
            || (!movement::is_inside_word(&display_map, display_range.start)
                && !movement::is_inside_word(&display_map, display_range.end))
            {
                self.selections.change_with(cx, |selections| {
                    new_selections.push(Selection {
                        id: selections.new_selection_id(),
                        start: offset_range.start,
                        end: offset_range.end,
                        reversed: false,
                        goal: SelectionGoal::None,
                    });
                });
            }
    }

    new_selections.sort_by_key(|selection| selection.start);
    let mut ix = 0;
    while ix + 1 < new_selections.len() {
        let current_selection = &new_selections[ix];
        let next_selection = &new_selections[ix + 1];
        if current_selection.range().overlaps(&next_selection.range()) {
            if current_selection.id < next_selection.id {
                new_selections.remove(ix + 1);
            } else {
                new_selections.remove(ix);
            }
        } else {
            ix += 1;
        }
    }

    select_next_state.done = true;
    self.unfold_ranges(
        new_selections.iter().map(|selection| selection.range()),
        false, false, cx,
    );
    self.change_selections(Some(Autoscroll::fit()), cx, |selections| {
        selections.select(new_selections)
    });

    Ok(())
}
```

70 lines of code on an empty stomach without syntax highlighting — I’m sorry. But even if you’ve never seen code that’s similar to this bit here, I’m pretty sure you understood what’s happening:

1. Check whether we even have a next selection, return if not.
1. Get all current selections in the buffer (`let mut new_selections = …`)
1. Find all matches in the current buffer (`select_next_state.query.stream_find_iter`)
1. For each match: add it to `new_selections`, modulo some word-boundary checks.
1. Sort the selections and remove overlapping ones.
1. Unfold code that contains selections.
1. Change the selections in the editor to the ones we just constructed (`self.change_selections`), which causes them to be rendered.

Except for that `while`-loop in the middle that does some wicked `plus-1`-ing (that I surely would’ve messed up but Antonio didn’t) — it’s pretty high-level, right?

It doesn’t even look optimized. There’s none of the scars that optimized code usually wears: no secondary data structures to save another loop, no falling-down to raw pointers carnage, no SIMD, no fancy data structures introduced. None of that.

Here’s the thing, though. Here’s why I’m showing you this and why I’ve thought about this code for the last three weeks.

When we ran the optimized code for the first time the runtime went from 1s *down to 4ms*. 4 milliseconds!

I couldn’t believe it. 4ms! With code that’s still this high-level! With the `unfold_ranges` call, with finding all the matches, with checking word boundaries, with extending and sorting and possibly dropping and rendering selections — 4ms!

If you’re reading this and shrugging it off with “so what, 4ms is an eternity for computers” then yes, you’re right, 4ms *is* an eternity for computers, yes, I agree, *but* based on that reaction I bet that you didn’t grew up like I did as a programmer. See, I grew up building websites, web applications, backends, that kind of stuff and in that world basically *nothing* takes 4ms. If it takes me 10ms to ping the closest data center in Frankfurt, how can I deliver something to you over the wire in less than that?

So there I was, staring at the 4ms and wondering: is this what the Rust enthusiasts mean when they say zero-cost abstractions? Yes, we’ve all heard that claim before (and yes: maybe too many times) and I’ve also written Rust for years now, so the idea that Rust is fast wasn’t new to me.

But seeing high-level code like this find [2351 occurrences of](https://github.com/zed-industries/zed/issues/6440)`<span`[in a 5184 lines XML file that contains the collected poetry of Edgar Allan Poe](https://github.com/zed-industries/zed/issues/6440) *in 4ms*?

I don’t know, man. I think it might have changed me.

---

# The Lightness of Unscheduled Calls

By Thorsten Ball • February 11, 2024

---

In my first week at [Zed](https://zed.dev) it took until the third day for someone to hop on a video call with me. The second video call happened in the week after that. Since then — I’ve just completed four weeks — I’ve only had two other video calls, both of which were [interview](https://zed.dev/blog/why-the-big-rewrite) recordings.

And yet: I did talk to many people. Everybody on the team, in fact. On my first day, on my second day, and every day since then. Multiple times a day, often for hours. But these conversation didn’t happen on Zoom, or Google Meet — they took place in Zed itself.

Zed [allows multiple people to work on the same project at the same time](https://zed.dev/blog/channels). You can see each others’ cursors, modify the same code at the same time, share your screens, and, yes, talk to each other. It’s how Zed engineers collaborate with each other: working on Zed, in Zed.

The technology behind this is very interesting ([CRDTs](https://zed.dev/blog/crdts), baby!), but what I keep thinking about for the past four weeks is how different, *how game-changing?*, this approach to collaboration is.

My current theory is that this is not due to the technology (although: fuck yes, CRDTs, baby!), or at least not mainly, but rather due to the culture surrounding it and *how* the technology is used to collaborate.

In my first week I asked three, four people for their top-3 recommendations for a newcomer. What showed up in every answer: pairing. “Pair, pair, pair”, someone said, “pairing is how knowledge is transferred here; it’s how people work. So if there’s one thing I’d recommend it’s to pair often, to ask people to pair and pull them in.”

That’s exactly what I did. Or rather: *what happened to me*.

On a typical day at Zed, you might reach out to someone on Slack with a question and they’d reply with “wanna pair on it?”, suggest a Zed channel, hop on the channel and then work with you for a couple hours.

Or while you’re hanging out with someone on a channel, someone else just joins, *ding dong*, says “morning!”, starts listening to what the two of you working on, then starts suggesting changes, proposing ideas, helping out. Sometimes a fourth person joins and says “Hey so-and-so, I’ve been meaning to talk to you about X, can we do that now?” and So-and-so says “Sure, let me just finish up here, then we can hop on a channel” and then they go in a different channel and it’s just two of you left and you continue working on whatever you were working on.
[![Image](https://archive.thorstenball.com/data/images/141568461.the-lightness-of-unscheduled-calls/dd836be6-f83c-4016-abc2-db571747e5b7_4096x2296.jpg)](https://archive.thorstenball.com/data/images/141568461.the-lightness-of-unscheduled-calls/dd836be6-f83c-4016-abc2-db571747e5b7_4096x2296.jpg)Day at the office: pairing with Antonio (who’s sharing his screen) on performance. You can see two other pairs working in other channels.
Crucially, I think, there are no calendar invites behind this, no elaborate scheduling. I’ve had — guessing here — three? four? pre-scheduled pairing sessions. Ad-hoc sessions? I’d say 25. In 20 working days.

Everything feels so *light*, so easy, so open when you don’t have to schedule collaboration in divisible-by-15-minutes chunks on calendars; when your afternoon isn’t shot-gunned by 3 different calls with 3 different people, with 30min breaks in-between; when you can spontaneously talk to someone, not knowing whether you’ll end the call in 5 or 55 or 105 minutes; when you’re not talking to someone for the remaining 8 minutes in the scheduled 30min call even though there’s nothing left to say.
[![](https://archive.thorstenball.com/data/images/141568461.the-lightness-of-unscheduled-calls/c4290479-c270-41bd-b3f7-9987d111f869_1742x1264.png)](https://archive.thorstenball.com/data/images/141568461.the-lightness-of-unscheduled-calls/c4290479-c270-41bd-b3f7-9987d111f869_1742x1264.png)My calendar for next week. That appointment on Friday evening is a private one. I only have one work meeting scheduled.
With an empty calendar and people willing to hop on calls, with the barrier to collaboration so low, with no hair to get in place for a webcam, somehow anything feels possible. Instead of full of meetings, every day feels full of possibilities.

Of course, *of course*, you can do that with whatever technology want: Zoom doesn’t make you chit-chat until the full hour, Google Calendar doesn’t require an entry before you talk to someone. I mean, fuck, I guess you could even close Slack and call someone on their phone if you wanted to.

But at the same time we all know that technologies can nudge your culture in one direction.

And in a remote company, with people in multiple timezones, with Slack and Google and Zoom and GitHub and What-have-you, it’s very easy to get sucked in, *sucked down* by these tools and their defaults, and to drown in your calendar and it’s very easy to forget that you can — even virtually — just walk up to someone and ask them about something and walk away again, or walk to someone else, or stay a little while longer. And if you and your colleagues are living in different timezones there’s no way around at least acknowledging asynchronous working – it’s a necessity and can be nice – but we all also know that it can suck and working with someone on something for four hours, while talking to them and throwing ideas around and shooting the shit — that’s pretty great. And I guess what I’m telling you is that I’ve made it back up to the surface and the air smells great and you should come up here and try it: clear the calendar, walk up to someone’s virtual desk, say “wanna pair on that?”, pull up a chair and work together.

---

# Education of a Typing Man

By Thorsten Ball • February 4, 2024

---

When we were 16 years old my friend and I spray-painted our keyboards in camouflage colors. We had just seen *Hackers*, wanted to copy [what we saw](https://www.youtube.com/watch?v=vsdTHzqam6U), and – yes, 16 years old – didn’t think much further than (1) get spray paint (2) spray-paint the keyboard. Only after the paint dried did we realise we can’t read the letters on the keys anymore and, well, guess we’ll have to now type blind.

Up until then I had been typing with two to five fingers and was reasonably fast, but I still had to peek at the keyboard when typing numbers or special characters. Now, with a camouflaged keyboard, I not only was able to type undetected in the woods should such a need arise but also learned to type without a lot of looking down. Well, mostly. Sometimes I still had to tilt my head and squint and try to make out a letter beneath the camouflage. The spray paint also slowly came off, but not on the upper rows, where I needed the letters on the keys the most.
[![](https://archive.thorstenball.com/data/images/141357656.education-of-a-typing-man/9f83f7d3-4442-4453-a29a-53c629c83e27_320x240.jpg)](https://archive.thorstenball.com/data/images/141357656.education-of-a-typing-man/9f83f7d3-4442-4453-a29a-53c629c83e27_320x240.jpg)Webcam photo from 2004: my camouflaged keyboard. (Yes, the desk was also spray-painted. Yes, it wasn’t the best paint of both jobs.)
For the next eight years that’s how I typed and it was actually pretty fast. I’m pretty sure I could reach 100 words per minute, sometimes more. Then, two things happened.

First: I used a MacBook for the first time. My wife’s – back then my girlfriend – all-white MacBook from maybe 2008, or 2009. Beautiful computer (I’ll never forget the “breathing” LED when it slept.) I was very confused by the location of the `ctrl` and `alt` (wait, `option`?!) keys. Not only because I hadn’t grasped yet that everything revolves around `cmd` instead of `ctrl` on a Mac, but also because on a German keyboard layout you have to use `alt` and `shift` and `alt gr` (nowhere to be seen on the MacBook layout) quite a lot.

On a MacBook keyboard things seemed even harder. Here, tell me how to type `{}/\@` on this:
[![](https://archive.thorstenball.com/data/images/141357656.education-of-a-typing-man/3fff0c55-ec6f-4e0d-bae9-6625ff46add6_3275x1317.png)](https://archive.thorstenball.com/data/images/141357656.education-of-a-typing-man/3fff0c55-ec6f-4e0d-bae9-6625ff46add6_3275x1317.png)
Exactly.

I can’t remember whether I tweeted it out or whether I mentioned it in conversation, but [Robin](https://coding-robin.de/) told me that most programmers use an English layout on their MacBooks. Wait, what? I couldn’t believe it, never hard of such a thing. An English layout? How would you type umlauts? How do you type Motörhead or Käsenüdelchen or “heute trinken wir Maß”? So many questions and so much fascination: using a special keyboard layout because you’re a programmer? I had to look into this.

When I then used an US English layout for the first time I had one of those moments in which I saw it all laid out before me: why the world is the way it is and how it became that way. A lightbulb moment and in its afterglow I put all the pieces together: so *this* is why it’s `http://` or why email addresses have an `@` in them or why it’s `C:/Programs` or the `~` for the home directory or why there are so many curly braces in programming languages – *because it’s easy to type on a US English layout!*

On a US English layout a `{` is a `shift-[` and not a `opt-8`, a `@` is a `shift-2` and not a `opt-l`, a backtick is right there, and a `\` is not a pain in the hand to type. And turns out that umlauts are easy too on a Mac, [you can just use the option key.](https://support.apple.com/guide/mac-help/enter-characters-with-accent-marks-on-mac-mh27474/mac)

Not a year later I bought my first MacBook – a 2011 MacBook Air, great machine – and ordered it with a US English layout.

The second thing that changed my two-to-five finger typing was an avalanche of small things that lead me to re-learn typing completely.

First small thing: Robin and I were working in a coworking space and a guy sitting next to us said “have you ever realised you only type with 2 fingers on one hand and 3 on the other?” Huh, I guess I did, but I never felt this weird about it.

Then I got [really into Vim](https://thorstenball.com/blog/2012/07/09/vim-learning-resources/), even started using [vim-hardmode](https://github.com/dusans/vim-hardmode), and wanted to get really good at it. I also watched a lot of [Destroy All Software](https://www.destroyallsoftware.com/screencasts/catalog) in which Gary Bernhardt types really fast, with high accuracy.

It wasn’t that I wasn’t fast typing the way I did, but the lack of accuracy frustrated me. Every time I had to type a lot of special characters things went off the rails. Not great when you want to get really fast at using Vim and writing code.

Time to learn to type properly. 10 fingers, no peeking, correct technique for all characters. Cue the training montage music.

First I bought [Keys.app](https://apps.apple.com/de/app/keys/id526394170?l=en-GB&mt=12) and started practing with it every morning before work. 30min every day. Just mindlessly typing what the app told me to type. Wax on, wax off. Shift left, shift right. At work I still sometimes fell back to my old system, but less and less as the weeks went by.

Then – this is the part in the training montage where the sax or guitar solo starts – I started using [typing.io](https://typing.io) to really practice writing code using all 10 fingers. Yes, I actually sat down every day and typed out parts of the Linux kernel or Redis, just to practice typing.

Big finale of the montage (sax/guitar are still soloing in background, but whole band came back in): I started using [10fastfingers](https://10fastfingers.com/) to get the speed up. I did this all day long – in the mornings before work, while at work and waiting for tests to run, in the evening to relax.

The end result of all that – unchanged for the last 10 years – is that I can now touch-type pretty much perfectly (yes, I alternate hands when using the `shift` key, depending on which other key needs to be hit), don’t have accuracy problems with special characters anymore, and easily reach 130 WPM right after waking up – should the need arise.

---

# 63 Unpopular Opinions

*On pineapple, tests, opinions & taste, and other things*

By Thorsten Ball • January 28, 2024

---

Years ago, as a guest on a podcast, I was asked: “what’s an unpopular opinion you have?” I don’t remember what my reply was, but I distinctly remember how much I struggled to come up with an answer: running through my mind in a panic, looking into every last corner of memory, shouting to myself “come on, let’s go! where are they?! the unpopular opinions! you have them! let’s go, let’s hear ’em! you like pineapple on pizza, what else? come on!”

Ever since then, whenever the term unpopular opinion was mentioned: panic. But then, six months ago, I told myself that *this is it*. You want unpopular opinions? Oh you get unpopular opinions. I created a note called “Unpopular Opinions” on my phone and added a line every time something popped into my head that might fit.

What follows is a a dump of thoughts, of unpopular opinions, that only makes sense as a dump. (A [fish stew](https://youtu.be/kxN_qPuefrM?t=15).) Take the dump apart and it’s throwaway thoughts. Don’t take them too seriously. Except the ones I hid in there on purpose.

1. Building a great business is not the same as building great software and vice versa.
1. People *still* underestimate how much Google has been cargo-culted. Especially when it comes to management.
1. Wireless is a scam, except headphones on the go.
1. Two-factor authentication is dumb. It frustrates me every time I have to pull out my phone *after* having pasted a 32 random-character password from my password manager.
1. There should be such a thing as a walker’s license and its possession should be a requirement for entering airports and train stations. Some people can’t walk.
1. “Correctness”, “type systems”, “memory safety” – they don’t matter as much as you think they do. Worlds have been built on “unsafe” & not-proven-correct – don’t mistake optimizations for requirements.
1. Not every company is for everybody.
1. As a lover of tests and TDD, by now I have to admit: I don’t think there’s a correlation between how many tests a codebase has and the quality of the product.
1. If you take an exit on highway, only start slowing down once you’re on the exit lane.
1. When people say “use whatever works for you” they set the bar for “works” much too low. Sometimes you have to spend more than one day on something to get something to work for you and that’s okay.
1. Related: we do junior engineers a disservice by saying “just use whatever works for you.”
1. Educators underestimate how important “coolness” is in learning resources.
1. Programmers must switch ecosystems at least once or twice in their career to gain truly “senior” experience. We’d all be better off if every JavaScript developer would work with Go for a year and then come back, every TypeScript developer with Ruby, every Ruby developer with Rust, and so on.
1. “I already had pizza yesterday” is an invalid argument. You can always have pizza.
1. People should switch companies – not every 2 years but probably more than once in 10 years. Every switch gives you a new perspective on everything that came before and everything that will come.
1. “Feedback is a gift” as a blanket statement should be used less. There’s a ton of nonsensical feedback that’s not actionable, given by people who have no clue. Actionable feedback *is* a gift.
1. Opinions are overrated. Taste is underrated.
1. Don’t be the person who says “I have strong opinions” because I promise you: everybody rolls their eyes when you say it. Be the “I build things” person instead.
1. A lot of discourse around programming languages and tooling and frameworks boils down to “you can’t do it like this.” Then someone goes and does it. “You can’t climb up the mountain in your jeans and without oxygen, you can’t” and then someone goes and does it and *it’s fine*. See Go, see JavaScript.
1. People who hoard tabs are doing it wrong.
1. People who can grow sideburns (not me) should do so.
1. If you have to insert “NOTE”, “SIDENOTE”, “BACKGROUND INFO”, “DETAILS” and other boxes into all of you writing – your writing’s not good. It’s equal to giving a speech and saying every two minutes “but also, let me talk about something else real quick.”
1. To hell with self-consistency.
1. Data-driven decision making can and should be applied to certain situations but not to the majority of all decisions.
1. A lot of time and money was wasted in order to add dark modes to software.
1. Those frayed ends on charging cables? That’s not a bad cable, that’s a bad user who doesn’t respect cables and doesn’t know how to use them. I never had a charging cable break on me – I respect cables.
1. Don’t use the `<quote>` style to highlight or emphasize something in your writing, only use it for quotes.
1. Also: [pull quotes](https://en.wikipedia.org/wiki/Pull_quote) on page 5 of a website don’t make sense. Whose eyes are you trying to catch? The eyes of the person walking past the magazine stand on which your article is presented on a iPad and scrolled-down 5 pages? Come on.
1. The ability to form opinions through consumption of media is overrated. Have you ever given an interview that took an hour to record but was then printed as 5 paragraphs? You get it. Do you read a single biography and think you *know* a person? So how well do you think you *know* something after reading two articles and eight tweets about it?
1. Cookie banners are [dumb](https://twitter.com/thorstenball/status/1724391384356954370).
1. Don’t hand over the responsibility of your education to a company or an institution.
1. Engineers put too many graphs on their dashboards. Most of them are useless. 5 graphs is enough for everything. A dashboard should tell you something at a glance, not require a manual.
1. There’s a lot of time in a day. “I don’t have the time” just means that you value other things higher. Try not watching TV shows for a week or playing video games or scrolling on your phone.
1. Paper isn’t “simply better.” Writing with pen on paper is strictly worse than typing on a computer. (I await your angry letters.)
1. Very often there’s no secret, no trick, no special thing: all one has to do is to do it.
1. There are programmers who are *a lot* – maybe ten times as much – better than other programmers.
1. Outsourcing mental tasks to computers is good, even if the mental capacity to do these tasks might shrink. It *is* a bicycle for the mind – why walk?
1. Backlogs and TODOs: if there’s something in there you can’t check off in next 3 months, just delete it.
1. There are a lot of very talented, very knowledgeable, very intelligent people that just don’t know how to work. Sadly, they often think they’re misunderstood.
1. Not to go all Hegelian on you, but: most people underestimate how much the world oscillates between Good and Bad and that you can’t have only one side without the other.
1. I had always assumed that once you get over X followers, that’s when you get the idiots in the replies. I thought it would happen at 1000, then at 5k, 10k, 15k. So far everyone’s friendly. Now I think a lot of people who attract trolls in their replies don’t know [how to write on the internet](https://jvns.ca/blog/2023/08/07/tactics-for-writing-in-public/).
1. Wine isn’t fancier than beer. And IPAs aren’t good.
1. You can’t just optimize your life, you need to optimize it *for* something.
1. Whether people enjoy working with you trumps the skills & knowledge you might have — rightfully so. But without skills & knowledge that is worthless too. You need both: skills & knowledge *and* people to enjoy working with you.
1. You can’t convince others of something by telling them they’re idiots. Watch how often people try to do it anyway.
1. Don’t self-censor yourself with asteriks – don’t write “f***”. It’s ridiculous. Who are you doing it for? Is a kid reading your tweets, thinking ”huh wonder what those** **mean?” Everybody who reads it knows what word you’re referring to. Get over yourself.
1. There’s few things as unfit for a purpose as social media is to discussing politics.
1. Most outrage on the internet blows over after weeks or months. There’s few things to be learned and few things changed by participating and pouring more oil on a fire.
1. Engineers put too much value on their ability to spot flaws in ideas. It’s only worth something in certain situations.
1. Many Big Company engineers and managers would be absolutely worthless in a startup.
1. I don’t think Hacker News and its comment sections are as bad as people say they are. I like HN and have found many, many interesting software, programmers, companies, and stories through its links and comments.
1. Comfortableness has been overrated in the pursuit of “work/life balance.”
1. A lot of people who say they are for the Right Things and describe themselves as “kind” and “empathetic” and say things like “as leaders, we must […]” behave like assholes online and I wouldn’t want to work with them.
1. Reading fiction can be as “useful” as reading non-fiction. Understanding is more than a collection of facts and truths. Reading fiction is the best way (besides the actual, literal way) to walk in someone’s shoes.
1. Everybody would be well-served by knowing more about the history of the field one is in, or — god forbid — the field one comments online about.
1. Being a pessismist is easier than being an optimist. I feel better when I try to do the harder one.
1. Taking something seriously & joking about it aren’t mutually exclusive.
1. You don’t have to have a clear line between work & life.
1. It’s absolutely fine to stand in line when boarding a plane. It’s nice to stretch your legs before sitting for hours & it’s nice getting space in the overhead bin without having to squeeze yourself back and forth through the plane in order to find a spot to put your babckpack.
1. Yes, you *can* drink that coffee. Get over yourself. You don’t have to have the best version of everything every time.
1. You can’t trust movie or tv show recommendations online by someone if you don’t know what else they liked or didn’t.
1. Organizing programming communities around languages might not be the best way to do it.
1. Pineapples on pizza is good. Pizza Hawaii is a fantastic name.

There you go. Now I need to create the “Fun facts about myself” note.

---

# Which command did you run 1731 days ago?

*Let's talk about shell history.*

By Thorsten Ball • January 21, 2024

---

> *Professor Henry Jones*: Well, he who finds the Grail must face the final challenge.
> 
> *Indiana Jones*: What final challenge?
> 
> *Professor Henry Jones*: Three devices of such lethal cunning.
> 
> *Indiana Jones*: Booby traps?
> 
> *Professor Henry Jones*: Oh, yes. But I found the clues that will safely take us through them in the Chronicles of St. Anselm.
> 
> *Indiana Jones*: [pleased] Well, what are they?
> 
> [short pause as Henry tries to recall]
> 
> *Indiana Jones*: Can’t you remember?
> 
> *Professor Henry Jones*: I wrote them down in my diary so that I wouldn’t *have* to remember.

                *******

Recipe for living a good life in the shell:

1. Make sure it’s fast.
1. Make sure its history can grow nearly infinitely and you can fuzzy-search through it.

The first one–fast shells–[we talked about last week](https://registerspill.thorstenball.com/p/how-fast-is-your-shell), so this time, let’s talk about shell history.

On one of my machines the `~/.zsh_history` file contains 26278 commands. Its oldest entry was recorded on April 25, 2019. When I hit `Ctrl-r` in ZSH [fzf](https://github.com/junegunn/fzf) pops up and lets me fuzzy-search through all 26278 commands, through the last 5 years of my shell history. It’s glorious.
[![](https://archive.thorstenball.com/data/images/140884708.which-command-did-you-run-1731-days/01532c09-5727-4ac5-8536-e20522bb90d4_800x518.gif)](https://archive.thorstenball.com/data/images/140884708.which-command-did-you-run-1731-days/01532c09-5727-4ac5-8536-e20522bb90d4_800x518.gif)
That one `curl` command with these four strange HTTP headers that I had to send to make sure I could talk to my local dev env correctly through the reverse-proxy – that’s in there, a few keystrokes and some hazy memories away. That one `rsync` that uses the correct SSH client binary on the other side and that preserves timestamps and permission – also in there. The ugly bastard of a command that combined `git grep` with `find` and 8 ugly incantations of AWK chained together – locked in there too. The test command I ran yesterday is as reachable as the one command with 12 `&&` in it that I ran 3 years ago, all thanks to a long shell history file.

Truly: `~/.zsh_history` is one of the most important files on my machine. I make use of it tens of times every day, whenever I hit `Ctrl-r`. If I wasn’t such a doofus it would contain even more than 26278 commands, because I’ve been keeping a long shell history for nearly a decade. But since I *am* such a doofus, I forgot to back it up (or deleted the backup too early) a few times and hence the `~/.zsh_history` on the machine I’m typing this only contains 1034 commands.

Someone might say: “well, if the command was that important, why don’t you save it to a script?” And to that I say: look, man, if I knew in advance which command would turn out to be important, then we wouldn’t be here, because I’d already have ascended to the astral realm.

Also: why *would* I record it in a script if I can just configure my shell to keep track of all of those commands for me? It’s cheap, it’s fast, there’s essentially no downsides to it: the largest `~/.zsh_history` I have is 2MB and I can fuzzy-search through it in *milliseconds*.

                *******

So, to repeat: your shell – ZSH, Bash, Fish, or others – can record every command you execute in it and I’m begging you to make sure it is configured to do that.

Make sure it keeps track of *a lot* of commands. So many commands that when you put the number in your rc-file you think: that’s ridiculous, why would I need to record that many commands? Double that number. As the next and final step you need to get a fuzzy-finder fuzzy-finder to search through it.

Here’s [the ZSH configuration](https://github.com/mrnugget/dotfiles/blob/2bdf21b659cbf34f21a0716bfac1f90914426a87/zshrc#L18-L35) I used for many, many years:

```
##########
# HISTORY
##########

HISTFILE=$HOME/.zsh_history
HISTSIZE=50000
SAVEHIST=50000

# Immediately append to history file:
setopt INC_APPEND_HISTORY

# Record timestamp in history:
setopt EXTENDED_HISTORY

# Expire duplicate entries first when trimming history:
setopt HIST_EXPIRE_DUPS_FIRST

# Dont record an entry that was just recorded again:
setopt HIST_IGNORE_DUPS

# Delete old recorded entry if new entry is a duplicate:
setopt HIST_IGNORE_ALL_DUPS

# Do not display a line previously found:
setopt HIST_FIND_NO_DUPS

# Dont record an entry starting with a space:
setopt HIST_IGNORE_SPACE

# Dont write duplicate entries in the history file:
setopt HIST_SAVE_NO_DUPS

# Share history between all sessions:
setopt SHARE_HISTORY

# Execute commands using history (e.g.: using !$) immediatel:
unsetopt HIST_VERIFY

```

That was combined with [fzf](https://github.com/junegunn/fzf) to fuzzy-search through the history on `ctrl-r`.

Configure your shell roughly like that and there you are: living the good shell life.

Or you can use [Atuin](https://github.com/atuinsh/atuin), which I’ve been trying out for the last few weeks and have come to love. It’s a drop-in enhancement of your shell’s history functionality and not only gives you everything I described above – incredibly long shell history and fuzzy-search through it – but also syncing and backup (yup, need that) of shell history across multiple machines, filtering commands by machine, working-directory-specific history and probably 13 other things I forgot. It’s *very* nice. Highly recommend it.

Whatever you use: make sure your shell history is recorded, make sure your shell history can grow ridiculously long, and get a fuzzy-search for it.

---

# How fast is your shell?

*Does it start in less than a second?*

By Thorsten Ball • January 14, 2024

---

What if I told you that someone hid some weights in your shoes?

Not massive weights that would make your shoes unliftable, but many tiny lead balls, hidden everywhere. Just enough lead balls so you can still walk, but the shoes feel heavier and walking feels harder today and, oh wow, I’m tired, this short walk really knocked it out of me.

You’d probably look at me and say “hey man what’s your problem” and then you’d go “what weights?” and then I’d show you and you’d look at me and go “who did this? you? what’s wrong with you?” and then you’d take the weights out and you’d put on your shoes and cautiously take a few steps and look at me with big eyes and then walk and then skip and then run and then you’d say “it was the weights! I’m not out of shape!” and, hell, maybe you’d do one of those jumps and click your heels together in the air.

`                            `***** **`  `

Alright. Open your terminal and type in the following:

```
# If you're a ZSH user:
time zsh -i -c exit

# Bash user:
time bash -i -c exit

# Fish user:
time fish -i -c exit
```

Run this command, say, 5 times. How fast does your shell start up? (I’m seriously interested – leave a comment or reply to this email.)

This is what I get:

```
$ time zsh -i -c exit
zsh -i -c exit  0.03s user 0.02s system 89% cpu 0.062 total
$ time zsh -i -c exit
zsh -i -c exit  0.04s user 0.03s system 88% cpu 0.072 total
$ time zsh -i -c exit
zsh -i -c exit  0.03s user 0.03s system 88% cpu 0.070 total
$ time zsh -i -c exit
zsh -i -c exit  0.04s user 0.03s system 87% cpu 0.072 total
$ time zsh -i -c exit
zsh -i -c exit  0.04s user 0.03s system 88% cpu 0.070 total
```

That means spawning a new shell takes ~70ms on my machine.

If it takes, say, longer than 200ms or 300ms for you then the diagnosis is clear: you’ve got lead balls in your shoes.

`                            `***** **`  `

Now you’re thinking: does it matter? 100ms? 200ms? Come on, dude.

And I’m telling you: yes it matters. Of course it matters. Those who don’t honor the milliseconds will end up with seconds. 100%, it absolutely matters. Who wants to walk around with clown shoes full of lead?

Think about it this way: which program do you execute more often than your shell? How many shells do you spawn every day? How many *other programs* do you run every day that spawn your shell? If you’re anything like me, it’s a lot of shells per day. I’m a heavy terminal and tmux user. I spawn shells like I open new tabs in a browser. Do you want one of your most-used programs to start slow because you didn’t care?

But also: it’s not just about your shell startup time – how fast does your shell prompt render? Do you have one of those multi-line shell prompts that displays 8 different bits of information? How long does it take to recompute that information? Think of your shell prompt as a tiny program. A tiny program that executed *every time you run a command in your shell*. Now look into the mirror and ask yourself: do I really want to wait for my fancy prompt to render every time I run a command?

Sure, there’s airquotes blazingly airquotes fast prompts and they’re optimized and use caches, but when I add `starship` to my zshrc it adds 10ms to its startup. 10ms – not much, I’ll give you that. But consider how many other programs also add 10ms by adding their own hooks into your `.profile` file or your shell-rc file, adding new commands or env vars or custom completions. Homebrew? direnv? asdf? Docker? NPM? PNPM? Yarn? That Google SDK stuff? It adds up.

Everybody wants a piece of your shell. Be very careful about giving it to them. Otherwise: clown shoes.

`                            `***** **`                            `

How do you fix your slow shell startup time?

First: profile! ZSH, for example, allows you to [profile its startup time](https://www.bigbinary.com/blog/zsh-profiling). You can do [similar things for Bash](https://stackoverflow.com/questions/5014823/how-can-i-profile-a-bash-shell-script-slow-startup). What exactly you do doesn’t matter as much as actually doing it. You can also binary-search comment out half of your shell rc-file at a time and then see what improvements that made.

I often run this command when tweaking my `.zshrc`:

```
for i in $(seq 1 10); do time $SHELL -i -c exit; done
```

Second: optimize your shell rc-file! There’s a lot of resources out there. [This blog post](https://htr3n.github.io/2018/07/faster-zsh/) is pretty good if you’re a ZSH user. [This one is very extensive](https://blog.jonlu.ca/posts/speeding-up-zsh) and contains a lot of references to other blog posts too.

Generally speaking, these are the rules of thumb:

1. Run as few commands as possible
1. Keep the prompt simple
1. Do less

The first one – run as few commands as possible – is pretty simple but if you go through your rc-file you’ll probably find a lot of commands being executed. Common example: `brew --prefix` – many macOS users have this in their shell rc-file to set aliases. That’s expensive. If I add this to my `.zshrc`

```
alias foo="$(brew --prefix)/foo"
alias bar="$(brew --prefix)/bar"
```

it adds 20ms to the startup time. If possible, replace external commands with shell built-ins or with env vars.

Second rule: keep the prompt simple. Once upon a time I had fancy prompt that displayed the current Ruby version, the current Go version, status of the git directory, and so on. It turned out that getting the Ruby and Go versions was uncached and added 20ms to every prompt. So every time I ran `ls` I had to wait an additional 20ms for the prompt to show up. Clown shoes. Look at your prompt and really consider whether you need that information on display *at all times* or whether you can’t run a command on-demand instead to, for example, find out how much battery your laptop has left.

Third rule: do less. The cardinal rule of optimzations also applies here. Do less in your rc-file. Do you *really* need fancy autocomplete for all of those commands? Even if it adds 100ms to your startup time? Do you *really* need all those commands adding their own keybindings, the ones you never use? What about that [language version manager](https://www.youtube.com/watch?v=I_EaA7Q3GxI) – do you need that or is there a faster replacement?

Let me make all of this concrete by showing you some things I did to my `.zshrc`.

[Here I got rid of 150ms startup time](https://github.com/mrnugget/dotfiles/commit/6c900a120795cea99bf76de6aa0bc3c5346d2b38) by throwing out a lot of fancy ZSH completion mechanisms that I never used and caching the output of `uname`. Then Keegan told me in a comment that I don’t even have to run `uname`, I can use an env var – [another 5ms](https://github.com/mrnugget/dotfiles/commit/f3eabc74c5297e7328c8252a00f1e3af1c03c9f4).

[Here’s 18ms saved](https://github.com/mrnugget/dotfiles/commit/1b394c45c08038b659c115353d6ce279aa63fa7e) by removing `brew --prefix`, using `-e` to check for file-existence, and avoiding double-sourcing of another file. [This trick here](https://github.com/mrnugget/dotfiles/commit/89b6b8213d4dc15e5cb7612792a6e33de1d963c7) to speed up ZSH’s completion-init saves another 20ms. I got the newest version from [this gist here](https://github.com/mrnugget/dotfiles/commit/8ba3c5c6369c0b746d86361fc5661b15c5a2fecb). And all of this started 8 years ago with me [realising that](https://github.com/mrnugget/dotfiles/commit/b4010478101d367a404494cbec425f3c12dbcd4a)`rbenv` added 100ms to the shell startup time.

So, what’s in your shell rc-file that you can optimize?

---

# New year, new job, new machine

*Setting up a new MacBook Pro M3 Max*

By Thorsten Ball • January 7, 2024

---

Happy new year, hackers! I’m starting my new job at [Zed](https://zed.dev/) in slightly more than a week, but my new work laptop is already here. In fact, it’s been sitting here for nearly two weeks. I hadn’t opened the box yet, because I was waiting for *just the right moment*. We all know how personal setting up a new computer is.

Then, yesterday afternoon, I had the house to myself and decided it’s time. Let’s set up the new machine: a brand-new, 16-inch, black, sorry: *space *black, MacBook Pro M3 Max with — listen to this! — 128GB of memory, a 16-core CPU, 40-core GPU, and a 16-core Neural Engine. Yes. Yes, that’s *memory*. What a beast.

All I said was that a M3 Max in black with a US English keyboard would be nice, then this thing showed up. Someone I told this to said about this gesture of Zed: “I love it when someone knows how to flirt.”
[![](https://archive.thorstenball.com/data/images/140438370.new-year-new-job-new-machine/50f9f4a8-13cf-4643-bd10-af0377ff29f9_3619x3024.jpg)](https://archive.thorstenball.com/data/images/140438370.new-year-new-job-new-machine/50f9f4a8-13cf-4643-bd10-af0377ff29f9_3619x3024.jpg)
That’s the second MacBook I set up in 4 weeks, because *this* machine, the one I’m typing this on, a M1 Max, I also set up again after it’s been wiped on [my last day at Sourcegraph](https://registerspill.thorstenball.com/p/leaving-sourcegraph).

So I figured that this time I’ll document what I do to set up a new machine and take you along for the ride.

## macOS Basics

The first thing I do on a new macOS machine is to tweak macOS itself, because otherwise I’d lose my mind after 30 seconds:

- Change the keyboard repeat rate using [mac-key-repeat.zaymon.dev](https://mac-key-repeat.zaymon.dev/). I always try to find [this tweet of mine](https://twitter.com/thorstenball/status/1609969938415894529) because it has my settings.
- Reduce the size of the Dock, throw out all the default applications. Then, lately, I’ve also been experimenting with an auto-hiding Dock and I’ve been using these settings to make it not table-flip-inducing:

`$ defaults write com.apple.dock autohide-delay -int 0`

`$ defaults write com.apple.dock autohide-time-modifier -float 0.4`

`$ killall Dock`
- Disable user interface sounds.
- Change tracking pad and mouse speed to one-less than max. Enable light click and tap-to-click.
- Remap Caps Lock to Control.
- Change the hostname [properly, using the commands in this gist.](https://gist.github.com/a1ip/68db7b4e137d958da58e587a3a44dab8)
- Ensure the thing doesn’t wake up in the middle of the night [by changing the strewn-about settings](https://twitter.com/thorstenball/status/1736679960784310775).
- iCloud, internet accounts, etc. etc. etc.

With that out of the way, it’s time to install software.

## The Bootstrap Problem

Whenever I setup a new machine, I set it up from scratch. I don’t want to restore from backup or another machine because I don’t want to accidentally carry any cruft over.

Setting up from scratch always poses these questions: do I install 1Password first so I can log into my accounts and *then* homebrew with which I could’ve also installed 1Password? Do I install Chrome by hand too? Or do I use brew for that? What comes first? Passwords or software? Software manager or passwords?

This time I started by installing [Homebrew](https://brew.sh/), then cloning [my dotfiles](https://github.com/mrnugget/dotfiles), and then installing the software.

## Software

I’ve recently started to use [this Brewfile](https://github.com/mrnugget/dotfiles/blob/master/Brewfile) for managing the software I install with Homebrew. I’m also somewhat consistent with it, but not 100%, some software I install by hand because I want to try it out and then it sticks.

Some things of note in that Brewfile:

- Neovim, obviously.
- Tmux, too.
- fzf, ripgrep, direnv, z, gh — all things I need so I don’t run into seventy-four “command not found” per hour.
- [iStat Menus 6](https://bjango.com/mac/istatmenus/), can’t live without it.
- [CleanShot X](https://cleanshot.com/) — the best screenshot tool. [Triple digit offer](https://twitter.com/thorstenball/status/1719717847553696061) for anyone to port this to Linux.
- I’m using [OrbStack](https://orbstack.dev/) as a Docker replacement now, because it covers all my use cases so far and seems [lighter & faster](https://twitter.com/thorstenball/status/1743323371532599728), which is all anything really wants, right?
- [Rectangle](https://rectangleapp.com/) to move windows around.
- [Tailscale](https://tailscale.com/), baby.
- All of the terminal emulators — Kitty, Wezterm, Alacritty, Contour. I like being able to compare things.
- [Monodraw](https://monodraw.helftone.com/) — sweet piece of software.

As you can also see in that Brewfile that I use [asdf](https://asdf-vm.com/) to manage programming language versions (Go, Node.js, Ruby). But I’m also not terribly consistent with this. I also install rustup and use Nix.

(Actually, I started to use rtx, an asdf replacement, when setting up this M1 Max a few weeks back. But then yesterday I noticed it was renamed to [mise](https://github.com/jdx/rtx) and after letting out a big sigh I was too lazy to uninstall/reinstall and for the sake of consistency I now stayed with asdf on both machines.)

There’s some stuff that’s not in the Brewfile. I don’t know exactly why, but here’s the stuff I installed by hand:

- Google Chrome. Yup, still using Chrome. I’ve tried switching to Safari, Arc, Firefox over the years but I always end up back here.
- [Raycast](https://www.raycast.com/). I’ve been using Alfred for 10 years and then gave Raycast a try a few weeks back. It stuck. It’s really fast and snappy. Biggest win over Alfred is that the window is sometimes persistent, meaning: I can start typing a calculation in, Cmd+tab to another window, then come back to the calculation.
- 1Password. This has to be installed as one of the first apps (see: The Bootstrap Problem).
- Dropbox. I use Dropbox to sync a folder full of Markdown notes, mostly. Yesterday I ran into the device limit. Now I don’t know what to do. 10 bucks a month for syncing a few megabytes is tough.
- [Zed](https://zed.dev/), of course. I’ve been hacking with Zed for the past 3 weeks and love it even more now. A few days ago I switched to using [Zed Preview](https://zed.dev/releases/preview) even. Very cool.
- [Ghostty](https://mitchellh.com/ghostty). This one’s also one of the first apps I install, just so I don’t have to stare at Terminal.app.
- Nix, using [this installer](https://determinate.systems/posts/determinate-nix-installer). Thanks to Mitchell and Ghostty I kinda got into Nix and also have been slightly Nix-pilled as the kids would say.
- [nix-direnv](https://github.com/nix-community/nix-direnv) so my shells load really fast in Nix-enabled repositories.
- [Arq](https://www.arqbackup.com/). I’ve been using Arq for nearly 10 years, backing up every machine I use and very often restoring from Arq when setting up a new machine. More on that in a second.

## Copying the data

Most of the data I work with day-to-day is synced to somewhere: GitHub, iCloud, Google, *the Cloud*, Dropbox, whatever. All my private data (photos, documents, …) is also synced to either iCloud or my Synology.

So, technically, I don’t even need to copy data from another machine to a new one, because I could get it from somewhere else, but there’s a bunch of stuff I always copy from machine to machine:

- My `~/.ssh/config `— there’s hostnames and config settings in there that I can’t reconstruct *easily*. So, copy it is.
- My old, trusty `~/.zsh_history `— here’s a lifehack for you: don’t worry about space and bump your shell history length to a really high number, then use fzf to fuzzy-search through history. My .zsh_history is *very* important to me. It *is* me. So, copy it is.
- The `~/code` folder: this contains my projects (blog, books, …), open-source projects I contribute to, experiments and playgrounds, workalongs with books, and random clones of repositories I make just to browse/explore the code. Yesterday it had a size of 74GB. As I found out later that was mostly due to Rust-sponsored `target` folders in various repositories (I think wezterm’s target folder had 12GB after running cargo build)

So the last one, the `~/code` folder, posed a bit of a challenge: 74GB is not nothing. Also, it’s full of tiny, tiny files. Lots of .git folders, even a few node_modules in there. 

So I thought: what’s the best way to copy this?

- **Attempt #1:** airdrop that sucker. I mean, why not? I have two MacBooks sitting side-by-side, let’s drag-and-drop that baby from here to there, right? Turns out that Airdrop doesn’t give you *ANY* reasonable progress indicator so after 20min of the Airdrop bubbles disappearing and a “progress bar” (yes, quotes intentional) in the Downloads folder, I canceled.
- **Attempt #2:** use a Thunderbolt cable. After a quick search for “how to transfer files from one Mac to another” I found an Apple help article saying that I can just plug a cable into both machines and then move the files over. Sweet! Turns out I have to restart and put the source machine into Sharing mode after which it shows up as an external HD on the other machine. Okay, still sweet. Did that but then I copied the 74GB folder using Finder.app and … it took nearly 2hrs for Finder to build the initial file list, and then it had the gall to tell me that the transfer would take 15hrs. 15hrs?! Come on, man.
- **Attempt #3:** rsync. Rsync’s a hero from the old tales, so I asked rsync for help. After 10min of rsync also building an initial file list I hit Ctrl-C.
- **Final attempt:** I did this before and I knew it’s fast, so I did it again: restore the ~/code folder from the Arq backup. That means: pulling less-than 74GB from S3 and restoring it. That took 45min. Why? Because I ignore node_modules in my Arq backups (and as of yesterday: target folders too) and Arq has a list of files, so it doesn’t need to figure out which files to copy first. Thanks Arq.

After that I was up and running.
[![](https://archive.thorstenball.com/data/images/140438370.new-year-new-job-new-machine/101767f2-cf0a-4be4-a180-f55a49064808_4096x2304.jpg)](https://archive.thorstenball.com/data/images/140438370.new-year-new-job-new-machine/101767f2-cf0a-4be4-a180-f55a49064808_4096x2304.jpg)
That was yesterday evening and I didn’t play around with the M3 Max that much, but first impression: this thing is *[fast](https://twitter.com/thorstenball/status/1743696108826632589)* and it’s snappy and it has work capacity and it feels great. The black looks awesome. Sorry, space black.

## Random Tidbits & Thoughts

- So many notifications! When you do nothing but install and start and setup software for two hours your notifications on macOS fill up with all kinds of garbage: this app is running in background, this app now uses this data, this app also started, hey this app is up and running, etc. It’s a lot of noise.
- [Continuity](https://www.apple.com/macos/continuity/) is pretty nice. In short: it lets you use one pair of keyboard & mouse for multiple devices and allows you to move your cursor to a MacBook that sits next to the other one. It worked surprisingly well! Incredibly useful: moving files from one machine via drag and drop. I did that for the mentioned-above .zsh_history and SSH config.
- When Apple’s stuff doesn’t work it’s frustrating. I kinda touched on this in [the last newsletter](https://registerspill.thorstenball.com/p/the-hum-of-the-machine): there’s never any indication of something happening. 99% of time that’s fine but when it fails you really want to know what’s going on. For example: when you use Apple Devices you can share a clipboard between them. SUPER MEGA USEFUL, *when and if* it works. I can copy a 2FA code on my iPhone and paste on the MacBook. I could even copy & paste passwords between the MacBooks yesterday. But then suddenly it stopped working and I didn’t know why. Then it worked again and I didn’t know why. Same goes for Airdrop suddenly disappearing.
- It’s VERY easy to miss a “Password:” prompt waiting for you, silently, in the background in a terminal.
- I think I could get a new dev machine up and running in 45min. You know: gun to my head and all, realistic circumstances.
- This was VERY painless. It was a joy, actually.
- That M3 Max is a beast, jesus.

With that, you should subscribe and then I’ll see you next week:

---

# The Hum of the Machine

By Thorsten Ball • December 22, 2023

---

Have you noticed that the newest versions of Chrome on macOS show how much memory a tab is using? I don’t mean something in the developer tools, or an internal process manager. No, you now only have to hover your cursor over a tab and Chrome tells you: this one uses 60MB, that one 200MB, the one at the end uses 400MB.

That’s endlessly fascinating to me. Why surface such a mechnical detail to every user of one of the most widely used pieces of software in the world? My guess: they probably want to educate users that Chrome isn’t the memory hog people claim it is, it’s the websites; here, look, we can prove it.

But doesn’t that go against the grain of the last ten years of product design?

Browser’s now hide the protocol of the URL, you only get a lock icon if you’re lucky. Chrome removed the downloads from the bottom of the window and shoved them into a submenu cellar. Long gone are the days when browsers showed the current request’s progress at the bottom.

Everything’s polished, everything’s smooth, everything *just works* – that’s what the UIs tell us. No mention, no indication that there’s machines executing code somewhere beneath the facade. Displaying memory usage feels like traveling back in time.

It’s not just software either. MacBooks no longer have any lights to show whether they’re even turned on or not. With the introduction of the M1 processors, they also no longer whisper (or scream) at you with their fans. Hard drives too have become a rarity and the SSDs that replaced them are silent. On a sensory level, computers now are just slabs of metal and plastic with displays and keyboards on the outside. Just by observing them, you couldn’t tell that there’s something happening inside.

I miss it. I miss the [sounds](https://www.youtube.com/watch?v=KR3TbL3Tl6M) and the LEDs and the vibrations and the fa– okay, yes, I don’t miss the fans, but everything else? I miss it because it was *feedback*, feedback that lets the user of the machine know what’s going on, or whether something’s going on at all.

Back when we had hard drives you could tell whether a program was doing its job, or at least attempting to, by *listening*: you could hear the hard drive spinning and the read head moving. If you ran programs often you learned to recognize patterns: ah, now it’s switching from this rhythm to that rhythm, that means the game is nearly done loading. Older computers even had LEDs to show CPU or network activity – a blinking LED could put you at ease because it let you know that at least *something* is happening, the computer hasn’t crashed.

This week I installed Xcode, which is 11GB in size. The installation process took somewhere between 20 and 30 minutes. For the entire duration Homebrew only printed “Installing xcode…” No other indication of what’s going on. Completely silent machine. It took a glance at the network indicator of [iStat Menus](https://bjango.com/mac/istatmenus/) to realize it’s still downloading.

Look, I’m not asking anyone to bring back fan noise, but I do think that we lost something when computers turned silent and still.

In fact and no exaggeration here, I seriously don’t understand how engineers can use their computers nowadays without something like iStat Menus to tell them whether a CPU is pinned, or whether something’s using the network, or whether memory is filling up – because the hardware doesn’t tell you anymore and the software doesn’t either.

Here’s an example: when I open macOS’ Activity Monitor on my M1 Max it takes 6 seconds for the list of processes to show up (yes, I timed this). 6 seconds long I wonder: will processes show up? Will it take 10 seconds more? 30 min? What’s going on? No sound, no LED, nothing.

When everything works and is fast and doesn’t use too many resources, that’s fine. You don’t want spinners and progress bars flashing up for half a second. But if things go wrong and take longer than 1-2 seconds, that’s when I want all the feedback I can get, as early as possible. Yes, even if it’s fans screaming into my ear to tell me that my program is inefficient.

---

# Leaving Sourcegraph

By Thorsten Ball • December 15, 2023

---

This is my last week at Sourcegraph. Today’s my last day. At 6pm my computer will be wiped cleaned and 4.5 years come to end. 4.5 years so dense that at other companies the clock would probably show 8, or 10 years.

Why am I leaving? Over the past few months I realised that there’s still many, many things I want to learn as an engineer. So many things to see and do until I can lean back and say that I’ve squeezed every last bit of programming out of myself. And the best way to do that, in my experience, is to go and do something new, to get out from the shallow end of the pool, to which I’ve drifted slowly over said 4.5 years, run to the other side and jump back into the deep end.

Believe me when I use this tired phrase and say that this wasn’t an easy decision. A colleague said to me this week: “to me, Thorsten, you were always Mr. Sourcegraph.” And I thought: yeah, man, I know.

There’s so much I could write here. Pages and pages and pages about what I learned, what we shipped, how Sourcegraph changed my views on software engineering, on organizations, on start-ups, on the US, on managers, on… everything, really. But I’ll save that for another time.

Instead, let me just give you some anecdotes and thoughts that pop into my head on this last day. Unsorted, incomplete; if I forgot to mention something it only means that I have bad memory, not that it didn’t mean anything to me. I assure you that next week I’ll think of 15 more things I should’ve put in here.

---

In my first week in April 2019 in San Francisco, I sat down with Quinn, Sourcegraph’s CEO, and asked him: “what should I work on? what’s the most important thing I should do?” He said: “I want you to think of Sourcegraph as a playground. You have certain skills and talents – that’s why you’re here – and I want you to look around and think how you can use them to move the company forward.”

---

Sourcegraph’s all-remote, with people all across the world working whenever they want. Sometimes I’d work early in the morning and someone in the US would still be online. And we’d talk a bit. When a late night and an early morning meet they create a very enjoyable vibe.

---

For quite a while I ran the internal *Demo Day* event, every 2 weeks. Engineers could join the meeting and demo what they built and shipped. I loved seeing engineers knock it out the park with a great demo. Loved also seeing people roll their eyes at my dumb jokes while also smiling.

---

When we were looking for a name for a new internal instance of Sourcegraph, someone suggested Horsegraph as a name. I loved that name and ran with it: creating fake company slogans, logos, a Slack channel. There’s an emoji in the Slack called :horsten:

---

Sometimes I’d stare in awe at a Google Doc in which 10 cursors where moving all over the screen, moved by people sitting in front of their computers in very different places all over the earth. Someone in Delhi, someone in Paris, someone in Berlin, someone in New York, someone in Colorado.

---

Quinn once said in a meeting: “we’re not based in San Francisco, we’re based on the Internet.”

---

There were some *fantastic* emoji reactions in Slack. Oh my god do I love the perfect emoji reaction.

---

Seeing people’s Zoom background change when they moved places.

---

One of the biggest lessons I learned: seeing, realizing, feeling that engineering has to serve the business, not engineering itself.

---

Our first company-wide offsite in Mexico was one of the most well-organized events I’ve ever been to. Hop on a flight, land, and everything else is taken care of. For more than 200 people. “wow, we’re *big* now, this is a pro operation”, I thought.

---

Sometimes you’d visit HackerNews on a Saturday evening and see a colleague’s blog post or project pop up there.

---

I won an Impact Award this year at a company offsite. I was sitting in the audience making jokes with [TJ](https://twitter.com/teej_dv) and when the winner – me – was announced I thought it was for a 3rd place or something and made a joke about it. TJ then said “uhm, no, I think you won this?”

---

After I joined I spent the first few months pairing *a lot* with [Keegan](https://twitter.com/keegan_csmith) and [Tomás](https://twitter.com/tsenart). Multi hour sessions in which we wrote code, or debugged production, or profiled performance issues. I’ll never forget that summer and I’m convinced that these few months and that much sync time we had helped me a lot at Sourcegraph.

---

Seeing [so much code written, changed, deleted](https://github.com/sourcegraph/sourcegraph/graphs/contributors) - mostly in a single repo.

---

I wrote a document called Engineering Ownership last year. When adding it to the handbook, Quinn, the CEO, [left a ❤️ on my paragraph about civil disobedience.](https://github.com/sourcegraph/handbook/pull/5296#discussion_r997851939)

---

Recording [Dev Tool Time](https://info.sourcegraph.com/dev-tool-time) with Beyang and TJ was incredible fun. Talking to other engineers about their dev tools and being star-struck – “I could do this all day long”, I thought.

---

[stevey](https://twitter.com/steve_yegge) has an uncanny ability to say or write something that gets me fired up, every time, no matter the circumstances. Full circle, in a way: he wrote [an article](https://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html) that got me into compilers, which then led to me learning about language tooling, which led me to Sourcegraph, where I then reported to stevey.

---

Sometimes I’d interview engineers and they’d go “oh, you’re Thorsten? wait a second!”, walk out of frame, come back and hold up one of my books.

---

Working with [Erik](https://twitter.com/erikseliger) on Batch Changes was a highlight. We shared a brain there for a while, knowing exactly what the other person is doing and why, knowing what they’ll say in a code review and fixing it before they can comment. I wish every engineer could experience collaboration like this.

---

I wrote a very long document this year and asked [Erika](https://substack.com/@erikars) for a feedback. She asked: “is it okay if I take my red pen out?” “Sure,” I said. And she did. The next day I woke up to 50, 60 comments on my Google Doc and it felt like Christmas, because every comment was a gift: a little suggestion, a fix, an idea. It felt like getting code reviews back when I was a junior engineer and I’d learn 3 new methods and ways to do things in every review.

---

Learning that there’s companies with hundreds of thousands of repos. Hundreds of thousands. One of my favorite things to mention over beers with other engineers.

---

Here’s what’s called The Fish Story.

Two years ago I [tweeted](https://twitter.com/thorstenball/status/1417116104380592131) about [these weird stories of Microsoft sending executives they want to hire](https://news.ycombinator.com/item?id=23267177)*[fish](https://news.ycombinator.com/item?id=23267177)*. As, you know, gifts, to convince them to join.

Quinn asked: [“will we start sending fish?”](https://twitter.com/sqs/status/1417225428062769170) [Nick](https://twitter.com/nickdsnyder), our Head of Engineering back then, [replied only with this clip](https://twitter.com/nickdsnyder/status/1417484888324943878).

A few weeks pass. I’m at the gym. My wife sends me a text message: “this came for you.” Along she sent a photo of a styrofoam box. I knew immediately what it was and laughed out loud in the gym, basically ran home, and found a big, frozen salmon waiting for me, sent by Nick.

---

When working on Batch Changes I repeatedly told others: “all I want is for a customer to wire us $1 for this.” A year later I get tagged in a Slack message, with Quinn saying “here’s your $1.” The first customer had signed and purchased Batch Changes. Batch Changes then turned into a significant contributor to the company’s revenue – one of the highlights of my career. I recorded a video of myself dancing and posted it in Slack.

---

The transparency. Seeing board slides, quotes from customers, financial projections, quotes from investors and board members.

---

Right after he joined, stevey led a small team to adding intelligent ranking to Sourcegraph. He wrote one long Google Doc that described the problem and a possible approach in *just the right way*, with just enough details to say what he wants but still leaving enough freedom for all of the engineers to solve the problems their own way. That was inspiring to see, to see how powerful great communication skills combined technical knowledge can be.

---

I’ll never forget when Nick told us someone had applied for an intership. Nick told them that we don’t do internships (we didn’t at the time) but the applicant said “no, I want to work here.” They became our first intern and knocked it out of the park. Still do.

---

Some of the most fun I had when rewriting our developer tooling into `sg`. Every Friday afternoon I’d host `sg hacking hours`, in which everybody could join me on Zoom, see me hack, suggest features, talk shit with me. That led to 20 people contributing code to this new tool in the first few months.

---

Being in the eye of the storm when working on [Cody](https://about.sourcegraph.com/cody) in the middle of the AI frenzy of 2023.

---

We once shipped a faulty release in which we updated to a new glibc version in the PostgreSQL container. I should probably write a long-ass blog post about this, but the gist of it: some database indexes became faulty after the update and wouldn’t return any rows.

Except we didn’t know any of this on the day after the release, when customers reached out and said they’re seeing 404 errors.

I woke up to people in the US still being on an incident call. Nothing gets you started in the morning like an incident call.

While trying to figure out what’s happening I said out loud, half-joking: “do we have any customer who will give us full access to their database and lets us execute SQL?” Our Head of Support laughed and said “yeah, that’s funny.”

Two hours later we talked to a customer and he said “yeah, sure, do whatever you want.” and we dictated SQL queries to him for an hour, which lead to a big, loud, shared “ohhhh!” once we found the bug. The customer then said: “that was awesome.”

---

I’m going to stop here, but I’ve got more anecdotes. Loads and loads of anecdotes.

You know, a few years back I thought: “isn’t the goal in life to be able to tell great stories when you’re older?” Sourcegraph certainly moved me closer to that goal. Thank you.

What’s next for me? In January I’ll join [Zed](https://zed.dev/) to work on a new text editor. I’m more than excited.

*I might pause Register Spill for the next few weeks. I might not. But I have four weeks off now and I’m going to treat them as lawless four weeks. In any case: subscribe if you want to get the next one.*

---

# It's a Negotiation

*When Product & Engineering Meet*

By Thorsten Ball • December 10, 2023

---

Based on all the evidence I’ve seen—barely working releases, lianas of duct tape, “what tests?”, “we’ll clean it up later”—here’s what I presume most engineers think must happen when Product and Engineering meet:

*Product: I need you to build X, Y, Z.*

*Engineering: okay.*

*Product: You have until end of this quarter.*

*Engineering: okay. [muttering to themselves, barely audible:] fuck.*

Product says What and (at least sometimes) When; Engineers worry about the How.

I’ve heard people say that out of these three—What, When, How—you get to pick two. You can say build me X (What) until this date (When) but then you can’t say How it’s built, because that’s Engineering’s job. Or you say you want X (What) built exactly like this (How) but then you don’t get to decide When.

The pick-two idea is useful, because it makes clear that trying to pick all three is the same as waving a magic wand—wishful thinking. But I also think it’s not nuanced enough.

In my experience, the most productive relationships between Engineering & Product were based on the understanding that they need to negotiate, make compromises, meet in the middle—on all three fronts: What, When, How. Because they are all related to each other and cleanly picking two while not touching the third one barely works in practice.

Ideally, the conversations go like this:

*Product: Here’s What I want—X, Y, Z—can you build that?*

*Engineering: Until when?*

*Product: End of quarter.*

*Engineering: Impossible, but I can give you X and Z until then.*

*Product: I see. But Y is more important to me than Z. Can we somehow get X and Y in? I’m happy to drop Z.*

*Engineering: We could get X in but Y only in small, y.*

*Product: That works. Small y is the important part anyway. When will you get to Z?*

*Engineering: Right after that.*

*Product: Sweet.*

Both parties need to go into the conversation knowing that they only have half of the picture and that the conversation is a way to see the other half—the conversation is a way to learn, to understand the constraints and tradeoffs involved.

After all, *this* is what Engineering is about, isn’t it? Building things to solve problems, given a set of constraints.

Imagine you’re an engineer in the physical realm and you’re tasked with building a bridge.

*Product: Build me a bridge.*

*Engineering: Alright. [muttering to themselves, barely audible:] fuck.*

That’s all wrong, right? An engineer who works with Actual Real Stuff (you know: sand, stone, iron, and so on) wouldn’t just go off and build a bridge, they’d find out what the actual constraint are in order to solve the problem.

*Product: Build me a bridge.*

*Enginering: Until when? What materials do we have available? What’s the budget? How many people will cross that bridge? Vehicles? For how long? How many every day? What’s traffic at peak hours?*

Then, depending on Product’s answers, Engineering might go and build different things:

*Product: The bridge is only for today. 5 people need to cross this river, fast.*

*Engineering goes and puts up a zip line.*

or:

*Product: Bridge needs to carry a thousand vehicles this week. Doesn’t need to survive longer than that. Budget is tight.*

*Engineering goes and puts up a wooden bridge.*

or:

*Product: Bridge needs to carry all the traffic that’s now on Other Bridge, because that one will be shut down. It can’t be a steel bridge because that’s prohibited here.*

*Engineering goes and builds a stone bridge.*

You get the idea: the What and the When and the How are all related and when Product & Engineering meet their task is to find out how related they are—which one you can change in which ways and how that influences the other ones.

Product saying What and When and Engineering eating it and crumbling about their How is just not engineering.

---

# Polishing Forks

By Thorsten Ball • December 3, 2023

---

I [told you before](https://registerspill.thorstenball.com/p/every-line-a-chance-for-greatness) that I could write more about The Bear’s S2E7. Here we are. I came across [this clip from that episode](https://twitter.com/DeadCaitBounce/status/1728958094464741872) this week and decided now’s the time. 

The scene is a dialogue between Ritchie, who works in a high-class restaurant for the first time, and Garrett, who’s worked there for a while and oversees Ritchie’s work:

*Ritchie: Yo. Garrett. Chef. I've been doing this forever. Can I... wash dishes or something?*

*Garrett: No, we got the best dishwashers in the world. You're just gonna slow 'em down. That wasn't clean.*

*R: I've been doing this for nine hours. I think I know what's clean.*

*G: I'm telling you, that's not clean. That was not clean either. Please do them properly--*

*R: Yo. They're goddamn forks.*

*G: Outside.*

*[they go outside]*

*G: Do you think this is below you or something?*

*R: Man, I think I'm 45 years old, polishing forks.*

*G: No one is asking you to be here. I don't think anybody remembers your name.*

*R: Nice try. You think I don't know how hard it is hiring people since COVID?*

*G: We don't have that problem.*

*R: You really drink this Kool-Aid, huh?*

*G: Yeah, I do.*

*R: Why?*

*G: Because I love this, Richie. I love this so much, dude. Did you know that when this restaurant opened 12 years ago, it won the best restaurant in the world the same year? It's retained three stars because we have a waiting list that's long. Five thousand people waiting at any given moment long. Do you see their faces when they walk in here? How stoked they are to see us and how stoked we have to be to serve them? It takes 200 people to keep this place in orbit. And at any given moment, one of those people that is waiting in line gets to eat here. They get to spend their time and their money here. I'm sorry, bro, but we need to have some forks without streaks in them. Every day here is the freaking Super Bowl. You don't have to drink the Kool-Aid, Richie. I just need you to respect me. I need you to respect the staff. I need you to respect the diners. And I need you to respect yourself.*

*R: I can do respect.*

*G: Lovely. I'll see you inside.*

I’ve watched this scene a couple of months ago and think of it very often. Not only because it’s a great scene in a great show, but because I’ve given the exact same speech as Garrett here.

Instead of working in a restaurant it was about building software. Instead of polishing forks someone would complain about why they should bother about formatting the code, or writing a proper commit message, or communicating to others properly, or fixing typos in a comment, or removing unnecessary blank lines. 

And I’d tell them: because this is the job, man, this is *it*. You’re working for one of the best software companies in the world, with some of the best software engineers in the world, building software for the other great software companies in the world — this is *it*. This is the NBA of programming and I need you to show up to practice every day and if you don’t want to do that, then you shouldn’t be playing here.

Do I care that much about typos in comments? No, but what I do care about is people respecting the opportunity they have and doing their job properly. 

---

# Watching A Pathological System

By Thorsten Ball • November 25, 2023

---

The first time I came across the term pathological system I had to look up what it means. The definition I found was similar to this:

> pathological system: exhibits extreme, abnormal, or self-destructive behaviors

Second time I came across it was in Bryan Cantrill’s [talk on pathologically performing systems](https://www.youtube.com/watch?v=7AO4wz6gI3Q) and defined it as “systems that don’t work.”

It stuck with me. (The idea, not the word of course. That I had to look up again just now.) There’s something really fascinating about systems that don’t perform as they should. I mean: behavior that no one designed, no one would expect, and possibly no one understands — what’s more fascinating than that?

In my life as a software developer I’ve had quite a few chances to observe pathological systems. Most of them early on, when I worked on SaaS applications and the pet/cattle distinction wasn’t that common yet and your production system was a nice pet that you check in on every day, making sure it doesn’t get sick.

But this week brought another chance and I spent with a colleague mainly doing one thing: watching a pathological system and trying to fix it, patch by patch.

Watching a pathological system is a contemplative act: you stare at graphs, you poke at the database and run some queries, you look at this dashboard and that dashboard and try to correlate behavior, you read logs to try to fill in gaps of knowledge. You create hypotheses and theories, some of them very short-lived, others maybe leading to a solution.

The system – running in data centers far away from you – starts to feel much more *real* and, dare I say it in times of AI, *alive* when you spend two days looking at three graphs that go up and down depending on which button you press.

You say things like these out loud:

“Oh, now why did this go up? It shouldn’t, right?”

“90% of these graphs are useless.”

“Okay, we need X.”

“Yup, no, that’s what the code does. Looks like I even reviewed and approved it.”

“Ahhh, you know wha- never mind.”

“Has anyone ever seen this?”

“Why would a restart even fix this?”

“This does not make sense.”

“Fuck it, let’s try it.”

Every line here is a lesson. Watching a pathological system you find bugs and incorrect assumptions in code. You learn how the system *actually* behaves and how wrong your assumptions of what a correctly-behaving system would look like were.

As Bryan Cantrill puts it in [his slides for another talk](https://speakerdeck.com/bcantrill/things-i-learned-the-hard-way?slide=9):

> But odd behavior is worth understanding: at worst, it enhances our own understanding (that is, that the behavior is in fact expected) but odd behavior can be an indicator of something much more deeply amiss – and in fact represents an otherwise innocuous presentation of an important defect!

So, next time you come across something odd: treat it as a chance to learn something.

---

# It's not up to you

By Thorsten Ball • November 17, 2023

---

There’s [a bit](https://www.likevillepodcast.com/articles/2021/1/8/youre-being-an-asshole-a-selection-from-louis-cks-live-at-the-comedy-store-2015) in Louis CK’s *Live at the Comedy Store* that I’ve been thinking about ever since I first saw it in 2015. It’s about someone saying they’re “not an asshole” (yes, it gained another layer of meaning after the misconduct revelations in 2017) and ends with Louis CK saying:

> It’s not up to you if you’re an asshole or not. That’s up to everybody else. You don’t get to say no to that. “You’re an asshole.” “No, I’m not.” “Oh, sorry, I thought… Okay, well, I’m glad I checked. I guess you’re not.” If somebody tells you you’re an asshole, you should go, “Oh, shit, alright, what happened? How did I get here?”

I keep thinking of this not because I’m constantly wondering whether I’m an asshole or not (I guess, uhm, leave a comment if you think I should?), but because the idea that some things aren’t up to you, but up to the judgement of everybody else is very powerful. I’ve seen it show up again and again. Here’s what I mean:

It’s not up to you if you’re *a clear communicator* or not. That’s up to everybody else.

It’s not up to you if *your RFC is easy to understand* or not. That’s up to everybody else.

It’s not up to you if *you said your message enough times* or not. That’s up to everybody else.

It’s not up to you if *your tool is easy to understand for new users* or not. That’s up to everybody else.

You get the idea. The quality of some things is measured through the perception of others and order to improve them you need to keep that in mind.

It sounds to obvious, right? I mean, *of course* it’s up to others to decide whether I’m a good communicator or not, *of course*. And yet, in practice, people tend to miss this.

They write something and their readers consistently misunderstand what they wrote. They blame it on the readers, not their writing.

They say something once and the listeners don’t turn it into action. Speaker blames the listeners, because haven’t they said it very clearly and in a way that’s easy to understand?

Very easy trap to fall into. Very powerful if you can avoid it. How to avoid it? I’m sorry to say that I don’t know of any shortcut, you just need to keep “how is this perceived?” constantly in mind and adjust what you’re doing accordingly.

Here’s George Saunders [talking about this very thing in the context of writing](https://www.theguardian.com/books/2017/mar/04/what-writers-really-do-when-they-write):

> How, then, to proceed? My method is: I imagine a meter mounted in my forehead, with “P” on this side (“Positive”) and “N” on this side (“Negative”). I try to read what I’ve written uninflectedly, the way a first-time reader might (“without hope and without despair”). Where’s the needle? Accept the result without whining. Then edit, so as to move the needle into the “P” zone. Enact a repetitive, obsessive, iterative application of preference: watch the needle, adjust the prose, watch the needle, adjust the prose (rinse, lather, repeat), through (sometimes) hundreds of drafts.

Now let me be perceptive and say: I can’t follow George Saunders. See you next week.

---

# Playful Programming

By Thorsten Ball • November 10, 2023

---

Last weekend I watched this video of [Andreas Kling](https://twitter.com/awesomekling) prototyping a JIT compiler for his [Ladybird](https://twitter.com/ladybirdbrowser) browser:

It’s a very interesting video, for two reasons.

One: if you’re interested in how bytecode VMs and JIT compilers work, it’s all in there, explained step by step. A goldmine, really. If I had had a video like that 6-7 years ago I might not have written my books.

Two: *how* Andreas builds this JIT compiler is endlessly fascinating. It’s clearly visible that he’s spent thousands and thousands of hours of his life programming. It shows up in the large (hey, he knocks out a JIT compiler in 1.5hrs) and in the small – little tricks and moves and shortcuts. The latter is what’s so fascinating, because usually you don’t catch these small things on video, forget that you did them or don’t think they’re even worth mentioning.

Here we do have them on video and when bundled up like this you see that the small things add up to a lot.

I had to smile right at the start when Andreas [starts with a single file](https://youtu.be/8mxubNQC5O8?t=204), only adds the necessary boilerplate to exit with code 0, adds it to the build system, compiles and runs – just to make sure it’s all wired up correctly and he’s ready to go. I’ve seen engineers run straight into multiple-modules land and write a bunch of code only to then realise that it doesn’t build and they will have to rewire the whole thing to make it work. Good move from Andreas right there.

Then there are these short moments throughout in which he [very quickly reorganizes the windows](https://youtu.be/8mxubNQC5O8?t=356) of his IDE and terminals. He’s very fast. I had to pause to figure out what’s going on and how to [replicate it in GNOME](https://x.com/thorstenball/status/1721192376591327465?s=20).

He’s fast in general: he types really fast, he changes windows quickly, he writes little JavaScript files with `cat` and Vim in a few seconds, he says “let me just dump this bytecode so we can confirm” and proceeds to write 50, 60, 70 lines of code – I’ve seen programmers simply *not* do a debugging step for days because it would take 50 lines of code to write instead of 2 print statements.

He also navigates through his files by *searching*, something which I also do and got from [Bram Moolenaar’s Seven Habits of Effective Text Editing](https://moolenaar.net/habits.html). That made me smile again.

Then there’s [Copilot](https://github.com/features/copilot). It’s all over the video. I haven’t counted the [“Thank you, Copilot”](https://youtu.be/8mxubNQC5O8?t=1019)s, but there’s quite a few. Copilot [fills out the bytecode interpreter](https://youtu.be/8mxubNQC5O8?t=1521), Copilot [writes assembly](https://youtu.be/8mxubNQC5O8?t=2410), Copilot [writes methods for the JIT compiler](https://youtu.be/8mxubNQC5O8?t=3020). Andreas uses Copilot *consciously*, which, if you haven’t seen it, might sound odd – it’s *auto*-complete after all. But take a look at [how he pauses here and waits for Copilot to fill out the main](https://youtu.be/8mxubNQC5O8?t=3099)`switch` statement of the JIT compiler, or how [he watches carefully and hits the tab key occasionally to guide Copilot along, having it write machine code](https://youtu.be/8mxubNQC5O8?t=3359). Very interesting to watch, especially since [people claim](https://twitter.com/ryxcommar/status/1722637011054383327) that “these tools” only make you faster when you work on boring or boilerplate code. I’m not sure whether there’s a 10x speedup, but I’d say there is one. I’ll be using some of Andreas’ tricks with [Cody](https://about.sourcegraph.com/cody) in Neovim.

My favorite moment in the video is when [Andreas fact-checks what Copilot generated](https://youtu.be/8mxubNQC5O8?t=3207). He doesn’t *just* fact-check by looking at the code and thinking “huh is this correct?” No. What he does: he uses `cat` to write the raw machine code bytes that Copilot generated directly to a `test.asm` file, then assembles it with `nasm`, then uses `ndisasm` to *disassemble* it again and ends up looking at the assembly instructions that map to the raw bytes. Now that’s how you should own and use your tools.

The overall impression I get from the video is: programming for Andreas is *effortless*. Sure, he knows the domain and probably prepared for this video and wrote the JIT compiler once before, but still: he’s fast, he writes a lot of code, he debugs without problems, he has mastered his tools and uses them as *tools*, not as something to wrestle with.

I’ve paired with and interviewed a lot of programmers and this effortlessness is not universal. For some programmers, writing code *does* require real effort and they do it only if they must. They wouldn’t write a throw away program, because why throw away something into which you put so much effort?

Compare that to Andreas in this video. His goal is to write a JIT compiler, but he starts by writing a bytecode interpreter. Technically he doesn’t have to, but he does it so he can verify that his JIT compiler and his VM are working. Writing code is not an obstacle. It’s just something he does.

He’s at ease, he’s *playing*, he’s having fun. There might be some effort involved, but there’s certainly no strain.

It’s a very inspiring video and the thought it left me with is this: between all of the usual advice on Becoming A Senior Engineer — the (valid!) thoughts around communication, architecture, tradeoffs, and so on — it’s very easy to lose track of one thing. Getting faster and better at programming, trying to produce more with higher quality, should probably still be the #1 goal and when you’ve reached it, it looks very impressive.

---

# Zig Zaggin'

By Thorsten Ball • November 3, 2023

---

Here’s a very interesting bit of Zig that I came across again this week: `@fieldParentPtr`. It’s a prism through which you can see a lot of Zig’s character. That’s not what the official [docs](https://ziglang.org/documentation/master/#fieldParentPtr) say, of course. They say that `@fieldParentPtr`:

> Given a pointer to a field, returns the base pointer of a struct.

That doesn’t paint a, uhm, full picture, I’d say. So here’s some code:

```
const Parent = struct {
    name: []const u8,

    left: Child,
    right: Child,
};

const Child = struct {
    name: []const u8,

    position: enum {
        left,
        right,
    },

    fn parentName(self: *Child) []const u8 {
        const parent = switch (self.position) {
            .left => @fieldParentPtr(Parent, "left", self),
            .right => @fieldParentPtr(Parent, "right", self),
        };

        return parent.name;
    }
};
```

`Parent` has two `Child`ren, all three have a name and the `parentName` method on `Child` returns its parent’s name.

The interesting bit is the invocation of `@fieldParentPtr`:

```
@fieldParentPtr(Parent, "left", self)
```

What that says is: give me a pointer to `Parent`, based on the pointer of the `"left"` field on `Parent` that I’m giving you.

It’s doing pointer math for you!

What it does is take `self`, which is a pointer to a `Child`, look up the position of `left` field in `Parent`, then calculate how many bytes to subtract from `left` to get to the start of `Parent`, do that calculation and return a pointer to `Parent`.

Here’s roughly-equivalent C code to show what’s going on under the hood:

```
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>

enum position {
    LEFT,
    RIGHT
};

struct child {
    const char *name;
    enum position position;
};

struct parent {
    const char *name;
    struct child left;
    struct child right;
};

const char *parentName(const struct child *child) {
    uintptr_t offset = 0;
    switch (child->position) {
        // 1. Turn a `0` into a `struct parent *` pointer
        // 2. Access `->left` or `->right`, take pointer of that.
        // 3. That increased the `0` address to the field address
        // -> our offset
        case LEFT:
            offset = (uintptr_t) &(((struct parent *)0)->left);
            break;
        case RIGHT:
            offset = (uintptr_t) &(((struct parent *)0)->right);
            break;
    }
    // Now we can take that offset and get to the name
    struct parent *parent = (struct parent *)((char *)child - offset);
    return parent->name;
}

int main(void) {
    struct parent parent = {
        .name = "bob",
        .left = { .name = "child1", .position = LEFT },
        .right = { .name = "child2", .position = RIGHT },
    };

    assert(strcmp(parentName(&parent.left), "bob") == 0);
    assert(strcmp(parentName(&parent.right), "bob") == 0);

    printf("And bob's... not your uncle?\n");

    return 0;
}
```

What `@fieldParentPtr` does is what `parentName` does here, except it’s *compile-time safe!*

If I change the Zig code from

```
@fieldParentPtr(Parent, "left", self)
```

to

```
@fieldParentPtr(Parent, "in emergency: break dance", self)
```

it breaks!

```
field_parent_ptr_simple.zig:18:46: error: no field named 'in emergency: break dance' in struct 'f
ield_parent_ptr_simple.Parent'
            .left => @fieldParentPtr(Parent, "in emergency: break dance", self),
                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~
```

One could [re-implement](https://www.ryanliptak.com/blog/zig-fieldparentptr-for-dumbos/)`@fieldParentPtr` in Zig without it being a compiler builtin. The fact it *is* a compiler builtin and that people use it to implement [interfaces in Zig](https://zig.news/david_vanderson/interfaces-in-zig-o1c) shows you what Zig is about.

It’s fun to learn.

---

# Laying Siege to a Bug

By Thorsten Ball • October 29, 2023

---

I love debugging – clear goal, possibly interesting technical surprises, total freedom in approach, and coloring-in-the-lines creativity required. Sometimes when I get assigned a bug I even feel something that could be described as glee. But of course it’s not all love & glee in debugging. Emotions that are quite different can be involved.

“This should be easy.”

Or:

“Huh.”

Or:

“This is disgusting. How did we end up like this? We should burn the whole thing down.”

Or:

“This does not make sense. This shouldn’t happen.”

Or:

“Why me?”

Or:

“Look, maybe it’s not a bug? Maybe it should be like this?”

Or:

“I won’t ever fix this.”

There’s another one. I ran into it yesterday. It’s this one:

“Okay, if this is how you want to play it, bug, then this is how we’re going to play it.”

It’s when you set out to do something different, when you weren’t assigned a bug ticket but a feature and you went ahead, whistling, and wrote code and then some more and then the bug showed up and you tried to ignore it and put a band-aid on but it wouldn’t disappear and you tried again – bigger band-aid – and it doesn’t work and then you try to fix it somewhat more properly but again no luck and then you try again and again and it just won’t go away.

And then you sit down and have a very personal [“I’m gonna need a bigger boat”](https://www.youtube.com/watch?v=2I91DJZKRxs) moment that your wife won’t understand when you talk about it at dinner but then it’s *on*. You roll up the sleeves – for real and in code. You delete the temporary fixes, you take a breath, and you start to add *proper* debug tooling, not just print statements but actual tooling that’s not written to be thrown away in 10min. You modify the data structures you work with to contain actually useful debug information, you *really* read through all of the surrounding code, even the bits which you hadn’t thought were relevant. Then, believe it or not, you also read the documentation the way it should be read and not just snippets here and there in the hopes that you can glance a 1-line remedy to your existential pain. Hell, you might even look up how to use a debugger.

Because at this point *you know* now that the only way to fix this bug is to learn so much about where it comes from, why it came from there, how and when it behaves the way it does – to shine so much light on it that there’s not a single dark corner left in which it can hide.

That’s where I am this morning with my bug. I wouldn’t say it’s love & glee that I’m experiencing right now, but ask me in a few days.

---

# Notes From the Field: Learning Zig

By Thorsten Ball • October 20, 2023

---

This was my week off and I wanted to learn some more Zig. What I did: dug into the Zig compiler, wrote [toy programs](https://github.com/mrnugget/ziggy) to replicate parts of it, tried to understand the Zig way of doing things. I’ve also spent two days hacking a GTK feature into [Ghostty](https://mitchellh.com/ghostty), which is largely written in Zig. Feature is not done yet (god no), but it’s probably been the most serious Zig coding I’ve done so far.

So I figured I’d send you some early, rough, subjective thoughts on learning Zig. This is *not* a comprehensive analysis of Zig and reasons for or against learning it. It’s thoughts that went through my head this week while writing Zig.

- It’s very [data-oriented](https://vimeo.com/649009599). Data structures and smart use of them are *everywhere*. I found that whenever you learn a new language, there’s one thing that immediately sticks out: learn Lisp and it’s the syntax, learn Rust and it’s the type system and borrow checker, learn Ruby and everything’s an object, learn Lua and wow it’s so tiny. With Zig the main thing that stands out to me is how much attention is paid to clever use of data structures. Read [this article on the Zig parser](https://mitchellh.com/zig/parser) to see what I mean. After reading that, I dug into [how the compiler does string interning](https://x.com/thorstenball/status/1714135050361372801?s=20) and found [a clever use of hash maps](https://x.com/thorstenball/status/1714342743718105425?s=20). It’s very, very interesting and I feel like I’m gaining another pair of glasses with which to look at programming.
- It’s a simple language, but not *that* simple. There are quite a few syntactic structures that I keep stumbling over, there’s still compiler errors I can’t make sense of, and I haven’t fully grokked comptime yet (more on that in next point). I suspect it’s due to the last point: comptime.
- [Comptime](https://kristoff.it/blog/what-is-zig-comptime/) allows you to run Zig code at compile-time. It allows you to write Zig code to do meta-programming: create types at compile-time (generics!), unroll loops at compile-time, do some neat stuff with pointers, and so on – mind-blowingly cool stuff. But I still have a hard time grasping it.
- Comptime makes Zig lazy and that still trips me up (probably because I haven’t internalized comptime yet). Take this code:

```
 const Person = struct {
     age: u8,
 };

 fn newPerson(age: u8) Person {
     // BUG: This field name is wrong
     //         vvvvvvvvvv
     return .{ .ageInYears = age };
 }

 test "newPerson" {
     const std = @import("std");
     try std.testing.expectEqual(5, 5);
 }
```

    Note the bug. ZLS, the Zig language server, doesn’t tell me there’s a problem and Zig happily compiles and runs this test:

```
φ zig test lazy.zig
All 1 tests passed.
```

    Why? Because the `newPerson` function isn’t called in the test.

    Again: this probably trips only me up because lack of understanding of comptime. (Told you: not an expert-analysis, but raw, dumb thoughts)

- Expressions are everywhere and I love it. I love that `switch` can be used as an expression, I love that `if` can be an expression. I love that even [loops can be used as expressions](https://ziglearn.org/chapter-1/#loops-as-expressions).
- After this week of coding, I probably need to go back and re-read a few things. That’s the best way for me to learn: read something, try it out in practice, go back to reading.
- It feels *very early*. I first played around with Rust in, I think, 2015 and *that* felt very early, but Zig feels even earlier. There’s not a ton of standardized documentation, everybody’s using the latest/nightly version of Zig, Zig’s still changing, the package manager story is being written right now, patterns are still emerging, community is full of hackers that already know a lot of other languages and are interested in compilers and languages. It’s nice, it’s raw, I enjoy it, but you need to adjust your expectations accordingly.
- The best learning resources I’ve found so far: [ziglearn.org](https://ziglearn.org/), [Learning Zig](https://www.openmymind.net/learning_zig/), [Ziglings](https://codeberg.org/ziglings/exercises/), the [stdlib](https://github.com/ziglang/zig/tree/master/lib/std). [Zig Discord](https://discord.com/servers/zig-programming-language-605571803288698900) is immensely helpful, too: I had two questions of mine answered within 15min.

Last thought after this week off and also probably related to Zig: I love programming very much.

---

# One Week of Nothing to Do

*All the things I could do*

By Thorsten Ball • October 15, 2023

---

I have next week off. No reason except that I need a week off. That means I have one week of nothing to do. No travel, no big family events, kids are still going to school, my wife is working, and I have nowhere to be and nothing to do.

What do I want to do in a week with nothing to do? Here’s a list of things that popped into my head while pondering that question:

- Go for a long bike ride.
- Go to lunch with my wife at this restaurant here in town that we both really like.
- Watch a very good movie I haven’t seen before.
- Keep digging into the Zig compiler, following [the same approach that I took last week](https://x.com/thorstenball/status/1711969973663355122?s=20).
- Write [a Monkey](https://monkeylang.org/) in Zig, using as many patterns from the Zig compiler as I can.
- Finish reading [The Making of the Atomic Bomb](https://twitter.com/thorstenball/status/1698206176700137845). I’ve been at it for far too long now. The book is like a companion by now. I’ll miss it.
- Work out every day. Last week was heavy and that kicked my butt. I’m hoping to get some accessories in this week.
- Hack on [Ghostty](https://mitchellh.com/ghostty). GUI programming is still alien to me. Maybe I can add a little feature.
- Fix the sealing of the patio roof. Noticed some heavy water drops making it through and fall is the time when it’s especially nice to sit outside with a roof over one’s head.
- Pre-write some newsletters.
- Visit my dad.
- Do some gardening. I have to cut down the hydrangeas.
- Learn how to bake pizza. After years of thinking about it, I ordered a new pizza stone last week. [Patrick](https://twitter.com/dubroy) gave me access to his pizza dough recipe. Gonna try it out for lunch, to share with my wife. I don’t want to make the kids cry with my first attempts.
- Just like last few weeks: drop off my daughter at school every day.
- Go to spa with my wife. That was a birthday present to her. Now we’re doing it.
- Finally try out Tailwind.
- Play around with Dall-E.
- Go for hike, uphill with weight vest on. Always a good feeling for the rest of the day.
- Flesh out README for my compiler. It’s been sitting around unused. Maybe fresh coat of paint will tell me what to do with it.
- Migrate [my Vim config](https://github.com/mrnugget/vimconfig) to Lua so I can use [lazy.nvim](https://github.com/folke/lazy.nvim) as the package manager.
- Play GTA V, which I’ve last played probably 6-7 years ago. This time I’m going to play it not on the old PS3, but on my gaming computer. See what that’s like.
- Go for a walk in a residential area of a town around here I haven’t been in. I always enjoy seeing other people’s houses and garages and gardens and what kind of toys the kids leave lying around outside and whether there are any garden gnomes and whether I can tell what the people living in the house do for work.
- Buy new glasses, or at least get new lenses for my glasses. Current pair is so scratched that I keep rubbing the screen, thinking there’s dirt on it.
- Take the kids to a playground we’ve never been to.
- Maybe visit a friend in Frankfurt.
- Drive to this one butcher’s shop in the town I grew up in and buy some sausage. I don’t know why I crave this. There’s something about going to a normal shop on a weekday’s morning.
- Turn this idea I have of this tiny, absolutely minuscule book into maybe a couple of pages of draft.
- Watch the Strange Loop talks that I didn’t get to watch while I was there three weeks ago but that have been recommended to me: [this](https://www.youtube.com/watch?v=6Ao8GS488hA) and [that one](https://www.youtube.com/watch?v=prM-0i58XBM).
- Clean up the shed. As always.
- Finally assemble the IKEA furniture we have sitting in our bedroom.

There you go. A week of nothing to do.

---

# Who removes rules?

By Thorsten Ball • October 8, 2023

---

Rules are an endless source of fascination and dread to me. How rules are created and why, how rules accumulate, how a set of rules shapes a system – it’s very, very interesting. Let me give you an example.

A couple years ago my wife and I were chatting with our tax advisor and he went off on a little rant about how the tax rulebook in Germany is getting thicker and thicker every year. “When I started out,” he said, “it was half the size! But they don’t know that!” The anonymous They he referred to are the young people working in the tax office today. His point: the young people who are just starting out working in the world of taxes don’t know that the whole world doesn’t come crashing down when you only have half the rules. Even though evidence points to the contrary.

My parents work in the construction business and my family on my mother’s side has done so for at least 70 years. Same thing: my mom says that every year they get an additional set of rules. Rules around what you can and can’t build, how to build it, how to document and who to report to what you built. She frequently points at (to me) normal-looking houses and says “you wouldn’t be allowed to build that today.”

I’m not here to say that everything was better before I was born. No, this is about rules. Two examples from two different worlds, the same pattern: rules accumulate over time. I asked my mom and my tax advisor the same thing: are rules ever removed? No, they both said, basically never.

If you’re like me and you have a voice in your head constantly asking “so how does this apply to software?” – relax, we’re here. In software we too have rules. We don’t have that many laws but we do have rules: checks in our CI systems, linters, and so on. But also rules that create *processes* in our companies that then govern how we create software.

Inside and outside of software, there’s one pattern that leads to a lot of rules: something bad happens, it’s agreed that it was bad and that we should avoid it from happening again, a rule is put in place to avoid it from happening again.

That’s when the first beads of perspiration begin to form on my forehead. You just made the rule book thicker!

Don’t get me wrong: I agree, the bad thing was bad, yes, we should avoid it from happening again. No one wants the f-word to show up in customer-facing documentation ever again. But look: rules aren’t free.

Rules need enforcement and enforcement takes time and resources. Every rule added to the tax code needs someone to know about it and to enforce it. Every CI check needs to run. Every linter needs your CPU when you save a file.

“Thorsten, you worried about a linter rule that takes 3ms to run?” First of all: I wish it was just 3ms. But even if, second: I’m not worried about a *single rule*, I’m worried about the rulebook growing thicker. A heavy book of linter checks will take longer than 3ms to run, I assure you. And every rule and process is a step in the direction of the rulebook getting thicker.

Because *rules are sticky*. They rarely have an expiration date. When they’re created it’s rare for someone to ask “do we really think the bad thing will happen again? Do we need this rule?” And once a rule or a process is put into place, you have to argue twice as hard for its removal than it was to introduce it. A rule prevents a *bad thing*, how can you argue to remove the rule that prevents the bad thing from happening? You want bad things to happen? You want the f-word to show up in the docs again? Thought so.

That’s how it goes, usually. And it worries me. It worries me tremendously. On a societal level because at least in Germany the chances are slim for someone to stand up and say: hey, look, maybe the bad thing will happen once in a thousand times and that’s fine and we’ll deal with that then and maybe the rule is an overreaction? And I’m not even talking about healthcare or traffic laws, I’m talking about the fact that I can only dump lawn clippings at the recycling place certain times a week because, oh my god, if we allow folks to just come and go and dump dead leaves whenever they please, someone might just show up and throw an old washing machine in there? Can’t let that happen.

On a software level because it took me two years of arguing for us to remove a linter check that makes sure no one uses single-letter variables and uses `index` instead of `i` in `for` loops.

On a company level because saying “do we really need that process?” always sounds like you’re against the thing the process is trying to achieve.

Most of all because a thick and getting-thicker rulebook narrows your possibilities and with that narrows your perspective on what’s possible. It takes an enormous amount of mental effort to see possibilities past a set of rules that are designed to prevent one-off edge cases.

It’s far easier to think “that’s not possible” than “yes, that’s possible, if we ignore these five rules here that then wouldn’t apply anymore anyway.”

*Editorial note: I’m on vacation next week. I might skip the newsletter.*

---

# Someone on the Other End

By Thorsten Ball • October 1, 2023

---

Every time I’m in the gym I use the same app on my phone: [KeyLifts](https://apps.apple.com/us/app/keylifts-531-workout-log/id1437949461?platform=iphone). For 3 years now, four to five times a week, the same app. I love it. I pay for the yearly subscription and the app is a huge if not the only reason why I’ve been running the same workout program (5/3/1) for years now. Whenever someone asks me about working out, I tell them about this app.

Yet I can’t point at a single feature that makes me love it so much. It has some great features, sure, but most of them you can find in other workout apps too. There’s even bugs here and there.

The reason why I love it then? Because every time I use it, it feels like there’s someone on the other end. I use it and think: this was built by a single person who cares. And that person also works out and uses this app, probably used it yesterday. A thousand tiny features for power users, small details tweaked multiple times, a changelog that reads like text messages from a workout buddy. It’s not clean and consistent, but charming. I don’t know how to express it any other way but to say: I don’t feel alone when using the app; I feel like I’m sitting in someone’s living room.

That’s rare, isn’t it? There’s a lot of software that doesn’t even feel like it was created by people. macOS, Windows, the Amazon app on my phone – the feeling: yep, this was created by a large corporation alright.

So here’s a thought: how can I make the software I write feel like it was written by someone who cares?

---

# Learning from Bellard

*What if software was like science in the early 20th century?*

By Thorsten Ball • September 24, 2023

---

For the past few weeks I’ve been reading Richard Rhodes’ [The Making of the Atomic Bomb](https://en.wikipedia.org/wiki/The_Making_of_the_Atomic_Bomb). Yes, weeks. It’s a 1000 plus pages, don’t judge me.

The book is *fantastic*. Just really, really good. I highly recommend you read it and I’m going to stop there, because every description I could write would not match the brilliance of the book.

So instead let me share something from the book that I’ve been holding up in my head next to thoughts about programming and software development.

Early in the book, Rhodes describes the world of science in Europe in the early 20th century (again: just fantastic) and what stuck with to me were the descriptions of how people became scientists. Rhodes writes:

> Physics students at that time wandered Europe in search of exceptional masters much as their forebears in scholarship and craft had done since medieval days.

Which meant in practice:

> If someone whose specialty you wished to learn taught at Munich, you went to Munich; if at Göttingen, you went to Göttingen. Science grew out of the craft tradition in any case;

Scholarship and craft. Rhodes putting it in historical context:

> in the first third of the twentieth century it retained – and to some extent still retains – an informal system of mastery and apprenticeship over which was laid the more recent system of the European graduate school.

Then, later in the book, he writes:

> To become a scientist, Polanyi thought, required “a full initiation.” Such an initiation came from “close personal association with the intimate views and practice of a distinguished master.” The practice of science was not itself a science; it was an art, to be passed from master to apprentice as the art of painting is passed or as the skills and traditions of the law or of medicine are passed.

In the roughly 400 pages that follow (which is as far as I’ve read), there are many descriptions of different physicists and chemists traveling around the world to work for another scientist. Bohr moving to England to work with Rutherford. Other people moving to Denmark to work with Bohr and so on.

All of that made me wonder: what if we had that in software?

We already have something like a global community, right? Through open source, conferences, blogs, social media, forums, podcasts, newsletters and, I guess, the internet in general, we know what other programmers on the other side of the world are working on. We sometimes know their tools, how they write code, how they test, and so. I mean, I flew from Frankfurt, Germany to St. Louis, USA last week, visited a conference, and someone walked up to me to say that they are reading this newsletter (Hi!) — if that doesn’t have at least a streak of global community to it, I don’t know.

But then I wonder: what if we had the apprenticeship part? What if someone could, for example, say “I want to work for [Fabrice Bellard](https://bellard.org/)” and then work for Bellard? What if they then train another programmer and could say things like “I learned this from Bellard”?

In some sense, I guess, we already have this: you *can* learn from Bellard by reading his code. You *can* learn from John Carmack by listening to 3 hour podcasts with him. You can learn from a lot of programmers by reading their blog.

But is it the same? What if you could sit next to them in an office, work with them on projects, have them guide you through a project?

Or, while we’re at it, what if you could do “learning sabbaticals” at other companies? Just like a Niels Bohr would go to England for 2 semesters to work with Rutherford, what if you could, say, work for the compiler team at Apple and then go back to your job after 6 months?

By now you know how this newsletter works: I won’t have answers here. But it’s nice stuff to think about, isn’t it?

---

# You don't need an opinion

By Thorsten Ball • September 17, 2023

---

This week I was talking with a teammate about a programming language he’s exploring. He said:

“I’m just not sure whether I like it or not”

Huh, I thought. Right, you think you have to like something or not.

Easy mistake to make. The internet’s opinion-density is famously high. It’s natural to think that having and sharing opinions is required.

Turns out: no, you don’t need to have an opinion. Nobody forces you to put things into Like and Don’t-Like columns. If someone asks what you think of something you can always say you don’t know.

It wasn’t long ago that I started to understand this and ever since then I have been trying to remind myself [and others](https://twitter.com/thorstenball/status/1391785544192040963) of it. The conversation this week made me realize that I’ve actually made some progress.

Ask me how I like Rust. I’ve been building a compiler in Rust for the past 2 years and my answer would be: I don’t know, man. There’s things that make me smile, there’s things that make me scratch my head. I don’t know what the overall score is. I’m learning and exploring Zig right now. There’s things that make me say “oh that’s cool” and things that make me say “hmm, not sure I understand”.

It doesn’t matter whether I like it or not. I can use it or not.

That doesn’t mean I never have opinions. I do have them, even strong ones. But I no longer think I have to have an opinion on everything I come across. It’s very, very freeing.

Let the opinions come to you, slowly, over time. Explore and observe, try to find out why you have certain gut reactions, why some things resonate and others don’t. You’ll end up learning much more and, surprise, build up a more complex, nuanced view than if you had approached a new topic with unholstered Like and Hate stamps in hand.

---

# Has Software Development Become Slower?

*Or: Catching Up With Carmack*

By Thorsten Ball • September 10, 2023

---

I found this [tweet](https://x.com/molecularmusing/status/1699085235588079962) very interesting. Let me quote the main part:

> Halfway through this book, I’m constantly amazed by how fast the early id Software guys got things done and games released.
> Can’t help but think that modern day SW dev has become bloated, overengineered, and slow, compared to earlier days.

“This book” is John Romero’s memoir [Doom Guy](https://romero.com/shop/p/doomguy) and id Software is the company that produced Doom, Quake, Wolfenstein, and other games. I haven’t read the book yet but I have read (and highly recommend) [Masters of Doom](https://en.wikipedia.org/wiki/Masters_of_Doom) and, yes, the speed with which id Software shipped games in their prime is remarkable. As the author of the tweet writes [in a reply](https://twitter.com/molecularmusing/status/1699091999637270715):

> Coming up with new tech and shipping that in 4 months. Creating a SNES port in 3 weeks. No off-the-shelf engines available back then.

A SNES port in 3 weeks? No matter *what* is being ported, 3 weeks for a platform port is fast.

What about the second line, though? Did software development become “bloated, overengineered, and slow”?

Let’s start with that first adjective – bloated. It comes up again and again in various comments on the internet: software has become bloated, which is used to mean that software uses too much memory, it’s slow, inefficient, and, actually, why do we need all that crap.

I’m not sure I buy it. Sure, if we compare CPU speeds from today with those from 1999, the conclusion that things should be *a lot* faster isn’t even a jump away. I don’t think it’s quite that easy, though. Hardware has gotten better & faster, but the workloads we throw at computers have also grown: our screen resolution isn’t 640x480 anymore, instead we have 120Hz displays and watch 4k movies, instead of text we routinely send *screenshots of text* around that take up more disk space than all of the images contained in a Windows 2000 installation combined (don’t fact check me). Windows 95 had a 256 color palette, but when I open Slack today there’s a chance I see three high-resolution, 200MB GIFs playing at the same time – of course that uses more memory than `paint.exe`. That’s only one dimension – asset sizes – but you get the idea.

This type comparison between old and new technology isn’t software specific. I’ve seen it happen when we built our house three years ago. You’d see how much a house costs and wonder: why are houses so much more expensive than the house my parents built in the 80s? And yet they’re still smaller? Turns out expectations and standards slowly rose over the past 40 years: houses in the 80s didn’t have proper insulation, floor heating, that many windows, that many power sockets, triple-pane windows, Ethernet cables in every room, etc. Quality & prices went up, but it’s hard to notice because most of it is hidden behind the walls or floorboards, and you end up with a comparison that doesn’t make a lot of sense.

Or take phones: a few years ago, non-tech friends of mine would say “a thousand bucks for a phone?! I remember when I could get a phone for a hundred and its battery lasted for five days!” Sure, dude, but did that phone have a megapixel camera with post-processing software that made your DSLR of that time look bad? Was that phone also constantly connected to the internet? Did it have a high-resolution, 120Hz display? Did you also use it for 3 hours every day and did you also use it as a navigation system in your car, your entertainment console at home, your book library, your video library, and as your online-shopping device? That phone from a few years ago is not in same league as the “phone” you use today. They don’t even play in the same stadium.

But I’m starting to digress and I need to wrap this up. Look, I don’t want to brush off the claim that software has become bloated. I think it did, but it’s more complicated than comparing memory usage and required disk space. (Let’s talk about latency instead!)

There are two other adjectives in the tweet – “overengineered, and slow”. These two got me thinking, because yes, the time-to-ship numbers that id Software put up do seem hard to achieve.

I have two thoughts here. The first one is similar to the one about bloat: software has become more complex, which makes shipping take longer, but you don’t necessarily see the complexity, which is why the speed (or lack thereof) seems hard to explain. This is a hunch, a gut feeling, so instead of pointing to clear evidence, let me throw some ideas into the room and wave my arms wildly instead.

Have you ever tried to implement an OAuth authentication flow? Ever compared the sweat that came out of you with the amount of time a user spends thinking about what goes on in the background when they click “Login with …”?

Ever implemented something that works for hundreds of thousands of users at the same time? If so, did you ever hear a user say “wow, I can’t believe that a hundred thousand other people use this at the same time as me, without any problems, that’s magical”? Okay, didn’t think so.

Ever made a website look *nearly* exactly the same in four different browsers on desktop, on phones, and even gaming consoles, just for one user to ask “why don’t you use this native element here?”

My point is: a lot of complexity is required just to meet today’s baseline expectations and when you meet them a user doesn’t scream out in joy, they just use it. Maybe that’s one reason why software development has become slower?

The other thought I have is even less defined and the one I’m going to leave you with in classic give-’em-something-to-chew-on-and-walk-out fashion.

Here it is: maybe, MAYBE, software development has become slower, because that’s just what happens when you add more people to software projects? And maybe that’s also what happened to the software ecosystem as a whole?

You start out knowing the whole stack of your project. That allows you to move fast because you know where everything is and if you bump into a problem and something *over here* feels hard and cumbersome, you know that you can change something *all the way over there* which will turn the problem you’re currently facing from I-need-to-duct-tape-this into Oh-now-it’s-just-a-matter-of-configuration.

But then you realise that won’t scale when you want to add more people, but you also want to add more people, because you want to ship more and faster. So you add another person to your project and say “you worry about this bit, I worry about that bit”. Then, later, when you bump into a similar problem as before, you know your bit, but you can’t make the change all the way over there, because you have no clue how that system works anymore. So you need to wait for your buddy and ask them to change it for you.

You end up not knowing the full stack anymore because *adding more people grows the stack in a way that makes it unknowable*.

That happens on small projects with abstractions between programmers, it happens on large projects with abstractions between teams, and, I think, it happens in the larger software ecosystem. We build and share libraries that other people and companies and teams can use. We build our software on top of other people’s code that we haven’t looked at once. When you sit on the shoulders of giants – giants that are made up of millions and millions of lines of code – nearly everything becomes a I-need-to-duct-tape-this problem, because you can’t wait for a hundred people to make whatever change you want to make easy.

Does that mean I think speed of software development is a function of programmers knowing the full stack? Well, I guess so. But there’s caveats: what even is the “full stack”? Does it include the OS? The file system? The network? You have to have limits somewhere, no? Even Carmack didn’t write his own OS to ship a game.

I think the most important bit is to know that adding more people and abstractions changes the speed with which you can make change. We all know by now that adding more people to a project doesn’t make it ship faster. But do we all know that adding more people also influences (lowers) the top speed at which software can be developed?

---

# Momentum

*Or: the goal is to be a monkey swinging through the trees*

By Thorsten Ball • September 3, 2023

---

I’m sick in bed today, so this one is short and involuntarily ironic.

When thinking about working and getting things done, I often come back to the idea of momentun.

Here’s how I think about it: when you’re being productive and checking off your TODOs, continuing to do that or doing even more seems easy. You’ve built up momentum and use it to propel you forward. A monkey swinging through the trees. Contrast that with not having started at all and everything you have to do feels like *too much*. Too much to even start.

Momentum is the difference between “Hey, I made 5 phone calls I’ve been putting off for weeks just now; sure, I’ll call the doctor too now and make an appointment for next week” and “I’ve been scrolling on my phone for 2 hrs; I’ll take the trash out later.”

Nothing revelatory in these lines, I’m sure. Yet it still feels to me as if the idea of momentum is underrated. Or more specifically: I don’t see a lot of folks consciously making use of it. Momentum isn’t just something that sometimes happens to you – you can create it.

Instead of slogging through that pull request that’s too big and that feels like it’ll never get merged, try splitting it up. Again, nothing new here – everybody knows small PRs are better. But have you ever tried shipping small changes *just* to build up momentum? I often do that when sitting down to work on a small project. Instead of wondering what I should do, I’ll start by cleaning up the README, or the `todos.md` file, or adding another test. After three commits, three more seem much more achievable.

There’s two ideas here:

1. Organize work so it allows you to keep momentum: small changes and small tasks that build up to a bigger thing but that give you the satisfaction of checking off todo items.
1. Consciously building up momentum by not starting with the task that will be slog, but ones that you know will give you momentum.

With that, back to bed.

---

# Every Line a Chance for Greatness

*Or: Why I'm So Into Code*

By Thorsten Ball • August 27, 2023

---

*You’re reading Register Spill, my weekly newsletter in which I share thoughts I can’t keep in my head. *

In The Bear’s season 2 episode 7 (which I highly recommend and could and probably will write more about), there’s a scene in which one character asks the other why they’re so into working front-of-house in a restaurant. Their reply: „every night there’s a chance to make someone’s day” It reminded me of something.

As a teenager and for a few years in my twenties and thirties one of my hobbies was [10 meter air rifle shooting](https://en.wikipedia.org/wiki/ISSF_10_meter_air_rifle). In case you haven’t been to one yet, let me assure you: Bavarian small-town shooting clubs with air rifles are probably *nothing* like you imagine them to be and air rifle shooting has as much to do with “shooting guns at the range” as seen in US movies as Olympic weightlifting has to do with bodybuilding in a gym. Just look at [this picture](https://en.wikipedia.org/wiki/ISSF_10_meter_air_rifle#/media/File:Air-rifle-shooting.jpg) – that’s what I looked like as a teenager on Friday nights, you figure out the rest.

Here’s how 10 meter air rifle works: you have 40 shots, the target has scoring rings from 0 to 10 points, perfect score is thus 400. My personal record is, I think, 378. I hovered around 360 most of my shooting career. 360 means that the average points per shot is 9.

Now here’s the thing. Say you want to shoot 360. If you take a shot and go below 9, ding ding ding, you are in debt, you have to catch up because you’re not on track to reach 360 anymore. Get a 7 and you have to shoot two 10s to make up for it. Shoot a 3 and that 360 looks far, far away.

Ultimately, that (and the long drives to the club house after I moved) was one of the things that turned me away from the sport: I couldn’t handle that making a mistake at the start meant that I’d then would have to to either catch up or know, while taking the remaining shots, that you won’t catch up. I like under-promising and over-delivering. I despair when over-promising and having to deliver.

Conversely, that’s why I think I like writing code and working with software so much. Because with code, it’s different.

Sure, you can back yourself in a corner when writing code. You can build something today and forget how it works tomorrow. There’s legacy code, tech debt, code as undocumented as a barn full of hay and ready to go up in flames just as so.

But there’s also always a chance.

Code isn’t chiseled in stone. It’s malleable. It’s written on blackboard and you always have sponge in hand to wipe it all off.

Every line you write or change – a chance, a new shot, to write something great. Write a 1000 lines of code tomorrow and you have a chance and a thousand single ones to write something great. The score is reset every time you crack your knuckles.

Every line you can make great. What that looks like depends on the line your cursor’s on. Maybe great means to make it as succinct as possible. Or maybe you can get the formatting just right. Or make it as clear as possible. Or the most efficient version it can be.

There’s no clock, there’s no score; you get a new attempt every time you touch the keys. If you start off bad and write 10 awful lines of code, tomorrow you get 10 chances to improve it.

That’s why I’m so into it.

---

# Is looking cool underrated in education?

By Thorsten Ball • August 20, 2023

---

*You’re reading Register Spill, my weekly newsletter in which I share thoughts I can’t keep in my head.*

A couple weeks ago, on social media, a [dad was talking about the best materials to teach his kid how to program](https://twitter.com/stylewarning/status/1688810456667009024). It’s a very interesting thread and I recommend reading it. What stood out to me: most of the learning materials just don’t look *cool*.

Let me be clear. I do NOT mean that they don’t look good, or that they don’t look like great learning resources, or that they aren’t valuable and a lot of work went into them. I mean exactly what I wrote: they don’t look *cool*.

If you would’ve shown the 12-year-old me the [Scratch landing page](https://scratch.mit.edu/), or [How To Design Programs](https://htdp.org/) (which someone links to in the thread above), or the [Bootstrap Hour of Code](https://www.bootstrapworld.org/materials/fall2023/en-us/courses/hour-of-code/) and asked “hey, how about it? wanna learn how to program?” I’m sure he, well, me, would’ve said no. Zero doubts about that. And if you would’ve then asked 12-year-old me why not, he probably would’ve said that it just looks like school, it reeks of teachers and exercises and homework and math and “useless stuff” (not an actual quote, but you get it).

Teenage-me became interested in programming because of this: useless JavaScript animations on a website (little balls following the mouse cursor), IRC bots and mIRC scripting, green text on dark background, the terminal itself, reading about the demo scene, open source software, the movies Hackers and 23, Linux, reading The Cuckoo’s Egg, these little programs to crack games, trying to do everything from the command line for absolutely no practical reason.

Ultimately I did end up reading textbooks and proper materials and looking at definitely-not-cool slideshows with Comic Sans in them, but the fire was lit not by the promise of learning something useful. No, it was “this looks cool” that set everything into motion and that still keeps me going.

Inspiration comes and goes in funny ways, all of them different for each person. For me, it rarely takes the path through a classroom in which something “useful” is being taught and I know that if I had started to program only with the resources linked above, I probably would’ve stopped soon after.

---

# Programming in a Well-Tested System

By Thorsten Ball • August 12, 2023

---

Over the last few weeks, I’ve been listening to the [Software Engineering at Google](https://abseil.io/resources/swe-book/html/ch12.html) book. I’ve read one or two chapters over the past few years, but never the whole thing.

While listening to the chapters on testing, I’ve had something of a personal lightbulb moment. Or: smile-to-myself moment.

Here, let me set the scene by giving you some excerpts. This is from the [the first chapter on testing](https://abseil.io/resources/swe-book/html/ch11.html):

> Small tests are the most constrained of the three test sizes. The primary constraint is that small tests must run in a single process. […] The other important constraints on small tests are that they aren’t allowed to sleep, perform I/O operations, or make any other blocking calls. This means that small tests aren’t allowed to access the network or disk.

Later, in the same chapter:

> All tests should strive to be hermetic: a test should contain all of the information necessary to set up, execute, and tear down its environment. Tests should assume as little as possible about the outside environment, such as the order in which the tests are run. For example, they should not rely on a shared database.

And this one:

> We like to say that “a test should be obvious upon inspection.”

The [next chapter is on Unit Testing](https://abseil.io/resources/swe-book/html/ch12.html#preventing_brittle_tests) and contains these paragraphs:

> When an engineer refactors the internals of a system without modifying its interface, whether for performance, clarity, or any other reason, the system’s tests shouldn’t need to change
> 
> The takeaway is that after you write a test, you shouldn’t need to touch that test again as you refactor the system, fix bugs, or add new features.
> 
> A clear test is one whose purpose for existing and reason for failing is immediately clear to the engineer diagnosing a failure. Tests fail to achieve clarity when their reasons for failure aren’t obvious or when it’s difficult to figure out why they were originally written.
> 
> Two high-level properties that help tests achieve clarity are completeness and conciseness. A test is complete when its body contains all of the information a reader needs in order to understand how it arrives at its result. A test is concise when it contains no other distracting or irrelevant information.

Alright, the scene is set.

Now, here’s what I was thinking while listening to these paragraphs: this would be a really nice codebase to program in.

No direct mention of non-test, production code and yet after hearing about how it’s tested I was convinced it must be nice to work with.

Needless to say, I’m not a member of the “ugh, you’re changing the code *just for the tests*?”-club. In fact, I’ll never understand why that club exists.

If a system is easy to test, it’s usually easy to work with — easy to extend, easy to debug, easy to refactor. Maybe because adding tests *is* a form of extending, debugging, and refactoring a system.

The inverse – a system that’s easy to work with is easy to test – is, at least in my experience, not necessarily true.

---

# To truly fix a bug, one must truly know the bug

By Thorsten Ball • August 6, 2023

---

*You’re reading Register Spill, my weekly newsletter in which I share thoughts I can’t keep in my head.*

Yesterday, [Mitchell wrote about a bug and its fix in his Ghostty Devlog 002](https://mitchellh.com/writing/ghostty-devlog-002). On displays with a DPI that couldn’t be clearly divided by 72, fonts would end up being blurry. Yes, it’s gnarly. I helped find the bug, but reading Mitchell’s analysis made me realise again: in order to truly fix a bug, one must truly know the bug.

When trying to fix the bug, I traced all the involved values through the code and realised that if I change them to integers the fonts become crisp. Mitchell, on the other hand, understood *why* the calculation was made in the first place, *why* it was using the specific values it did, and – most importantly – how that relates to the GPU, how it renders text, and why that leads to blurry fonts. I came up with a 2-line fix, but Mitchell went and fixed the whole data structure in which the values are kept, audited the codebase for similar issues, and found another bug.

It’s really easy (and often tempting) to fix a bug without really fixing it. You make the wrong behaviour go away, but you haven’t fixed the bug. Many race conditions can be “fixed” by adding sleep-statements, but in order to really fix them, you need to understand why and when and how they happen.

That’s not always possible nor feasible, though. Sometimes, say when you’re working with a proprietary API, it might be acceptable to fix a bug and comment `// We don't know why this happens, but when we add a newline at the end, it works`. Or maybe the *right* fix would mean you have to re-architect your whole application, only for, say, some UI jitter to go away when you double-click a button. Tricky balance to strike. Truly fix everything you come across and you might end up having to reinvent the whole stack. Only superficially fix bugs because that’s faster and you might end up with the whole house of duct-taped-together cards crashing down on you. It takes a lot of bug fixing to develop an intuition for when and how to go deep.

Then again: is it even possible to “superficially fix” a bug? Or is that just a workaround? Do you “fix” a wobbly table by shoving a piece of folded-up paper under one leg?

What I do know for certain: you should make conscious choices about how to fix a bug. Make sure you know whether your fix is a fix and if it isn’t you should have an explanation for why it’s not.

---

# Software is like Coca-Cola

By Thorsten Ball • July 30, 2023

---

*You are reading Register Spill - my weekly newsletter in which I share thoughts I can’t keep in my head.*

In 1975, Andy Warhol wrote:

> You can be watching TV and see Coca-Cola, and you know that the President drinks Coke, Liz Taylor drinks Coke, and just think, you can drink Coke, too. A Coke is a Coke and no amount of money can get you a better Coke than the one the bum on the corner is drinking. All the Cokes are the same and all the Cokes are good. Liz Taylor knows it, the President knows it, the bum knows it, and you know it.

---

I’m not entirely sure, but I think it was 2001 when I built my first website. I had somehow ended up in the after-school computer class my older sister was attending – either I talked my way into it, or our mom figured it’d be easier to pick us up together from school.

The teacher showed us how to build websites with [Microsoft Frontpage](https://en.wikipedia.org/wiki/Microsoft_FrontPage) and introduced us to HTML and JavaScript.

I’m not exaggerating when I say it felt like playing with fire. I was already a big fan of the Internet and now I got to play around with the stuff the Internet is made of? Probably some of the most fun and excitement I ever felt in that school building.

“So how do I show this to others?” I asked.

“You’ll need webspace and a domain probably. Then you’ll need an FTP program.” he said.

I didn’t know what any of these words meant but I somehow figured out how to get all three: 5 or 10MB of webspace, a .de.vu domain, and an FTP program.

The thrill I felt when I visited my uncle and typed my domain name into the browser’s address bar – the same browser that’s used to visit the other websites, the *real* ones, the ones built by large companies. That browser now showed *my website*! On the same Internet! Next to all the other websites!

I couldn’t believe it. “This is it?!”, I kept wondering, “I can just upload my own website and it shows up on the Internet?”

---

It’s been over 20 years and I still feel the same way – about websites, about the Internet, about software.

To bastardize the Warhole quote from above: software is software and no amount of money can get you a better piece of software than the one the bum on the corner uploaded to GitHub.

All you need is a computer and an internet connection. No degree, no entry fee, no test you need to pass. Start typing and push it out into the world. Your software will sit next to the greats. There is no room that you don’t have access to in which the Linux kernel, or Redis, or Neovim are being built. It’s the same computers, the same internet connection, the same tools that you have access to.

---

# Allergic to Waiting

*Is one second fast or slow?*

By Thorsten Ball • July 23, 2023

---

Many times in your day-to-day programming life you have to wait. Wait for your development environment to boot up, wait for the formatting-on-save command to finish, wait for the website you just opened to load, wait for tests to run, wait for the CI build to finish.

The waiting doesn’t really cause me physical pain, but it does evoke a physical reaction alright. I just can’t stand it. Maybe it’s because I’m impatient by nature. Maybe it’s knowing that things could be faster that causes it. When I have to wait ten seconds for a test to finish that I plan to run many times over the next hour, I tell you, it feels as if I’m about to lose my mind.

Then, when I’m down on my knees, screaming at the sky, asking the universe why this is taking so long, asking for salvation, and I look to my left and my right – no one’s there. Everybody’s sitting at their desk, shrugging.

This isn’t meant literally. I work remotely. If I truly would expect someone to scream by my side when I wait for a website to load then, well, then I guess I did lose my mind.

The point is: it sometimes feels as if others don’t care as much. Or maybe they do care, but their pain threshold is higher, their judgement of what’s fast and what’s slow is different than mine. What I perceive as unacceptable isn’t perceived by them at all.

A few months ago I was on a call with a colleague, pairing on something. He had to run a command to re-generate some files. “Do you really want to do this now? This is doing to take like ten minutes” he said. “What the fuck” went through my mind and “Wait, what?” is what I said. I knew that command and I knew that it takes 15 seconds to run on my machine, 30 tops. Ten minutes? That’s too slow. Something must be wrong, I thought, and something *was* wrong.

I asked him to run the command, because, yes, I need to see this, there’s no way it should take this long. So he ran the command and we looked into what was going on. I’ll keep it short: the command spawned a shell, but my colleague’s shell setup was borked and caused another shell to spawn, which caused another shell to spawn, which… The command that ran in 15 seconds on my machine was a fork bomb on his. It’s still not clear to me how it would *ever* finish for him.

The even bigger mystery: how he would’ve just shrugged it off if I hadn’t been there.

One theory I have: it might be due to a lack of a mental model. If you don’t know what that command is doing under the hood – finding the tens of files out of a hundred thousand that need to be recreated and running a generation command for each one – then maybe you think ten minutes is a reasonable time to wait for it to finish. There *are* things can take a long time, ten seconds or ten minutes, without anything being wrong: booting up a computer, downloading large files, re-encoding video files, extracting big archive files, … If you don’t know whether what you’re currently waiting for falls into that category or not, then you just wait, I guess.

But if the lack of a mental model is the reason, then I should see more people wince when a website takes longer than two seconds to load. There are very few reasons most websites should take long to load. Yet many times when, together with colleagues, I’d watch a website that *we built* load for longer than two seconds and say “something’s off, I bet there’s an N+1 query here” and turn out to be right – nobody else noticed anything.

I’m not a computer performance savant. I can’t put my ear to a machine and guess the clock rate. I just get allergic reactions when I have to wait for a computer for an unreasonable amount of time. So is it maybe that others don’t think that one second can be an unreasonable amount of time for a computer to do something? Is one second is considered fast?

This week I deleted a test in which someone had put a 1-second sleep statement. I ripped out the test for another reason, but seeing that sleep statement… Again: not physical pain per se, but I also didn’t feel comfortable.

Computers can create and destroy entire worlds in one second. One second is multiple billions – billions! – of executed instructions. One second is an eternity for a computer.

Yet I sometimes wonder whether one second is the smallest unit of time most programmers think in. Do they know that you can run [entire test suites in 1s](https://twitter.com/thorstenball/status/1512719157179133957) and not just a single test? Do they know that one second is slow?

Or do they think one second is acceptable, because my generation of programmers grew up on the Internet? On the Internet Jeff Dean’s [Numbers Everyone Should Know](http://brenocon.com/dean_perf.html) seem archaic if not irrelevant: why worry about nanoseconds when pinging the nearest Google server takes 13 milliseconds? On the Internet, one second doesn’t seem too bad maybe

So is it the Internet, with its undersea cables and packets that are sent around the world, that moved the bar for what’s acceptable speed and what not? Maybe.

It’s probably a combination of it all: not knowing what computers are capable of, unsure what a reasonable time for a given task is, and everything going over a network making us think that a single millisecond is not relevant to the work we do.

---

# Nothing in My Way Except Myself

By Thorsten Ball • July 16, 2023

---

This [tweet](https://twitter.com/garybernhardt/status/1667247409158832129) by Gary Bernhardt has been bopping around in my head ever since reading it a few weeks ago:

> It’s also so refreshing to have a problem where there’s nothing in my way except myself. There are zero questions about “can this tool do the thing I need to do?” Only “can I find the solution?” and “can I make it fast enough to be usable?”

I know *exactly* what he’s talking about. I’ve talked about it many times myself.

Whenever I’m asked what I find fascinating about hacking on compilers or interpreters I say this: working on my Monkey interpreter (that turned into [interpreterbook.com](https://interpreterbook.com)) was the most joy-inducing programming I had ever done.

It was so unrestrained, so fast: no libraries, no database, no browser, no UI, barely any IO. Just throw a bunch of strings into one end and run the tests to make sure the right result comes out the other end. The rest is up to you: tokenize it, parse it, evaluate it, do whatever the hell you want. It’s you, your editor, the host language, and the ideas you can come up with.

I highly recommend it to anyone who programs. Sure, we’ve all done this in some form or another, but mostly in small programs: little test script here, very over-engineered fizzbuzz there, maybe some example code over there.

When you’re building a programming language, though, you can grow the program to thousands and thousands of lines of code while keeping everything out of the way, except yourself.

Try it.

---

# The Most Powerful Law in Software

*Earthly constraints & Conway's Law*

By Thorsten Ball • July 9, 2023

---

In 1968 Melvin Conway wrote [a paper](http://www.melconway.com/Home/Committees_Paper.html) that contained the following statement:

> organizations which design systems (in the broad sense used here) are constrained to produce designs which are copies of the communication structures of these organizations

You might already know this as [Conway’s Law](https://en.wikipedia.org/wiki/Conway%27s_law).

Or maybe you’ve heard someone say “Don’t ship the org chart!” which, roughly, points at the same problem: your organizational structure has an effect on the software the people in the organization produce and ship.

Think about it: the structure of an organization – who’s in which team and how they talk to other teams, who needs to report to whom, and so on – has an effect on the software it produces. No, really, think about it: it’s not about the individuals, their talents and skills; it’s purely about the *structure*.

That’s kinda mind-blowing, no? One would think that software, [“only slightly removed from pure thought-stuff”](http://www.grok2.com/progfun.html), stands above such earthly constraints such as how the people who write it talk to each other. And yet, it happens.

A couple of years ago, people said that you can see the org chart when you open the Spotify desktop app. It looked like there was one team responsible for building the desktop app hull, the skeleton, and other teams built the separate views inside the app. One team built the search view, another one built the home page, another one built the artist page, and so on.

I’ve heard the same thing being said about Facebook from 10 years ago: one team built the news feed, another team built the events page, another one built groups page, and then there were teams for the games, for photos, for messenger, and so on. In the navigation bar on the left side you could see a list of engineering teams.

When I first heard about Conway’s Law, I shrugged it off: yeah, makes sense, I guess? The companies I worked at were either so small that there was no org chart *inside the engineering org* to speak of (all of engineering would fit into a single team at a FAANG company, I bet) or the org chart was dictacted by the product itself.

We built SaaS web applications that served three clients: an iOS app, an Android app, and the web frontend. There’s your org chart right there: one backend/web team, one iOS team, one Android team. Done. What’s next on the agenda? I didn’t have a strong feeling of the org chart influencing our product, because, well, we did *want* an iOS app and an Android app, right? There was no friction between what we wanted to ship and the org chart.

Looking back, though, I can see Conway’s Law standing in the corner of the room, smiling, waiting, while we were idly discussing whether web frontend should be a separate team from our backend team.

Now, years later, I’m starting to think that Conway’s Law might be the most powerful law in software. I spent the last four years working at [Sourcegraph](https://about.sourcegraph.com). Joined when we were around twenty employees, now we’re in the hundreds. I’ve seen Conway’s Law.

One part of the product well-engineered, another part dormant – one had a team, the other didn’t. Bug reports that fall into the cracks and disappear, because there was no clear team to assign them to. Directory structures and filenames that make you think of the org chart. Teams kicking ass because they can focus on their own slice of the product, undisturbed by the concerns of what goes on over there, or over there.

Again: one would think that software – intangible, weightless constructs that can be willed into existence, shaped to match dreams, sent around the world in a second, destroyed or replicated millions of times, all with a single push of a button – floats above it all. But is there a greater force in the room in which software is written than the person writing it? And don’t we all know that, while we say we aren’t, we *are* influenced by which title you give us, which role we are supposed to play, who we work with, what we are measured by?

We also know what happens to a codebase when you hire someone who’s really, really, *really* into functional programming right now; or when an ex-Java programmer joins a Ruby team; or when you hire a DevOps person that loves Kubernetes and doesn’t really love your simple Heroku stack; or what your admin area will look like when it’s owned by engineers that dare not to touch CSS or JavaScript.

That *is* Conway’s Law, but zoomed in. Zoom out: what happens to a product and engineering org, when you say there shall now be a dedicated frontend team, or a dedicated SRE team, or a Q&A team, or a platform team, or a Kubernetes team? Your product will look like it.

It’s the most fascinating thing to me: Conway’s Law is not just something that happens to you, it’s something you can see and influence and steer. If you’re building a new product, the structure of engineering teams you decide to have will have much influence on the product as any wireframe.

There’s a million interesting things to ponder: how long does it take until the org structure puts its stamp on a product? Are some products easier to influence than others? Don’t the platforms you deploy to already give you an org chart to start with? What about the programming language and its tooling? Aren’t there individuals who escape the constraints of teams and put their own unique brand on the software, no matter who they report to? Where do you put them, to maximize effect?

Pure thought-stuff, indeed, man.

---

# Stumbling in the Dark

*Trying a new language, new platform, new IDE, new framework*

By Thorsten Ball • July 2, 2023

---

This week I hacked on a macOS GUI application. It’s built in Zig and Swift and uses SwiftUI, Apple’s relatively new UI framework.

I’ve written around 100 lines of Zig code in my life, 0 lines of Swift, and have only once built a proper GUI app — in 2001, using GTK and GNOME to display “Hello, World!”

Swift and SwiftUI also kinda require you to use Apple’s IDE, Xcode, something that I’ve also only used in the peeked-inside-and-said-”ah, ok” sense. You can get by without it, I’m sure, but I’ve worked with iOS engineers in the past and having seen how much build logic can be contained in a Xcode project definition I decided to use it.

New language, new platform, new framework, new IDE.

It was quite something.

I copy & pasted code, I cursed, I googled errors, I asked ChatGPT, I asked [Cody](https://about.sourcegraph.com/cody), I prayed to Xcode’s autocomplete.

I did binary-search-commenting-out of code where I just commented out the first half, reran the build, noticed it still doesn’t work, commented out the other half, reran the build, noticed that it still doesn’t work, said “I need a break”, and got up.

Nothing here is new. Many times have I hacked together code by blindly copy & pasting. I’ve googled error messages ever since people said that it’s a secret trick. My heart knows the desparate hope to find something else besides the unanswered StackOverflow question from 7 years ago more than it knows the joy of an eureka moment. Commenting out code as a last resort? Yeah, I’ve been there - many times.

What’s new is the sum of it. I don’t think I’ve ever been in a programming situation where I didn’t have *any* mental model of what was going on. I always knew something: either the language or the tooling, or the platform, or the framework and its way of thinking.

I’ve hacked apart the JavaScript of someone else’s website without knowing anything but the string to search for in the *.js file — but I know the web. I rappelled into unknown codebases before to leave 1-line fixes, screaming “get me out of here” right after — but I knew the language and the tooling and the runtime.

Here I was completely blind and I started to wonder: is that common? Is *that* what it’s like for people fresh out of college that go into a new job, using a language and framework they’ve never heard of, expecting training-on-the-job?

Is *that* why people use IDEs? To do what I did and type `window.f`, hoping, yearning for that autocomplete box to show up with the `focus()` method I’ve been looking for?

It was very strange. Very frustrating. Very refreshing, in the cold shower kind of sense.

Illuminating, too. I realised: I like learning by *doing*, but I need to know *something*, anything, before I start. How different would this week’s experience have been, had I spent 1 hour reading about SwiftUI or looking at an Xcode cheat sheet?

*(Note: talking about stumbling in the dark — I’d love to hear from you! What you think about the newsletter, what you enjoy or don’t enjoy about it, which advice you have for me.)*

---

# Cadence of Code

*What's to learn from retyping code?*

By Thorsten Ball • June 25, 2023

---

*I was on vacation and paused the newsletter for two weeks. Now I’m back. Thanks for reading.*

Hunter S. Thompson, author and journalist, typed out other people’s writing – entire novels, even – to learn from them. [In his words](http://brianjohnspencer.blogspot.com/2014/06/hunter-s-thompson-typing-out-work-of.html):

> If you type out somebody’s work, you learn a lot about it. Amazingly it’s like music. And from typing out parts of Faulkner, Hemingway, Fitzgerald - these were writers that were very big in my life and the lives of the people around me - so yea I wanted to learn from the best I guess."

To learn what exactly? [Here’s another quote](https://www.newyorker.com/magazine/2005/03/07/believer):

> He used to type out pages from “The Great Gatsby,” just to get the feeling, he said, of what it was like to write that way

Just to get the feeling.

I’ve read a lot of things by and about Hunter S. Thompson in my teenage years and can’t recall where I first came across this practice of his, but I do know that I’ve been thinking about it for over a decade.

What I remember is Hunter saying that he did it to get a feel for the rhythm of someone’s writing. Maybe I misremember him using the word rhythm, but based on the quotes above, it probably wouldn’t be something he disagreed with.

I’ve always wanted to try it, typing out a novel. There’s something to the idea of letting a piece of writing flow through you, one keystroke at a time.

Typing out a lot of other people’s code – that I did. Whenever I follow a book that contains code and it’s a book I truly want to learn from, I type out the code while following along. No copy & pasting. I’ve done it this way ever since I started programming and learning from books. Not sure exactly why, maybe because copy & pasting always had a smell to it? Maybe it felt like skipping the actual work when you don’t type it out?

When I read Zed Shaw’s [Learn C The Hard Way](https://learncodethehardway.org/) years and years ago, I got confirmation that I’m not alone with this. In the introduction Zed sets some rules for following along:

> - Type in all of the code. Don’t copy-paste!
> - Type the code in exactly as it appears, even the comments.
> - Get it to run and make sure it prints the same output.

Even the comments.

It sounds like a dumb, mechanical exercise, doesn’t it? An exercise for exercise’s sake. Typing out comments – what good can that possibly do?

I’m not sure, but I agree with him. In the introduction of [Writing An Interpreter In Go](https://interpreterbook.com) I don’t set rules, but nudge:

> This book is meant to be read from start to finish and I recommend that you follow along by reading, typing out and modifying the presented code.

I’m no educator and don’t have a single degree, so I’m absolutely out of my depth here, but I do think you absorb more if you actively engage with something instead of merely reading or listening. Typing out a bit of code, at least to me, seems to have a better learning effect than only reading it.

That makes me wonder: if Hunter S. Thompson typed out Fitzgerald & Hemingway to become a better writer, which code should one type out to become a better programmer?

[typing.io](https://typing.io/), which I’ve used a long time ago to practice my touch typing, has a nice selection: Redis’ `db.c`, the `sched.c` file of Linux 0.01, `Collections2.java` of the Guava, parts of jQuery, Ruby on Rails, some Perl, and a lot more in other languages. Yet the main goal here is to get better at *typing*, not to get better at writing the code.

What would be on a list compiled specifically for that latter purpose? Pieces of code to type out, character by character, “just to get the feeling” of it, to maybe get a glimpse of the thoughts that made the fingers move when the code was originally was written?

[Gary Bernhardt](https://twitter.com/garybernhardt) once said that he enjoys the “cadence of typing”. Or maybe he didn’t, because I can’t find a source, but I’m pretty sure it popped up in a variation of the talk “Learning from the masters” that Geoffrey Grosenbach gave at Railsberry in 2012. The only thing I can find, though, is a recording of that talk from 2013, at RubyConf AU. That doesn’t have the quote I’m referring to, but it has [this wonderful section](https://youtu.be/vzjARuXpFZY?t=570) in which Gary explains how prefers one way over another to delete 2 lines in Vim because it saves him 1 or 2 keystrokes.

Maybe it’s not possible to recreate thought through retyping. Not sure. What I do know – on a non-scientific, talking-out-of-my-ass level – is that certain pieces of code have a certain rhythm, and if nothing else, getting a feeling for that rhythm – the cadence of the code – by retyping, well, it doesn’t sound like wasted effort to me.

---

# Making a plan

By Thorsten Ball • June 4, 2023

---

Okay, look, I don’t know how to kick this one off. This could’ve been titled One Weird Trick The Secret Cabal Of Productive Engineers Doesn’t Want You To Know About. Could’ve been, because it’s true (kinda - I haven’t checked in with the cabal in a while), but it also is a lame title.

Another possible title: The One Thing (I Think) That Might Be One Of The Most Important Things A Developer Can Do. That one stumbles right off the tongue and crashes the landing. Another one: One Crucial Skill Every Developer Should Master. Also bad.

The problem: what I want to talk to you about sounds so, oh so boring (except if you like bulleted lists), but I truly think it’s important and one of the fundamental skills a lot of effective engineers have.

I’m talking about making a plan. A plan for something you want to implement. I’ve also heard this being called a technical plan, or a technical concept, or a breakdown, or- well, most often it’s called a plan.

It’s something I’ve been asked to do ever since I started programming professionally and by now I subconsciously do it every time I need to think about how to do something, answer how long it would probably take, whether it has parallelizable parts, after which point I could ship, when it’s possible to pause, and so on.

Say the task is this: allow users to upload avatars on their profile page and display those avatars.

A plan that I’d write in the ticket (or in my notes), would look roughly like this if I were using a framework like Rails:

```
Goal: allow users to upload avatars on their profile page and display those
avatars

Tasks:
- migration to add `avatar_url` to `users` table, default null
- change `User` model definition to also include `avatar_url`
- add AWS S3 bucket configuration to app, including test/staging env
- create bucket (bucket name? permissions? ask product/infra)
- add AWS library so we can do URL signing
- change profile edit page to render pre-signed upload URL to POST uploads
  directly to S3
  - use library in controller to create pre-signed URL
- add route to accept avatar_url
- add `UserAvatars` controller with `create` action that accepts `avatar_url`,
  which is S3 URL
- frontend: add upload form on profile page that will post uploaded image to
  pre-signed POST url directly to S3
- profile page: render `<img>` if `user.avatar_url` is not null
- frontend: CORS???

Open questions:
- bucket permissions?
- what do we do when user uploads avatar and they already have one? do we delete
  old one on S3 on successful upload?
```

There’s probably something missing or something wrong with this. Sorry, but I just typed this out while imagining a hypothetical Rails app and I haven’t worked with Rails in 5 years.

You get the idea though. It’s a rough plan on how I’d implement this feature, from database migration up to frontend changes, in various degree of detail.

Is it incomplete? Yes. Will this plan change? Yes, likely, see the open questions at the end – those are things that popped into my head while writing, indicating that not everything about this feature request is crystal clear.

Is it still worth writing? One hundred thousand million percent. Absolutely. Because here’s the thing: it’s not only about the plan itself, it’s about the thinking we did to get to the plan.

The tasks above I didn’t have to write down. I could’ve just started programming. But then on the 2nd day, after I stumble out of the S3 AWS library docs with scratches in my faces, I’d realize: hey, what do we do with already uploaded avatars? Do we delete them? How? Do we have enough information on the backend to do that? Or do we need to store more information? Do we need to store bucket and filename in the database too?

The plan is not only useful because it gives you something you can check off while you do your work, or something that you can split and delegate (hey, what about those “frontend” parts – can someone else do that?), it’s useful because by writing it out you are actively thinking about what you’re supposed to be doing. Meaning: it helps you do it better.

Writing the plan helps you construct a mental model of all the work required. You’ll see whether you need database changes, only frontend stuff, whether this takes 1 week or 1 month. The amount of times I have written down a plan like this and suddenly sat up straight saying “wait, this is not that easy”? Many, many times.

Don’t get hung up on the form of the plan here. Not every plan looks like the one above. They could be higher-level and contain less details, or they could be even *more* detailed. They could be longer and contain not only the avatar-upload feature, but the whole user profile page and its sub-features. Sometimes I don’t even write it out.

What’s important is that you have *a plan* so that when someone asks you whether you know what you do, you do.

And yet I see so many engineers not ever creating plans or struggling when attempting to do so. Why? I’m not sure. I can only guess. Maybe it’s because it’s often easy to simply start, because there’s usually something that everybody agrees on (in the case above: everybody would agree that we have to store a URL of an avatar somewhere), and having to think through the rest seems like a waste of time? Maybe it’s because people struggle with the mental model behind the plan - they can’t think through how all of the parts interact because they can’t “see” that far? Not sure.

The good news: making plans helps you get better at making plans. Just start doing it. Next time you have to implement something, open a `todo.md` file and write down those tasks. Read through the list again and add things you missed on the first pass. Do this until there’s no more changes when you do a pass. Then hand that list to your colleague and ask them: does this look right to you? Maybe they can help you and point out something you missed. Then look at your list and ask yourself: how long will it take to do all of this? 3 days? 4? Maybe 5. But notice: it’s not wild guessing anymore, you now know roughly how much work it is - roughly. That’s already a lot better than saying “I don’t know”. Then look at your list and order things the way you’d implement them. If you need to split up your work with a colleague, add names next to each task.

Then take a step back and pat yourself on the shoulder. Congratulations, you now have a plan.

---

# What do others do without tests?

*This could've been a love poem*

By Thorsten Ball • May 28, 2023

---

In some sense, I grew up doing TDD - test-driven development.

At my first internship we were doing TDD. I was taught to red-green-refactor. We often paired, one person first wrote a test and the other one then had to write the code to make it pass, then we flipped the roles. We were programming in Ruby and at the time TDD was the way to write code in Ruby. I prepared for that internship by working through [railstutorial.org](https://www.railstutorial.org/), which also shows the failing tests first.

There was a life before tests, though. I didn’t fall into a well full of tests as kid. The first program I ever wrote wasn’t a failing test, it was Hello World. I started programming as a teenager and didn’t learn about tests until a decade later.

And yet I can’t imagine what it’s like to program without tests anymore. More than a couple hundred lines without some tests? Sounds uncomfortable. It’s not about correctness and coverage, though. Not really. Well, not *only* that.

Having tests is having code that I can quickly run, ideally with a couple of keystrokes, to exercises other code that I wrote. It’s about feedback, right there, in my editor. With tests, I don’t have to run this, wait, click this, run this, take this and put it in this – I can just hit `,rt` in Neovim and see whether it works. Ideally, of course.

What a REPL and a debugger are to others, that’s what tests are to me. Here I can play around with an idea using all the tooling my editor gives me in a normal file. I can zoom in on a bug by writing ever more granular tests and isolating the faulty part step by step – all comitted and recorded. Sometimes I write failing tests for missing features or for nasty bugs and keep them around, commented out, for weeks, until I have time to make them pass. Correctness and preventing regression – cherries on top. A test suite that runs in less than 1s is worth having just for the joy it brings every time you run it.

Tests have their downsides too, of course. They can make changes harder because now you have to change the system and its tests. They can be ghosts from the past that whisper “it must be so” in your ear when you’re not sure whether you can change something or not; echos of the programmer who wrote them years ago and left. They can become slow. They can be useless, dead weight when they don’t test anything. Acknowledged, signed, yes, tests can be bad.

I just don’t know how others can live without them.

---

# When the cymbals come in

By Thorsten Ball • May 22, 2023

---

Back when I was in a band and really into guitars I was a regular on an online guitar forum. Since you can’t jam on a vBulletin forum, people did the next best thing and posted photos. Photos of their very expensive Les Pauls, old amplifiers, new foot pedals. That’s the time I learned that GAS stands for Gear Acquisition Syndrome. Not long after that I became convinced that surely – hey! *surely* – I will play better if I had just the right setup.

Everybody on there believed in the power of gear and it wasn’t just your standard guitars and amps or new effect pedals that were interesting. [NOS](https://en.wikipedia.org/wiki/New_old_stock) tubes, hand-wound pickups, special coats of paint (ideally: cracked), original greenback speakers – all of them objects of obsession.

This was in 2007, 2008 maybe. YouTube already existed but comparison videos weren’t what they are today. Little bit less polish, less videos in general. You’d let out an audible Yes if you found a video that compared exactly the amp and tubes you were after.

One day someone posted a video of himself showing off new boutique pickups in his Les Paul, playing through an old Marshall.

I already had a Les Paul and a Marshall and gotten nothing but compliments on my tone from my bandmates. And yet: GAS. My tone *could* be better, I thought, it’s not there yet. Maybe a new set of these expensive, boutique pickups could fill this audible-only-to-me hole? They are expensive though.

So after watching the video of the guy and his new pickups way too many times, I reached out to him and asked him: do you really think there’s a difference between these and the stock pickups in my Les Paul?

He replied: yes, they sound fantastic, different to the stock ones. Tremendous pickups, fantastic craftsmanship.

At the end of his reply, in a separate paragraph, he added a but: once the drummer hits those cymbals, you won’t be able to tell the difference.

I didn’t buy the pickups. But not only that. In the years since reading this last paragraph, I turned it over in my mind so many times that it morphed from a comment about guitar gear into something I turn to on a regular basis.

Whenever I’m in a discussion about technology that revolves around what The Best Way to do a particular thing is I think of it. When people discuss tools, or programming languages, and what theoretically the best solution is, when someone turns up their nose and wants to rip the word “pragmatism” out of the dictionary, that’s when I think: but will it matter once the cymbals come in?

---

# The Age of a Software Project

By Thorsten Ball • May 12, 2023

---

Does it make a difference whether your project is 2 or 3 weeks old? Probably not. Does it make a difference whether it’s 3 weeks old or 3 years? Probably very much, yes.

I was recently talking to a friend about how you work on a project must change depending on where in its lifecycle the project is.

Is it still young, unproven, doesn’t have product-market fit and is in an exploratory phase?

Or did you find your customers and you can’t keep up with the demand so that you find yourself now in a scaling phase?

Or maybe the peak has already passed and you’re now in maintenance phase?

It matters and should affect how you work.

When you’re exploring by definition you don’t know what will stick, so it’s fine to experiment, to play around. Meaning: you don’t have to follow The Best Practices all the time. Maybe you have less tests than you think one should have. Maybe one bit of the architecture is popsicle-sticks-and-ducttape. Maybe some load-bearing code has a fat `TODO: we shouldn't do this` above it. In this phase there are a lot of things you don’t know yet – which part of the project is important, what is truly the most load-bearing bit, what will have to change the most often, what breaks frequently – so you need to *learn*, as fast as possible.

Once you need to scale, you’ll learn even more: now you find out where the bottlenecks are and what will break and when. This is when you need to make the load-bearing parts actually load-bearing. This is when you wrap the things that should not ever, ever break again so thick in tests that regressions become nearly impossible. It’s time to put a proper architecture in place (or adjust whatever you had in place); an architecture that represents everything you learned about how the system is used and how it should work.

Once the party’s has found a nice groove, you’re in the maintenance phase. This is when you are able to sort your files into buckets that describe how often they change: ah, these two we haven’t had to touch in 2 years; this one and that one we have to change weekly, because we need to make slight adjustments to business logic; these files over here, we’re working on those because we realised it’s been a constant source of bugs for years.

If you don’t know where you are on the timescale you end up doing the possibly right things at the wrong time: worrying too much about performance bottlenecks when you don’t have a single user yet or hacking stuff together in a very important part of the project and breaking it for customers.

All of that is, of course, easier said than done. It’s hard. My friend and I both said that it’s the mark of very senior engineers to be able to seamlessly switch their mode of working depending on which project they’re on.

Especially in our world of programming where best practices and patterns are usually presented without context. It’s often “at company X we do Y to great success” but it would be more valuable if it was “at company X, on 4-year old, hugely successful project Z, with 60 engineers working on it, we now discovered that Y is much better than these 5 other things we tried years ago”.

(I was really impressed when listening to [Kent Beck](https://softwareengineeringdaily.com/2019/08/28/facebook-engineering-process-with-kent-beck/) explain that at Facebook/Meta they are so aware of these lifecycles that they put different teams on projects depending on where they are in the lifecycle, which he calls the [3x curve](https://medium.com/@kentbeck_7670/fast-slow-in-3x-explore-expand-extract-6d4c94a7539).)

---

# The Messy Page

*Or: why I don't like greenfield projects*

By Thorsten Ball • May 7, 2023

---

A few seconds ago I was staring a blank page, right before I started to put down the first bullet points that will eventually turn into this thing that you’re reading right now.

I wouldn’t say I hate the blank page, but I also don’t like it. In fact, I try to get rid of it as fast and as soon as I can. Barf out a first sentence, throw in some bullet points, sketch out where this thing should go as fast as possible. Anything, really, to rid it of its blankness.

The endless possibilities promised by the blank page? Thanks but no thanks. Give me the messy page instead.

Same with programming and software engineering: I really, really don’t like greenfield projects.

There are too many options. Too many tools to chose and decisions to be made. All of the code has to be written, including the boilerplate and the boring stuff.

Thanks but no thanks. Give me a messy project instead.

Something that we already know kinda works but that needs to be extended or scaled or refactored or tested or optimized or ported or shipped. That’s the good stuff, that’s where the fun starts.

Know why? Because there’s less uncertainty. With greenfield projects you often don’t know whether the work you do today won’t be deleted in four weeks, because, hey, we went in the wrong direction. Ah, it’s a horrible feeling, not knowing whether the work you do will pay off or not. I’d be terrible in a research lab or academia, where you could bump into a dead end in 6 months and have to throw everything away. Anxiety would kill me.

The projects I enjoy working on the most have clear product-market fit, somewhat clear requirements, and you “just” need to make it work. Give me *some* invariants or a rough shape of the thing we’re trying to build and I’m good.

Maybe that’s why I like debugging so much. In debugging there are very clear requirements (“fix this bug”) and you usually know that the effort won’t be wasted (it was labelled a “bug”, so presumably someone thinks that it’s worth fixing it).

Maybe that’s also why I don’t care that much whether an AI coding assistant will produce bugs or not. Because I’d rather have a messy bit of code that has a bug in it than an empty file.

---

# Do papercuts matter?

By Thorsten Ball • April 30, 2023

---

Papercut – a small annoyance in a piece of software, a rough edge, something that shouldn’t be there, a little issue that makes you say “ugh” out loud or roll your eyes. It’s usually not a bug, since functionality is not impeded, but it is something that should be fixed.

Lately I’ve started to wonder: does it even matter whether piece of software has papercuts?

That question is kinda a big deal for me. For years, I’ve been firmly in team anti-papercut. At work, I’ve long been advocating against papercuts. When I run into one I try to fix it; I applaud others that remove them; in case a papercut is added I do my best to call it out; I even organized our ticketing software so we can track and remove papercuts together.

I always thought I’d slam the table and shout “you’re god damn right they do” when asked whether papercuts matter, but a few weeks back I had a lightbulb moment. It wasn’t one of those lightbulb moments where you’re basked in light and can hear the angels sing, but the other type: dark basement, noise in the pipes, lighbulb fizzling and close to going out.

The realisation: I keep paying for and using software even though it has papercuts.

Re-rendering glitches in GUIs, badly formatted output in CLIs, margins and paddings in web applications that are ever so slightly off, inconsistent formatting of text, missing loading indicators, having to hard-reload pages – I run into these constantly and yet I keep using the software. Why?

My current guess is this: because the software still solves my problems, it still provides value, *despite the papercuts*. Even though the credit card input form on the checkout page is glitchy, I can still buy something; I can also still run the command and do what I want to do, even though there’s needless blank lines between every actual line of output and you can *feel* a race condition behind the way the spinner is rendered; and even though the conversation view is always scrolled to the wrong position when I open it, I can still send a message to a friend.

Papercuts annoy, but they don’t stop me from reaching my goal.

Does that mean they don’t matter? Fuck it, leave ’em in?

I now think that they matter *less* than I once thought. Before my lightbulb moment I’d have said that it’s bad UX if I roll my eyes while using an application. Maybe I would’ve even gone so far as to say that great UX *is* the absence of papercuts. Now I think that might be wrong.

The current hypothesis I have is this: software with great UX is software that gives you a clear path to solving your problem, *even if you have to walk on glass on that short path*. That means the presence and absence of papercuts is not related to bad and good UX. And that too means that papercuts might not be related to, say, business success of a bit of software. If it still solves the problem and still provides value, I assume it can also earn money.

It doesn’t feel right, though, does it? Papercuts don’t matter - that’s shiver-inducing. Similar to saying that inefficiencies in software don’t matter, right? But *that* we know to be true. Whether we like it or not, we can’t deny that there’s a whole lot of resource hogs out there that could run on a quarter of the CPU and memory that they’re currently using and yet they’re still wildly successful.

Maybe it’s pride in the craft. Maybe papercuts rub me the wrong way (and cut me?) because they [don’t let me sleep at night](https://www.goodreads.com/quotes/445621-when-you-re-a-carpenter-making-a-beautiful-chest-of-drawers). Maybe it’s because sometimes they’re an indicator of sloppy work. Maybe it’s because my eyes are tired of rolling back.

Maybe. Who knows. But here’s something I’m starting to know on some level: *in some sense* it’s nice that software can still be successful even if there are rough edges, as long as it solves the users problem and provides value.

---

# Best practices and an elephant

*Haven't I learned from engaging in bad practices?*

By Thorsten Ball • April 23, 2023

---

Everybody agrees: learn more things. It’s good for you, makes you better.

Learn a functional language, learn an imperative language. Learn about asynchronous programming.

Use an ahead-of-time compiled, statically-typed language, then use a dynamically-typed and interpreted language.

Try frontend, try backend, try CSS, try GraphQL, try REST. Make a game, or build a distributed system.

I could go on but you get the idea. I [wrote about some of it](https://thorstenball.com/blog/2019/04/09/learn-more-programming-languages/) a few years ago.

We all agree. Okay, yes, maybe we won’t agree on what *exactly* is worthwhile to learn – I’m sure I can find someone out there saying one must never try CSS – but I do think the majority of you would nod if I’d say one should learn more *good* things. Good, proven languages; best practices; great tools.

Lately, though, I’ve been wondering: what about the *bad* things? Haven’t I learned a lot too from doing the big no-nos, from engaging in *bad* practices, by doing the opposite of what I once thought was The Right Way?

This is where the elephant comes in. Do you know the parabel of [the blind men and an elephant](https://en.wikipedia.org/wiki/Blind_men_and_an_elephant)? If not you can click on that link and read about it and come back here, but since no one in the history of reading on the internet has ever done that before continuing to read, here’s the first paragraph:

> The parable of the blind men and an elephant is a story of a group of blind men who have never come across an elephant before and who learn and imagine what the elephant is like by touching it.
> 
> Each blind man feels a different part of the elephant’s body, but only one part, such as the side or the tusk. They then describe the elephant based on their limited experience and their descriptions of the elephant are different from each other. In some versions, they come to suspect that the other person is dishonest and they come to blows.
> 
> The moral of the parable is that humans have a tendency to claim absolute truth based on their limited, subjective experience as they ignore other people’s limited, subjective experiences which may be equally true.

Believe me, I’m fully aware of what a request this is, but: try to imagine now, as a first example, the idea of automated software testing as the elephant.

With that picture in mind, let me ask you this: aren’t you the guy touching only the elephant’s butt if you’ve *only ever done TDD and wrote the tests first*? Aren’t you missing something if you’ve never tried writing the tests after the code, or, hell, skipping the tests altogether?

I think so. I think that conflicting, contradicting experiences are very useful for learning. The more parts of the elephant we touch, the more perspectives we accumulate, the more comprehensive our understanding of the subject becomes.

So try TDD but also try writing tests last. Try writing no tests and see how far you get.

Try to deploy on every commit, then try deploying only every week, or every month; deploy only on Fridays and then never on Fridays.

Try copy & pasting code, first a little, then a few files. Try to *never* copy & paste code and only use 3rd-party dependencies. See how far you get.

Automate everything, then try do everything manually.

Add tech debt, ignore a bug, maybe even: *reinvent the wheel*.

Use a framework, then don’t use a framework, then build your framework.

Use only global variables, make some spaghetti code, have a single file for the whole project.

The important thing is *to try different things,* to gain perspectives, to touch the elephant from every side.

What’s the elephant? Software engineering? Programming in general? Life? Who knows, but I do believe that seeing it from every possible angle not only makes you better at it but gives you richer experience of it.

---

# A series of ever-bigger problems

*Thoughts on growing as a software engineer*

By Thorsten Ball • April 16, 2023

---

*You’re reading Register Spill, my weekly newsletter. Every week I start a timer. 60min. What I write in that time gets published. Mostly unedited. It's what I'd write if you'd send me an email asking me what's on my mind.*

Last week we’ve had calibrations at work. These are meetings in which managers and the executive team discuss the performance of all the engineers at the company in order for us to calibrate and be able to say “this is clearly level 3” or “this is close to level 5” and mean the same thing.

It’s very, very interesting because it gives insight in how other managers, or our [Head of Engineering](https://about.sourcegraph.com/blog/introducing-steve-yegge), think about performance and growth of engineers.

Since then I’ve been reflecting on what it means to grow as an engineer, what it means for me, and in general how I think about, well, *work*.

None of what I’m about to tell you is, in any way, definitive or even complete. It’s one particular way of looking into the kaleidoscope. If I turn it just slightly things might look completely different.

---

Here’s what I think: as a software engineer you grow to solve bigger and bigger problems.

It starts with small problems: a small bug, a small feature, an improvement. Someone has a problem - “this doesn’t work” or “this could be better” or “we’re missing this” - and you make it go away. It’s a ticket-sized problem, but you can take care of it so that the person asking for your help doesn’t have to worry about it anymore.

Then, over time, the problems get bigger.

A big feature that takes several weeks to implement: you take care of it, so that the person who wants the feature doesn’t have to worry about it.

Later, the problems become too big for you to solve on your own, but your boss can give you two other, possibly more junior engineers and you take them by the hand and you implement the features and the bugs and do the maintenance work with them over the course of months and your boss doesn’t have to worry.

Then, even later, the problems start to become abstract. It’s not features anymore, not clearly defined problems, it’s areas, or domains, or themes, or whatever you want to call it. Instead of getting concrete problems to take care of, it’s now your job to *find problems* *and* *fix them*. By now, very likely by getting others to help you fix them or fix them for you.

It only gets bigger from there.

It started with single tickets, then big features, then multi-feature multi-week projects, then it’s a whole area full of projects that you keep an eye and your hands on, then it’s possibly *teams* you take care of by making sure they work correctly, then you maybe grow to define what the projects in the area are, and then you end up helping define the areas.

From your boss’s perspective it’s the same thing, though: you’re solving a problem for them that they then don’t have to worry about anymore. It’s “I gave that ticket to Anna, she’ll take care of it”, then “I put Anna on it, she’ll implement this with the new junior dev”, then “Anna’s our domain expert there, she says we should do X”, then “Those teams? Yeah, Anna works with them and makes sure they perform well and solve the business problems we have in this area”.

---

---

I’m not going to put labels on each of these stages – “this is senior, this is staff” – because I think that varies from company to company. In some companies some of the problems I named would probably be owned by managers, or directors even, and not by engineers.

To me, it’s all the same: I’m an engineer that gets paid to create value for the business and the more experience & skills I have, the bigger the levers I have at my disposal to create value. Writing code is the first lever, then it morphs into defining which code should be written, then it can morph into ensuring that others know how to write code and how to define which code should be written.

In some companies, I bet, everything I said is wrong. But I’ve only ever worked in small startups and spent the last four years at Sourcegraph, in which autonomy and high-agency are the expectation from day one. What I described above maps clearly (which might make it wrong for others) to my own growth as an engineer.

Back in 2019, right after I joined I talked to [Quinn](https://slack.org/), our CEO, and asked him what I should do. What he said was this: “Look, you have certain skills & talents and we here have problems that need to be solved. I want you to use those skills & talents to solve these problems.” And I was enlightened, as the saying goes.

Over the following years, with Sourcegraph growing from ~20 to ~250 employees, I’ve seen the same thing over and over again: a problem becomes important, so we hire someone to take care of it.

Problem: sales doesn’t scale anymore, because the CEO can’t be in every meeting. Solution: hire a Head of Sales that takes care of that problem so the CEO can focus on something else.

Problem: we don’t have customer support, but we have more and more customers. Solution: hire a Head of Customer Support to take care of that so the CEO can focus on something else.

You see the pattern.

And I now see the pattern *everywhere*: I see it when judging growth of engineers (“what problems can they can take care of?”), I see it with job interviews (“your only job in the job interview is to convince the other side that you can solve their problems for them”), I see it when wondering what I should do next (“they want me to take care of this multi-people, multi-project problem now, so they don’t have to worry about it”).

---

# Two types of software engineers

*One assumes it's easy because it's a non-technical problem, the other assumes that's why it's hard*

By Thorsten Ball • April 9, 2023

---

Here's something I've been kicking around in my head for a few weeks, a tiny theory I have of how people think about software engineering.

According to my theory, there are two types of software engineers:

Type 1, when presented with a problem, thinks: "easy, people can just do X."

Type 2, when presented with the same problem, thinks: "very hard, because it requires people to do X."

Type 1 assumes something's easy if it's not a technical problem, because "we can just ask people to do X." Type 2 thinks it's hard *because* it is not technical.

Example:

Type 1: "easy, we can just ask people not to deploy at this time"

Type 2: "wait, but what do we do _when_ people deploy at this time?"

Another example:

Type 1: "easy, we just document this new process and ask people to follow it"

Type 2: "how do we ensure people even read this?"

Another one:

Type 1: "easy, we just build a system that these 4 parties will use and that ensures that no one cheats on the other one"

Type 2: "this is really hard because we need to get 4 parties to use the same system"

I'm not entirely sure yet on where exactly to draw the line between type 1 and 2 or how to define them precisely. I told you: *tiny* theory.

Painting in really broad strokes, though, I'd say that type 1 doesn't take people into account and type 2 knows that at the heart of all of their engineering work (and problems) are people.

Type 1 believes in capital E Engineering, where there are cold, hard truths; there's math & physics; it's applied *science*. It's what you see in [The Martian](https://en.wikipedia.org/wiki/The_Martian_(film)).

Type 2 would probably ask: "yeah, but what if the guy in The Martian didn't have to build this stuff for himself but for others?"

Now, as you might have noticed, I'm not-so-subtly hinting at the fact that the type 2 engineer knows a bit more but *maybe* you also wonder whether you can’t smell a hint of cynicism in there and think that it's me admitting defeat — we can't build nice things because it all becomes a mess as soon as people are involved.

Here's the kicker though: it's the opposite! It's not cynicism, type 2 engineering is *embracing* the fact that we build with and for people and taking on an even bigger challenge of doing work despite the chaos this produces.

Because, see, when it gets messy, that's where it gets *real*; that’s where the actual work begins, when you go from drawing board to actually shipping something of value and with impact to someone.

It's embracing the fact that people are not machines and no matter how often they say they're rational thinkers, you still know that even the strongest choose-the-best-tool-for-the-job advocates will sometimes choose a tool because, well, the GIF in the README was cooler. It's knowing that no one will read your documentation if you don't make it entertaining and easy to read. It's leveraging the fact that people will install security updates to get new emojis. It's anticipating that, no, not everybody will follow the best practice because everybody has a Thursday afternoon that feels like it should be Friday evening.

Let me add one more on top: I'd argue that it's *precisely because of how messy it can get* do the things we build become beautiful.

Until next week!

---

# Flipping the switch

*Realising that it's on you now*

By Thorsten Ball • April 2, 2023

---

Remember when you first moved out of your parent’s place and realised — truly realised — that you live alone now?

I remember. It wasn’t immediately after moving out. The realisation lagged behind reality. You know, like the shadow of a cartoon character hit by a cannon ball: it stretches, and stretches, and streches and then *— snap! — *it hits you. I live alone now.

It wasn’t in a moment of solitude either. I wasn’t lying in bed staring at the ceiling. No, I stood in front of the fridge, putting back the carton of milk I had just used, with only the tiniest bit of milk left in it. “Well, there’s still something in it, so…” I thought to myself to justify not putting a new carton in before — *snap — *it hit me. Wait, *I’m *the next guy, the one who will take out the carton of milk and within a split-second notice that it’s far too light and get pissed off at the previous milk drinker for not putting a new carton in the fridge.

Same thing happened with the dishwasher, after pulling clean dishes out one by one instead of unloading the whole thing. *Snap*. Or after taking the trash out that was filled to the brim while inexplicably hoping that someone else is going to take it out. *Snap*.

---

As a software engineer I’ve had a few of these moments: no, no one else is going to fix this bug *properly*. There is no other person that’s going to clean up the tech debt you just introduced. No secret team plans to write tests that you don’t think you can add now. No, it’s on you. If you don’t do it, it won’t get done.

It doesn’t hit you when you jump from project to project, or when you only work on greenfield projects. It hits you when you work on something for years and *own* it, truly own it, with no one else responsible for it.

It’s a harsh lesson, but I found it so valuable to my own work that in the past few years I encouraged others — colleagues and friends — to embrace this perspective. I call it “flipping the switch”, going from “someone’s surely watching and keeping an eye on this” to “I own this now and have to take care of this”.

Flipping the switch has a paradoxical effect. The responsibility hits you in a way that makes you want to sit down, but then, slowly and quietly, something else starts to grow. A sense of ownership. What I built, what I fixed, what I debugged, what I wrestled to the ground and then got to work — I did that and no one else.

 

---

# What is Register Spill?

*Thoughts I can't keep in my head*

By Thorsten Ball • April 2, 2023

---

So what’s *Register Spill*? In short: my attempt to publish more longer-form writing. Things that are less than a blog post, slightly more than a bunch of tweets.

The idea is that once a week I set myself a timer for 60min and what I write in that time gets published. I won’t do a lot of editing and I won’t do a lot soul searching for Very Important Topics. Write down and send out whatever I would say is on my mind if you’d ask me that week.

The name was [a suggestion by Patrick](https://twitter.com/dubroy/status/1639706797232537606?s=20) and I love it. When the register allocator in a compiler can’t keep more values in a CPU’s registers it has to “spill” them to the stack. That’s what this is about here: spilling thoughts out that I can’t keep in my head.

My personal goal is to publish 10 of these. Why? Because I’m not sure whether I can keep it up for much longer and I’m also not

So, if you want to be a part of this experiment and get a short post every week, subscribe here: