### 1 million page views
I was delighted to notice this morning that this site has recently passed 1M page views. And since Murat wrote about his 1M page view accomplishment at the time, I felt compelled to now too. I started...
Rss feed of the blogs I like, sorted by published-date.
I was delighted to notice this morning that this site has recently passed 1M page views. And since Murat wrote about his 1M page view accomplishment at the time, I felt compelled to now too. I started...
These are some of the most influential (mostly due to experience or expertise) and active folks (I actually see them attend events) in the NYC infrastructure scene (that I have a personal connection t...
This is an external post of mine. Click here if you are not redirected.
Being unemployed can be incredibly depressing. So much rejection. Everything seems to be out of your control. Everything except for one thing: what you produce. You might know that repeatedly posting ...
You want to check for strict consistency ( linearizability ) for your project but you don't want to have to deal with the JVM . Porcupine , used by a number of real-world systems like etcd and TiDB, h...
Delta Lake is an open protocol for serverless ACID databases. Due to its simplicity, scalability, and the number of open-source implementations, it's quickly becoming the DuckDB of serverless transact...
I wrote last month that what you want to do is one of the most useful motivations in life. I want to follow that up by saying that the only thing more important than wanting to do something is to actu...
In your professional and personal life, I don't believe there is a stronger motivation than having something in mind and the desire to do it. Yet the natural way to deal with a desire to do something ...
Bugs in distributed systems are hard to find, largely because systems interact in chaotic ways. And even once you've found a bug, it can be anywhere from simple to impossible to reproduce it. It's abo...
This is an external post of mine. Click here if you are not redirected.
This year has seen a resurgence in really high quality systems programming meetups. Munich Database Meetup , Berlin Systems Group , SF Distributed Systems Meetup , NYC Systems , Bengaluru Systems , to...
A database does not need a write-ahead log (WAL) to achieve durability. A database can write its long-term data structure durably to disk before returning to a client. Granted, this is a bad idea! And...
Note This blog post was co-authored with May Lee and is cross-posted on the Datadog blog . Datadog collects billions of events from millions of hosts every minute and that number keeps growing and fas...
This is an external post of mine. Click here if you are not redirected.
Some of the most interesting technical blog posts I read come from, and a common reason for posts I write is, confusion. You're at work and you start asking questions that are difficult to answer. You...
I've been running software book clubs almost continuously since last summer, about 12 months ago. We read through Designing Data-Intensive Applications , Database Internals , Systems Performance , and...
In this post we'll build a database in 400 lines of code with basic support for five standard SQL transaction levels: Read Uncommitted, Read Committed, Repeatable Read, Snapshot Isolation and Serializ...
I want to explain why the blogs in My favorite technical blogs are my favorite. That page is solely about non-corporate tech blogs. So this post is too. I'll have to make another list for favorite cor...
I started a paper reading club this week at work, focused on databases and distributed systems research. I posted in a general channel about the premise and asked if anyone was interested. I clarified...
This is an external post of mine. Click here if you are not redirected.
Having worked a bit in Zig, Rust, Go and now C, I think there are a few common topics worth having a fresh conversation on: automatic memory management, the standard library, and explicit allocation. ...
A little over a month ago, I joined EnterpriseDB on a distributed Postgres product ( PGD ). The process of onboarding myself has been pretty similar at each company in the last decade, though I think ...
Distributed consensus in transactional databases (e.g. etcd or Cockroach) is a big deal these days. Most often under the hood are variations of log-based Paxos-like algorithms such as MultiPaxos, View...
I spent a week looking at MySQL/MariaDB internals along with ~80 other devs. Although MySQL and MariaDB are mostly the same (more on that later), I focused on MariaDB specifically this week. Before la...
Over the years, I have repeatedly felt like I missed the timing for a meetup or an IRC group or social media in general. I'd go to a meetup every so often but I'd never make a meaningful connection wi...
I learned this week that you can intercept and redirect Postgres query execution. You can hook into the execution layer so you're given a query plan and you get to decide what to do with it. What rows...
With Postgres 12 , released in 2019, it became possible to swap out Postgres's storage engine . This is a feature MySQL has supported for a long time. There are at least 8 different built-in engines y...
King and I wrote a blog post about building an event-driven cross-platform IO library that used io_uring on Linux. We sketched out how it works at a high level but I hadn't yet internalized how you ac...
The most popular SQLite and PostgreSQL database drivers in Go are (roughly) 20-76% slower than alternative Go drivers on insert-heavy benchmarks of mine. So if you are bulk-inserting data with Go (and...
How software fails is interesting. But real-world errors can be infrequent to manifest. Fault injection is a formal-sounding term that just means: trying to explicitly trigger errors in the hopes of d...
Databases are fun. They sit at the confluence of Computer Science topics that might otherwise not seem practical in life as a developer. For example, every database with a query language is also a pro...
This is a collection of random personal experiences. So if you don't want to read everything, feel free to skip to the end for takeaways. I write because I'd like to see more high-quality meetups. And...
Someone on Discord asked about how to learn functional programming. The question and my initial tweet on the subject prompted an interesting discussion with Shriram Krishnamurthi and other folks. So h...
This is an external post of mine. Click here if you are not redirected.
I knew Zig supported some sort of reflection on types. But I had been confused about how to use it. What's the difference between @typeInfo and @TypeOf ? I ignored this aspect of Zig until a problem c...
As part of bringing myself up-to-speed after joining TigerBeetle , I wanted some background on how distributed consensus and replicated state machines protocols work. TigerBeetle uses Viewstamped Repl...
Originally published on February 1, 2021. The original version included two books I don't think are actually so worthwhile. This list is down to two. I think that's a good thing actually. These are th...
Originally published on December 5, 2021. If you are an experienced software developer whose only exposure to reddit is dank memes, proggit or even language-specific subreddits like /r/python , you're...
Introduction # Over the past years, the adoption of RocksDB increased dramatically. It became a standard for embeddable key-value stores. Today RocksDB runs in production at Meta, Microsoft , Netflix ...
At TigerBeetle these last few weeks I've been doing a mix of documenting client libraries, writing sample code for client libraries, and writing integration tests against the sample code. The client l...
Disney was a celebrity by his mid-30s, Disney the company was famous by 1930s. Even though politically the 1930s was considered the decade of Roosevelt (elected President in 1933), culturally the 1930...
I wanted to practice making coding videos so I did a four-part series on writing a basic Scheme-like language (minus macros and arrays and tons of stuff). I picked this simple topic because I wanted a...
There are three specific activities I have loved in some product managers I've worked with (and missed in others). tldr; Talk with customers and prospects Develop and share a vision Evangelize Talk wi...
In 2022 I finished 20 books spanning 15,801 pages. 3 more than I read in 2021, but about twice the number of pages. 3 fiction and 17 non-fiction. Another ~30 started but not finished. I had a hard tim...
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
You acquire a skill or experience through time and effort, then downplay the impact of writing and sharing the learning process. Professionals seem naturally to imagine a high bar for what is worth wr...
This is an external post of mine. Click here if you are not redirected.
For my second project while learning Zig, I decided to port an old, minimal SQL database project from Go to Zig. In this post, in ~1700 lines of code (yes, I'm sorry it's bigger than my usual), we'll ...
I mostly programmed in Go the last few years. So every time I wanted an embedded key-value database, I reached for Cockroach's Pebble . Pebble is great for Go programming but Go does not embed well in...
This is an external post of mine. Click here if you are not redirected.
When I wrote the " build a distributed PostgreSQL proof of concept " post I first had to figure out how to use Hashicorp's Raft implementation . There weren't any examples I could find in the Hashicor...
Let's assume you're familiar with basic SQL databases like PostgreSQL and MySQL, and document databases like MongoDB and Elasticsearch. You probably know Redis too. But you're hearing more and more ab...
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
In this post we'll build a basic jq clone in Go. It will only be able to pull a single path out of each object it reads. It won't be able to do filters, mapping, etc. $ cat large-file.json | head -n2 ...
This is an external post of mine. Click here if you are not redirected.
What is CockroachDB under the hood? Take a look at its go.mod and notice a number of dependencies that do a lot of work: a PostgreSQL wire protocol implementation , a storage layer , a Raft implementa...
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
This is an external interview. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
In this post we'll write a rudimentary document database from scratch in Go. In less than 500 lines of code we'll be able to support the following interactions, inspired by Elasticsearch: $ curl -X PO...
This is an external post of mine. Click here if you are not redirected.
I've never run my own mail server before. Before today I had no clue how email worked under the hood other than the very few times I've set up mail clients. I've heard no few times how hard it is to s...
This is an external post of mine. Click here if you are not redirected.
Many "must-read" books are not well-written. I try to read a lot , but I still have a low tolerance for bad writing and bad editing. I write this post both to discourage thoughtless recommendations an...
I spent a few days playing around with bootloaders for the first time. This post builds up to a text editor with a few keyboard shortcuts. I'll be giving a virtual talk based on this work at Hacker Ni...
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
Last year (2021) I finished 17 books, a five year low. But that's ok! 4 fiction and 13 non-fiction. Another 30 started but not finished. Non-fiction It seems I was pretty focused on business history b...
By the end of this guide we'll have a minimal, working implementation of a small part of Lua from scratch. It will be able to run the following program (among others): function fib ( n ) if n < 2 then...
This is an external post of mine. Click here if you are not redirected.
All code for this post is available on Github . Let's take a look at how zip files work. Take a small file for example: $ cat hello.text Hello! Let's zip it up. $ zip test.zip hello.text adding: hello...
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
Previously in exploring PL/pgSQL: Strings, arrays, recursion and parsing JSON In my last post I walked through the basics of PL/pgSQL, the embedded procedural language inside of PostgreSQL. It covered...
Next in exploring PL/pgSQL: Implementing a Forth-like interpreter PostgreSQL comes with a builtin imperative programming language called PL/pgSQL. I used to think this language was scary because it ha...
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
V8 is, I'm sure, the most used implementation of JavaScript today. Used in Chrome, (and by extension) Microsoft Edge, Node.js, etc. Safari's JavaScriptCore and Firefox's SpiderMonkey are also contende...
Modern C++ has a lot of cool features. Move semantics means passing around structs in functions is cheap. std::shared_ptr means I don't have to manage any memory; no more new / delete ! (But try as I ...
Developers often think parser generators are the sole legit way to build programming language frontends, possibly because compiler courses in university teach lex/yacc variants. But do any modern prog...
In a ridiculous attempt to prove an internet wrong about the practicality of Lisp (Common Lisp specifically), I tried to get a simple (but realistic) web app running. After four days and a patch to AB...
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
This is an external post of mine. Click here if you are not redirected.
This post goes out to anyone who leads a team: managers, directors, VPs, executives. You need to share organization success stories with your organization on a regular and frequent basis. Talk about s...
This is an external post of mine. Click here if you are not redirected.
For years I've kept a private list of really cool tech companies in NYC. Now that I'm funemployed it's the perfect time to publish. This list is influenced by 1) my perception of the difficulty of the...
In this post we'll build a minimal text templating library in Python inspired by Jinja. It will be able to display variables and iterate over arrays. By the end of this article, with around 300 lines ...
I have never contributed to nginx. My C skills are 1/10. But downloading the source, hacking it up, compiling it, and running it doesn't scare me. This post is to help you overcome your own fears abou...
tldr; reimplement standard library functions in your favorite language without loops . Background For a few years after college I spent a lot of free time doing projects in Standard ML and Scheme. As ...
It's been a few months since I picked up gosql and I wanted to use it to prototype a SQL interface for data stored in S3. But one missing critical feature in gosql is LIMIT and OFFSET support. This po...
This year I finished 47 books, up from last year but not a personal best. The breakdown was 17 non-fiction and 30 fiction. Another 20-30 remain started but unfinished this year. Non-fiction The 8 non-...
In this post we'll get a basic semgrep environment set up in Docker running some custom rules against our code. Existing linters Linters like pylint for Python or eslint for JavaScript are great for g...
In this post we'll stumble toward a working emulator for a barebones C program compiled for linux/AMD64. The approach will be slightly more so based on observation than by following a spec; a great wa...
Ambitious companies form management teams at every level above you, sometimes including you. Management teams meet periodically and have private chat rooms. They discuss customers, product and organiz...
Incredibly, Standard ML implementations are still actively developed. MLton , Poly/ML , MLKit , SML# and SML/NJ are the most prominent. Discussion on the future direction of Standard ML remains health...
When I first started programming, especially when asked for code samples, my comments lacked purpose and would often duplicate in English what the code clearly indicated. I knew that "commenting is go...
In this post we'll write a Python to C compiler in Python. This is especially easy to do since Python has a builtin parser library and because a number of CPython internals are exposed for extension w...
Full-Text Search is one of those tools people use every day without realizing it. If you ever googled "golang coverage report" or tried to find "indoor wireless camera" on an e-commerce website, you u...
This post is a recipe for setting up a minimal Kubernetes cluster on Fedora without requiring virtualization or a container registry. These two features make the system cloud-agnostic and the cluster ...
DBCore can now generate a TypeScript/React CRUD UI that is automatically hooked up to the generated REST API (in Go). The UI has full support for login, viewing (and filtering), editing, and creating ...
I recently published an alpha version of a code generation tool, DBCore, that reads a database schema from PostgreSQL or MySQL and generates an entire Go API with CRUD operations, pagination, filterin...
I hated writing documentation before working on features. But after a while I realized I couldn't communicate well enough, even with folks I had a good connection with. It took me a number of mistaken...
Previously in database basics: <! forgive me, for I have sinned > 1. SELECT, INSERT, CREATE and a REPL 2. binary expressions and WHERE filters 3. indexes In this post, we'll extend gosql to implement ...
Previously in database basics: <! forgive me, for I have sinned > 1. SELECT, INSERT, CREATE and a REPL 2. binary expressions and WHERE filters Next in database basics: 4. a database/sql driver In this...
Previously in database basics: <! forgive me, for I have sinned > 1. SELECT, INSERT, CREATE and a REPL Next in database basics: 3. indexes 4. a database/sql driver In this post, we'll extend gosql to ...
The only time I've been able to seriously, rapidly improve my ability to speak a foreign language was through intensive language courses in college. I was forced to actively speak, read, and write Chi...
The first few paragraphs cover what I was looking for and what I considered. Then the review. Why the Surface Book 2 I used a Macbook throughout my professional career until I had the choice a few yea...
Next in database basics: <! forgive me, for I have sinned > 2. binary expressions and WHERE filters 3. indexes 4. a database/sql driver In this series we'll write a rudimentary database from scratch i...
There's a style of Java that is a joy to write. This post will cover how to set up a basic PostgreSQL-integrated REST API using Jersey and JOOQ in a style not dissimilar to Flask and SQLAlchemy in Pyt...
Previously in compiler basics: <! forgive me, for I have sinned > 1. lisp to assembly 2. user-defined functions and variables 3. LLVM 4. LLVM conditionals and compiling fibonacci 5. LLVM system calls ...
The quickest way to cut through confusion or disagreement among otherwise amiable and honest folks is to ask questions. Ask early so you don't waste time. But it's not enough to just ask clarifying qu...
After spending some time at work on tooling for keeping documentation in sync with Go struct definitions I had enough exposure to Go's built-in parsing package that next steps were clear: write an int...
Kubernetes is easy to use after some exposure; it's pretty convenient too. But it is super hard to set up. eksctl is a good tool for folks who don't want to spend hours/days/weeks debugging VPC config...
This post covers building and testing a minimal, but still useful, C project. We'll use Google's gtest and CMake for testing C code. This will serve as a foundation for some upcoming posts/projects on...
Previously in emulator basics: <! forgive me, for I have sinned > 1. a stack and register machine In this post we'll extend x86e to support the exit and write Linux system calls, or syscalls. A syscal...
Previously in compiler basics: <! forgive me, for I have sinned > 1. lisp to assembly 2. user-defined functions and variables 3. LLVM 4. LLVM conditionals and compiling fibonacci Next in compiler basi...
Better yet, take a look at this post walking through emulating x86 ELF binaries in Go: Emulating linux/AMD64 userland: interpreting an ELF binary Next up in emulator basics: <! forgive me, for I have ...
In this post we'll explore what tail calls are, why they are useful, and how they can be eliminated in an interpreter, a compiler targeting C++, and a compiler targeting LLVM IR. Tail calls A tail cal...
Previously in compiler basics: <! forgive me, for I have sinned > 1. lisp to assembly 2. user-defined functions and variables 3. LLVM Next in compiler basics: 5. LLVM system calls 6. an x86 upgrade In...
Responsibility is only possible by granting ownership and setting expectations. If you don't turn over ownership, don't expect folks to take responsibility. When you grant ownership and set expectatio...
In addition to providing a static type system and compiler for a superset of JavaScript, TypeScript makes much of its functionality available programmatically. In this post we'll use the TypeScript co...
Say we have some HTML: < html > < body > < h1 > Hello world! </ h1 > </ body > </ html > And say we'd like to be able to render this page in a web browser. If the server is hosted locally we may want ...
Let's say we want to implement a simple list filtering language so we can enter a.b = 12 and return only results in a list where the a column is an object that contains a field b that is set to the va...
Previously in compiler basics: <! forgive me, for I have sinned > 1. lisp to assembly 2. user-defined functions and variables Next in compiler basics: 4. LLVM conditionals and compiling fibonacci 5. L...
tldr; I'm working on a AOT-compiled Javascript implementation called jsc . Many dynamically typed programming languages have implementations that compile to native binaries: Python: Cython Common Lisp...
I saw a post on dev.to that talks about dysfunctional teams. This is a response that focuses specifically on how to prevent burnout from overworking. This is aimed at senior/lead engineers and enginee...
It has been six years since I last used Windows for any remotely serious software development. I've used Ubuntu, Arch, or FreeBSD since. But eventually I spent so much time working around common workp...
Previously in compiler basics: <! forgive me, for I have sinned > 1. lisp to assembly Next in compiler basics: 3. LLVM 4. LLVM conditionals and compiling fibonacci 5. LLVM system calls 6. an x86 upgra...
Two frustrating things that can happen in an organization are 1) big changes and 2) changes that aren’t clearly associated with a known problem. It’s even worse in that order. These situations tend to...
String interning is a technique of storing only one copy of each unique string in memory. It can significantly reduce memory usage for applications that store many duplicated strings. The built-in str...
Next in compiler basics: <! forgive me, for I have sinned > 2. user-defined functions and variables 3. LLVM 4. LLVM conditionals and compiling fibonacci 5. LLVM system calls 6. an x86 upgrade In this ...
I’ve lived in NYC for the past year — moved here after years in Philly and after growing up in a rural community a few hours west of there. My wife is South Korean and last week concluded my second tr...
The last time I read for fun was in elementary school. Since college I knew I must read more, but I never forced myself to build the habit. Then three years ago I spent time around my brother and a co...
It can be difficult to disassociate the idea that dynamically typed programming languages are tied to byte-code interpreters (e.g. YARV Ruby, CPython, V8, Zend Engine, etc.). But for many languages, a...
btest is a minimal, language-agnostic test runner originally written for testing compilers. Brian, an ex- co-worker from Linode, wrote the first implementation in Crystal (a compiled language clone of...
There is a common struggle in the writing and maintenance of documentation, checklists, emails, guides, etc. Each provides immense value; a document may be the key to an important process. The goal is...
Writing a JSON parser is one of the easiest ways to get familiar with parsing techniques. The format is extremely simple. It's defined recursively so you get a slight challenge compared to, say, parsi...
I've been using FreeBSD as my daily driver at work since December. I've successfully done my job and I've learned a hell of a lot forcing myself on CURRENT... But there's been a number of issues with ...
Score: 4.5 / 5 Paul Graham and his editor(s) are excellent. His prose is light and easy to follow. The only awkward component of the book's organization is that he tends to use a concept one section b...
Note This post is outdated, please read the new design document on GitHub . A few months ago I released the first version of an embedded on-disk key-value store written in Go. The store is about 10 ti...
If you've only vaguely heard of Lisp before or studied Scheme in school, Common Lisp is nothing like what you'd expect. While functional programming is all the rage in Scheme, Common Lisp was "express...
This is an external post of mine. Click here if you are not redirected.
Running Go on AWS Lambda is not something totally new - developers figured out how to launch Go binaries from Python a while ago, but it wasn't convenient and had some performance implications. A few ...
I started working on BSDScheme last October, inspired to get back into language implementation after my coworker built bshift , a compiler for a C-like language. BSDScheme is an interpreter for a (cur...
Cgo is a mechanism that allows Go packages call C code. The Go compiler enables cgo for every .go source file that imports a special pseudo package "C" . The text in the comment before the import "C" ...
Note This post was updated on 2021-04-25. Go has a powerful built-in profiler that supports CPU, memory, goroutine and block (contention) profiling. Enabling the profiler # Go provides a low-level pro...
I became a FreeBSD user over 2 years ago when I wanted to see what all the fuss was about. I swapped my y410p dual-booting Windows / Ubuntu with FreeBSD running Gnome 3. I learned a lot during the tra...
Racket is an impressive language and ecosystem. Compared to Python, Racket (an evolution of Scheme R5RS is three years younger. It is as concise and expressive as Python but with much more reasonable ...
Here are the slides from my talk "Scraping the Web with AWS Lambda and PhantomJS" given at Greater Philadelphia AWS User Group meetup on May 25, 2016. You can find the source code of PhantomJS/Node.js...
Note This post was updated on 2016-08-13: added python-rapidjson ; updated simplejson and ujson . A couple of weeks ago after spending some time with Python profiler, I discovered that Python’s json m...