Engineering
I studied CS at Brown University; while I took my first CS course in 2005, I only really went head-first into CS in 2008 after too much fucking around, and graduated in 2010.
My best friend Saurya has a favorite quote of mine:
Becoming a software engineer because you love coding is like becoming a butcher because you love animals.
So personally, I'd love to have a petting zoo. Professionally, my life looks very different.
My personal computing interests are largely in programming languages. I did Advent of Code using a different language every day (twice, in 2016 and 2021) getting to about 22 languages before I tapped out. I wrote a Whitespace compiler in Racket when I was bored on the Google bus. I wrote a Scrabble bot who's backend is in Erlang, the client in Ruby (wrapping ncurses) and the key data structure is written by a C program using a custom binary format. This blog is generated by my first OCaml program. Those (and more) described below. So yeah, I get down!
Professionally, I tend to stick in mid-level application domain, mostly as a backend engineer, though I've also shipped Android apps, and desktop-deployed C++ for multiple platforms.
At a few companies, I've done people management. While I'm a nerdy dude, my passion is and has always been people; it's why I went to college intending to do theatre. "Computers are something I do, people is who I am."
My full job list is on the more general About me page.
Selected Projects (roughtly chronological order)
ScrabbleCheat
Your neighborhood friendly Scrabble solver.
August 2010-2011. Erlang, Ruby, C. Repo
This was my first major side project after graduating college. I wanted to write a bot for Scrabble, and I wanted to learn Erlang. I did it! Here's how it breaks down:
-
The solver is in Erlang, lives here, and speaks to clients via Apache Thrift (Facebook Thrift was big at the time).
-
I wrote a terminal client using an ncurses library in Ruby, which lives here.
-
Finally, the data structure required was ~300MB when built with Erlang and naively dumping the native term, so I designed a compact binary representation that I constructed in C, and load that binary at runtime. The C program that generates it lives here.
It's actually pretty challenging to do this! Boggle is a common interview
puzzle, but Scrabble has a lot trickier constraints. The trick is to use a
variation of a Trie called a GADDAG, a bizarre data structure more-or-less
invented for this kind of problem in 1995. I wrote the Wikipedia page for it,
check the first revision is pablomeier
😛
Ebooker
Markov-chain Twitter bots
Fall 2012. Go. Repo, announcement/explanation blog post.
I was miserable at Google and thought I might find love if I joined a programming language team. Issue is, I didn't actually know any Go. So I learned by writing this.
Generating Markov chains is not particularly challenging in Go (it's literally one of their codewalks to teach the language), but I learned a ton writing my own OAuth1 client for Twitter's API.
Eventually I got a little too ambitious and tried refactoring the code into modules where it didn't make sense, so I think the eventual state of that code is rather miserable. But making a mess is partially what personal projects are for.
Invisible Thief
A Whitespace interpreter in Racket.
August 2012. Racket. Repo.
Did I mention I was miserable at Google? I was miserable at Google.
The daily commute had me on a Google Bus for ~4 hours every day where I couldn't work on company code: you must tunnel into their machines (no company code in your laptop), my team's project was in Java and needed a graphical environment like Eclipse, and I was competing with ~80 other Googlers to use the bus Wi-Fi. It wasn't conducive to tunneling a full X session.
So I read two blog posts (one on creating languages in Racket and one on Racket macros) and got to work on building a silly language interpreter.
Advent of Code 2016
22 languages in as many days.
December 2016. Repo. Features Standard ML, Factor, Racket, Ruby, Go, C, Prolog, Haskell, Erlang, C++, Common Lisp, Rust, Python, Java, JavaScript, Pyret, Scala, Elixir, Mercury, Clojure, Lua, Awk, SQL.
Did it again in 2021, Repo, featuring Factor, Standard ML, Common Lisp, Prolog, Erlang, Mercury, Pony, Racket, Ruby, Gleam, C, Elixir, Crystal, Haskell, Go, OCaml, Raku, Clojure, Lua, and Scala.
I challenged myself to do Advent of Code every day in a new language. There were 25 days, I got through about 20 to completion, with half-solutions to another 3 or 4.
Fleaswallow
Static site generator in OCaml.
January 2018. OCaml. Repo.
Baby's first OCaml project: I used to generate this site with Frog, an amazing site generator by the inimitable Greg Hendershott, but decided I wanted a few other features (like adding OpenGraph tags per-post) and/or a different templating model.
I started hacking and kept waiting for my sense to catch up to me; it never did and I finished!
Screamchess
Chess! But with more screaming!
Summer 2017. Repo. Python, collaboration with Karen Castelletti and Sara Drakeley.
For Burning Man 2017, we built a physical chess set that used a plexiglass board, a Raspberry Pi, a webcam, speakers, and some software to build a chess set that reacted to the game. So pieces would mourn their deaths, give soliloquys, and heckle the player. It didn't realy work as intended in the field, but it was fun to hack up.
Ghostlight
IMDb for live performance web app (or most of it, anyways).
Summer 2015. Repo. Erlang, Postgres.
I wanted to write a Real App that interested me, and I've always liked the idea of something like IMDb for live performance and theater. I got pretty far and modelling the data was super fun, but then I had a tough breakup, put it down, and haven't picked it up again. Learned a lot about Erlang, and using odd tech for products.
PizzaHutTacoBell
Plugins for StarCraft Streaming.
Fall 2011, Repo. Java, ActionScript 3
Around when Twitch.tv was rebranded from Justin.tv and StarCraft streaming was starting to boom, I wanted my stream to have some features like post-game stats. The most popular streaming software at the time (XSplit) allowed for ActionScript plugins, and a StarCraft replay tool allowed for Java plugins, so I wrote two plugins (Pizza Hut and Taco Bell) which communicated over a socket to provide and display stats.
This was also a way to Get Involved in my company's product: I was working on the Flash Runtime, and felt like I wasn't engaging the customer enough since I wasn't a Flash developer, so I built this entirely with our open-source ActionScript tools.
Others
Ask me about "PlayTabletop" and "Amado," who's repos are privately hosted, two Elixir webapps I got to 80% and decided not to launch. I'd write more now but I'm feeling lazy.
Favorite Articles (outdated, need to add more)
Most of us are pretty jaded having been on Hacker News or /r/programming and seeing a million "Why I switched to X" articles. That said, a few have really shaped how I approach programming in industry.
-
Don't Call Yourself A Programmer, And Other Career Advice, by Patrick McKenzie. I was pretty bright-eyed and bushy-tailed as a college graduate, and I feel that this is a pretty no-nonsense look into what coding for industry can be like.
-
How many Microsoft employees does it take to change a lightbulb? by Eric Lippert. Another 'college is not industry' one, it expresses very clearly how challenging working for a BigCo can be. User communities loves telling software publishers that they're lazy for not implementing X, which should take 10 minutes, and I always link them to this article.
-
Tough Times on the Road to StarCraft, Parts 1, 2, and 3. All of Patrick Wyatt's articles on game development from that time at Blizzard are pretty amazing.
-
A Generation Lost in the Bazaar, by Poul-Henning Kamp. I don't care that 'Worse is Better' won the macro game, we should all still care about quality in the micro game.
-
Don’t waste your time in crappy startup jobs., by Michael O. Church. The story of working in startups is multifaceted (it turned my career around), but never let anyone sell you on one with lies.