Blog
Posts on software development, careers, and craft.
CSS Modules and CSS-in-JS encourage me to think selfishly
CSS Modules and CSS-in-JS encourage me to think selfishly. I write separate styles for each component I create. I'm not forced to reuse styles. Thi...
“We don’t need to do code reviews
“We don’t need to do code reviews. We write tests”. How do we assure the code is well structured and readable? How do we assure the UX is good? How...
"I don't need to run the PR
"I don't need to run the PR. I trust the developer". You wouldn't believe how many PRs I see that have obvious mistakes or don't even run. Writing...
Problem: Disabled buttons hurt accessibility and usability
Problem: Disabled buttons hurt accessibility and usability. 🚫 They're invisible for screen readers. 🚫 There's no way for a user to discover why a...
Naming rule: Case acronyms as words
Naming rule: Case acronyms as words. 🚫 getURLParam ✅ getUrlParam 🚫 parseHTTPRequest ✅ parseHttpRequest The second one is easier to read because i...
A test naming strategy I enjoy: 1
A test naming strategy I enjoy: 1. Use "describe" to describe the scenario under test 2. Use "test" to describe the expected results Benefits: ✅ Av...
An EV is the ultimate mobile office
An EV is the ultimate mobile office. It’s quiet. I’m playing soft music. The A/C and cooled seat is on. My laptop and phone are charging. My screen...
AI coding tools like Copilot make suggestions based on what code is in the repo
AI coding tools like Copilot make suggestions based on what code is in the repo. ⚠️ So watch out: If the code is full of anti-patterns, AI suggesti...
Two thoughts on accessibility: 1
Two thoughts on accessibility: 1. I believe in writing accessible web apps. I teach teams how to use screen readers and how to write accessible HTM...
Mistake: Displaying UI features that don’t work
Mistake: Displaying UI features that don’t work. This is a common mistake on pre-production projects. Displaying buttons/pages/features that don’t...
Problem: TypeScript can't validate runtime data
Problem: TypeScript can't validate runtime data. Solution: Use Zod to validate runtime data. 6 things I validate at runtime via Zod: ✅ URL ✅ Cookie...
A common programming mistake: Forgetting to start with a verb
A common programming mistake: Forgetting to start with a verb. Here are 4 things that should typically start with a verb: 1. Function 🚫 userGet ✅...
TypeScript is a set-based language
TypeScript is a set-based language. If I "lie" to TypeScript about the nature of a set of values, then TypeScript can't help me. If something can b...
Yet another reason I run PRs as part of code reviews: I just ran a PR with...
Yet another reason I run PRs as part of code reviews: I just ran a PR with the devtools open and saw the app spewing console warnings. 😬 I can’t s...
Avoid disabling from submit buttons
Avoid disabling from submit buttons. 🚫 Hurts accessibility. The submit button “disappears” for screen readers. 🚫 Hurts usability. The user may no...
Problem: You need to represent an empty number
Problem: You need to represent an empty number. Hack: Use 0, -1, or "". The real solution: Use null. That's what it's for. Null says, "This has no...
Bun is exciting
Bun is exciting. But Bun’s “all-in-one”approach has many risks and downsides: 🚫 Bun will often lag behind changes to the separate tools it replace...
Software developers are writers
Software developers are writers. Great writers master communication. Communication involves 4 key skills: ✅ Writing ✅ Reading ✅ Listening ✅ Speakin...
Problem: I'm working in an app that uses both Redux and React Query
Problem: I'm working in an app that uses both Redux and React Query. React Query responses are copied into the Redux store. The app is buggy becaus...
The Node cjs to esm transition is a mess
The Node cjs to esm transition is a mess. But Bun can handle both cjs and esm *in the same file*! This works?! Awesome. 🤯
Bun 1.0 is here and it’s shockingly compelling
Bun 1.0 is here and it’s shockingly compelling. Bun is a lightning fast runtime, build tool, bundler, package manager, and testing tool, all rolled...
I just removed tests, types, linting, code reviews, and CI from my project
I just removed tests, types, linting, code reviews, and CI from my project. I'm excited to ship my bugs faster!
Why is this post is getting so much buzz
Why is this post is getting so much buzz? Because it's extremely uncommon for teams to migrate from TypeScript back to JavaScript. I've worked with...
I understand why some teams use plain JavaScript
I understand why some teams use plain JavaScript. Perhaps the code is simple and rarely changes. Perhaps the team is small, so types feel like over...
“We don’t need types
“We don’t need types. We write tests.” Tests are wonderful. But tests don’t replace types. Why? Because tests are harder to do well than types. Tea...
My talk "Creating Reusable Components...That Are Actually Reusable" from...
My talk "Creating Reusable Components...That Are Actually Reusable" from @ReactRally just posted on YouTube! I welcome your feedback. https://www.y...
Problem: The REST API I’m calling is a mess
Problem: The REST API I’m calling is a mess. Solution: Abstract it. Resolve the issues in your response handlers. ✅ Fix misspelled properties and c...
I’ve used a treadmill under my standing desk for the last 8 years
I’ve used a treadmill under my standing desk for the last 8 years. I love it, and I believe it’s a competitive advantage. Here’s why: 1. 10k steps...
I’m helping a team create their first automated tests
I’m helping a team create their first automated tests. Here are 8 common testing mistakes I’m seeing, and how to fix them: 1. Unclear name. Solutio...
Here’s a novel reason to write automated end-to-end tests: It motivates...
Here’s a novel reason to write automated end-to-end tests: It motivates developers to fix performance issues. Why? Because if the app is slow, the...