Minimum Unviable Product
Thinking Small to Move Fast With Quality
About this Presentation
- Sort of a post-mortem
- But not really because we are going to plan too
- This is based on a real project
Problem Statement
We need you to build a URL shortener. We're going to use this with our text messaging system to send short links to people. It needs to support multiple domains, some internal and some external.
Redirects
- Short URL -> Long Url
- Doesn't exist -> 404 external
- Doesn't exist -> Redirect to UI internal
Create
- Can create named URLs
- Can generate short URLs
- Can create via API
- Can create via UI
Update
- Change the long URL of a short URL
- Can update via API
- Can update via UI
Delete
- Stops redirecting
- Maintains history after delete
- Can delete via API
- Can delete via UI
Query
- View short URL details (UI)
- Retrieve short URL details (api)
Multiple Domains
- Some internal facing (s.f, air/)
- Some external facing (st8.farm)
- URLs are unique to the domain
Product Features
- Redirect
- 404
- Go to UI
- Create named API
- Created generated API
- Create UI
- Update API
- Update UI
- Soft Delete API
- Soft Delete UI
- Search UI
- Internal Domains
- External Domains
- Query UI
- Query API
Product Dependencies
Goals
- Identify Dependencies Between Features
- Create a Rough Ordering
Dev Dependencies
Goals
- Identify Dev Dependencies
- Put them on our plan before the first time they are needed
Design Considerations
- Multiple Domains
Create Rough Sprints
Suggestions
- Aim to deliver value every sprint
- Don't plan to tackle more than one dev dependency in a sprint
- Group a dev dependency with product functionality
- Keep your sprints focused, you should be able to name your sprint like a Friends episode
Parallel Work Streams
What is the MVP?
Create Sprint 1 Stories
404 Story
Given a short URL that doesn't exist
And an external domain
When I navigate to the short URL
Then I should get a 404
Hard Mode
State Farm's
Release Process
- ~18 month release cycle
- Minimum 2 months system test
- Minimum of 1 month in performance test
- Minimum 2 months implementation test
- Minimum 3 months from the completion of integration test to production
- Builds must be certified by QA before being allowed into the next environment
Process Restrictions
- Every release must impact users
- Prove that every known function of the application works exactly as intended in every environment (dev, system, pre-production, production)
- 100% automated regression tests for all bugs
- Automate deployment to each environment
- Automate build certification
- Beyond dev must use real dependencies (db, service, logging, etc.)
Sure, but are there any hard problems?
Definition of Done
- 100% mutation test coverage (code coverage is a pointless metric)
- Every path must have an integration test
- Integration tests must be repeatable
- Integration tests must have net 0 impact (everything created by the test is cleaned up)
- Integration tests must have passed in all environments (including production)
Code Coverage
@Test
public void testMyMethod() {
myObject.myMethod(null, null, null);
}
Mutation Testing
@Implementation
public int inRange(int min, int max, int valueToTest) {
return valueToTest >= min && valueToTest <= max;
}
@Test
public void testMyMethod() {
myObject.myMethod(null, null, null);
}
/* Failed mutation 1 ->
changing `valueToTest >= min` to `valueToTest < min` did not cause test to fail
*/
/* Failed mutation 2 ->
changing `valueToTest <= max` to `valueToTest > max` did not cause test to fail
*/
/* Failed mutation 3 ->
changing `valueToTest >= min && valueToTest <= max` to
`valueToTest >= min NAND valueToTest <= max` did not cause the test to fail
/*
Sprint Plan V2
Wrap Up
- Deliver Every Sprint - any value is enough
- Stay Focused
- Bundle Dev Deps with Product Functionality
Minimum Unviable Product
By Justin Dragos
Minimum Unviable Product
- 1,170