Notes about writing and running software

Laptop

I develop on a laptop with an Apple Silicon chip. A laptop.sh script symlinks dotfiles to $HOME and sets up my text editor (Neovim), programming languages (Go, Ruby), language servers (HTML, SQL), and CLIs (GitHub, Fly, Heroku, Railway, Tailscale).

Git

I use a monorepo for version control. Here's my end-to-end workflow with a kanban board, GitHub code review, and CI/CD.

Neovim

My text editor is Neovim in a Kitty terminal.

A few settings help wrap text, spell check in Markdown docs and Git commits, and auto-fix code on file save.

\ searches projects. | aligns Markdown tables. Shift+V, :sort sorts lines.

My Leader key is mapped to Space. Leader+r runs code. Leader+t and Leader+s run tests.

Postgres

These steps help me debug slow queries.

For years, I've been happily running the simplest possible Postgres-backed job queues in production.

Create indexes concurrently to avoid locking writes to a table.

Use concat_ws instead of concat() to avoid ugly output.

Speed up Postgres full-text searches with a tsvector column as cache and trigger to keep the cache updated.

Tests

To better see cause and effect, I use a four-phase test structure, avoid mystery guests, and use stubs and spies instead of mocks.

HTML

There are many ways to build static HTML and put it on the internet but I've been happiest with a little custom Go program that runs on GitHub Actions and deploys to Deno when I merge changes.

Unix

Create SSH keys with Ed25519 instead of RSA for good security, performance, and aesthetics.

Define Unix processes in a manifest named Procfile and use tools to manage those processes.

HTTP

Don't point DNS directly to an origin server, point DNS to a CDN that pulls content from the origin.

I prefer writing thin HTTP clients rather than using a third-party SDK.

Ruby

Heroku Postgres has a great feature they call "dataclips" which let users enter SQL queries into a textarea, run them against a read replica, and export to CSV. I wrote a Heroku dataclips clone for fun.

Heroku

I restore my development database from a production copy daily.

These are steps for reducing a Heroku slug size in a Ruby app.

When my production app processes change state, I send Slack notifications with AWS Lambda.

Configure Heroku Postgres read replicas with Rails to scale read traffic and free primary database connections for writes.

Fly.io

Even better is to serve a web app from multiple Fly.io regions and route read-only queries to same-region Postgres replicas.

Growth

Growth is a discipline that blends design, marketing, and engineering to help users get value from products. When I've worked on growth for SaaS products, a north star metric and retention curves have been helpful inputs to the roadmap.