Senior Software Engineer at Suiteness
Sep 2017 - Present
I am one of a handful of full-stack developers for Suiteness, whose core stack is Clojure, Clojurescript, Postgresql, and Redis. Some accomplishments I'm particularly proud of:
- Designing and developing a transitional event system in Postgresql. The end result was something like Kafka, but without the deployment overhead.
- Moving our large, long-term cache from Redis to Postgresql. With hundreds of gigabytes of cache data, a disk-based (rather than RAM-based) cache was necessary. Using Postgresql in this way involved challenges to get the write performance up, but the end result has scaled beautifully. It's a part of the stack the team hasn't had to think about since it went live over a year ago.
Senior Software Engineer at Sonian
Nov 2016 - Sep 2017
Sonian (acquired by Barracuda) is a cloud-based email archiving company, with Clojure, Elasticsearch, Postgresql, RabbitMQ, and many other technologies in its stack. I was a member of the core team, which was responsible for developing and maintaining the email ingestion pipeline (including parsing and importing into Elasticsearch) and the customer metadata system.
Principal Developer at Hashrocket
Sep 2010 - Nov 2016
While at Hashrocket, a software consultancy specializing in web applications, I worked with many different clients directly. I really enjoyed working through the technical challenges, and also the challenge helping clients find the best solution for their problem space.
After a year at Hashrocket, I became the de facto leader of the our Chicago office, a satellite office of the headquarters in Jacksonville, FL. As the leader of the office, I reported to our CEO, facilitated interpersonal conflicts between our office's developers, served as a technical person on sales calls, and led local hiring.
Web Developer at Neoteric Design
Jun 2008 - Sep 2010
Freelance Software Developer
Sep 2005 - Jun 2009
In addition to the projects listed below, my GitHub profile provides a fairly comprehensive overview.
This library came about when bulk loading data into Postgresql through the normal Clojure driver wasn't fast enough, and was becoming the bottleneck in a nightly ETL process. It uses Postgresql's binary COPY protocol to load data. For our primarily binary data set, it improved load performance three-fold, allowing us to scale up how much we could process each night.
I used IMDB's data and Datomic to create a “graph” database for exploring actors’ and actresses’ relationships (the famous 6 degrees of Kevin Bacon game). Datomic is not a graph database, but using a combination of direct index access and graph traversal algorithms, I was able to get the kind of performance I wanted, without having to use a dedicated graph database. While the live version of the site is no longer deployed, the source code is still available on GitHub, and I wrote about the trade-offs involved in using Datomic as graph database, as well as tips for improved performance while doing bulk imports into Datomic.
A partial implementation of Clojure written in Ruby, with an interpreted runtime. After I had implemented about two-thirds of clojure.core, I paused work on it. As it turns out, an interpreted language on top of another interpreted language can be painfully slow. However, in the process of building, I learned a bunch about Clojure and its internals. I regret nothing.
Chicago Theological Seminary
2006 - 2008
M.A., Religious Studies
Anderson University, Anderson, IN
2002 - 2006
B.A., Religious Studies
- Significant Experience with: Rust, Go, Java, R, Datomic, and lots more