architecture · craftsmanship
Designing Simple Systems
·1 min read
Start with a contract
When a side project feels chaotic I write down the entrypoints. A good contract lists the shape of data, the boundary between UI and domain logic, and the optional things that can safely be removed.
type Contract = {
inputs: Record<string, unknown>;
outputs: Record<string, unknown>;
};
The act of writing this tiny interface usually exposes assumptions I forgot to question.
Cut scope when naming hurts
If it takes me longer than five minutes to name a module, it means the module is doing more than one thing. I split it—no ceremony, just enough refactoring to let each concept breathe.
Batching decisions
I reserve a single hour per week to revisit project structure. The rest of the time I bias toward finishing features. The cadence keeps me honest without turning refactors into a hobby.