Notes on software development
DatabasesCompilersDistributed systems / cloudGoSoftware / engineering practice
- Posts
- 208 from 29 Dec 2016 to 29 Oct 2026
- Posting
- weekly (41 in the last year)
- Kind
- personal blog
- Feed
- https://notes.eatonphil.com/rss.xml
2026 37
- 2026 10 29 nyc
- Deepthi Sigireddi from Supabase
- Compression and concatenation on the web
- Full text search and PostgreSQL
- Query plan rewriting in PostgreSQL
- Data races and the limits of ThreadSanitizer in C and Go
- Another look at SQLite's WAL-Reset bug
- The road to ACID transactions in Cassandra 6
- Hourly updates to jobs and the feed
- Touring The Consensus, six months in
- The feature in OxCaml that more languages should steal
- WasmGC in Wasmtime
- Observing Go's garbage collector, old and new
- Doing the rounds
- This week in infrastructure
- Of forks and clones and package management
- Python 3.14 garbage collection rigamarole
- Yeunjoo Choi from Igalia on Chromium
- Serving files over HTTP three ways: synchronous, epoll, and io_uring
- Automating Hermitage to see how transactions differ in MySQL and MariaDB
- Branimir Lambov from IBM on Cassandra
- Who even uses jemalloc in 2026 anyway? (many major projects)
- How jobs, events, and funding work on The Consensus
- Who contributed to DataFusion 53
- Taking multi-master MariaDB for a spin, reproducing a Jepsen report
- Developer Spotlight: Somtochi Onyekwere from Fly.io
- A static site generator and website transferring under 20kB
- Mojo's not (yet) Python
- Source-available projects and their AI contribution policies
- Open Source Contributor Spotlight: Kosta Tarasov and DataFusion
- I started a software research company
- We have pgvector at home
- Generating vector embeddings for semantic search locally
- Paths of MySQL, vector search edition
- Companies behind Postgres 18 development
- LLMs and your career
- Distinguishing yourself early in your career as a developer
2025 25
- Year in community
- Year in books
- Is psql's scripting language Turing complete? Or: fibonacci in psql
- An individual can change an organization
- Transaction pooling for Postgres with pgcat
- In response to a developer asking about systems
- A simple clustering and replication solution for Postgres
- Analytics query goes 6x faster with EDB Postgres Distributed's new analytics engine
- Set up a single-node EDB Postgres Distributed cluster on Ubuntu
- What even is distributed systems
- Stack traces for Postgres errors with backtrace_functions
- Want to meet people, try charging them for it?
- Debugging memory leaks in Postgres, jemalloc edition
- Cheerleading
- Debugging memory leaks in Postgres, heaptrack edition
- Screw your title
- Transactions are a protocol
- Things that go wrong with disk IO
- Phil Eaton on Technical Blogging
- Minimal downtime Postgres major version upgrades with EDB Postgres Distributed
- From web developer to database developer in 10 years
- Edit for clarity
- An explosion of transitive dependencies
- Embedding Python in Rust (for tests)
- Logical replication in Postgres: Basics
2024 25
- How I run a coffee club
- Picking up volleyball in NYC with Goodrec and New York Urban
- 1 million page views
- Exploring Postgres's arena allocator by writing an HTTP server from scratch
- Effective unemployment and social media
- Checking linearizability in Go
- Intuitions for Distributed Consensus by Phil Eaton
- Build a serverless ACID database with this one neat trick (atomic PutIfAbsent)
- Be someone who does things
- Obsession
- What's the big deal about Deterministic Simulation Testing?
- Delightful, production-grade replication for Postgres
- A reawakening of systems programming meetups
- A write-ahead log is not a universal part of durability
- The limitations of LLMs, or why are we doing RAG?
- Confusion is a muse
- How I run a software book club
- Implementing MVCC and major SQL transaction isolation levels
- What makes a great technical blog
- A paper reading club at work; databases and distributed systems research
- Finding memory leaks in Postgres C code
- Zig, Rust, and other languages
- First month on a database team
- An intuition for distributed consensus in OLTP systems
- Writing a minimal in-memory storage engine for MySQL/MariaDB
2023 22
- Make your own way
- Exploring a Postgres query plan
- Writing a storage engine for Postgres: an in-memory Table Access Method
- io_uring basics: Writing a file to disk
- Go database driver overhead on insert-heavy workloads
- Intercepting and modifying Linux system calls with ptrace
- How do databases execute expressions?
- Eight years of organizing tech meetups
- Thinking about functional programming
- We put a distributed database in the browser – and made a game of it
- Metaprogramming in Zig and parsing CSS
- Implementing the Raft distributed consensus protocol in Go
- Two books I recommend to developers
- My favorite software subreddits
- Errors and Zig
- Notes from Neal Gabler's Walt Disney
- Lessons learned streaming building a Scheme-like interpreter in Go
- An effective product manager
- The year in books: 2022
- Favorite compiler and interpreter resources
- General book recommendations
- In response to a frontend developer asking about database development
2022 25
- Is it worth writing about?
- A Programmer-Friendly I/O Abstraction Over io_uring and kqueue
- Writing a SQL database, take two: Zig and RocksDB
- A minimal RocksDB example with Zig
- A database without dynamic memory allocation
- A minimal distributed key-value database with Hashicorp's Raft library
- What's the big deal about key-value databases like FoundationDB and RocksDB?
- SQLite has pretty limited builtin functions
- Container scheduling strategies for integration testing 14 different databases in Github Actions
- Implementing a simple jq clone in Go, and basics of Go memory profiling
- One year as a solo dev building open-source data tools without funding
- Let's build a distributed Postgres proof of concept
- SQLite in Go, with and without cgo
- HTML event handler attributes: down the rabbit hole
- Interview With Phil of DataStation
- Surveying SQL parser libraries in a few high-level languages
- Writing a document database from scratch in Go: Lucene-like filters and indexes
- Speeding up Go's builtin JSON encoder up to 55% for large arrays of objects
- SMTP protocol basics from scratch in Go: receiving email from Gmail
- The world of PostgreSQL wire compatibility
- How to recommend books, or, stop recommending SICP
- Bootloader basics
- dsq: Commandline tool for running SQL queries against JSON, CSV, Excel, Parquet, and more.
- Analyzing large JSON files via partial JSON parsing
- The year in books: 11 to recommend in 2021
2021 23
- Writing a minimal Lua implementation with a virtual machine from scratch in Rust
- Running SQL Server in a container on Github Actions
- Implementing zip archiving in Golang: unzipping
- Benchmarking esbuild, swc, tsc, and babel for React/JSX projects
- Building a fast SCSS-like rule expander for CSS using fuzzy parsing
- Exploring PL/pgSQL part two: implementing a Forth-like interpreter
- Exploring PL/pgSQL: Strings, arrays, recursion, and parsing JSON
- Experimenting with column- and row-oriented datastructures
- Notes on running Electron
- Enumerating and analyzing 40+ non-V8 JavaScript implementations
- Writing a simple JSON library from scratch: a tour through modern C++
- Parser generators vs. handwritten parsers: surveying major language implementations in 2021
- Practical? Common Lisp on the JVM: A quick intro to ABCL for modern web apps
- Writing an efficient object previewer for JavaScript
- React without webpack: fast path to a working app from scratch
- Controlled HTML select element in React has weird default UX
- Leaders, you need to share organization success stories more frequently
- Languages you can run in the browser, part 1: Python, JavaScript, SQLite
- Coolest hard-tech companies in NYC 2021
- Writing a Jinja-inspired template library in Python
- Learning a new codebase: hacking on nginx
- How to get better at recursion
- Extending gosql to supporting LIMIT and OFFSET
2020 18
- The year in books: 20 to recommend in 2020
- Static analysis with semgrep: practical examples using Docker
- Emulating linux/AMD64 userland: interpreting an ELF binary
- The impact of management teams as a decision-making group, in startups and enterprise
- Standard ML in 2020
- The case for comments in code
- Writing a simple Python compiler: 1. hello, fibonacci
- A single-node Kubernetes cluster without virtualization or a container registry
- Generating a full-stack application from a database
- Generating a REST API from a database
- RFCs and asynchronous-first culture
- Writing a SQL database from scratch in Go: 4. a database/sql driver
- Writing a SQL database from scratch in Go: 3. indexes
- Writing a SQL database from scratch in Go: 2. binary expressions and WHERE filters
- Studying foreign languages with inbox zero
- Reviewing the Surface Book 2
- Writing a SQL database from scratch in Go: 1. SELECT, INSERT, CREATE and a REPL
- A minimal REST API in Java
2019 18
- Writing a lisp compiler from scratch in JavaScript: 6. an x86 upgrade
- Confusion and disengagement in meetings
- Interpreting Go
- Administering Kubernetes is hard
- Unit testing C code with gtest
- Writing an x86 emulator from scratch in JavaScript: 2. system calls
- Writing a lisp compiler from scratch in JavaScript: 6. LLVM system calls
- Writing an x86 emulator from scratch in JavaScript: 1. a stack and register machine
- Tail call elimination
- Writing a lisp compiler from scratch in JavaScript: 4. LLVM conditionals and compiling fibonacci
- Responsibility and ownership
- Interpreting TypeScript
- Writing a web server from scratch: 1. HTTP and sockets
- Writing a simple JSON path parser
- Writing a lisp compiler from scratch in JavaScript: 3. LLVM
- AOT-compilation of Javascript with V8
- Windows
- Writing a lisp compiler from scratch in JavaScript: 2. user-defined functions and variables
2018 12
- Writing a lisp compiler from scratch in JavaScript: 1. lisp to assembly
- On NYC, Tokyo and Seoul
- Why (and how) to read books
- Compiling dynamic programming languages
- btest: a language agnostic test runner
- Writing to be read
- Writing a simple JSON parser
- Finishing up a FreeBSD experiment
- Book Review: ANSI Common Lisp
- Starting a minimal Common Lisp project
- Interview with the D Language Blog: BSDScheme
- First few hurdles writing a Scheme interpreter