Blog
Longer-form writing on array programming, columnar engines, and the parts of market-data infrastructure that only look simple.
Why high-frequency trading systems demand array languages
Moving beyond row-oriented overhead. A trade is not a row — it is one value in each of nine columns, and every question you ask of a trading day is a question about columns. What that costs you in an object-per-row runtime, measured rather than asserted.
Zero-copy interop: bridging Amber memory buffers directly into Apache Arrow & Python
What "zero copy" actually has to mean if the claim is going to survive contact with a refcount, a batch that outlives its stream, and a 32-byte object header sitting immediately before every payload.
Navigating temporal offsets: why Amber counts days and nanoseconds from 2000-01-01
A thirty-year offset is the most boring kind of bug and the hardest to see. Where the epoch choice comes from, what it buys, and how every integration in the ecosystem is built so the conversion is impossible to forget silently.
From language to platform: -8!, one-report diagnostics, owning the terminal, and libamber.so
Five point releases that added no vocabulary at all. What they added instead was a wire format, an error report you can act on, a line editor, an extension seam, and a shared library — everything an ecosystem needs to exist outside the repository.
Down to the metal: temporal types, SIMD, the arena, and a branch-free as-of join
The point where Amber stopped being a library written in K and started being an engine written in C. Four releases, five kernels, and one 16 MB bump allocator that exists purely to keep malloc out of the tick path.
One byte at offset −13: column attributes in C
`s, `u, `p and `g are not metadata. They are a promise the kernel is allowed to believe, stored in a byte nobody has to look for, and they are the difference between 4.23 seconds and 1.9 milliseconds.
Teaching K to speak q: tables, the join family, and bare qSQL
K has dictionaries and a transpose. Everything else a tick shop needs — table literals, keyed tables, eight joins and select … by … from — had to be built. Here is how, and where I put each piece.
The interpreter underneath: what ngn/k is, and why Amber starts there
Before any of my code existed there was a 10,000-line C interpreter that fits in a cache. This is what it does, why K is shaped the way it is, and what I inherited.