Jake Worth

Jake Worth


Favorite Posts

Over the years, I’ve published a few hundred blog posts. Here are a few favorites.

All Posts

Here's the full archive of my posts.

Write Boring Code

Published: September 13, 2023 2 min read

Write a little bit of code, and you may come to an unsettling realization: there are multiple ways to do almost any programming task. How do…

Take the Big Project

Published: September 06, 2023 2 min read
  • projects
  • career

Something I’ve learned as an engineer: when presented with the option of working on a Big Project, or doing anything else, take the Big…

Thinking of Bugs in Classes

Published: September 03, 2023 2 min read
  • bugs
  • testing

“How did this feature break? I thought we were writing tests.” –Frustrated Boss We spent the time writing tests, and yet, a bug survived…

Why Great PRs Are Great: Pull Requests Templates

Published: August 14, 2023 2 min read
  • github
  • devexp

Have you ever seen a pull request that seems to completely explain itself? It’s a real artifact. I don’t know the project, yet I understand…

Don't Ask for Advice; Ask for a Code Review

Published: August 09, 2023 • Updated: August 10, 2023 2 min read
  • career

Here’s some advice about programming, that also isn’t advice: “Don’t ask for advice; ask for a code review.” In this post, I’d like to…

From Booleans to Strings in Frontend State

Published: August 04, 2023 • Updated: September 05, 2023 5 min read
  • react
  • booleans

When it comes to controlling frontend presentation in React, booleans are a common tool, but they often fall short. In this post, I’ll…

The Case Against "Try This" Debugging

Published: June 26, 2023 3 min read
  • debugging

I recently wrote about a debugging technique that I recommend: making a prediction. The idea is that before trying an experiment during a…

The Joy of JavaScript Absolute Imports

Published: May 02, 2023 3 min read
  • javascript

Absolute imports are an essential feature for me in any JavaScript application. In this post, I’ll explain what they are and why they’re…

My Daily Programming Routine

Published: April 10, 2023 • Updated: August 29, 2023 4 min read
  • routines

After a decade of programming full-time, I’ve developed a daily work routine that I’d like to share. I hope to revisit it myself and share…

Variable Name Antipatterns Named and Explained

Published: April 03, 2023 • Updated: April 17, 2023 5 min read
  • naming

There are only two hard things in Computer Science: cache invalidation and naming things. — Phil Karlton Let’s talk about variable name…

Cold Water for Your Code Coverage

Published: March 28, 2023 • Updated: March 29, 2023 3 min read
  • testing

Code coverage– the percentage of your code covered by automated tests– is a metric associated with quality. In this post, I’d like to pour…

Does ChatGPT Mean Software Engineering Is Over?

Published: March 26, 2023 3 min read
  • ai

Here’s an argument that’s gaining momentum in my field: AI like ChatGPT and GitHub Copilot is very good at writing describable code…

One-Sentence Summaries of Popular Technology Books

Published: March 21, 2023 • Updated: March 28, 2023 3 min read
  • books

Here are some one-sentence summaries of books that have helped me understand programming and technology. Some are technical and some are…

How to Run an Agile Retrospective for Leaders

Published: March 15, 2023 • Updated: May 01, 2023 4 min read
  • agile

Retrospectives are one of my favorite engineering team practices. In this post, I’ll explain why and how I run retros. If you’ve never done…

Just Right: Type Your TypeScript Library Functions

Published: March 01, 2023 2 min read
  • typescript

There’s been a lot of recent discussion in the TypeScript community about typing functions. These arguments tend to take binary positions…

The Power of CRUD Operations Explained with SQL

Published: January 12, 2023 2 min read
  • databases

CRUD is an acronym that’s used a lot in web and mobile development. Frontend engineers in particular might wonder what it means and why we…

How to Create a Simple Timer in React with setInterval

Published: December 29, 2022 4 min read
  • react

Have you ever wanted to create a timer in a React app? In this post, I’ll explain how to create a timer effect in a React application using…

Given/When/Then Works Incredibly Well

Published: December 20, 2022 • Updated: April 20, 2023 3 min read
  • agile

When I am preparing development work, I write Gherkin-style stories, which follow the “Given/When/Then” format. I learned this technique at…

Button, Link, or Neither? Three Principles for Clarity and Accessibility

Published: December 03, 2022 • Updated: December 13, 2022 4 min read
  • html
  • a11y

Which HTML elements should we be giving a user to click? In this post, I’ll share some best practices for clickable elements. To summarize…

All My Best Tips For Expertly Reviewing Your Own Code

Published: November 12, 2022 • Updated: September 19, 2023 5 min read
  • github

This post was inspired by the following Tweet: You need a code review, but you don’t have another person. Maybe you’re building a startup…

Deliver a Great Standup Report as an Engineer

Published: November 09, 2022 • Updated: May 16, 2023 2 min read
  • agile

I’ve been lucky to have worked with some great engineers, and one thing that they tend to do exceptionally well is reporting about their…

How to Write a Resume for Transitioning to Programming

Published: October 27, 2022 • Updated: April 03, 2023 4 min read
  • career

