Skills
Please select a programming language, computer system, or miscellaneous skill below to get a brief description of my experience.
Python
I’ve enjoyed using Python professionally since 2014, and personally since around 2011. It’s my almost-exclusive tool of choice for exploring a data set and for most one-off scripts or tasks. I’m consistently impressed by Python’s design: the abstractions that the language core chooses to support always seem to have a deceptively high power-to-weight ratio, and of course the standard libraries are excellent and abundant.
Most of my work on the Khan Academy website is in Python. Of that work, much is related to the core site infrastructure (in particular, the content model), to the streaks functionality, and to the thumbnails system.
My hobbies include chaining decorators, doing terrifying things with metaclasses, and linking people to “hasattr
: a dangerous misnomer.”
JavaScript and React
Some relevant projects include:
An assembler and interpreter for the LC-3, a teaching microcomputer (source on GitHub). This is a single-page jQuery application currently that I wrote to replace the course-provided interpreter for my computer architecture course at Cal Poly; it continues to be used by students of that course. (I also started porting it to React, and rewrote the assembler with full test coverage, but abandoned that port a while ago.)
A set of tools for a music professor of mine (source and explanation on GitHub). This is a React application that, I’m pleased to report, has 100% test coverage, including the GUI components. I’m particularly proud of the implementation for the infinite tree view, an infinitely scrolling canvas from dynamically generated data; all the logic for the scrolling, positioning, and rendering is purely functional and extensively tested!
This very site, also written in React! (The source is on GitHub.) Everything is server-side rendered to a static site, so there’s no lag before the initial render and the site should function just fine even with JavaScript disabled. After rehydration, client-side routing takes over to enable instant page loads, as well as interactive components like this one.
Java
Java is the language that I’ve used for the longest time. I’ve often used Java when I want it to be easy to write a GUI for a desktop application. (These days, I also use React for the same purpose.)
I was an editor on the third edition of Effective Java by Josh Bloch, published December 2017.
Some relevant projects include:
- My projects for CMU’s 15-214 software engineering course, including a Scrabble game and a general-purpose data analysis framework. I can’t publish the source for these due to academic integrity restrictions, but I do have overviews and screenshots.
Kiosk, an application for moderating debates. See the relevant project page for more information, or jump to the source on GitHub. (If examining the source, please note that I wrote this a long time ago, and the implementation does not reflect my current skills!)
JGame, a game development library for new programmers. See the relevant project page for more information, or jump to the source on GitHub.
Haskell
I’m reasonably comfortable in Haskell after having dabbled in it since around 2013. I use Haskell frequently for pipes in Unix command lines, and also for standalone utility applications.
I’ve written such things as the game of Go (as well as a simpler Unix filter to colorize gnugo
) and a Scheme-like language. I also wrote a Haskell program to solve a graph theory problem, which doubled as a Haskell tutorial for a CS-inclined math-major friend of mine. (The source is here.)
Git
I tend to use git for the vast majority of my work, even if I don’t intend to push it to any remote. My workflow is to rebase aggressively: I prefer to keep a clean history where each commit is atomic, minimal, and has no lint errors or test failures, instead of a more literal recording of my keystrokes. For example, I recently fixed all lint errors in every commit of a (local-only) repository easily via an interactive rebase.
Similarly, I prefer to keep coarse-grained branches, corresponding more to “project” than “feature,” so that I can more easily curate that history by bouncing around in a rebase. (If I want a literal history, I’ll consult my persistent undo files!)
I try to post most of my work on GitHub, unless restricted by confidentiality or academic integrity.
I’ve used exclusively for all my documents—notes, homework, papers, presentations—since 2013, and haven’t looked back. When I have the time, I especially enjoy creating scientific diagrams with TikZ and related packages…here’s a gallery of some of my favorite pages over the years.
My personal style files are on GitHub.
Blender
I enjoy using Blender for all the 3D modeling that I do—which is not much—but I’ve also found it to be a valuable tool in many more contexts than one might expect. For example, I’ve used its powerful image compositing tools to perform batch transformations, used it as a simple cross-platform standalone video editor, and used its modeling and animation tools to mock up designs. It’s a beautiful and versatile software package that many developers could probably benefit from learning.
(Neo)vim
(Vim users are contractually obligated to announce this, right?) Anyway, I’ve used vim exclusively for a while, and have been even happier after moving to Neovim, primarily because of its excellent built-in terminal emulation, its significantly faster startup time, and all the little things that it fixes that make me smile.
Many people have asked me for my .vimrc
file. To new users of vim, I always respond that my .vimrc
file is on GitHub, and that they should feel totally free to read from it, and to type any portions of it into their own .vimrc
files, but not to paste things in directly. The point of the file is to enable you to configure vim how you want it; if you don’t learn how to do that, you’ll be shirking its potential.