Blog
Posts on software development, careers, and craft.
My new favorite VS Code extension: GitHub Pull Requests and Issues
My new favorite VS Code extension: GitHub Pull Requests and Issues. Review pull requests in VS Code! Benefits: 1. See and checkout PRs 2. See chang...
GitHub code review tip: In diff view, there’s a copy path button next to...
GitHub code review tip: In diff view, there’s a copy path button next to each filename. So to quickly open a file in VS Code: 1. Click the copy fil...
A common mistake: Partially implementing many features
A common mistake: Partially implementing many features. This causes multiple problems: 1. Creates confusion about what is done. 2. Hinders future r...
Continuous integration (CI) is a spectrum
Continuous integration (CI) is a spectrum. The question is, how frequently should we integrate our code changes? Options from most to least continu...
Continuous integration: ✅ No PRs ✅ No branches ✅ No gating code reviews ✅...
Continuous integration: ✅ No PRs ✅ No branches ✅ No gating code reviews ✅ Commit directly into trunk Frequent Integration: ✅ Small PRs ✅ Simple, sh...
TypeScript tip: If a type is only used by one file, colocate the type with...
TypeScript tip: If a type is only used by one file, colocate the type with the file. This clarifies the close relationship, reduces file navigation...
Problem: You want to start a new ticket, but you’re waiting for a related PR...
Problem: You want to start a new ticket, but you’re waiting for a related PR to be merged. Solution: Create a branch off the PR branch. Now your ne...
Independence is wonderful
Independence is wonderful. But it has its downsides too. Here are the key tradeoffs I’ve learned… 10 things I love about being independent: ✅ No al...
Problem: A ticket is too big
Problem: A ticket is too big. Solution: Decompose it. Example: “Create contact us page.” How to decompose it: 1. Design page and write content. 2....
Claim: “We need sprints to break work down and hit deadlines.” Reality: We...
Claim: “We need sprints to break work down and hit deadlines.” Reality: We need to frequently release small tickets so we can estimate velocity. We...
Problem: TypeScript only exists at compile-time
Problem: TypeScript only exists at compile-time. At runtime, it's plain JS. So, when the type is only known at runtime, TypeScript can't protect yo...
Problem: Feature flags are handy, but it’s easy to forget to remove them later
Problem: Feature flags are handy, but it’s easy to forget to remove them later. This leads to needless overhead, complexity, and risk. Solution: Wr...
Good news: You can deep clone objects in the browser via structuredClone
Good news: You can deep clone objects in the browser via structuredClone! 🎉 Bad news: Spread syntax is 34x faster than stucturedClone. ⚠️ structur...
Problem: You're doing a code review and have a suggested change that's hard...
Problem: You're doing a code review and have a suggested change that's hard to describe. Solution: Open a PR against the PR. If a suggested change...
Around 2005, I had a job where I was paid well to do nearly nothing
Around 2005, I had a job where I was paid well to do nearly nothing. I worked for a large telecom company on a team called “test operations”. My jo...
“I once attended a planning meeting in which it was discussed for 20 minutes...
“I once attended a planning meeting in which it was discussed for 20 minutes whether a task should be included in the next sprint. The task could b...
I recently joined a struggling team for part-time consulting
I recently joined a struggling team for part-time consulting. After some coaching and code reviews, things are going smoothly! Here are 6 key impro...
TypeScript tip: Try to avoid optional fields
TypeScript tip: Try to avoid optional fields. They cause two problems: 1. They reduce type safety. 2. There's no type-safe way to enforce when the...
Tip: Clone your repo multiple times
Tip: Clone your repo multiple times. Then you can have the multiple editors open to different branches. Result? Quickly switch context and compare...
I typically run the app when reviewing a PR
I typically run the app when reviewing a PR. Here's why: ✅Helps me see the user experience. ✅Seeing the UX helps me read the code, because it helps...
TypeScript misconception: “If I need to rename a union type, the usages...
TypeScript misconception: “If I need to rename a union type, the usages won’t get updated.” Reality: All usages of the union type can be safely upd...
Generally, prefer TypeScript union types over enums
Generally, prefer TypeScript union types over enums. But, here's a rare case where enum is preferable: If you’re calling a function that accepts a...
Problem: Sometimes functions are needlessly marked async
Problem: Sometimes functions are needlessly marked async. Solution: typescript-eslint/require-await. This ESLint rule finds functions where the asy...
Using "any" in a TypeScript library is occasionally necessary
Using "any" in a TypeScript library is occasionally necessary. Using "any" in an app's TypeScript code is rarely necessary. So, an "any" in app cod...
React tip: Tired of manually wrapping React components just so you can add...
React tip: Tired of manually wrapping React components just so you can add styles? Check out stylemapper. With stylemapper, you call "styled", spec...
"I’ve been employed in tech for years, but I’ve almost never worked"
"I’ve been employed in tech for years, but I’ve almost never worked". This post mentions a surprising cause: Scrum. Scrum encourages sizing tasks a...
Avoid Sprints
Sprints create an arbitrary deadline every x days. This creates estimation overhead, and fosters short-term thinking. Instead: 1. Break work down into small tic…
Claim: “Employment is safer than independence.” Reality: A job isn’t safer
Claim: “Employment is safer than independence.” Reality: A job isn’t safer. You can be let go at any time. So what’s actually safe? Competence. Be...
A common mistake in React: Mixing fetching, formatting, logic, and JSX
A common mistake in React: Mixing fetching, formatting, logic, and JSX. This works fine in small components. But it’s hard to maintain and test as...
I quit my job a few years ago so I could be an independent consultant
I quit my job a few years ago so I could be an independent consultant. The difference in my daily routine is amazing. Before, as a full-time dev: 6...