How do you write a resume that helps you transition to programming? You have experience in another field. You want to be a programmer. You…

Solving Exercism's Resistor Color Trio in TypeScript

Published: October 26, 2022 • Updated: January 03, 2023 2 min read
  • typescript

Today I completed the ‘Resistor Color Trio’ TypeScript exercise on Exercism. This exercise asks us to write a TypeScript function that takes…

Vim Scratchpad Part 2

Published: October 26, 2022 3 min read
  • vim

Today, I’d like to dive deeper into a part of my practice: using a persisted text file for jotting things down. You can read the post I’m…

Buy the Best Hardware You Can

Published: October 25, 2022 • Updated: July 21, 2023 2 min read
  • hardware

Some advice I offer people entering the programming profession is to buy the best hardware you can. You’re going to need it. Get the most…

Solving Exercism's Resistor Color Duo in TypeScript

Published: October 24, 2022 • Updated: January 03, 2023 2 min read
  • typescript

Today as a code kata I completed the ‘Resistor Color Duo’ TypeScript exercise on Exercism. Here’s my work. This exercise asks us to write a…

Print Last Exit Code

Published: October 21, 2022 2 min read
  • terminal

The exit code of a command in a Unix-based system is an important and easy-to-miss piece of data. It isn’t printed to standard out; you have…

You Can't Change Nothing

Published: October 21, 2022 • Updated: March 03, 2023 2 min read
  • debugging

Here’s a meme I saw this week: Here we have a person debugging code, and they’re saying “My code doesn’t work. Let’s change nothing and run…

Read the Docs

Published: October 19, 2022 2 min read

When learning a new language or framework, the first thing I do is read the official documentation cover-to-cover. Choose the latest version…

How to Append to a Write-Protected File

Published: October 19, 2022 2 min read
  • terminal

Suppose you want to append to a file that’s write-protected and can only be edited via . Is that possible? It is! A technique I discovered…

Why Do I Have to Use the Factorybot Gem, Again?

Published: October 17, 2022 • Updated: December 30, 2022 3 min read
  • ruby
  • testing

The FactoryBot gem, previously known as FactoryGirl, is ubiquitous in Ruby and Ruby on Rails testing. If you aren’t familiar with it, you…

Default to Programming Conventions Unless You Have a Great Reason

Published: October 14, 2022 • Updated: February 09, 2023 2 min read

Trying to enforce unconventional coding preferences on a team is an uphill battle. When in doubt, default to convention. Contrived Example…

How to Assert About Response Body in RSpec Controller Tests

Published: September 29, 2022 • Updated: June 28, 2023 2 min read
  • ruby

When testing a serialized Rails API with RSpec, a common mistake is to assert about the response body, only to find that it’s an empty…

Recommended Reading

Published: September 28, 2022 • Updated: October 14, 2022 2 min read
  • books

Here are some books that have helped me understand programming. This list is a living document that I plan to update as I read. Recommended…

How to Introduce New Ideas

Published: September 08, 2022 2 min read

How do you introduce new ideas and ways of working? We want to bring a new idea to our engineering teams, such as a new command-line…

Computers Can Be Understood

Published: September 06, 2022 • Updated: June 25, 2023 2 min read
  • learning

A big mental leap I made early in my programming was starting to view computers as something that could be understood. What is a computer…

How to Ignore Whitespace in a GitHub Pull Request

Published: September 05, 2022 • Updated: March 29, 2023 2 min read
  • github

Reviewing a GitHub PR on that contains a lot of whitespace changes? Extra whitespace can make it challenging to evaluate the substance of a…

How to Filter Network Requests By Status Code in DevTools

Published: August 30, 2022 2 min read
  • http

The Chrome DevTools Network Tab is incredibly useful for frontend web development, but it can be noisy. Perhaps you’d like to filter it down…

Vim Scratchpad

Published: August 25, 2022 2 min read
  • vim

Today I’d like to share a small part of my practice: using a persisted scratchpad text file for jotting things down. When coding, often I’ll…

Improve Your API Documentation Workflow with Dash

Published: August 21, 2022 • Updated: January 09, 2023 3 min read
  • docs
  • mac

One of my all-time favorite programming tools is Dash by Kapeli. In this post, I’ll share some tips for leveraging this fantastic program…

Prefer Real Data For Software Development

Published: August 18, 2022 • Updated: March 21, 2023 2 min read
  • data

When testing user input or data presentation, I prefer using realistic rather than random data. For a recipes app, that would mean adding an…

How Luck Played a Role in my Career

Published: August 15, 2022 • Updated: March 30, 2023 2 min read
  • career

I believe that luck is part of every professional journey. Here’s a sampling of the luck I’ve had. A passage I recently read caught my…

All My Best Debugging Tips

Published: August 05, 2022 • Updated: April 01, 2023 8 min read
  • debugging

This is a list of all the best debugging tips I’ve picked up over the years. It’s inspired by ‘All my best programming tips’ by Jason Swett…

Tmux Application Startup Script

Published: July 28, 2022 2 min read
  • tmux

My development environment depends on several processes running. Here’s how I’ve scripted this setup. Whenever I boot up, I need at least…

