fellowcoder

I like solving problems. Programming is part of that.

I’ve worked on substantial projects in Perl, SQL, ColdFusion, Java, JavaScript, Scheme, Racket, Python, and C/C++. I’ve written programs in Haskell and TypeScript and I-don’t-know-how-many other languages. I’ve built websites and databases, written compilers and interpreters, and implemented plenty of algorithms.

As a teacher, I’ve written code mainly to solve problems for myself and the people I know, or to model the process for students. I’ve also reviewed and graded tens of thousands of lines (at least!) of student code in Java, Racket, Scheme, SQL, and C. I have conducted code walkthroughs of student code in programming class, teaching students what to look for when reviewing code.

Teaching also involves writing plenty of instructions and specifications. Here’s an example of a programming project spec I wrote for the second semester of an intro programming class.

Below is a non-exhaustive list of projects I’ve worked on or contributed to.

Open-source projects

Work projects

2022: For auticon US:

Fun projects

2020: A script for generating a paper gradebook and planner for left-handed teachers, written for a teacher friend and documented sufficiently for a competent programmer without Racket experience to experiment with changes to the parameters.

2020: A script that simulates perfect shuffling of a deck of cards:

A vertical stack of four wide bands of red-or-orange and black rectangles.
Each band depicts, as a horizontal sequence of thin vertical rectangles, the
changing locations of all red and black cards in a deck over the course of 208 perfect shuffles. The initial deck state is leftmost, and successive shufflings are added to the right. The red and orange bands differ in how we chose each shuffle's topmost card (i.e., from the top or bottom half of the deck): in the red bands, the same half of the deck always provided the top card, and in the orange bands, for each shuffle we chose among the two halves randomly and with uniform probability.

A vertical stack of four wide bands of red-or-orange and black rectangles. Each band depicts, as a horizontal sequence of thin vertical rectangles, the changing locations of all red and black cards in a deck over the course of 208 perfect shuffles. The initial deck state is leftmost, and successive shufflings are added to the right. The red and orange bands differ in how we chose each shuffle’s topmost card (i.e., from the top or bottom half of the deck): in the red bands, the same half of the deck always provided the top card, and in the orange bands, for each shuffle we chose among the two halves randomly and with uniform probability.

2018–19: As a choral director and singer, I know directors need to know the vocal ranges of singers and songs, to choose songs that fit the singers’ ranges. I wrote a script that extracts pitch info from a MusicXML file of four-part vocal music, and generates an image of summary histograms that can then be inserted into the last page of the sheet music PDF, permitting directors to see the needed vocal ranges at a glance:

Histograms showing the frequencies with which various pitches occur in a song.

Histograms showing the frequencies with which various pitches occur in a song.

2014: In studying the pancake-sorting problem, I wrote some code to generate trees of possible pancake-stack states using BFS, find critical paths from root to leaves, and render the results:

An n-ary tree of stacks of four pancakes of distinct widths, depth 5, 24 nodes, with nodes on the critical paths circled.

An n-ary tree of stacks of four pancakes of distinct widths, depth 5, 24 nodes, with nodes on the critical paths circled.

Academic work

2008: I implemented an algorithm in Java (working in Eclipse) for finding the quasi-inverse of a database schema mapping.

2000: I developed a prototype language for writing “nanopass” compilers, as described in the subsequent paper A Nanopass Framework for Compiler Education.

Writing

A few Quora posts I’ve written about programming: