Why I still reach for Lisp and Scheme instead of Haskell
Scheme (and Lisp) lets you express complex systems and problem domains in simpler terms than any other language can. For all its brilliance, Haskell resists most of the attempts people make to just hack and write useful code quickly.
Beyond agentic coding
AI dev tooling can do better than chat interfaces
A faster way to calculate the day of the week
A range of fast modulus techniques that beat compiler output
Code is clay now
Artisans, factories and the new material software is made of
Tony Hoare has died
Limousin, Saint-Yrieix-la-perche, Périgord, Université, société, Livres, citations, Nantes, Jumilhac
Vulnerability research is cooked
Vulnerability discovery has always been gated by elite attention. Elite attention is now abundant. What happens next?
Git Rebase for the Terrified
As a maintainer of several OneBusAway projects, I regularly ask contributors to rebase their branches before merging. The response is often hesitation or…
Software for One
Robin Sloan wished for a HyperCard that could build a family app in a day. That world showed up.
Tree-sitter vs. Language Servers
I got asked a good question today: what is the difference between Tree-sitter and a language server ? I don’t understand how either of these tools work in depth, so I’m just going to explain from an observable , pragmatic point of view.
Hilariously fast volume computation with the divergence theorem (2018)
The following presents a fast algorithm for volume computation of a simple, closed, triangulated 3D mesh. This assumption is a consequence of the divergence theorem. Further extensions may generalise to other meshes as well, although that is presently out of scope.
Jujutsu megamerges for fun and profit
A practical guide to creating and maintaining powerful megamerge workflows in Jujutsu for faster, conflict-free development.
Fixing a 20-year-old bug in Enlightenment E16
Some may find it weird, but I actually greatly enjoy using Enlightenment E16 as my window manager. It's themable, hackable, lightweight (24MB peak RSS!),...
Fine, I'll build my own text editor
The one where I build my own text editor (until I get bored).
Defer available in gcc and clang
About a year ago I posted about defer and that it would be available for everyone using gcc and/or clang soon. So it is probably time for an update. Two things have happened in the mean time: A tec…
Learning Programming in an Age of LLMs
Open answers to a reader's letter.
Faster asin() was hiding in plain sight
This one is going to be a quick one as there wasn't anything new discovered. In fact, I feel quite dumb. This is really a tale of " Do your research before acting and know what your goal is, " as you'll end up saving yourself a lot of time. Nobody likes throwing away work they've done either, and there could be…
Simple Is Not Small
small programs hide coupling
Thoughts on Generating C
wingolog: article: six thoughts on generating c
Training an LLM in Swift, Part 1: Taking matrix mult from Gflop/s to Tflop/s
10 implementations of handwritten matrix multiplication: from plain C and Swift through to Metal
The 100 hour gap between a vibecoded prototype and a working product
I spent 100 hours vibecoding an app and it's not as simple as people say.
What's the best programming language for coding agents?
This somewhat widely cited post (I keep seeing it cited, anyway) suggests that dynamic languages and/or languages that represent things more concisely are more token efficient. It seems to be cited enough that LLM search results agree. For example, when I searched for "dynamic vs static language token cost" (no…
Nested code fences in Markdown
Today, we will meet a spiky-haired nerd named Corey Dumm, who normally lives within Markdown code fences. We will get to know him a bit, smile with him when his fences hold and weep quietly when misfortune strikes.
In Emacs, everything looks like a service
A common refrain is that Emacs is an operating system (OS). This isn’t true, but what invites comparison to an OS is its ability to orchestrate applications and utilities above the OS kernel...
Watching Go's new garbage collector move through the heap
Go 1.26 made Green Tea the default GC. We observe its cache-friendliness with perf, visualize the heap to see how Go allocates, and poke at a sparse-page problem a non-moving collector like Go's struggles with.
Finding all regex matches has always been O(n²)
every regex engine that promises linear time breaks that promise the moment you ask for all matches. the problem has been there since the 70s, hiding in the iteration loop.
Lisp's Influence on Ruby
Once I wrote users.select { |u| u.admin? }.map(&:email) and realized I’d written Lisp.
Using PostgreSQL as a Dead Letter Queue for Event-Driven Systems
Learn how to use PostgreSQL as a Dead Letter Queue (DLQ) for event-driven systems. Case study from Wayfair showing how to handle failures in Kafka consumers with PostgreSQL.
Things Unix can do atomically (2010)
This is a catalog of things UNIX-like/POSIX-compliant operating systems can do atomically, making them useful as building blocks for thread-safe and multi-process-safe programs without mutexes or read/write locks. The list is by no means exhaustive and I expect it to be updated frequently for the foreseeable future.