The 5 Ds of Data Development
A practical framework for analytics engineering projects.
A practical framework for approaching analytics engineering projects. It draws on the Analytics Development Lifecycle from dbt Labs, but is shaped around the reality of being on the ground. That means the compromises, the pressures, and the decisions that actually get made when you are building data products.
The phases are not strictly linear. Discovery feeds Design, Design informs how you Develop, and what you learn in Development can take you back to Discovery. The framework is a loop as much as a sequence. The depth scales to the stakes. An hour of Discovery before a small change, a fortnight before a platform migration, but the same five phases either way. Each phase is built around three things, aChecklist of what to be doing, aDone enough when… exit gate, and theMost expensive mistake to avoid.
Discovery
The outcome, not the output
Discovery is the most important phase of the 5 Ds. Get this right and everything that follows is faster, cleaner, and more likely to land well. Rush it, or skip it entirely, and you risk spending weeks building the wrong thing. Or worse, building something that makes the problem harder to solve.
The central question is simple. What problem are we actually trying to solve? Stakeholders naturally think in outputs, like a dashboard or a data extract. The work of Discovery is to understand the outcome behind the request, and what will actually change once it exists.
Most expensive mistake
Building something that has already been built. Nothing wastes more time than spending two weeks on a problem someone else in the business has already solved. Even if you only have an hour for Discovery, spend part of it checking.
Talking to stakeholders
The most valuable thing in Discovery is talking to the people closest to the problem, then listening for what they are not quite saying. A few techniques help:
- Ask them to show you what they do today. Rather than asking how they work, get them to walk you through it. You will often spot things they did not realise were relevant, and sometimes find the solution already exists.
- Ask what changes if they have this. The question “what will you do differently once this exists?” ties the request to a real decision or behaviour. If they cannot answer it, that is worth knowing.
- Use the 5 Whys. When you get an answer, ask why, and then ask again. The first answer is rarely the real one, and the problem someone presents is often a symptom of something further upstream.
Understanding the landscape
Discovery is also about understanding what already exists. Before designing anything, find out whether the problem has already been solved. What you find usually falls into one of three situations: something that exists and works, something that exists but is not trusted, or nothing at all. Each one changes the scope of the work, and it is far better to know which now than when you're halfway through Development.
The compromise
Discovery is the phase people most want to skip. The better response is to reframe it. Time spent here is risk reduction. An incorrect metric that gets used to make decisions is more dangerous than no metric at all. Discovery does not have to be endless, but it does need to be enough.
Checklist
- Talk to the stakeholders closest to the problem. Ask them to show you, not just tell you.
- Identify the outcome the stakeholder needs, not just the output they are asking for.
- Check whether something already exists that answers the question, fully or partially.
- Understand the existing data landscape: what is available, what is trusted, what is missing.
- Identify dependencies on other teams or sources that could affect timelines.
- Write a clear problem statement and agree it with the stakeholder.
- Define success criteria in terms of outcomes, not outputs.
Done enough when…
You have a clear, agreed problem statement, you know what success looks like in terms of outcomes, and you know what already exists and where the gaps are. The stakeholder understands what is being solved, and why.
Design
Start with the end, work backwards
Discovery told you what problem you are solving. Design is where you work out how to solve it. It is the most technically demanding phase of the 5 Ds, but the most important thing you do here is not technical at all. Before models, layers or pipelines, you need to answer one question clearly. How does the output you are proposing lead to the outcome the stakeholder needs? If you cannot answer that, you are not ready to design yet. Go back to Discovery.
Most expensive mistake
Building something technically solid that does not solve the problem. You can refine the grain, adjust the model structure or change the output format, and all of that is recoverable. A fundamentally misaligned solution is not.
Start with the end
Begin by defining what the solution is, not how you will build it. It might be a data model with a defined grain and set of columns, a metric in the semantic layer, a report, or a connection between systems. Do not default to the familiar. The output should be whatever best solves the problem, not whatever you built last time. Then ask whether that output actually delivers the outcome. A well-specified output that solves the wrong problem is still the wrong solution.
Work backwards from where you want to be
Once you know where you are going, work out how to get there. What data already exists that you can build on? What needs building from scratch? What can be reused, and can what you build be reused by others? Where are the dependencies, and are any outside your control? This is rarely a straight line. You will start down one path, hit a blocker, try another, and hit another. Good Discovery is what reduces the dead ends. The more you understood the landscape upfront, the fewer you walk down here.
MAESTRO: the properties of a good pipeline
A pipeline cannot be perfect in every dimension. Its properties compete with each other, and good design is about naming the trade-offs explicitly rather than trying to maximise everything. MAESTRO is the model I use to have that conversation: Maintainable, Accurate, Efficient, Scalable, Timely, Robust, Observable.
Read the full MAESTRO breakdown
The wider questions
Design is where you ask the questions that touch everywhere. Be explicit about each:
- Governance and privacy. Can you use this data, does it need a privacy assessment, what access is required?
- Testing. How will you know it is good enough, and what will guard it going forward?
- Reusability. Are you building something bespoke, or something others could reach for?
- Deployment approach. A big bang rollout has different design implications than running old and new side by side.
Make it visible
Whatever you are designing, get it out of your head and into a form someone else can follow. A DAG diagram, a flowchart, a sketch. It does not need to be polished, it needs to be clear. It is both a communication tool and a thinking tool, and the person who comes back to it fresh in six months might well be you.
Checklist
- Define the output first: grain, columns, format, whatever form the solution takes.
- Confirm the proposed output leads to the desired outcome.
- Map the journey from current state to target, identifying dependencies and blockers.
- Identify what can be reused, and whether what you build can be reused by others.
- Run through MAESTRO: name which properties you have prioritised, which you have traded off, and why.
- Complete the governance check: privacy assessment, data sensitivity, access controls.
- Define how you will test it: both validation and ongoing automated tests.
- Define the deployment approach, and its implications for the design.
- Make the design visible, and review it with someone before building.
Done enough when…
You can explain how the output leads to the outcome, you have run through MAESTRO and named your trade-offs, and someone else has reviewed the design. You know how you will test it, and how you will deploy it.
Develop
Valid is not enough. Is it correct?
Development is the phase people think of as the job, the building, the code. It still is, but how we build has changed, and that brings a responsibility that is easy to overlook. The question to answer at the end of this phase is not “does it run?” It is “how do you know this is correct?”
Most expensive mistake
Stopping at validity. A model that runs cleanly and produces the wrong numbers is worse than one that fails to build, because at least a broken model is obviously broken.
How building has changed
Development used to be inherently iterative and human-led. Write a bit, run it, check it. A human eye was on the output at every step, so testing was woven in by default. AI tooling has changed that. Tools like Claude Code let you make larger changes in fewer steps, which is genuinely powerful, but the natural checkpoints that used to exist are no longer automatic. You can go from prompt to output without a single manual inspection in between, which makes it more important than ever to be deliberate about how you validate what you have built.
Validity and soundness
There are two questions to ask about anything you build, and most people only ask the first. Validity means the code runs. The syntax compiles, the references resolve, the model builds. That is the baseline, necessary but nowhere near sufficient. Soundness means the output is actually correct. Does it produce what you think it does? Stopping at validity is one of the most common failure modes in analytics engineering.
Proving soundness
Soundness is really two jobs, one for now and one for later.
- Validation confirms it is right today. Compare dev to prod, spot check records you know something about, check row counts and splits, and find an independent source that should show the same number.
- Automated tests confirm it stays right tomorrow. Constraint and data-quality tests guard structural integrity (uniqueness, not-null, accepted values, referential integrity, freshness), and logic tests cover your transformations.
Write the test plan before you build. Tests written afterwards make it too easy to confirm what you built rather than challenge it.
Ready for review
Review exists to catch what you missed, not to do your QA for you. If you submit a PR hoping the reviewer will find the problems, you have skipped a step, and in an AI-assisted world you have moved the problem rather than solved it. If you cannot demonstrate how you know it is correct, it is not ready for review.
Checklist
- Write a testing plan upfront: define scenarios and expected outputs before building.
- Prove validity: the code compiles, references resolve, the model builds cleanly.
- Prove soundness: compare dev to prod, spot check cases, check row counts and splits.
- Add primary key uniqueness tests on every model.
- Add not-null and accepted-values tests on critical fields.
- Add referential integrity tests where tables are related, and freshness checks where timeliness matters.
- Add logic tests on every critical transformation or calculation.
- Agree accuracy tolerances with the stakeholder and document them.
- Submit for review only when you can demonstrate how you know it is correct.
Done enough when…
You can answer “how do you know this is correct?” with something concrete. Primary key tests exist on every model, critical logic has a test, and the code has been reviewed by someone other than the author.
Document
The step everyone skips
Everyone complains about documentation. There is never enough of it, it is never clear enough, nobody can find what they need, and yet nobody wants to write it. It always gets paid for in the end, though. Either you invest in it as you go, or you pay later with interest, in onboarding time, in debugging sessions, and in you, six months from now, staring at a model and wondering why you made that decision. No one has ever looked back and wished they had documented something less well.
Most expensive mistake
Letting a model reach production undocumented and never coming back to fix it. The moment it is live without docs, the clock starts. It is not a question of whether that gap causes a problem, but when.
Two kinds of documentation
End-user documentation is for the people consuming the output. It is non-technical. What does this metric mean, what is this report showing me, and when something looks wrong, how do I debug it? Every question it answers is one that does not land in your inbox. Technical documentation is for the people building on top of your work. How does it work, what were the design decisions and why, what does someone need to know before they extend it? You need both. They serve different people, and neither substitutes for the other.
Do it along the way
If you leave all the documentation until the end, it shows. By the time you reach Deploy you are ready to ship, not write prose. The better approach is to let it accumulate across the other phases. The problem statement from Discovery, the design artefacts from Design, and the testing plan from Develop are all documentation. This phase is then about consolidating and completing, not starting from a blank page. Include documentation in your definition of done.
The AI dimension
Documentation matters more now, not less. When AI helps you build, it needs context. Without clear technical docs and consistent naming, you get generated code that reinvents what already exists or makes assumptions that do not hold. When an end user queries your data through an AI interface, that AI needs to understand what the data means, or you get confident answers that are subtly wrong. The audience for good documentation has expanded beyond humans.
Checklist
- Write end-user documentation: metric definitions, report descriptions, how to debug when something looks wrong.
- Write technical documentation: design decisions, known limitations, dependencies, what someone needs to build on top.
- Consolidate artefacts from the other phases: problem statement, design diagrams, testing plan, tolerance agreements.
- Add column-level descriptions, especially for calculated fields and anything non-obvious.
- Document known caveats and limitations.
- Make semantic-layer definitions clear enough for an AI to use correctly.
- Review documentation for accuracy. If AI-generated, check for hallucinations.
Done enough when…
An end user can understand what the data means and debug basic issues without asking you. A developer can understand how it works and build on top of it. Documentation is committed alongside the code or published to the data catalogue.
Deploy
Make it easy for everyone else
Deploy is where your work meets the real world. The building is done, the tests pass, the documentation is in place. Now you need to get it into production without breaking what is already there. This is fundamentally a change management problem, and change management is one of the most consistently overlooked parts of analytics engineering.
Most expensive mistake
Declaring victory at “it is live” without confirming the outcome. Shipping to production is not the finish line. If you do not close the loop back to Discovery, you do not know whether the problem was actually solved.
Know what you might break
Before you deploy anything, understand what exists downstream. Which models depend on what you are changing, which reports are built on those models, and which teams rely on those reports to make decisions. This should not be a surprise at this stage. You should have identified downstream dependencies during Discovery and Design; Deploy is where that knowledge becomes operational.
How you deploy is a design decision
A big bang replaces the old with the new in a single deployment. Clean and simple, and sometimes the right call for smaller changes, but if something is wrong, everything is wrong at once. A parallel deployment runs old and new side by side, migrating downstream dependencies gradually. It is more work, but significantly lower risk, and it lets you compare old and new outputs directly, which loops straight back to the soundness question from Develop.
Deploy in phases, keep the picture visible
For larger work, it is rarely sensible to deploy everything in one enormous PR. Smaller, reviewable chunks reduce risk, but they create their own problem. The reviewer only sees a piece of the puzzle. The fix is simple. Keep an overall plan in a ticket that lists every PR in the change, which have merged and which are still to come, and link every PR back to it. A “you are here” for your deployment.
Tell people what is coming
Technical deployment is only half of Deploy. If your changes affect downstream users, and good Discovery and Design mean you know exactly who they are, they need to know what is coming, why it matters, and what they need to do. You are the one making the change, so it is your job to make it as easy as possible for the busy people you are affecting. Tell them the change, the reason, the timeline, and the exact steps.
Checklist
- Identify all downstream dependencies: models, reports, dashboards, teams.
- Choose the deployment approach, big bang or parallel, based on scale and risk.
- If parallel: define the cut-over criteria and the plan to decommission the old asset.
- Define a rollback or fallback plan in case something goes wrong.
- Break large changes into phased PRs with a visible overall plan.
- Communicate to affected parties: what, why, when, and what they need to do.
- Confirm observability is live, not just designed: monitoring, alerting and logging working in production.
- Complete the ownership handover: who owns this, who gets alerted, where the docs live.
- Run post-deploy verification against pre-deploy baselines.
- Close the loop with the stakeholder: confirm the Discovery outcome was met.
Done enough when…
The solution is live, observability is confirmed working, and downstream dependencies are migrated. The stakeholder has confirmed the outcome from Discovery has been met, and ownership is clear. Done means outcome confirmed, not output shipped.