01
Types at the boundaries
The highest-value typing is at the edges: API responses, form input, database rows. Validate untrusted data once at the boundary and the interior of the application becomes far simpler to reason about.
02
Document decisions, not syntax
Comments explaining what the code does age badly. Short records of why an approach was chosen — and what was rejected — are what a future maintainer actually needs.
- Record architectural decisions with their trade-offs
- Keep a running list of known limitations
- Write the runbook while deploying, not afterwards
03
Make deployment boring
If releasing is stressful, releases become rare, and rare releases are large and risky. Automated, repeatable deployment with a rollback path keeps change cheap.