I'm an Infrastructure Engineer at Stripe and a third-year PhD candidate in the PLASMA Lab at UMass Amherst, advised by Emery Berger. My research interests span systems and programming languages, with a focus on making existing software more efficient, more secure, and usable in new contexts.

Weblog

PLDI 2016

I just got back from the 2016 Programming Language Design and Implementation (PLDI) conference (my first PLDI!) in Santa Barbara, along with the Programming Language Mentoring Workshop (PLMW). I met a ton of great people in the PL community and even snuck in some good talks.


Notes on systemd Internals

systemd is the init system used by the current versions of most major Linux distributions, including Debian, Red Hat, Ubuntu and Arch. One of its key features is reliable dependency management, building a dependency graph of services, and sequencing of services where unrelated services can be started in parallel, but dependencies are sequenced correctly.

Let’s walk through how systemd implements this. Of note - if you’re interested in what a modern C codebase that doesn’t care about backwards compatibility can look like, systemd is especially interesting.


Tomato Garlic Dipping Sauce

This is a Syracuse-local recipe, scaled down from here. The goal is to match Cheeky Monkey’s sauce – I think we’re 80% of the way there but there is still some tweaking to do.


Notes on 'Practical FS Design'

I recently finished Practical File System Design by Dominic Giampaolo - a great read on filesystem implementation. Some aspects of the book are dated (initially published in 1999), but it does (lightly) discuss multithreading issues, which are absent from much of the classic UNIX literature. The three topic covered I felt were especially notable are journaling, indexing, and the comparison with other filesystems.


Optimizing real-world Go

This is about some fun I had while putting together a small Unix-y utility to measure RAM and swap usage - psm. I was able to decrease runtime by more than 65% during a 3-hour train ride with the help of some standard go tools.


Research

Browsix

Programs written to run on conventional operating systems typically depend on OS abstractions like processes, pipes, signals, sockets, and a shared file system. Compiling programs into JavaScript, asm.js, or WebAssembly with tools like Emscripten or GopherJS isn't enough to successfully run many programs client-side, as browsers present a non-traditional runtime environment that lacks OS functionality. Porting these applications to the web currently requires extensive rewriting or paying to host significant portions of code in the cloud.

Browsix answers these challenges, with:

Processes: Unmodified C, C++, Go, and Node.js programs run as processes on Web Workers, executing in-parallel with the main browser thread – no need to worry about long-running computations blocking event-handling or page rendering.

Kernel + System Calls: By working at the lowest levels of abstraction, Browsix provides shared resources to multiple language runtimes, just as traditional operating systems enable running programs written in a host of languages.

Scalability: By enabling a large class of programs (including legacy codebases) to run in-browser, Browsix can free you from the chore of sandboxing and load-balancing programs server-side.

Projects

Systems

psm

Utility for fast, accurate RAM and swap reporting

slackfs

FUSE filesystem for Slack, and tmux-based UI

Web

seshcookie

HTTP sessions stored in encrypted cookies for Go

btscale

Reverse-engineered JavaScript API to the Acaia scale

System Dynamics

libsd

Parser and simulation engine in C

sd.js

Parser, simulation engine and diagram layout in JavaScript

boosd

Declarative language for object-oriented SD models, implemented in Go

Contributions

System Dynamics

System Dynamics is a methodology for debugging your mental models of the world. It does this by getting you to write down your assumptions as a model, simulate that model over time, compare the results to historical data, and project into the future. If the results based on your assumptions don't match the real data, you should consider changing your mental model! If the projection into the future doesn't look as you'd like, you are forced to be explicit with where and how your improved policies will influence the model. I wrote a thesis on object-oriented system dynamics as an approach to manage complexity and reuse models.

A project I want to get back to is a web-based editor for SD models, with a focus on usability and design:


Go

I've authored a number of small changes, including recently(-ish) a fix for a compiler crash. I found a nice little performance improvement in the time package. Previously, I've fixed issues in HTTP headers, JSON support, gob encoding, and the build system.

Linux kernel

I helped test and fixup the initial x32 pseudo-arch support in 00194b2e, ce5f7a99, and f044db4c. f75a8df3 and 10db4e1e address spurious and actual warnings emitted during kernel builds. More recently I've fixed an issue in the x86 FPU code with c88d4748.

Git

I found and fixed some issues with git diff --no-index in 176a3354 and f3999e03.

One Laptop Per Child

I was an intern and community member of OLPC. I diagnosed and fixed some bugs (like this one), worked on a System Dynamics activity named Model to enable students to do system dynamics modeling on the XOs, and rewrote the boot animation in C (from Python), cutting 12 seconds off the boot time for hundreds of thousands of laptops.