By Fatskills Exam Guides Team — the exam nerds behind 28,500+ quizzes and 2.1M practice questions across 500+ global exams.
(Agile & Scrum, Scrum Guide 2020)
You’re a Scrum Team Developer (or Product Owner) staring at a backlog item that reads: "As a user, I want to upload a 10GB video file so I can share it with my team."
It’s too big—it won’t fit in a Sprint. If you force it in, you’ll either: - Miss the Sprint Goal (because it’s too complex). - Deliver a half-baked "solution" (e.g., only the UI, no backend processing). - Burn out your team with late-night heroics.
S.P.I.D.R. (Spikes, Paths, Interfaces, Data, Rules) and Vertical Slicing are your scalpel and blueprint for cutting stories into small, valuable, shippable increments—without breaking the system.
Why this matters in production: - Faster feedback: Smaller stories = earlier validation (e.g., "Does the upload button even work?"). - Reduced risk: You don’t discover a 10GB file crashes your API on Day 10 of the Sprint. - Better estimates: A 3-point story is easier to size than a 20-point epic. - Continuous delivery: Each slice can be deployed independently (e.g., "Upload works, but processing is manual for now").
Real-world scenario: You’re building a video transcoding pipeline for a media company. The "upload" story is just the tip of the iceberg—you also need: - File validation (size, format). - Chunked uploads (for large files). - Progress tracking. - Transcoding (FFmpeg). - Storage (S3). - Notifications.
If you try to build all of this at once, you’ll fail. Instead, you’ll use S.P.I.D.R. to split it into vertical slices—each delivering end-to-end value (even if it’s minimal).
Production insight: If a story fails any INVEST check, split it.
Production insight: Horizontal slicing leads to "integration hell" (e.g., "The UI is done, but the API isn’t ready").
"As a content creator, I want to upload a video so I can share it with my team."
For each split, ask: ? Independent? (Can it be built alone?) ? Negotiable? (Can we adjust details later?) ? Valuable? (Does it deliver user value?) ? Estimable? (Can we size it?) ? Small? (Fits in a Sprint?) ? Testable? (Clear acceptance criteria?)
Example Slices:1. "Upload a 1MB file via web form-stored in S3." - Value: Users can upload small files. - Acceptance Criteria: - File appears in S3 bucket. - User sees "Upload successful" message.2. "Show upload progress for files >100MB." - Value: Users know if upload is stuck. - Acceptance Criteria: - Progress bar updates in real-time. - User can cancel upload.3. "Reject files >10GB with error message." - Value: Prevents system overload. - Acceptance Criteria: - Error message: "File too large (max 10GB)." - No file is stored.4. "Transcode uploaded file to H.264 (FFmpeg)." - Value: Standardized format for playback. - Acceptance Criteria: - Output file is H.264. - Original file is preserved.
Example Conversation:
PO: "Do we need progress tracking in the first slice?" Dev: "No, we can add it later. Let’s start with basic upload." QA: "We can test the 1MB upload with a simple S3 check."
Feature: Video Upload Scenario: Upload a 1MB file successfully Given I am logged in When I select a 1MB MP4 file And I click "Upload" Then the file appears in the S3 bucket "media-uploads" And I see "Upload successful" Scenario: Reject file >10GB Given I am logged in When I select a 12GB file And I click "Upload" Then I see "File too large (max 10GB)" And no file is stored
Example AWS CLI Command (for testing):
# Upload a test file to S3 (verify it works) aws s3 cp test.mp4 s3://media-uploads/ --acl private # Check if file exists aws s3 ls s3://media-uploads/
json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/upload-lambda" }, "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::media-uploads/*" } ] }
python import boto3 s3 = boto3.client('s3') url = s3.generate_presigned_url( 'put_object', Params={'Bucket': 'media-uploads', 'Key': 'test.mp4'}, ExpiresIn=3600 # 1 hour )
python # Use S3 object key with UUID to avoid overwrites key = f"uploads/{user_id}/{uuid.uuid4()}.mp4"
media-uploads-{env}
media-uploads-prod
video-upload-processor-{env}
bash aws s3api put-bucket-tagging \ --bucket media-uploads \ --tagging 'TagSet=[{Key=Project,Value=VideoPlatform},{Key=Environment,Value=Prod}]'
Errors > 5 in 5 minutes
FileSize > 1GB
python import logging logger = logging.getLogger() logger.info(f"Upload started: {file_name}, size={file_size}MB")
python from aws_xray_sdk.core import xray_recorder @xray_recorder.capture('upload_file') def upload_file(file): # ...
Why? The first is horizontal (no end-to-end value).
"What’s the best way to split a story about user authentication?"
"Build the login button first."
"A story is too big. What’s the first step?"
"You’re building a payment system. The story is: 'As a user, I want to pay with a credit card.' How do you split it?"
Answer:1. Paths: - "Successful payment" (happy path). - "Payment declined" (error path).2. Data: - "Pay with Visa" (test with one card type first). - "Pay with Amex" (different validation rules).3. Rules: - "Pay with saved card" (no CVV required). - "Pay with new card" (CVV required).4. Spikes: - "Test Stripe API for tokenization."
Why? Each slice delivers independent value (e.g., "Users can pay with Visa" before Amex).
"Split this story using S.P.I.D.R. and vertical slices: 'As a user, I want to search for products so I can find what I need.' Assume the system has: - A product catalog (10,000 items). - Filters (price, category, rating). - Sorting (price low?high, popularity)."*
Why it works: - Each slice is independent (e.g., "Search with 1 filter" doesn’t depend on "Search with 2 filters"). - Each delivers user value (e.g., "Users can find electronics under $500"). - INVEST criteria are met (small, estimable, testable).
Join 4M+ learners. Unlock unlimited quizzes, wrong-answer tracking, flashcards + reminders, study guides, and 1-on-1 challenges.