Blog

Posts on software development, careers, and craft.

A recipe for massive technical debt: 📉 🚫 Throw a large number of...

A recipe for massive technical debt: 📉 🚫 Throw a large number of developers at an empty project...and tell them to hurry. 🚫 Don't bother with co...

Two mistakes I see often: 1

Two mistakes I see often: 1. Start coding too early. If we start coding before we know what we need, it leads to excessive rework and risks throwin...

I frequently audit JavaScript projects for companies

I frequently audit JavaScript projects for companies. Here's something I look for: Is there an ESLint plugin installed for each package we’re using...

Habit: Before I make a PR comment, I ask “Could this check be automated?”...

Habit: Before I make a PR comment, I ask “Could this check be automated?” Examples: 🚫 Bad format ✅Use Prettier 🚫 Tests fail ✅ Run tests on CI 🚫...

Every software shop wants to say “we’re agile”

Every software shop wants to say “we’re agile”. But true agility requires two things: 1. Executives that give teams autonomy and trust. 2. Teams th...

Problem: You need to apply a key to a React fragment

Problem: You need to apply a key to a React fragment. Solution: Use React.Fragment instead of <>.

Company: "We're agile." 5 minutes later

Company: "We're agile." 5 minutes later... Company: "It's time for quarterly PI planning, so all teams need to agree on what they'll do in the next...

Concern: “Asking for feedback makes me look weak or incompetent.” Reality:...

Concern: “Asking for feedback makes me look weak or incompetent.” Reality: Asking for feedback makes you look more confident, more capable, and mor...

Perhaps the most common mistake in software: Waiting too long before getting...

Perhaps the most common mistake in software: Waiting too long before getting feedback. Early feedback catches obvious issues when they're cheaper t...

Every abstraction has a cost

Every abstraction has a cost. Some abstractions don’t provide enough value to offset their cost. Examples: A function only called once with a singl...

Problem: You want to support internationalization

Problem: You want to support internationalization. You want autocomplete support for translated strings. You want type safety to ensure translation...

Problem: Mock datasets tend to be bloated, unreliable, and repetitive

Problem: Mock datasets tend to be bloated, unreliable, and repetitive. So, it's often unclear what mock data can safely be changed, reused, or adde...

I believe one of the most valuable things we can do in code reviews is...

I believe one of the most valuable things we can do in code reviews is improve naming. "I'm unclear what this variable name means." "This function'...

Anyone know of an ESLint rule that enforces naming React state properly

Anyone know of an ESLint rule that enforces naming React state properly? I'd like it to catch this: const [count, updateTheCount] = useState(0) And...

“I don’t need Tailwind

“I don’t need Tailwind. I’m a CSS expert.” ⚠️Will your docs will be as comprehensive? ⚠️Will your class structure will be as thoughtful? ⚠️Will you...

Software development is intimidating because there is no "arrival"

Software development is intimidating because there is no "arrival". There's no day I can say "I fully understand". A career in software development...

Using "!" in TypeScript is often a hack that reduces type safety

Using "!" in TypeScript is often a hack that reduces type safety. Instead, it's typically best to: 1. Check if the expected data exists. 2. Throw a...

Software development is an interest of mine

Software development is an interest of mine. I enjoy reading, experimenting, and getting better. But, it’s not *inherently* interesting. It’s inter...

I thought TypeScript was a waste of time

I thought TypeScript was a waste of time. I thought it was more complexity than it was worth. I thought Microsoft was just trying to make JavaScrip...

A lead who understands and is responsible for the entire system is critical

A lead who understands and is responsible for the entire system is critical. Here’s why: ✅ They can spot needless complexity ✅ They can see when a...

“Move fast and break things.” This can be a useful mantra early in a...

“Move fast and break things.” This can be a useful mantra early in a software project. But, once real users and real data are impacted, it’s typica...

Good programming advice can be taken too far: DRY - “I don’t repeat...

Good programming advice can be taken too far: DRY - “I don’t repeat anything, ever” Single responsibility - “Every function I write is one line” TD...

A common mistake: “I don’t like that person, so I won’t agree with anything...

A common mistake: “I don’t like that person, so I won’t agree with anything they say.” Example: “I don’t like Uncle Bob. So, DRY is dumb”. A person...

You don’t need to get rich to radically change your life

You don’t need to get rich to radically change your life. You just need save enough that you can afford to not make money for a little while. Here’...

When I’m stuck on a hard programming problem the most ineffective thing I...

When I’m stuck on a hard programming problem the most ineffective thing I can do is sit at the keyboard and hope a good idea arrives. So instead, I...

Confession: Years ago, my life was dominated by fear

Confession: Years ago, my life was dominated by fear. I was so scared of failure that I was afraid to speak up. I was afraid to try things that mig...

Refactoring is rarely “necessary” or “urgent”

Refactoring is rarely “necessary” or “urgent”. Yet refactoring is important because code is read often, and patterns proliferate. If we only change...

Problem: TypeScript and ESLint display errors using a red underline, so you...

Problem: TypeScript and ESLint display errors using a red underline, so you can’t tell if it’s a type or lint issue at a glance. Solution: Use only...

I strive to use consistent names when passing React props

I strive to use consistent names when passing React props. Consistent naming makes the code easier to read and navigate. Examples: ✅ Pass a piece o...

The cascade in CSS is like inheritance in Object-Oriented programming

The cascade in CSS is like inheritance in Object-Oriented programming. It sounds like a good idea at first, but it often causes more problems than...