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.