Blog
Posts on software development, careers, and craft.
How I use #TypeScript with #Node today: 1
How I use #TypeScript with #Node today: 1. For dev, I use ts-node. ts-node compiles TypeScript before passing it on to Node. Useful for npm scripts...
New React 18 APIs: createRoot - replaces render startTransition - for low...
New React 18 APIs: createRoot - replaces render startTransition - for low priority updates useId - Creates an ID that is consistent on server and c...
I believe in storing developer-oriented docs in the repo
I believe in storing developer-oriented docs in the repo. 1. No discovery issues. It’s in the repo. 🔎 2. Easily navigate between the docs and the...
I just created a custom Link component
I just created a custom Link component. What makes it unique? It only accepts *known* URLs. Benefits: ✅ Concise syntax ✅ URL autocomplete support ✅...
Why software development is so satisfying: We accelerate slow processes
Why software development is so satisfying: We accelerate slow processes. We simplify complex processes. We secure insecure processes. We harden err...
A little code review habit I appreciate: When my teammates make a minor...
A little code review habit I appreciate: When my teammates make a minor suggestion, they often prefix it with "Nit:" It's a short, polite way to sa...
Why I use a backend for frontend (BFF) for most SPAs I build: ✅ Better security
Why I use a backend for frontend (BFF) for most SPAs I build: ✅ Better security. The BFF can set an HTTP-only cookie. ✅ Better performance. I can a...
Just published
Just published! 🎉 Building Reusable Components...That Are Actually Reusable 🎥 In this talk, I share lessons learned from helping companies build...
Just learned about devcontainers
Just learned about devcontainers. Declare a Docker image that contains your dev environment. Benefits: ✅ No need to manually install dependencies ✅...
Rapid development checklist: Clear requirements Small tickets Mock APIs CI...
Rapid development checklist: Clear requirements Small tickets Mock APIs CI server Linting Feature flags Trunk-based dev Static types Automated test...
When I started programming, I feared I could never remember it all
When I started programming, I feared I could never remember it all. Now, I know that I never will. And that’s okay. Success as a modern developer i...
10 reusable component mistakes: 1
10 reusable component mistakes: 1. Incompatible props Example: <Input required={false} requiredMessage=“Required!” /> Solution: Unify props t...
To me, the best thing money can buy is freedom
To me, the best thing money can buy is freedom. Freedom to eat what I want. Freedom to sleep when I want. Freedom to travel where I want. Freedom t...
TIL this is valid #JavaScript: onClick?.(); I'm familiar with optional...
TIL this is valid #JavaScript: onClick?.(); I'm familiar with optional chaining, but I didn't realize I could use it before the invocation parens l...
Four frontend trends I'm seeing in 2022: 1
Four frontend trends I'm seeing in 2022: 1. Moving from client-side to server-side rendering 2. Moving from lean client-side generators to full-sta...
3 dev team tasks, ordered by priority: 1
3 dev team tasks, ordered by priority: 1. Critical bugs/blockers 2. Code review 3. Writing code Common mistake: Prioritizing coding over code revie...
Has anyone created a comparison of @nextjs be @remix_run yet
Has anyone created a comparison of @nextjs be @remix_run yet? I’m enjoying both and compiling my thoughts, but would love to hear other takes.
10 reasons I recently switched an app from create-react-app to @vercel...
10 reasons I recently switched an app from create-react-app to @vercel Next.js: 1 Faster startup 2 Faster builds 3 Faster first paint 4 Faster test...
Just switched an app from create-react-app to @vercel Next.js
Just switched an app from create-react-app to @vercel Next.js. A surprising benefit: Tests run twice as fast! Here’s why: With Next, each page rend...
Accessibility tip: Use aria-current to style active links
Accessibility tip: Use aria-current to style active links. Benefits: 1. Screen reader users will get a friendly notification that the link is activ...
I hated Apple
I hated Apple. I thought it was just overpriced. Now I realize what they're selling: Integration. My laptop, phone, watch, and headphones all talk...
Just learned about Zod, a #TypeScript schema declaration and validation library
Just learned about Zod, a #TypeScript schema declaration and validation library. Zod is a simple way to validate API response shapes. Declare a val...
Concern: Waiting for code reviews wastes time
Concern: Waiting for code reviews wastes time. Reality: I can be productive while waiting for a review. ✅ I review my own PR a final time. ✅ I revi...
There’s nothing wrong with using free time to learn, explore, and grow
There’s nothing wrong with using free time to learn, explore, and grow. Voluntary growth isn’t “hustle culture”. Working outside work isn’t “workah...
When I think back on my early career, I made one mistake frequently: I tried...
When I think back on my early career, I made one mistake frequently: I tried to change too much at once, and got overwhelmed. I’ve learned small, i...
A common automated testing mistake in TypeScript: Not specifying the...
A common automated testing mistake in TypeScript: Not specifying the expected result's type. Types are useful in tests too. For all the same reason...
When logic is hard to unit test due to side-effects, I typically prefer...
When logic is hard to unit test due to side-effects, I typically prefer extracting over mocking. My approach: 1. Extract the logic to a well-named,...
This month I’m switching one of my clients from create-react-app to @vercel...
This month I’m switching one of my clients from create-react-app to @vercel Next.js. I’ve noticed the strong opinions help me navigate and build fa...
Just created Remix Doge with @remix_run
Just created Remix Doge with @remix_run. The app displays dog images from an API.🐕 Why I'm impressed: 1. It runs without JS 2. Very little code No...
My unintuitive solution to burnout: Learn
My unintuitive solution to burnout: Learn. Sometimes, when I feel burnout, I’m actually just bored. I want novelty. I want a new challenge. I want...