Experiments you can break.
Interactive notes on the things my work is made of: payments, concurrency, performance, correctness when the network fails. Plus two classics from algorithms and physics, because the same habits apply. Each runs live, in your browser or on the Java 25 service behind this site, whose API is public.
JVM behind this siteConnecting…
- Payment security
Frictionless or challenge?
Before a card payment is authorised online, the bank’s access control server decides: let it through, ask for a code, or refuse. Send one a payment and watch it decide, rule by rule.
- JVM performance
Anatomy of a memory leak
An unbounded cache looks harmless until the old generation fills up. Flip on the fix and watch the pauses disappear.
- JVM performance
Where does the time go?
Run a slow piece of Java on the JVM behind this site and read its Flight Recorder profile as a flame graph. Then run the fix.
- Payment security
Charged twice
Networks drop responses and clients retry. Without idempotency keys some customers pay twice — make the network worse and count them.
- Distributed systems
Ten thousand blocking calls
The same workload on a fixed thread pool and on virtual threads, running live on the Java 25 JVM behind this site.
- JVM performance
Ten thousand threads, twenty connections
Virtual threads made threads cheap; connections are not. Requests pour into a small PostgreSQL pool under three policies, and the ceiling stays where Little’s law puts it.
- Distributed systems
A ledger under concurrent transfers
A thousand transfers between a hundred accounts, sixteen at a time, under six strategies. One loses money; the others differ in what keeping it costs.
- Distributed systems
Outbox under crash injection
Save an order, announce it, and let the process die in between. A dual write loses events or invents them; an outbox loses nothing and sends some twice.
- Distributed systems
Search over a million rows
A million products on PostgreSQL, searched four ways at once: a pattern on every row, a trigram index, typos, full text. The database explains each query.
- JVM performance
Watch the JIT
A cold loop on the JVM behind this site, compiled twice as it warms up, then thrown back to the interpreter when a new type reaches its call site.
- Distributed systems
Adding a node without moving everything
Modulo hashing reshuffles almost every key when a node joins. A hash ring moves about one in N.
Fibonacci, five ways
From hundreds of millions of calls to a few dozen multiplications: one function, five algorithms, timed on a real JVM.
Chaos and the integrator
Two pendulums released a billionth of a radian apart swing completely differently fifteen seconds later — and the numerical method decides whether energy survives at all.