Recognizing and Repairing a Broken Mental Model

Published: July 25, 2022 • Updated: April 26, 2023 2 min read
  • debugging
  • ai

Perhaps you’re familiar with this scenario: you’re debugging and stuck. You’ve Googled, read some blog posts, docs, and forum answers. You…

Retros Need Action Items

Published: July 19, 2022 2 min read
  • agile

Agile retrospectives should produce many action items. What Are Action Items? Action items are small, defined, actionable TODOs to follow up…

Better Than 'foo'

Published: July 13, 2022 3 min read

There’s almost always a better variable name or value than ‘foo’. It’s useful as a placeholder, but it almost never belongs in production…

Database Migration Checklist

Published: July 11, 2022 • Updated: July 12, 2022 2 min read
  • databases

Here’s my checklist for a great database migration. A great migration is: Correct Atomic Reversible Consistent with the style of the…

Save Debugging Cycles by Always Logging an Object in JavaScript

Published: July 07, 2022 • Updated: August 04, 2023 2 min read
  • javascript
  • debugging

When printing a JavaScript value to the console, I suggest using an object literal over the raw value. It’s a little thing that over time…

Why Ruby?

Published: June 30, 2022 2 min read
  • ruby

Why should someone learn Ruby in 2022? Ruby was my first programming language, and although I’ve drifted elsewhere, I write Ruby every day…

What Are the Tradeoffs of Passing Objects as React Props?

Published: June 27, 2022 • Updated: January 19, 2023 2 min read
  • react

A common React pattern is to pass an object as a prop. Consider a user avatar component that shows the user’s initials. You might see one in…

What Is a Naive Implementation? The Art of Artless Programming

Published: June 23, 2022 • Updated: May 04, 2023 2 min read
  • agile

A naive implementation is a programming technique that prioritizes imperfect shortcuts for the sake of speed, simplicity, or lack of…

Authentication vs. Authorization

Published: June 21, 2022 2 min read

Authentication and authorization are two distinct concepts. Yet, I’ve found they’re sometimes used interchangeably. In this post, I’d like…

The Power of Spell Checking with Vim: Tutorial and Best Practices

Published: June 15, 2022 • Updated: January 14, 2023 2 min read
  • vim

I write each post for this blog in Vim. Writing in the terminal makes me feel like a programmer, even when I’m not specifically programming…

How to Write a Perfect Bug Report

Published: June 13, 2022 4 min read
  • debugging

You’re a person who opens bug reports for software engineering teams. Perhaps your bug reports take a long time to resolve, and you’d like…

Make a Prediction

Published: June 08, 2022 • Updated: May 17, 2023 2 min read
  • debugging

Imagine you’re debugging, and you’re stuck. Everything you try leads to another unexpected result. You continue to be surprised by what you…

Desire Paths

Published: June 05, 2022 2 min read
  • ux

Lately I’ve been thinking about desire paths. We’ve all seen a desire path. They are footpaths created by erosion from human and animal…

Think Hard

Published: June 01, 2022 • Updated: November 04, 2022 2 min read

This is a response to Ben Kuhn’s ‘Think Real Hard.’ Ben starts by sharing a problem-solving checklist from the scientist Richard Feynman…

PostgreSQL Polymorphism

Published: May 30, 2022 • Updated: June 22, 2023 2 min read
  • postgresql

Scenario: you have a database record that can belong to one record or another, but not both. That ambiguous ownership could be called…

Goodbye Shared Dotfiles

Published: May 25, 2022 2 min read
  • terminal

A lot of people start programming with shared dotfiles, copied from a team or online. I did. Maybe you’re ready to move on. Why would you do…

Organizing React Components

Published: May 23, 2022 2 min read
  • react

You’re creating a React app, and want to organize your components. Or maybe you’re working in a legacy codebase, with many components in one…

Thoughts On Starting Your Programming Task Over

Published: May 18, 2022 • Updated: January 14, 2023 2 min read

I used to have a bad habit when working alone: I’d start a feature, begin questioning my approach, throw away my work, and start over from…

How to Identify the Breaking Commit With Git Bisect

Published: May 17, 2022 • Updated: June 27, 2023 4 min read
  • git
  • debugging

Some code is broken, and you can’t figure out why. Maybe there are a lot of changes to consider, and identifying that breaking change seems…

Commit Part of a File in Git

Published: May 06, 2022 2 min read
  • git

You’ve been working on a big set of changes, and haven’t committed to Git yet. Now, you want to commit some, but not all, changes to a file…

Be Fast

Published: May 06, 2022 • Updated: September 14, 2023 2 min read
  • career

Great programmers can be great because they are fast. I’ve sunk a lot of time into being fast at Vim. I’ve used it as my text editor for…

Only One Way Out of a Function

Published: May 02, 2022 • Updated: August 11, 2023 4 min read
  • javascript

A programming style I try to practice could be described as: “there should be only one way out of a function.” Early returns can often cause…

Am I Too Old to Become a Programmer?

Published: April 28, 2022 • Updated: April 19, 2023 2 min read
  • career

“The best time to plant a tree was twenty years ago. The second best time is now.” — Chinese proverb I mentor adults who are learning to…

