ezyang's blog
Recent content on ezyang's blog
- Posts
- 457 from 28 Dec 2009 to 17 Apr 2026
- Posting
- monthly (19 in the last year)
- Kind
- personal blog
- Feed
- https://blog.ezyang.com/feed.xml
2026 16
- OSS code review, in the era of LLMs
- 2026
- Autograd and Mutation
- Read Less, Steer More
- Parallel Agents ❤️ Sapling
- AI-assisted programming for spmd_types
- Silent BC Breaking Changes
- Vibe Coding Design Study: tlparse
- Replicate Forwards, Partial Backwards
- DTensor erasure
- The JAX sharding type system
- Global vs Local SPMD
- Megatron via shard_map
- Computing sharding with einsum
- Hugo Migration
- The gap between a Helpful Assistant and a Senior Engineer
2025 11
- Code review as human alignment, in the era of LLMs
- 2025
- Learning to love mesh-oriented sharding
- Draw high dimensional tensors as a matrix of matrices
- So you want to control flow in PT2
- The Parallelism Mesh Zoo
- You could have invented CuTe hierarchical layout (but maybe not the rest of it?)
- State of torch.compile for training (August 2025)
- Vibe coding case study: ScubaDuck
- Why you should maintain a personal LLM coding benchmark
- New Years resolutions for PyTorch in 2025
2024 5
2021 5
2020 7
- The hidden problem(?) with basic block procedures in SSA
- 2020
- Idiomatic algebraic data types in Python with dataclasses and Union
- Let's talk about the PyTorch dispatcher
- Dynamic scoping is an effect, implicit parameters are a coeffect
- A brief taxonomy of PyTorch operators by shape behavior
- vmap in Haskell
2019 4
2018 6
2017 12
- Systems ML workshop panel
- Accelerating Persistent Neural Networks at Datacenter Scale (Daniel Lo)
- MOCHA: Federated Multi-Tasks Learning (Virginia Smith)
- A Machine Learning Approach to Database Indexes (Alex Beutel)
- Ray: A Distributed Execution Framework for Emerging AI Applications (Ion Stoica)
- 2017
- Backpack for deep learning
- Proposal: Suggest explicit type application for Foldable length and friends
- Prio: Private, Robust, and Scalable Computation of Aggregate Statistics
- Designing the Backpack signature ecosystem
- How to integrate GHC API programs with Cabal
- Try Backpack: Cabal packages
2016 18
- A tale of backwards compatibility in ASTs
- 2016
- Backpack and the PVP
- Left-recursive parsing of Haskell imports and declarations
- The problem of reusable and composable specifications
- Thoughts about Spec-ulation (Rich Hickey)
- Try Backpack: ghc --backpack
- Seize the Means of Production (of APIs)
- The Base of a String Theory for Haskell
- The Edit-Recompile Manager
- Backpack and separate compilation
- cabal new-build is a package manager
- Optimizing incremental compilation
- What Template Haskell gets wrong and Racket gets right
- Debugging tcIfaceGlobal errors in GHC: a study in interpreting trace output
- Announcing cabal new-build: Nix-style local builds
- Hindley-Milner with top-level existentials
- ghc-shake: Reimplementing ghc --make
2015 8
2014 23
- Unintended consequences: Bound threads and unsafe FFI calls
- 2014
- Ubuntu Utopic upgrade (Xmonad)
- Tomatoes are a subtype of vegetables
- Haskell Implementor's Workshop '14
- Open type families are not modular
- A taste of Cabalized Backpack
- The fundamental problem of programming language package management
- What's a module system good for anyway?
- New theme!
- Type classes: confluence, coherence and global uniqueness
- Parsec: "try a <|> b" considered harmful
- GHC and mutable arrays: a DIRTY little secret
- Elimination with a Motive (in Coq)
- The cost of weak pointers and finalizers in GHC
- Calculating Shanten in Mahjong
- Haskell for Coq programmers
- Equality, roughly speaking
- How to maintain a pristine copy of your configuration files
- PEPM'14: The HERMIT in the Stream
- Ott ⇔ PLT Redex
- When a lock is better than an MVar
- So you want to add a new concurrency primitive to GHC...
2013 29
- Two bugs in the borrow checker every Rust developer should know about
- 2013
- Visualizing a block allocator
- Xmonad and media keys on Saucy
- If you're using lift, you're doing it wrong (probably)
- Of Monadic Fixpoints and Heap Offsets
- Induction and logical relations
- Cost semantics for STG in modern GHC
- Blame Trees
- OPLSS lecture notes
- No grammar? No problem!
- HoTT exercises in Coq (in progress)
- (Homotopy) Type Theory: Chapter One
- The AST Typing Problem
- Anatomy of an MVar operation
- HotOS "Unconference" report: Verifying Systems
- Category theory for loop optimizations
- The Difference between Recursion & Induction
- Kindle is not good for textbooks
- A Zerocoin puzzle
- A classical logic fairy tale
- Ndseg
- Resource limits for Haskell
- The single export pattern
- The duality of weak maps and private symbols
- What is a membrane?
- Kindle Paperwhite notes
- The GHC scheduler
- NLP: the missing framework
2012 55
- Google Nexus 7 setup notes
- 2012
- Metro Maps of the News
- Maildir synchronizing Sup
- Why can't I just be a little lazy?
- Functional Encryption
- Extremist Programming
- Plan 9 mounts and dependency injection
- hp/D3.js: an interactive heap profile viewer
- Ubuntu Quantal upgrade (Thinkpad/Xmonad)
- ACM XRDS: Jeff Dean profile
- Duality for Haskellers
- Hails: Protecting Data Privacy in Untrusted Web Applications
- Visualizing satisfiability, validity & entailment
- GET /browser.exe
- Generalizing the programmable semicolon
- Template project for GHC plugins
- "This is really the End."
- Unintuitive facts about Safe Haskell
- The Y Combinator and strict positivity
- So you want to hack on IMAP...
- OfflineIMAP sucks
- How OfflineIMAP works
- The Monad Reader: Issue 20
- Applicative functors
- Practical Foundations for Programming Languages (first impressions)
- Is Haskell liberal or conservative?
- Two ways of representing perfect binary trees
- Polymorphic variants in Ur/Web
- Managing the server/client split in Ur/Web
- Secure multiparty Bitcoin anonymization
- Why verification results in higher quality code
- Thoughts on gamifying textbooks
- An Interactive Tutorial of the Sequent Calculus
- Ubuntu Precise upgrade (Thinkpad/Xmonad)
- What happens when you mix three research programming languages together
- Some thoughts about literature review
- How Ur/Web records work and what it might mean for Haskell
- Use the source, don't read it
- Reduce Ubuntu latency by disabling mDNS
- Visit month: Princeton
- Is it better to teach formalism or intuition?
- Visit month: University of Pennsylvania
- You could have invented fractional cascading
- Visualizing range trees
- Anatomy of "You could have invented..."
- Transcript of "Inventing on Principle"
- Travel: Spring 2012 Edition
- How to build DRM you can trust
- Popl
- Modelling IO: MonadIO and beyond
- monad-control is tricky
- Mystery Hunt and the Scientific Endeavour
- Problem Set: The Codensity Transformation
- Why iteratees are hard to understand
2011 97
- Bugs and Battleships
- 2011
- How to build i686 glibc on Ubuntu
- Interactive Demo of Zero-Knowledge Proofs
- Accessing lazy structures from C
- Transparent xmobar
- Ubuntu Oneiric upgrade (Thinkpad/Xmonad)
- How to read Haskell like Python
- The new Reflections on Trusting Trust
- Obviously Correct
- Polyglot programming
- Why you shouldn't do a PhD in systems
- Let's play a game
- 8 ways to report errors in Haskell revisited
- Joseph and the Amazing Technicolor Box
- Diskless Paxos crash recovery
- First impressions of module programming
- In-program GC stats redux
- Changes to IntMap
- Food-related functional humor
- BlockedIndefinitelyOnMVar
- From data type definitions to code
- Variant types and GADTs
- In-program GC stats for GHC
- Synthetic Git merges
- Parallelism to plug space leaks
- Facebook support for BarnOwl
- Grad School, Oh My
- Cambridge retrospective: History and Philosophy of Science
- A new vision for Mendeley
- IVar leaks
- Scheduling IVars
- The IVar monad
- Debugging compilers with optimization fuel
- Multi-monitor xmobar placement on Gnome
- A Year of Notebooking (Part 2)
- A Year of Notebooking (Part 1)
- A pattern for increasing sharing
- On type synonyms
- A Taxonomy of Socialization on the Internet
- Pinpointing space leaks in big programs
- Measurement, quantification and reduction
- What Philosophy of Science Can Say for Software Engineers
- The Cryptography of Bitcoin
- Bitcoin is not decentralized
- Chain Rule + Dynamic Programming = Neural Networks
- An insufficiently lazy map
- If it has lots of comments, it's probably buggy
- Tail recursion makes your loops cleaner
- Computing function composition
- Anatomy of a thunk leak
- Space leak zoo
- Reified laziness
- Calling all space leaks
- Bindings and CAFs on the Haskell Heap
- How Aristotle got it Wrong On the importance of conceptual frameworks
- Unraveling the mystery of the IO monad
- Haskell: Not pure enough?
- How the Grinch stole the Haskell Heap
- Functions produce the Haskell Heap
- Implementing the Haskell Heap in Python, v1
- IO evaluates the Haskell Heap
- Evaluation on the Haskell Heap
- The Haskell Heap
- Mailbox: Advice for a sup first-timer
- Tracing the compilation of Hello Factorial!
- Bugs from using the wrong variable
- Hoopl: Dataflow analysis
- Type Kata: Local data type
- Hoopl: Dataflow lattices
- Hoopl guided tour: Base system
- GHC migrating to Git
- HTML Purifier 4.3.0 released
- Ely Cycles
- Interleaving stream processors
- The return of Hellenistic reasoning
- Spring Reading: 2011 edition
- On expressivity
- Someone is wrong on the Internet
- Many-valued logics and bottom
- Killer mutants attack (mutation gone wrong)
- Type Technology Tree
- Petri net concurrency
- The creation of a statically-typed functional programmer
- On cargo culting and hacking
- Multi-day debugging
- Ad hoc approximations
- Semi-automatic testing
- Two short tips for FFI bindings
- On checked exceptions and proof obligations
- Picturing Hoopl transfer/rewrite functions
- Picturing binomial coefficient identities
- Android 2.x Sensor Simulator
- A suggestion for indent/php.vim
- Lav'net is watching you
- OCaml gotchas
- All about MVars
2010 158
- A year of blogging
- 2010
- Greetings from Switzerland
- No one expects the Scott induction!
- Thriller: Doing it for the thrills
- Travel advisory
- Generalization and vagueness in specifications
- Tourist by day, Blogger by night
- ω: I’m lubbin’ it
- Getting a fix on fixpoints
- Errata for gin and monotonic
- Gin and monotonic
- Hussling Haskell types into Hasse diagrams
- Talk Friday
- How I Learned to Stop Worrying and Love the ⊥
- My first proof in Isabelle
- Reflexivity. Qed.
- Integer sequences every computer scientist should know?
- Is multiply-carry strongly universal?
- Cambridge potpourri
- Haskell.org committee
- It's just a longjmp to the left
- You are in a maze of twisty little passages, all alike... (a GHC hacking post)
- mod_fcgid 2.3 is broken (fixed in 2.3.6)
- Medieval medicine and computers
- DP Zoo Tour
- Dead Edward Day
- DP Zoo
- Intelligence is the ability to make finer distinctions: Another Haskell Advocacy Post
- Blog name changed...
- OCaml for Haskellers
- Don't Repeat Yourself is context dependent
- Purpose of proof: semi-formal methods
- Rapidly prototyping scripts in Haskell
- Existential type-curry
- Quote Day
- Why being a sysadmin will help you do Science!
- The HTML purification manifesto
- Abstraction without a concrete concept
- Why I am in Cambridge
- Tips for running a hackathon
- How to get answers from busy maintainers
- So long America!
- High performance monads
- Data is Code
- Tension of patch and tree version control
- Session types, subtyping and dependent types
- Evolution of a Shared Web Host
- Keyword arguments in Haskell
- Towards platform-agnostic interruptibility
- pthread_cancel on Windows
- Embracing Windows
- Annotating slides
- My type signature overfloweth
- Defining “Haskelly”
- Interrupting GHC
- abcBridge: Functional interfaces for AIGs and SAT solving
- Type Kata: Distinguishing different data with the same underlying representation
- Day in the life of a Galois intern
- Type kata: Controlled sharing of references
- What high school Algebra quizzes and NP-complete problems have in common
- Generalizing APIs
- A radical Hackage social experiment
- Paper Monday
- The Gateway Drug to Type Programming
- Tour of a distributed Erlang application
- Buffered streams and iteratees
- How to pick your string library in Haskell
- Suggestion box
- Delaying implicit parameter binding
- Reader monad and implicit parameters
- Managing foreign pointers effectively
- Pipelines and continuations
- System.Posix.Redirect
- Maximum matching deadlock solution
- Flipping arrows in coBurger King
- Graphs not grids: How caches are corrupting young algorithms designers and how to fix it
- Safety first: FFI and threading
- Groom: human readable Show for Haskell
- Little’s law
- MVC and Purity
- Call and fun: marshalling redux
- Thinking about talk
- Marshalling with get and set
- First steps in c2hs
- The secret to successful autogenerated docs
- Principles of FFI API design
- Well-founded recursion in Agda
- Setting up Cabal, the FFI and c2hs
- The Haskell Preprocessor Hierarchy
- Static Analysis for everyday (not-PhD) man
- AP Physics: Stuck in the concrete
- Databases are categories
- Bug boogie: Git and symlinks
- Punt the Prelude
- Use The Monoid: A worked example
- Bananas, Lenses, Envelopes and Barbed Wire A Translation Guide
- Lazy exceptions and IO
- Upgrading to Ubuntu Lucid
- Class Reflections
- I Hate Patches: Confessions of an Open-Source Developer
- Spring 2010: A Random Walk
- Refactoring Haskell code?
- Nested Data Parallelism versus Creative Catamorphisms
- Omnipresent Cabal
- Name conflicts on Hackage
- Design Patterns in Haskell
- Art. Code. Math. (And mit-scheme)
- Inessential guide to fclabels
- The Problem with xUnit
- Creative catamorphisms
- Association maps in mit-scheme
- Thoughts on discussion
- Dudamel visits MIT
- Inessential Guide to data-accessor
- Later Impressions of the VX-8R
- Diagramming in Xournal and Gimp
- You could have invented zippers
- Cup of FP with a Java twist
- Summer internship at Galois
- More fun with Futamura projections
- The case of the Hash Array Mapped Trie
- Ad hoc wireless
- Hunting for abstractions in mathematics
- Mutation sleuthing in Python
- Haskell, The Hard Sell
- Straitjacket programming
- Five tips for maintainable shell scripts
- Replacing small C programs with Haskell
- Being an expert considered harmful
- How to use Vim's textwidth like a pro
- Third-party unattended upgrades in three steps
- Writing generator friendly code
- History as documentation
- The Art of Posing a Problem
- Comonads and Convolutions
- Type manipulation: Tricks of the trade
- Why we stay up late
- Hunting for constraints
- Scheming environments
- Sources of music
- Nested loops and exceptions (Oleg Kiselyov)
- Nested loops and continuations
- Classes begin
- Cute macro tricks in the kernel
- Workflows in Git: Single-user style
- Arcadia Rising posters
- To the right! Autocompletable names
- Hacking git-rerere
- Too many leftovers!
- Five advanced Git merge techniques
- Typeclasses matter
- Sup: Mail for Nerds
- First impressions of the VX-8R
- Why Haskell? The big question
- rxvt-unicode for gnome-terminal refugees
- Audio connectors and radios
- Adventures in Three Monads