Resources

Go from coder to systems thinker.

solidbook: An Introduction to the World of Software Design & Architecture

Get clarity. Uncover the unknown unknowns and learn the main topics from over the last 40 years of software design, architecture & testing.

Get the book

Testing Mastery

Master the first skill you should have been taught in school: testing. Takes you through the first two Phases of Craftship.

Enroll in TM

The Software Essentialist

Become a confident crafter. Master the 80-20 of testing, design, architecture & strategy to write scalable, testable, flexible and maintainable code on any side of the stack. Takes you through all five Phases of Craftship.

Enroll in TSE

Recent articles, letters & posts

view all

Temporal Decoupling: Why We Use Events & Messages
What is it about events and event-based architectures that make them work so well?
Tension Seeking Resolution (The Law of Polarity)
Why does code tend towards chaos and complexity? Why should you write tests? Why bother with design, architecture or strategy at a...
Two Categories of Tests: High Value vs. Typical Tests
It's critical to build a foundational understanding of the different types of tests before investing a ton of time into writing th...
Using Builders to Model Complex Test States
Setting up test cases can be extremely challenging. Especially when running E2e tests. In this letter, we learn how to use builder...
How to Improve Legacy Code w/ Characterization Tests
Just like entropy, the natural state of the universe, code has a tendency towards disorder over time. Tests act as a sort of "entr...
The Metaphysical Mental Models: Abstraction & The Feedback Loop
The metaphysical mental models describe how we solve problems and bring ideas to life. They are 1) Abstraction, and 2) The Feedbac...
98% of Developers Use React as a Framework, Not a Library
React is a view layer library but most developers use it as a framework. Let's look into why that is and the implications of it.
Is DDD Overrated? | Domain-Driven Design
DDD is one particular approach to software design. While highly influential and transformational for developers new to software de...
Enforcing Coding Conventions with Husky Pre-commit Hooks
In this guide, we'll learn how to setup Husky to prevent bad git commits and enforce code standards in your project.
Domain-Driven GraphQL Schema Design using Event Storming
A GraphQL schema is a declarative, self-documenting, organization-wide API. It's pretty important to spend a little bit of time on...
How Apollo REST Data Source Deduplicates and Caches API calls [Deep Dive]
Apollo's REST Data Source does a lot more than you'd think behind the scenes, and that's why it's recommended instead of using a w...
How to Setup a TypeScript + Node.js Project
In this guide, we walk through the process of creating a TypeScript project from scratch with cold-reloading, and scripts for buil...
Where Do Domain Events Get Created? | Domain Driven Design w/ TypeScript
In this post, I explain how good ol' fashioned encapsulation + TypeScript getters and setters enable us to effectively create Doma...