It's Harder to Read Code Than Write It

Published: April 25, 2022 • Updated: August 23, 2023 4 min read
  • rewrites

In Things You Should Never Do, Part I, Joel Spolsky narrates Netscape’s ruinous decision to rewrite their browser from scratch. This…

The Problems With Code Screenshots

Published: April 19, 2022 • Updated: March 20, 2023 3 min read
  • debugging

A common anti-pattern on sites where code is discussed, such as Slack, Stack Overflow, GitHub Issues, etc., is to post a screenshot of code…

Hash Fetch Instead of If/Else

Published: April 16, 2022 2 min read
  • ruby

Conditional logic has its place, but often there’s a better alternative. Today, we’ll look at a Ruby solution: a hash with . My thanks to…

First Get It Working, Then Make it Look Good

Published: April 13, 2022 • Updated: March 17, 2023 3 min read

I recently completed a winter survival course where we built shelters in just ten minutes with only the contents of our packs. The pack I…

My psql Config

Published: April 12, 2022 2 min read
  • postgresql

RC files, thought to stand for “run command” files, are read by a program during startup. The file that configures the PostgreSQL REPL psql…

Solved! How to Exit Vim "Ex" Mode

Published: April 06, 2022 • Updated: January 03, 2023 2 min read
  • vim

How does one exit Vim “Ex” mode? But first… how did you even get into “Ex” mode? Probably by accidentally typing in normal mode: If this is…

How to Read a Stack Trace

Published: April 05, 2022 4 min read
  • debugging

A stumbling block for many people when debugging is reading the stack trace. Today I’d like to discuss this skill. What is a stack trace…

RSpec.describe vs. describe: Which Should I Use?

Published: April 02, 2022 • Updated: April 07, 2023 2 min read
  • ruby
  • testing

Ruby’s RSpec block has two common syntaxes. Which should you use? 👉Disclaimer: they both work. But I’m assuming since you’re here, you’re…

Your Demo Doesn't Need Auth

Published: April 01, 2022 2 min read

When building a demo, I believe you often can and should skip authentication. Picture this: a junior engineer or team demoing an MVP. Smart…

The Importance of a Bug

Published: March 30, 2022 • Updated: March 29, 2023 3 min read
  • debugging

In today’s post, I want to talk about the importance of a bug. I remember the first bug that I shipped to production. I was upset that I’d…

Debugging Tip: Learning From Bugs

Published: March 25, 2022 • Updated: April 03, 2023 4 min read
  • debugging

You were stuck, and now you aren’t. 👏 Congratulations! Before you move on, it’s vital to stop and learn from it. It’s the best way I know…

How to Make Renames Easy

Published: March 22, 2022 3 min read

“There are only two hard things in Computer Science: cache invalidation and naming things.” — Phil Karlton Today I want to talk about re…

How to Read Postgres Docs

Published: March 21, 2022 2 min read
  • postgresql

Have you ever tried to read the documentation for a Postgres command? Although many consider Postgres’ docs best-in-class, they include…


Published: March 16, 2022 • Updated: March 20, 2024 2 min read

If I could give one piece of advice to anyone learning to program: build. This advice might be most helpful to beginners. But it’s been…

Which Operating System Is the Best for Programming?

Published: March 14, 2022 • Updated: June 01, 2023 2 min read
  • career

Which operating system is the best for programming? This is a perennial question in code boot camps where I’ve taught. I think students see…

How to Make a New Directory and File in Vim

Published: March 11, 2022 2 min read
  • vim

How does one create a new directory and file, without leaving Vim? Assuming you’re running a shell, I would shell out for either of these…

Autoformat Your Code

Published: March 10, 2022 • Updated: August 14, 2023 2 min read

Auto-formatting code is good, and you should be doing it all the time. Why? It helps you write better code in real-time, it preempts trivial…

Don't Copy-Paste Dotfiles

Published: March 09, 2022 • Updated: March 29, 2023 2 min read
  • terminal

A protip for program configuration files (dotfiles): don’t add configuration to them that you haven’t tried to understand and confirmed you…

How I Review Code

Published: March 06, 2022 4 min read
  • github

Code reviews are important on many teams. Do them well, and your code ships quickly and safely. Do them poorly, and your code ships slowly…

How I Make Sure I Understand a Feature Before Building

Published: March 02, 2022 • Updated: July 07, 2022 2 min read

Here’s an idea that’s not ready for programming work: “Let’s add social login to our website.” Same idea, ready for work: “A logged-out…

Don't Stay Stuck

Published: March 01, 2022 2 min read
  • debugging

We’ve all seen this: a frustrated coworker hunched over a computer after hours, flailing alone against some impossible bug. Go home…

Why Vim

Published: February 23, 2022 • Updated: January 02, 2023 2 min read
  • vim

I’ve been using, teaching, and stanning Vim since almost the beginning of my programming career. Yet, when asked to explain this preference…

On Disabling Tests

Published: February 22, 2022 • Updated: October 03, 2022 2 min read
  • testing

I want to talk about a common technique: disabling problematic tests to allow a feature to ship. I challenge this practice because I believe…

