Blog

Posts on software development, careers, and craft.

Problem: People forget to remove feature flags

Problem: People forget to remove feature flags. Solution: Create "exploding" feature flags. Two techniques: 1. Don't allow flags that target 100% o...

If I’m unhappy with the code AI generates, it’s probably my fault

If I’m unhappy with the code AI generates, it’s probably my fault. My prompt is vague. My context is incorrect. My task was too high level. My requ...

Two important points: 1

Two important points: 1. The AI team was all real developers. If non-devs were Vibe coding they’d likely have significantly worse results. 2. The A...

Is Vibe coding effective

Is Vibe coding effective? It appears the answer is “Yes”. Just saw a talk from a team that did an experiment to prove it. They built the same app u...

I'm watching the Remix Jam stream and this little moment is interesting

I'm watching the Remix Jam stream and this little moment is interesting. Since DOM events bubble, you can declare event handlers in parent elements...

In TypeScript, I don't use screaming case for consts - it's needless because...

In TypeScript, I don't use screaming case for consts - it's needless because TS enforces the const via "as const". I find camelCase easier to read...

People often separate React component logic via a hook

People often separate React component logic via a hook. But one hook with all the component's logic isn't ideal. So, avoid this: Modal.tsx useModal...

> In sprint planning > Team has 19 story points in the sprint and a...

> In sprint planning > Team has 19 story points in the sprint and a “capacity” of 20. > Scrum master searches the backlog for a 1-point ti...

"Test in prod”

"Test in prod”. Sounds risky. But it need not be. It doesn’t mean test *only* in prod. It means test *also* in prod. Testing in prod is the only wa...

"Because I said so." Early in my career, I asked my team lead why we had to...

"Because I said so." Early in my career, I asked my team lead why we had to do a process that seemed unnecessary. His gruff reply? "Because I said...

In the last week both Cursor and Copilot announced a new CLI

In the last week both Cursor and Copilot announced a new CLI. The number of CLI coding assistants is growing fast: Claude Code Copilot CLI Cursor C...

Problem: Using coding with agents, it's annoying to constantly check back to...

Problem: Using coding with agents, it's annoying to constantly check back to see if it's done. Solution: Configure a hook to notify you when it's d...

Imagine your team only had two environments: 1

Imagine your team only had two environments: 1. Your machine (where you code and test) 2. Production Could you successfully ship software this way?

Problem: I want to learn while coding in a new tech

Problem: I want to learn while coding in a new tech. Solution: Set Claude Code's output style to "Learning" With this enabled, Claude explains its...

Anyone using a Macbook Air as their dev machine

Anyone using a Macbook Air as their dev machine? I currently have a 16" M1 Max Macbook Pro with 32 GB of RAM, but I'm considering trying a 15" M4 A...

I’m a fan of Tanstack and excited for Tanstack Start

I’m a fan of Tanstack and excited for Tanstack Start. I’m also a fan of Vercel and admire their continual innovation. @leerob replied courteously f...

My 6-step approach to learning: 1

My 6-step approach to learning: 1. Read the docs. 2. Build an example. 3. Iterate as I make mistakes. 4. Experiment with edge cases and approaches....

Just implemented a feature using GitHub spec-kit

Just implemented a feature using GitHub spec-kit. It's an opinionated workflow for coding via an LLM. I used it with Claude Code, but it works with...

Just found awesome-copilot

Just found awesome-copilot. Handy repo of instructions, prompts, and configs for enhancing GitHub Copilot. Lots of interesting examples in here hav...

Problem: Too many feature flags

Problem: Too many feature flags. We forget to clean them up when they’re no longer needed. Solution: Only allow creating flags for targeting a *sub...

General rule: Feature flags should default *off* for new features

General rule: Feature flags should default *off* for new features. This way, if we push to prod and the flag isn’t configured, the feature is safel...

New version of VS Code chat automatically selects the appropriate LLM model...

New version of VS Code chat automatically selects the appropriate LLM model based on your request and rate limits. It automatically chooses between...

A big difference between Tanstack Query and Tanstack DB: Tanstack Query is...

A big difference between Tanstack Query and Tanstack DB: Tanstack Query is pessimistic by default. It updates the UI *after* an async write complet...

How I handled React state over 10 years: 2014: Class state 2016: Redux 2018:...

How I handled React state over 10 years: 2014: Class state 2016: Redux 2018: useState, useReducer, useContext 2020: React query 2021: Zustand for g...

How I routed in React over 10 years: 2014: React Router 2016: Next page...

How I routed in React over 10 years: 2014: React Router 2016: Next page router 2022: React Router with loaders 2023: Next app router 2024: Tanstack...

A portion of the React community seems to enjoy hating on Vercel

A portion of the React community seems to enjoy hating on Vercel. That’s a shame. Sure, they’ve made mistakes. But they’ve also given us so much. -...

Problem: LLMs may be trained on old docs and thus suggest outdated APIs

Problem: LLMs may be trained on old docs and thus suggest outdated APIs. Solution: context7. It provides the latest docs for tons of projects via M...

Many apps are basically Excel in the browser

Many apps are basically Excel in the browser. This is common when the app doesn't have a professional designer. Developers think "I'll display all...

"Solid is better than React." Sure

"Solid is better than React." Sure. But switching isn't worth it *for me*. I'm an independent consultant, and I enjoy working with a variety of com...

Spending more time with Tanstack DB this week and it's finally clicking

Spending more time with Tanstack DB this week and it's finally clicking. Lot's of little "ah ha" moments. Here's an example. In typical React, I'd:...