I authored Distributed Services with Go. The book teaches you how to build distributed systems by walking you through building a real-world software project (a self-contained, persistent event-stream service) from start to finish. The book introduces distributed systems practically, explaining the pieces that make up a distributed system and showing how they fit together.
I build foundational infrastructure at early-stage companies. Currently at Oscilar as the first infrastructure engineer, building our risk decisioning platform. Previously, I was the first cloud hire at Confluent, where I built the backend and infrastructure powering Confluent Cloud. Before that, I was an early engineer at Segment working on backend and infrastructure, and earlier in my career worked as a prototyper at 37signals.
I learned to program through open-source, contributing to real-world projects and eventually creating and maintaining my own. I’ve continued that work throughout my career, and my GitHub reflects years of tools, libraries, and infrastructure projects I’ve contributed to or built.
Want to reach me? Send me an email or message me on Twitter.
- 25 years of Emacs
Nov 16, 2025
- I'll take pkg over internal
Nov 1, 2019
- Keep passwords and secrets out of your logs with Go
Jun 4, 2018
- The best books I read in 2017
Feb 1, 2018
- “username or password incorrect” is bullshit
Dec 21, 2017
- Hiring woes: the costs of bad hires and how to avoid them
Oct 4, 2017
- Manage Datadog with Terraform
Sep 7, 2017
- How to persuade in online discussions
Jun 14, 2017
- Building a Kafka that doesn’t depend on ZooKeeper
Jan 19, 2017
- EC2’S magical address to get instance metadata
Nov 29, 2016
- How Kafka’s Storage Internals Work
Oct 13, 2016
- Monitoring with InfluxData's TICK stack
Sep 23, 2016
- Techniques to Achieve High Write Throughput With Elasticsearch
Jun 8, 2016
- Using Golang and JSON for Kafka Consumption With High Throughput
May 9, 2016
- Graphing Kafka offset lags with StatsD
Mar 26, 2016
- SSH into EC2 instance with instance ID
Nov 30, 2015
- Outbound connections from Docker with VirtualBox not working?
Nov 17, 2015
- Building a custom Zendesk app
Nov 10, 2015
- Library and Lambda function to show your Rdio heavy rotation on your website
Oct 24, 2015
- Error responses on Node.js with Koa
Oct 21, 2015
- Building infrastructure with Docker, AWS ECS, and Hashicorp's Terraform
Oct 7, 2015
- Piping into a Docker container
Sep 25, 2015
- Writing your own Emacs interactive functions with completion
Sep 11, 2015
- Animated nyan cat in the terminal
Jun 25, 2015
- Re-architecting Segment's API
Mar 25, 2015
- How to hide Chrome's notification icon in the menu bar
Jul 24, 2014
- NSURLSession and NSOperationQueue working together = TRVSURLSessionOperation
Jun 17, 2014
- Added support for promises in mocha v1.18.0
Mar 14, 2014
- Jasmine-jQuery v2 adding support for Jasmine v2
Jan 13, 2014
- Writing @ prefixed macros
Jan 10, 2014
- My Xcode plug-in to have Clang format/style your code using the new clang-format
Jan 7, 2014
- Text processing with NSLinguisticTagger: implementing Writer Pro's syntax control
Dec 25, 2013
- Preventing 'IB auto generated at build time for view with fixed frame' when using Auto Layout
Nov 28, 2013
- URL linking in a non-editable NSTextView
Nov 9, 2013
- Using UIImage, UIColor, UIFont Code on Mac OS X
Nov 2, 2013
- Using TextKit to put an image in a text view
Oct 20, 2013
- How to know when a UIScrollView (includes UITableView, UICollectionView) finished scrolling
Oct 19, 2013
- Server-sent event event source API client in ObjC for iOS and Mac using NSURLSession
Oct 12, 2013
- Async testing with Xcode and any testing framework such as XCTest, SenTestingKit, Expecta, etc.
Oct 11, 2013
- `git author sha`: get author info for a given sha in git
Oct 5, 2013
- Xcode attaching to app running in simulator not working
Oct 3, 2013
- Basic authentication with AFNetworking 2
Sep 27, 2013
- Disable microphone muting when typing in Google+ Hangouts
Sep 24, 2013
- Scroll to the bottom of a UICollectionView
Sep 19, 2013
- Testing JavaScript projects with Grunt, Jasmine, and JSHint
Sep 3, 2013
- Installing Ruby with rbenv and Homebrew on OS X Mavericks
Jun 24, 2013
- When Google Chrome won't open iTunes links
Jun 4, 2013
- Getting the status bar's height in iOS
May 6, 2013
- Converting AVFoundation's power levels to/from logarithmic and linear scale
Feb 8, 2013
- Notify yourself of successful/failed Xcode builds by email
Jan 17, 2013
- Overriding UIViewController's view property, done right
Dec 28, 2012
- Quick staging and other file operations in git
Nov 1, 2012
- Making Custom Transitions Between UIViewControllers
Oct 22, 2012
- Alias in ZSH with completion
Aug 8, 2012
- iOS how-to: mask and shadow views
Aug 6, 2012
- Adding a drop shadow to a table view
Jul 23, 2012
- Getting the index path of a table view cell via a subview event
Jul 22, 2012
- Rendering errors with JSON and Rails
Apr 27, 2012
- How-to test starting Backbone's history
Apr 16, 2012
- Web Inspector's new dock to right feature
Apr 1, 2012
- errors.js: client side errors object
Mar 30, 2012
- What is this? I don't even... bind this to your object in JavaScript!
Mar 29, 2012
- JavaScript conditional assignment
Mar 20, 2012
- Generate Rails migrations that automagically add your change
Mar 16, 2012
- Using git's include for private configuration information (like github tokens)
Mar 9, 2012
- Find Rails partial references in Vim
Feb 23, 2012
- Using PostgreSQL's Hstore with Rails
Feb 20, 2012
- Vim and the power of :g
Feb 17, 2012
- Modern grep
Feb 9, 2012
- Search a git repo like a ninja
Feb 2, 2012
- ZSH's extended glob breaking commands
Jan 30, 2012
- Hide comments with Vim folding
Jan 17, 2012
- Building regexps in JavaScript
Jan 5, 2012
- Expressive domain specific languages (DSL) in Ruby
Dec 28, 2011
- Keeping your git repo clean of .orig files!
Dec 3, 2011
- Saving files in nonexistent directories with Vim
Nov 28, 2011
- Markdown headers in Vim
Nov 18, 2011
- Mess up a rebase? Reflog your problems away
Oct 31, 2011
- M-x occur for Vim
Oct 31, 2011
- Hello. Yes, this is blog.
Oct 29, 2011