Count to Ten

Published: February 15, 2022 2 min read

A trick that that has helped me as a programmer: count to ten before killing a process. I learned this in IT. When a screen froze, the IT…

Avoid Similar Variable Names

Published: February 14, 2022 2 min read

A convention I see, particularly in Ruby tests, are variable names like this: Swap these out for and , or and , and you have a very…

Refining Your Terminal Aliases

Published: February 10, 2022 • Updated: June 01, 2023 2 min read
  • terminal

Any command you type out manually, or even tab-complete a few times, can be shortened. A common shortening technique is the terminal alias…

Ruby's Frozen String Comment: YAGNI

Published: February 09, 2022 • Updated: January 03, 2023 5 min read
  • ruby

Open a production Ruby file, and you’ll often see this magic comment at the top. Today I’d like to argue that most Ruby files do not need…

Two Reasons Why I Don’t Point Agile Bug Tickets

Published: February 07, 2022 • Updated: January 23, 2023 3 min read
  • agile
  • debugging

When I create Agile bug tickets, I don’t add Agile story points. In this post, I’d like to explain this preference via two arguments…

Weekly Summary Technique

Published: February 04, 2022 3 min read

I’ve written a weekly summary for myself and my teams for years. In this post, I’ll explain why I do and how I use this tool. Why Write a…

Opt Into Beta

Published: February 02, 2022 2 min read

Here’s a technique I’ve used on launches: instead of a big scary waterfall, or, in tandem with a phased release, let customers opt into a…

How to Find a Programming Mentor

Published: January 31, 2022 • Updated: July 02, 2023 3 min read
  • career

“How do I find a programming mentor?” I feel grateful to have collected a group of mentors over the years. I call on them frequently to talk…

Use a Dev Email

Published: January 29, 2022 2 min read

An engineering technique I recommend: when you sign up for any service, even on a side project that’s just getting off the ground, create an…

How to Answer Questions on Stack Overflow

Published: January 27, 2022 • Updated: June 07, 2023 3 min read
  • debugging

I enjoy answering questions on Stack Overflow. It helps me learn about common challenges and practice reviewing code. In the beginning, it…

Want Better Automated Tests? Hard-Code Your Expectations

Published: January 25, 2022 • Updated: January 25, 2023 3 min read
  • testing

Here’s a kind of assertion I see often in tests: And here’s that same assertion with a hard-coded expectation, which is almost always better…

Presence is Boolean

Published: January 24, 2022 • Updated: June 13, 2023 2 min read

When possible, I prefer to use the presence of data as a boolean, rather than a boolean itself. Here’s a problematic pattern I see a lot in…

Be a Better Technical Consultant by Saying "I Think That..."

Published: January 19, 2022 • Updated: January 31, 2023 2 min read
  • consulting

An idea I find useful as an individual contributor is starting my consulting with this phrase: “I think that…“. The idea is to let your…

Bug Reports Are Gold

Published: January 15, 2022 • Updated: September 05, 2023 2 min read
  • debugging
  • cx

Me: Hey, I’m experiencing an issue with your software. Here’s a detailed bug report. SaaS CTO: What you’re describing isn’t possible…

My Career Advice: Get Good

Published: October 13, 2021 2 min read
  • career

What should you focus on at the beginning of your programming career? My answer is: being really good at programming. “Be So Good They Can’t…

How to Organize JavaScript Imports

Published: August 30, 2021 • Updated: November 26, 2022 2 min read
  • javascript

The statements at the top of a JavaScript component file can be a confusing, duplicative, churning mess. Is there a way to organize them…

Write Better Code by Knowing When Not To Refactor

Published: August 26, 2021 • Updated: July 17, 2023 3 min read
  • refactoring

Refactoring (noun): a change made to the internal structure of software to make it easier to understand and cheaper to modify without…

The Tutorial Anti-Pattern

Published: August 24, 2021 3 min read

Here’s a scenario: you’re applying for your first tech job. You’ve found a bunch of tutorials like Rails Tutorial and you’re speeding…

Consultancy Cycles

Published: August 04, 2021 2 min read
  • consulting

This week in conversation I made this argument: Working at a quality software development consultancy like Hashrocket early in your…

What is the Sub Claim of a JSON Web Token?

Published: April 02, 2021 • Updated: December 31, 2022 2 min read
  • jwt

Today I’d like to explain the , or subject, registered claim of a JSON Web Token. Registered claims are predefined fields of the JWT that…

Augmenting an Object With the Proxy Pattern

Published: February 26, 2021 • Updated: August 21, 2023 3 min read
  • ruby
  • oop

Here’s a Ruby class that claps: And here’s me using an instance of it to do something surprising. is not defined in , or any parent of it…

Do the Hard Things First

Published: January 25, 2021 • Updated: May 23, 2023 2 min read
  • startups

“First thing in the morning, eat a live frog, and you can go through the rest of your day knowing the worst is behind you.” — Mark Twain A…

Exercism Raindrops in Python

Published: December 06, 2020 2 min read
  • python

I’ve been learning a bit of Python this Fall to facilitate conversations with a mentee. In this post, I’m going to share the first Python…

