01

Problem Framing

Start with the business decision, not the data. Every pipeline, model, and interface exists to improve a specific outcome.

Map the business context and the decision that needs better information before designing the system.

02

Data Acquisition

Design ingestion with failure in mind. External APIs break, files go missing, and schemas change without notice.

Treat every external source as unreliable — validate at the boundary, handle retries explicitly, and preserve raw data for reprocessing.

03

Data Contracts and Quality

Define the schema before building the pipeline. Validate at every boundary. Catch changes before they break downstream consumers.

Define the output contract before building the pipeline, and validate at every internal boundary — not just the external edge.

04

Architecture and Storage

Choose storage and architecture based on access patterns, not fashion. Separate concerns. Make the system understandable in six months.

Design storage and architecture around query patterns and operational constraints — not around what is popular on Hacker News.

05

Production Reliability

Tests at every layer. CI on every push. Monitoring that catches problems before users do. Deployments that are boring.

Ship with tests at every layer, continuous integration on every push, and monitoring that catches failures before they reach the decision-maker.