The Black Box Resists Expertise

SEO, or search engine optimization, is a black box for a reason. It resists expertise. Generally speaking, a search engine is trying to do one thing: help you efficiently find what you’re searching for. When performing well, the result you’d want to see the most would be at the top of the search results page. Example: Science article Imagine I want to learn about the Mars Perseverance Rover. Let’s say that the best page on this subject is NASA’s “Mars 2020: Perseverance Rover” webpage. ...

October 14, 2026

Recovering from a Software Engineering Mistake

Here’s a mistake that I made as a programmer and how I recovered. TIL like attack The first significant application I built by myself was Hashrocket’s Today I Learned. A feature of the site was a post “like” button, which you could click to show that you liked a post. You could even click it when not logged in! The site then kept track of posts you’ve liked. If you’ve ever tried to build a feature like this, you know that it’s hard to control unauthenticated user activity. ...

September 29, 2026

On "Invisible" Software Engineers

My comment on The best engineers I know are almost invisible online – LinkedIn “I’ve seen a decent amount of both. Great engineers who are also prolific content creators, great engineers who are silent, and middling engineers in both categories. Although, it’s hard to maintain the Dunning-Kruger effect when you’re regularly sharing engineering ideas online.” The author continues to argue that invisible engineers should consider building an online presence to survive in today’s job market. I agree. ...

September 23, 2026

What blog posts influenced your thinking the most?

What blog posts have influenced my thinking the most? Here are three. This is a response to this post. Thanks to Simon Willison and Josh Branchaud for the inspiration to write this. Learn in Public, Shawn Wang. As a self-taught programmer, I needed feedback. Getting permission to fail publicly has allowed me to harness the entire internet in my growth. The Trap of the Premature Senior, Charity Majors. Titles in software do not directly map to competency. The way you get truly great is by doing your time on multiple teams. ...

September 15, 2026

How To Get an Interview When You Don't Know Anybody

Perhaps you’ve heard that career adage: “It’s not what you know, it’s who you know.” I’ve found this to be true: most of my software engineering opportunities came from a referral inside the company. But what if you don’t know anybody? I’ll start by challenging the premise: you probably know somebody. An acquaintance who works at a company with programmers. A local business owner with a website. A cousin in tech. Think hard! When I do this, I usually discover someone I can lean on. ...

September 14, 2026

Building a Pitchfork-Style Loading Skeleton

Today, after waiting for an album review to load, I built something small: my own take on the Pitchfork aggregate review loading experience. Pitchfork uses a Skeleton-style UI while returning an album’s aggregate review, such as “8.0” for Mastodon’s Crack the Skye. Skeleton UIs show you something, like blurred text or a flashing bar, to build anticipation and fill out the page while in a loading state. They are a fantastic UX touch for the right kind of app and data. In the case of the Pitchfork app, the aggregate review is a pivotal piece of information about an album, and is presumably being calculated on demand, so this choice makes sense. ...

September 2, 2026

Favorite TypeScript Learnings from TypeNotes

This Summer I wrote a number of blog posts for my TypeNotes project. Here are a few things I learned about TypeScript that were worth revisiting. Path aliases in TypeScript Use cases for JavaScript loose equality (==) Inspecting TypeScript’s inferred types Why TypeScript error codes aren’t documented Here is a summary of each thing I learned. Path Aliases in TypeScript Path aliases are the modern way to do aliases and they are worth adopting on your team. ...

August 24, 2026

The Power of One Test

A developer experience and quality control measure I take on programs I’m building, even small ones, is always to write at least one test. Here’s an example, from this blog: // cypress/e2e/index.cy.js it('shows the homepage', () => { cy.visit('/'); cy.get('article').should('have.length', 10); }); The test loads the homepage and confirms ten articles. The test framework, Cypress, is inconsequential– the point is the test. Should we write tests? What kind, and how many? It’s easy to overthink it; don’t. The difference between zero tests and one is massive. ...

August 20, 2026

Opaque IDs, editable titles in TIL URLs

Today I’d like to highlight something I built with some colleagues that I think is cool: the dynamic paths of Hashrocket’s daily learning site, Today I Learned (TIL). Check out the browser bar here: The URL it contains is: https://til.hashrocket.com/posts/ee0a1bc878-parameters-filtering What do you notice? Here’s my list: After posts/, the path starts with ee0a1bc878 (?) That’s followed by a dash, then the post title in kebab-case (parameters-filtering) When you visit the same URL with an altered kebab-case title (e.g. ee0a1bc878-nope), you get the same page 😵‍💫 When an admin changes the post’s title (e.g. “Rails Parameters FTW”), the URL changes too(ee0a1bc878-rails-parameters-ftw) 😳 There are some sneaky features in there! Let’s dig into them for a minute. ...

July 22, 2026

Genuinely Care

I often reflect on a conversation from years ago with a former Army boss. It is a core component of my leadership style. He said that being a leader means you have to “Genuinely care.” This phrase helped me instantly understand all the leaders I’d encountered up to that point. And better understand my own successes and failures. Followers will forgive many shortcomings and failures in their leader, if they believe that they truly care about what happens to them. ...

June 29, 2026