Programming Resources for Beginners

Published: December 05, 2020 3 min read

A self-teaching, learning programmer asked me the following question: Can you recommend any resources or sites that you go to with questions…

My Annotated Vim Configuration File

Published: November 26, 2020 • Updated: June 30, 2023 6 min read
  • vim

I love Vim. Folks who’ve programmed with me, or attended a Vim Meetup when I was an organizer, can attest. When I was learning to code…

Essays on Programming I Think About a Lot

Published: October 29, 2020 • Updated: February 06, 2023 10 min read

Programming is a game of abstractions, mental models that help us conceptualize our work. The better your abstractions, the better your…

My Development Roadmap

Published: October 20, 2020 4 min read

I’ve been working on a development roadmap for my projects, and wanted to share my process. Consider this my recipe to turn an idea into…

You Have New Mail

Published: October 16, 2020 2 min read

Here’s a familiar scenario: you open a new terminal, and before the prompt appears, you see the following. You have new mail. What’s going…

Printing Code on a Mac

Published: October 13, 2020 2 min read
  • til

A few times over the years, I’ve had to print out code that I’ve written onto physical paper. I have heard that some teams do team code…

Restore a Heroku Database Locally

Published: October 11, 2020 2 min read
  • postgresql

Sometimes a post is just for me, and this is likely one of those posts. Several of my open source projects run on Heroku, and I often want…

Duplicate your Development Branch for QA

Published: October 09, 2020 2 min read
  • git

I’m working on a team where we keep a clone of the branch (the main place where work is done), used to deploy to a QA environment. The…

How I Clean Up JavaScript Dependencies

Published: August 03, 2020 2 min read
  • javascript

Unused dependencies are bad: they increase the size of your project, slow down your processes, require upgrades, and send incorrect messages…

Introducing React Explained

Published: June 12, 2020 2 min read
  • react

Today, I’d like to introduce my newest project, a free weekly newsletter for React learners called React Explained. 🎉 For as long as React…

South Dakota v. Wayfair, Technology, and Your Business

Published: May 07, 2020 2 min read

Today I published a post on the Hashrocket blog titled ‘South Dakota v. Wayfair, Technology, and Your Business’. It covers a unique…

WebAssembly: The Next Language of the Web

Published: January 30, 2020 2 min read
  • wasm

Interested in WebAssembly? At Hashrocket’s Winter Miniconf 2020, I presented my personal one-month audit of this emerging technology. Please…

Searching with Ripgrep

Published: December 30, 2019 2 min read

I’ve been using Ripgrep on my work machine, and for pure performance, it’s tough to beat. Here are two mappings I’ve set up to replace…

A Different Language

Published: October 12, 2019 2 min read

When people who don’t code listen to programmers talk about code, something they say is that it sounds we’re “speaking a different language…

Technologist Reading List

Published: September 28, 2019 3 min read
  • books

“Not all readers are leaders, but all leaders are readers.” –Harry S. Truman It’s been said that most programmers read less than one…

Intro to TDD

Published: September 11, 2019 2 min read
  • testing

If one wanted to learn Test-Driven Development, AKA TDD, in 2019, where should they start? It’s worth mentioning first that there are…

How to Prepare for a Technical Interview

Published: August 06, 2019 2 min read
  • career

Today, I published a post on the Hashrocket blog about interviewing. It’s called How to Prepare for a Technical Interview. Interviewing is…

Pangram in TypeScript

Published: July 29, 2019 2 min read
  • typescript

I’ve been doing Exercism’s TypeScript exercises, and wanted to share some of my early solutions. A pangram is a sentence that contains each…

Clone All of an Organization's Git Repos

Published: June 11, 2019 2 min read
  • git

Today, using parts of this Gist I found a command to clone all the repos in a Github organization. Here it is, tested on Ruby 2.3: Change…

Interview: Jeremy Huffman, Dialyxir

Published: April 11, 2019 2 min read
  • elixir

Today, I published a post on the Hashrocket blog presenting a recent interview I conducted. It’s titled Interview: Jeremy Huffman, Dialyxir…

Planning Poker: Speed Mode

Published: April 09, 2019 2 min read
  • agile

Today, I published a post on the Hashrocket blog about rapidly assigning points in a story estimation workflow. It’s titled Planning Poker…

Pick a Good Name

Published: March 08, 2019 2 min read

Last week, I published a post on the Hashrocket blog about choosing good names for things in software. It’s called Pick a Good Name. Naming…

Use Yarn Like a Pro

Published: February 23, 2019 2 min read
  • javascript

Last week, I published a post on the Hashrocket blog about my favorite JavaScript package manager, Yarn. It’s called Use Yarn Like a Pro…

Generate Images for Instagram

Published: February 05, 2019 2 min read

Today I released a post on the Hashrocket blog, Generate Images for Instagram. It documents a project I made to generate Hashrocket-branded…

Adventures in Mentorship

Published: January 03, 2019 2 min read
  • mentorship

This fall, I participated in the formal mentorship program at the Code Platoon bootcamp here in Chicago, and I wrote about the experience…

