What I do for a living is best described as domain modeling (h/t @whitequark).
Let’s say you have a bunch of raw data that has some sort of underlying structure, and you want to make sense out of it. If your data can be fit into well-known structures like Merkle trees or directed acyclic graphs, it can be used to build high-quality, high-performance tools and systems. The central thrust of my career has been about doing just that.
I build tools that make developers’ lives better. I’ve spent many years doing it, and I’ve come away with a few core beliefs:
- Tools are force multipliers created by humans to serve humans. The ability to build and compose tools is among humanity’s greatest strengths.
- The digital realm opens up new possibilities for tools, free from physical constraints.
- Tools shape culture: if a tool makes something easier to do, people will do more of it.
- If a human has trouble understanding a tool, it is always a problem with the tool—never with the human.
- The material relations around the development of tools have an outsized, underappreciated influence on human society.
2022-present: Starting November 2022, I’ll be at Oxide, working on the control plane.
2018-2022: I worked at Novi on developer tools for the Diem blockchain. Before that I worked on the virtual machine for the Move smart contract language.
2012-2018: I worked on developer tools, primarily source control, at Facebook. As part of my work on Mononoke, I led a team effort to invent novel version control data structures that made performance-critical operations much faster.
2008-2012: while being a full-time student, I contracted for Mozilla on Firefox’s then-build system and Thunderbird, among other things.
Open source projects⌗
I’ve been privileged to work on open source code for most of my career. Here’s a partial list of projects I have substantial professional contributions to:
cargo-nextest: A new test runner for Rust, using parallel execution to make test runs over twice as fast as
cargo test. Supports identifying slow, leaky and flaky tests; partitioning test runs across multiple CI jobs; and producing test results in the JUnit format. Nextest has over 1000 stars on GitHub and is used by Rust projects of all sizes.
guppy: project lead for a set of tools and libraries that track Cargo dependency graphs. guppy was used by the high-security Diem project to solve a variety of problems, most importantly to understand what code ships in production binaries.
- Other work based on guppy includes cargo-hakari, a project to manage workspace-hack packages, speeding up builds in large workspaces by 60%.
Diem: drove several systemic improvements to the Diem blockchain’s code quality, the biggest one being introducing property-based testing and coverage-guided fuzzing.
Mercurial: many improvements to the version control system: designing merge drivers, other new features, and performance work. Member of the steering committee from 2016-2018.
Mononoke: Founding member of the team that created Facebook’s next-generation source control server, now in production use (2019–).
- Led a team effort to design Bonsai changesets, a Merkleized representation of source control data that has a significantly higher throughput than Git.
- Implemented many core features, including wire protocol support for Mercurial, conversion to and from the Bonsai format, and lazy diff and merge algorithms that only fetch data as required.
Watchman: Integrated the file-monitoring tool with Mercurial. Making it reliable meant perfect tracking of file changes: found and fixed a number of TOCTTOU races in Watchman.
I’ve also made personal contributions to some projects, including:
camino: like Rust’s
std::path, except UTF-8 only. Simplifies path handling greatly for most applications.
Documentation and tutorials⌗
I’ve written documentation, tutorials and essays about Rust and software engineering. My work has been useful to practitioners and learners in both business and academia. Other than the posts on this website, I’ve written:
rust-cli-recommendations: My recommendations for how to organize and manage Rust CLI applications.
lifetime-variance: A tutorial to cover the basics of variance in Rust, as it applies to lifetimes.
borrow-complex-key-example: How to implement the
Borrow trait for non-trivial keys.
I have over a decade of professional experience developing software from start to finish:
- coming up with new ideas: creating new software designs, inventing high-performance algorithms, and designing novel data structures that solve complex scaling problems, both independently and leading team efforts
- prototyping those ideas and rejecting the ones that don’t work out
- communicating those ideas to teams of 4-100 people through presentations and design documents, resolving disagreements and conflicts along the way
- expressing those ideas through code, primarily in Rust but also in Python, Hack and some C and C++
- validating that code through a variety of techniques, including property-based testing and coverage-guided fuzzing, and driving efforts by large teams to do the same
- and productionizing that code through thoughtful, staged rollouts, taking into account costs, risks and benefits along the way.
Everything I know I’ve learned by working in teams full of extraordinary people, and I owe a great debt of gratitude to them.
Available upon request.