Blog
Posts on software development, careers, and craft.
Idea: Open a software development agency with one simple premise: “Our...
Idea: Open a software development agency with one simple premise: “Our developers work directly with you.” No docs. No formal design. No layers in...
Wow, just upgraded to the iPhone 14 Pro and the 120hz screen is wonderful
Wow, just upgraded to the iPhone 14 Pro and the 120hz screen is wonderful. Scrolling is buttery smooth - and text stays crisp while scrolling. Now...
Problem: If an app makes multiple GraphQL calls on the same page, all the...
Problem: If an app makes multiple GraphQL calls on the same page, all the GraphQL calls look the same in the network tab. My approach: Click on eac...
TypeScript tip: Variable names and type names should typically correspond
TypeScript tip: Variable names and type names should typically correspond. If the variable's name doesn't look like it "fits" with the type, ask: -...
React tip: Keep state as "low" as possible
React tip: Keep state as "low" as possible. Example: If state is just passed down to one child, it's too high. Solution: Move the state down to the...
// TODO: Thing we’ll never get around to doing
// TODO: Thing we’ll never get around to doing. If it’s worth doing, do it now or open a ticket. Why a ticket? 1. TODO comments are often forgotten...
Trunk based development can accelerate velocity and reduce overhead
Trunk based development can accelerate velocity and reduce overhead. But, the team must be mature enough to handle it. Necessary foundation: ✅ Comp...
The REAL reason manual testing doesn't scale: When people quit, domain...
The REAL reason manual testing doesn't scale: When people quit, domain knowledge walks out the door. Suddenly, no one knows how parts of the app ar...
Security misconception: “We can’t put a primary key in the URL because a...
Security misconception: “We can’t put a primary key in the URL because a malicious user may change the URL to request a record they aren’t supposed...
Habit: When I open a PR, I review the diff myself first
Habit: When I open a PR, I review the diff myself first. I ask: Is this change well tested? Are docs necessary? Any hacks I need to resolve? Any fo...
Tip: When naming a variable that stores a list, avoid needless suffixes
Tip: When naming a variable that stores a list, avoid needless suffixes. Avoid: 🚫userData 🚫userList 🚫userArray 🚫userItems Instead, keep it simp...
Concern: Isn't deploying multiple times a day risky
Concern: Isn't deploying multiple times a day risky? Solution: Make it less risky. How: ✅Automate checks ✅Monitor prod for issues ✅Use feature togg...
General rule: The fewer environments a web app has, the better
General rule: The fewer environments a web app has, the better. Why? Environments = overhead. Environments are a sign of manual processes. They exi...
Software death spiral: “We don’t have automated tests, so we need many...
Software death spiral: “We don’t have automated tests, so we need many environments with slow, manual checks in each.” 😬 Virtuous cycle: “We have...
Just switched a large project from create-react-app to Vite
Just switched a large project from create-react-app to Vite. With create-react-app: start: 25 sec Hot reload: 2.8 sec With Vite: start: 2 sec 🔥 Ho...
Claim: "Pair programming replaces code reviews" Are you willing to drive...
Claim: "Pair programming replaces code reviews" Are you willing to drive across a bridge that was never inspected just because two people built it...
Tailwind tradeoffs in one tweet: Are you willing to: Learn some class names...
Tailwind tradeoffs in one tweet: Are you willing to: Learn some class names 👎 Accept noisier HTML 👎 In exchange for: Smaller bundles 👍 No more n...
A developer who immediately approves PRs is a liability
A developer who immediately approves PRs is a liability. Why? Because they eliminate an opportunity for a *real* review. A fake reviewer glances at...
When I teach teams React, I teach WAY more than just React: Debugging...
When I teach teams React, I teach WAY more than just React: Debugging TypeScript State, form, and styling patterns and libs React frameworks Compon...
Pre-commit hook used well: ✅ Fast ✅ Focused (Lint changed files, auto-fix) ✅...
Pre-commit hook used well: ✅ Fast ✅ Focused (Lint changed files, auto-fix) ✅ Necessary (Assure secrets aren’t committed) Pre-commit hook used poorl...
Problem: You want to assure your unit test doesn't produce console errors
Problem: You want to assure your unit test doesn't produce console errors. Solution: Assert that console error hasn't been called after each test....
A key dev team role: Architect
A key dev team role: Architect. Duties: -Foster reuse -Enforce consistency -Standardize solutions -Select technologies and patterns -Review changes...
Today I woke up in Germany
Today I woke up in Germany. I had brunch in Paris. Lunch in Detroit. And I’m excited to have dinner with my family in Kansas City. Modern travel ne...
As an “old” developer, I’m driven by two conflicting ideas: 1
As an “old” developer, I’m driven by two conflicting ideas: 1. I have a sense of urgency to help teams avoid the mistakes I’ve made over the last 2...
Wow, just found Deno Lint, a Rust-based alternative to ESLint
Wow, just found Deno Lint, a Rust-based alternative to ESLint. The performance difference is staggering. Example project: ESLint: 11.8 seconds Dino...
Goal: Wrap React Router's Route component so I can avoid having to wrap 50+...
Goal: Wrap React Router's Route component so I can avoid having to wrap 50+ lazy loaded routes in Suspense. This doesn't work because React Router...
The closer developers are to end users, the better
The closer developers are to end users, the better. Why? End user feedback increases empathy, motivates developers, shortens the feedback loop, and...
Problem: You need to deep clone a JavaScript object
Problem: You need to deep clone a JavaScript object. Solution: structuredClone. It clones nearly everything including dates, array, blobs, Error, a...
Branches should ideally have a short lifetime, less than a day
Branches should ideally have a short lifetime, less than a day. - “Accelerate” book How: ✅ Break tasks down. ✅ Pair or review code via conversation...
Unsurprisingly true: Having automated tests primarily created and maintained...
Unsurprisingly true: Having automated tests primarily created and maintained by QA or an outside party isn’t correlated with IT performance. - “Acc...