Avoiding Code Catastrophes

Published: December 04, 2018 2 min read

Last week, I published a Hashrocket blog post for junior developers, addressing a question I’ve been asked a few times. It’s called…

JavaScript Equality

Published: July 17, 2018 2 min read
  • javascript

A few weeks ago, I built an app with React.js and create-react-app that I call ‘JavaScript Equality’. View deployment here. This application…

mgrim: Everything Updated All The Time

Published: July 11, 2018 2 min read
  • git
  • terminal

My current favorite command line alias is , composed of four other aliases: Here’s what this does (starting from a feature branch…

Comprehensive Instructions

Published: July 09, 2018 • Updated: March 29, 2023 2 min read
  • oss

A user opened an issue in Tilex last week that I spent a significant amount of time thinking about and talking about (thanks JB) before…

Autoformat Elixir on Buffer Write

Published: February 17, 2018 2 min read
  • elixir
  • vim

I’ve been working with the Elixir 1.6 autoformatter a lot this year. Part of that journey was adding the following to my local Vim…

The Universal Programming Language

Published: September 17, 2017 2 min read

Recently I tried to answer a question that is common when talking about software. I’ll paraphrase: Why can’t there be an “universal…

How I Talk: My Guide to Tech Public Speaking

Published: August 09, 2017 • Updated: April 19, 2023 9 min read
  • speaking

I’ve been giving technical talks for a few years, and I’m speaking at the Vim Chicago Meetup next month about integrating React with Vim. In…

It's Done

Published: July 19, 2017 2 min read

When a stakeholder asks for a change to the software we’re developing, my typical response is, roughly: “Sure thing.” Then later: “I’m…

Don't Build Every Feature

Published: June 19, 2017 2 min read

Mold clay to form a bowl; it is the empty space which makes the bowl useful. –Tao Te Ching There’s a detail about Today I Learned some might…

Work Small

Published: June 10, 2017 2 min read

Write programs that do one thing and do it well. –The Unix Philosophy I believe in working small. I love small Git commits and pull requests…

Tilex Progress

Published: June 05, 2017 2 min read
  • elixir

First, some background. Tilex, our Phoenix port of Today I Learned, is coming really well. After a personal hiatus for RailsConf prep, I’m…

Binary to Decimal Conversion in Ruby

Published: May 04, 2017 • Updated: December 30, 2022 2 min read
  • ruby
  • algorithms

This week I wrote an algorithm in Ruby to convert binary numbers into decimal numbers. Here’s the problem description, from Exercism…

You Should Blog

Published: February 11, 2017 3 min read

I created this blog to reflect on my code and development as a programmer. In that spirit, I’d like to make a pitch to anybody reading: you…

Reset an Ecto Heroku Postgres Database

Published: January 07, 2017 2 min read
  • elixir
  • postgresql

We introduced some breaking database changes to our Phoenix port of Today I Learned on Friday; today I deployed them to staging. Resetting…

Vim Nonrecursive Mappings

Published: December 17, 2016 2 min read
  • vim

My first PR to a new Vim plugin was merged this week, check it out. For context, vim-termbux is a plugin by my friend Dillon Hafer that…

Porting TIL from Rails to Phoenix: Initial Commits

Published: November 29, 2016 2 min read
  • elixir
  • ruby

Last week, I started a new project: porting Today I Learned from Ruby on Rails to Phoenix (Elixir). The first few commits were pair…

Gold Master Testing: An Introduction

Published: October 26, 2016 2 min read
  • testing

What is a Gold Master test? The idea is that you write a unit test that takes a known set of data (for instance, a production dump), feeds…

Hamming Distance in Elixir

Published: September 11, 2016 2 min read
  • elixir

Today I solved the Exercism Hamming Distance problem in Elixir. Problem Description From Exercism: Write a program that can calculate the…

Exercism's Sum of Multiples in Elixir

Published: August 26, 2016 • Updated: January 03, 2023 2 min read
  • elixir

Today I solved Exercism’s Sum of Multiples problem in Elixir. Here’s the description of the task: Write a program that, given a number, can…

Run Length Encoding in Elixir

Published: July 31, 2016 4 min read
  • elixir

I’ve been working through the Elixir challenges on Exercism.io, to learn the language in the same way James Edward Gray recently attempted…

Learn to Test

Published: July 15, 2016 2 min read
  • testing
  • career

What is one skill I could learn to set myself apart from other apprentice candidates? Testing. The web frameworks of today all have mature…

Why Elixir?

Published: July 06, 2016 2 min read
  • elixir

I’ve been learning and using Elixir lately, and loving it. More than once, I’ve been asked some version of the question: why are you…

Writing Elixir Sigils

Published: July 04, 2016 2 min read
  • elixir

Sigils are a mechanism for working with textual representations in Elixir. If you’ve ever made an array of Strings in Ruby with , the API is…

How and Why to Squash Your Pull Request

Published: July 03, 2016 5 min read
  • git

Most pull requests go through a cycle like this: Programmer opens pull request Maintainer gives feedback Programmer makes changes Repeat #…

Recreating Elixir's Enum.sum

Published: June 30, 2016 2 min read
  • elixir

I’m learning Elixir, and today as an exercise, I was challenged to recreate using recursion. For those new to the language, iterates over…

Server Side Sorting in Ruby

Published: June 28, 2016 2 min read
  • ruby

Recently a friend asked me this question about server-side sorting in Rails: I’m working on an app that displays movies. The index page…

Are Web Development Jobs Stable?

Published: June 10, 2016 2 min read
  • career

Original post: https://www.quora.com/Are-web-development-jobs-stable/answer/Jake-Worth Yes, as stable as any other job. If you look at three…

Keyword, Match, and Region in VimScript

Published: April 20, 2016 2 min read
  • vim

After a recent talk I gave that included VimScript, an attendee asked a question about the differences between , , and following in a Vim…

Career Interview Questions

Published: April 16, 2016 4 min read
  • career

I was interviewed for a high school career day recently, and thought it would be fun to share my answers here. Q: Please describe your…

From One End to the Other in Ruby

Published: March 06, 2016 2 min read
  • ruby

A while back I tackled the following programming challenge: From One End to the Other: Find the smallest possible (positive) integer that…

LED Clock in Ruby

Published: March 06, 2016 2 min read
  • ruby

A few weeks ago I attempted to solve a programming challenge that was described as such: LED Clock: You are (voluntarily) in a room that is…

Round Robin Problem in Lua

Published: March 06, 2016 2 min read
  • lua

A while ago, I solved the following programming challenge: Round Robin: Given 3 Teams (A, B, C), we want to organize a tournament schedule…

Vim Buffer Problem

Published: March 06, 2016 • Updated: July 26, 2023 2 min read
  • vim

A few weeks back I tackled the following programming challenge from my colleague Josh Branchaud: Vim Buffer 🐈‍⬛ I open up a new Vim buffer…

Reflecting on Three Years of Programming

Published: November 03, 2015 2 min read

This month marks three years since I started programming; I’d like to take a minute and reflect on this milestone. Programming is Awesome…

Silver Searcher RDoc Support

Published: October 30, 2015 • Updated: March 20, 2023 2 min read
  • ruby

Today I submitted my first pull request to The Silver Searcher project: PR #782 Silver Searcher is a fantastic command line search tool. I…

Tmux List Sessions

Published: October 13, 2015 2 min read
  • tmux

Today while hacking on Rails I stumbled upon the Tmux ‘list sessions’ command. (where is your Tmux leader) opens a list of all your Tmux…


Published: October 03, 2015 2 min read
  • ruby

I made a new gem today, called Remarkovable. The source code is here: https://github.com/jwworth/remarkovable This gem extracts the Markov…

Ceramic Nation

Published: September 11, 2015 • Updated: January 04, 2023 2 min read
  • algorithms
  • ruby

Project announcement! Last night I built a Markov Chain-generated novel, titled Ceramic Nation. It’s presented as a robot named Ellis…

The N + 1 Problem

Published: February 22, 2015 2 min read

Recently, I was thinking about the N + 1 problem. N + 1 is a performance issue in a web application, where a method call unleashes a torrent…

Learning to Program as a Career Change

Published: January 21, 2015 6 min read
  • career

A few years ago, I wrote my first computer program. It was a line of JavaScript that printed my name on the screen, using the website…

Ruby Symbol#to_proc

Published: October 31, 2014 2 min read
  • ruby

Explore a Rails app, and you might see something like this: What is that , you might be wondering? It’s shorthand for this: Often in Ruby…

Code Club: Rack and Rails Server

Published: August 27, 2014 2 min read
  • ruby

This week in Code Club we explored Rack, the middleware of the Rails stack. Rack is newsworthy of late due to a change in ownership…

Vim Cheat Sheet

Published: August 22, 2014 2 min read
  • vim

The Vim adventures continue. Today I started reading through the ‘help’ section, which is vast and full of surprising ideas. Starting to…

Vim or Bust

Published: August 20, 2014 2 min read
  • vim

Starting with this blog post, I will be using Vim as my primary text editor. When I started programming, I was on a Windows machine. I used…

Mass-Opening Like Files in a Directory

Published: May 08, 2014 2 min read
  • terminal

The Unix command line is powerful. Before doing anything in a GUI, I usually first try to see if it can be done in the command line. Often…

RailsConf 2014 Wrap-Up

Published: April 30, 2014 2 min read
  • ruby

I just returned from Rails Conf 2014 here in Chicago. This was my first conference as a developer, and my first time being immersed in the…

Save a Command's Output to a File

Published: April 08, 2014 2 min read
  • terminal

One tool that I love allows you to take the output of a terminal command and save it in a file. That command is: An example: This runs the…

One Monitor

Published: March 31, 2014 2 min read
  • hardware

I have one computer monitor on my desk. Not long ago ago, this was the norm for everybody, but today, I am the only person in my office who…

Hello World!

Published: February 09, 2014 2 min read

I’ve been writing code for a few years now, and am proud to be launching my own developer’s blog. The developer’s blog is a time-honored…

Join 100+ engineers who subscribe for advice, commentary, and technical deep-dives into the world of software.