Punycode: My New Favorite Algorithm
A deep dive into how Punycode works, and why I think it's so neat.
Technical writing on software engineering, programming languages, distributed systems, and building reliable software.
A deep dive into how Punycode works, and why I think it's so neat.
A comprehensive guide to CRDTs and their tradeoffs, from counters to sequences. Written in the spirit of the Typeclassopedia, exploring how different CRDTs solve the distributed consensus puzzle.
An accessible guide to understanding the confusing terminology around JSON Schema. What are schemas, dialects, vocabularies, and metaschemas, and how do they all fit together?
How to use event streams in an effective, scalable, future-proof way.
Understanding the difference between essential and accidental complexity in software design.
Improve the robustness and flexibility of your Haskell apps by changing how you design your libraries.
We often need to make and manipulate derived types that are similar to each other, but not quite the same. Higher-kinded records provide a way to do this in a generic way, but are clunky. We\
An argument for using really exhaustive pattern matching.
In the last post, we figured out an interface for the RPC caller to invoke remote Haskell functions. In this post, we\
In
A lot of the Rust <-> Haskell interop examples out there are for small, synchronous libraries. They also tend to omit how to actually package the Rust library. We\
Typical serialization libraries in the Haskell ecosystem target a single format. We explore how to provide composite serialization for data types that chooses the best format for each data type.
We struggled for several months with a mysterious tracing issue in our production environment. Unrelated web requests were being linked together in the same trace, but we could never see the root trace span. This is the story of how we found and fixed root cause.
Early explorations in data-driven Haskell applications in the browser.
Sinatra-esque Haskell web apps.