Blog

Posts on software development, careers, and craft.

Simple rule to keep React apps simple: Declare state as low as possible

Simple rule to keep React apps simple: Declare state as low as possible. If only one component needs the data, declare the state there. Keeping sta...

Default mode: The activity you naturally reach for during free time

Default mode: The activity you naturally reach for during free time. Bad default = bad results: Eating -> Overweight Shopping -> Bankrupt Ent...

Solid writeup for anyone managing a JavaScript monorepo

Solid writeup for anyone managing a JavaScript monorepo. Covers npm, Yarn, Yarn Workspaces, and Lerna, and their potential interactions. Summary: -...

An underrated way to learn and stay current: Read the docs

An underrated way to learn and stay current: Read the docs. I've worked in React since it was open sourced and often re-read the docs. - I find new...

🎉 It's live

🎉 It's live! 🎉 "Clean Coding Principles in C#" just published on @pluralsight. This course is full of concrete examples. I show "dirty" C# snippe...

Just radically reduced our CI build time

Just radically reduced our CI build time! Before: 12.5 minutes ☹️ After: 3 minutes! 🔥 Tips: - Run integration tests against the prod React build (...

React integration testing tip: On your CI server, run your automated...

React integration testing tip: On your CI server, run your automated integration tests against your React *production* build. Why? React is MUCH fa...

"We need a mandatory weekly retrospective to be agile." No we don't

"We need a mandatory weekly retrospective to be agile." No we don't. We just need to regularly discuss what's working, and what isn't. We don't nee...

Two forms of working for "free": 1

Two forms of working for "free": 1. Working over 40 hours/week in a salaried job 2. Working on the side to grow your skills/business I did #1 early...

“We need mandatory daily stand up meetings”

“We need mandatory daily stand up meetings”. No we don’t. We just need to talk regularly. #agiledogma

This advice improved my writing: Prefer active voice

This advice improved my writing: Prefer active voice. Active voice is typically easier to understand and less wordy. Example 1: Avoid: "Count the n...

Upward spiral: Sleep well -> exercise -> eat well -> focus at work...

Upward spiral: Sleep well -> exercise -> eat well -> focus at work -> optimistic attitude When people say “How you do anything is how y...

My entire career, I've only used automated integration testing when the app...

My entire career, I've only used automated integration testing when the app was too big to manually test. But Cypress has changed that. It's so eas...

This is a superb, visually stunning blog post on React Hooks

This is a superb, visually stunning blog post on React Hooks. Even if you understand React Hooks, this is worth reading. https://buff.ly/2lhV8eb Gr...

What a 2019

What a 2019! In September, I quit my job to pursue my dream of being independent. I'm focused on React training, consulting, and development: http:...

Common saying: "Buy experiences, not stuff"

Common saying: "Buy experiences, not stuff". But stuff is an experience too. Nice bed = experience restfulness Nice car = experience luxury, speed,...

Using a timebox for a tricky issue is a great way to avoid wasting hours...

Using a timebox for a tricky issue is a great way to avoid wasting hours churning. I was stumped on Friday. I gave myself an hour, but remained stu...

TIL you can prefetch lazy loaded React components.🔥 create-react-app honors...

TIL you can prefetch lazy loaded React components.🔥 create-react-app honors Webpack directives: https://webpack.js.org/guides/code-splitting/#pref...

In poorly built software, velocity slows over time

In poorly built software, velocity slows over time. Poorly designed monolithic functions, components, and APIs fight reuse. In well-built software,...

I believe the world would be better if TVs weren't in public spaces like...

I believe the world would be better if TVs weren't in public spaces like restaurants, stores, airports, and gyms. TVs create needless noise and dis...

Have an issue, but can't tell what line is causing the bug

Have an issue, but can't tell what line is causing the bug? Bisect. Here's how: 1. Comment out half the code. Still there? 2. Continue commenting o...

Welp, after literally 10 seconds using the new MacBook Pro 16" I was sold

Welp, after literally 10 seconds using the new MacBook Pro 16" I was sold. The 2015 keyboard is back! 🎉 Shut up and take my money! The new larger,...

Currently updating imports in a large project from the "named import" style:...

Currently updating imports in a large project from the "named import" style: import { SelectInput } from "reusable"; to a direct import: import Sel...

Choosing the “hard” way requires discipline

Choosing the “hard” way requires discipline. Walk or bike instead of drive Buy in cash instead of getting a loan Create instead of consume Choosing...

I feared public speaking

I feared public speaking. I feared independence. The decision to chase my fears instead of hide was one of the best decisions of my life. The world...

Felt so lucky today

Felt so lucky today. Loving independence. Training another big team in React this week. Many training engagements coming up. Enjoying doing dev for...

A risky dev team mindset: "We're too busy to do code reviews." Without...

A risky dev team mindset: "We're too busy to do code reviews." Without reviews, consistently, velocity, and quality fall. Skipping code reviews mak...

You can conditionally add JavaScript array elements in a single expression

You can conditionally add JavaScript array elements in a single expression. How? Use spread: const arr = [ ...(includeA ? ['a'] : []), 'b', ]; This...

Emerging job title: UI Architect Concerns: State management Reusable...

Emerging job title: UI Architect Concerns: State management Reusable components, scripts, styles Dev environment (transpiling/bundling/linting...)...

Tip: JavaScript's spread syntax is also handy for creating a copy of an...

Tip: JavaScript's spread syntax is also handy for creating a copy of an object with a property omitted: const { address, ...userWithoutAddress } =...