Loading content...
Every catastrophic system design failure—every project that ran 3x over budget, every platform that collapsed under its first million users, every startup that built the wrong product—shares a common origin: a fundamental misunderstanding of what the system actually needed to do.
Core features identification isn't merely the first step in system design; it's the step that determines whether every subsequent decision will build upon solid ground or quicksand. Yet in the rush to demonstrate technical prowess—to sketch architectures, debate database choices, or showcase microservices patterns—many engineers treat requirements gathering as a procedural formality rather than the intellectual discipline it truly is.
This page will fundamentally change how you approach the opening minutes of any system design challenge. You'll learn to identify what a system must do versus what it might do, to recognize feature requests that are actually architecture constraints in disguise, and to ask the questions that separate Principal Engineers from those who merely implement specifications handed down from above.
By the end of this page, you will be able to: (1) systematically extract core features from ambiguous requirements, (2) distinguish essential features from enhancements, (3) recognize implicit requirements hiding within explicit ones, (4) translate business needs into technical capabilities, and (5) establish a feature baseline that anchors all subsequent design decisions.
Before we can identify core features, we must precisely define what we mean by the term. In system design, core features are the fundamental capabilities without which the system would fail to serve its primary purpose.
Consider this definition carefully. It contains two critical elements:
Core features exist at the intersection of these two elements. They are not merely 'important features' or 'features we should have'; they are the features that define the system's very identity.
A feature is 'core' if, without it, users would no longer recognize the system as what it claims to be. If you remove search from Google, it's no longer a search engine. If you remove messaging from WhatsApp, it's not a messenger. Core features are identity-defining.
The Feature Hierarchy:
Not all features are created equal. Understanding where features fall in the hierarchy is essential for making sound design decisions:
| Feature Type | Definition | Design Implication | Example (E-Commerce) |
|---|---|---|---|
| Core Features | Without these, the system cannot fulfill its primary purpose | Must be supported from day one; architecture must optimize for these | Browse products, add to cart, checkout, process payment |
| Essential Features | Expected by users but not identity-defining | Should be included in initial release; may accept suboptimal performance initially | Search products, view order history, save payment methods |
| Enhancement Features | Improve user experience but system works without them | May be phased in post-launch; architecture should not block these | Wishlist, product recommendations, one-click ordering |
| Nice-to-Have Features | Competitive differentiators or convenience features | Consider in architecture but don't optimize for; may never build | AR product preview, social shopping, voice ordering |
The Danger of Misclassification:
When engineers misclassify features, the consequences cascade through the entire system:
A payment system that treats 'process payment' as an enhancement—optimizing instead for 'display payment history'—will have an architecture fundamentally misaligned with its purpose. The history feature might be blazing fast while the actual payment processing becomes a bottleneck.
Identifying core features is not an act of intuition—it's a disciplined process that Principal Engineers have refined through years of practice. The following methodology provides a repeatable framework for extracting features from any system design challenge.
Phase 1: Establish the System's Raison d'Être
Before listing any features, you must answer one question with crystalline clarity: What problem does this system solve?
This isn't about what the system does; it's about why the system exists. Every feature must trace back to solving this core problem.
Phase 2: Identify the Core User Journeys
With the system's purpose established, map the primary paths users take to achieve that purpose. These are not edge cases or administrative workflows—they are the journeys that represent 80%+ of system interactions.
For each core journey, document:
1234567891011121314151617181920212223242526272829303132333435363738394041
# Core Journey: Request a Ride ## PurposeEnable a rider to travel from point A to point B ## Entry PointUser opens app and sees their current location on a map ## Steps1. User enters destination2. System displays estimated fare and arrival time3. User confirms ride request4. System matches rider with nearby driver5. Driver accepts/declines (if declines, re-match)6. System displays driver info and real-time location7. Driver arrives at pickup8. User and driver confirm pickup9. Driver navigates to destination10. User and driver confirm drop-off11. Payment is processed automatically12. User rates the ride ## System Responses Required- Geocoding (convert address to coordinates)- ETA calculation (traffic-aware routing)- Fare estimation (distance + time + surge)- Driver matching (proximity + rating + availability)- Real-time location tracking- Payment processing- Notification delivery ## Success Criteria- Rider reaches destination- Payment is collected- Driver is compensated ## Failure Modes- No drivers available → notify user, allow retry- Driver cancels → re-match or refund- Payment fails → retry or flag for resolution- GPS failure → manual address entry fallbackPhase 3: Extract Feature Capabilities from Journeys
With journeys mapped, extract the discrete capabilities the system must provide. A capability is a specific function the system performs—not a user action, but a system action.
Transform each journey step into capabilities. The ride request journey above yields:
A capability is what the system CAN do. A feature is what users WANT to do. 'Real-time tracking' is a capability. 'See where my driver is' is a feature. Core features are built on top of core capabilities. Always identify capabilities first, then map features to them.
Phase 4: Apply the Essentiality Filter
With a list of capabilities extracted, apply rigorous filtering to separate core from non-core:
The Removal Test: If you remove this capability entirely, can the core journey still complete?
The Substitution Test: Could this capability be provided by humans, external systems, or workarounds in v1?
The Day-One Test: If this capability doesn't work on launch day, would you delay the launch?
The most dangerous features are the ones no one mentions because everyone assumes they're obvious. These implicit features are often more critical than the explicit ones listed in requirements—and missing them is a hallmark of junior engineering.
Principal Engineers develop pattern recognition for these hidden requirements. Here are the categories you must always consider:
The Iceberg Principle:
For every explicit feature visible above the waterline, expect several implicit features lurking below. A simple 'user registration' feature seen by stakeholders actually includes:
Implicit features are why 'simple' projects blow their estimates. A seemingly straightforward 'build a login system' includes so many implicit features that teams often spend weeks on authentication alone. Always surface implicit features during requirements gathering—not during implementation.
Technique: The Assumption Audit
To surface implicit features, systematically challenge every assumption:
This audit converts hidden assumptions into explicit requirements before they become costly surprises.
Core features rarely exist in isolation. They form dependency graphs where some features must exist before others can function. Understanding these dependencies is crucial for both system design and development planning.
Dependency Types:
Features can depend on each other in several ways:
| Dependency Type | Description | Example | Design Implication |
|---|---|---|---|
| Data Dependency | Feature B requires data that Feature A creates | Order history requires Orders; Orders require Checkout | Database schema must support both; A must run before B |
| State Dependency | Feature B requires system state that Feature A establishes | Driver tracking requires Driver to be 'on trip'; trip requires ride confirmation | State machine must be defined; transitions must be atomic |
| Service Dependency | Feature B requires a capability that Feature A provides as a service | Fraud detection requires Payment processing service | Service interface must be stable; A may need higher availability than B |
| Sequence Dependency | Feature B must occur after Feature A in a workflow | Shipping confirmation must occur after Payment confirmation | Workflow orchestration required; partial completion handling needed |
| Shared Resource Dependency | Features A and B both require the same resource | Both Checkout and Inventory Update need access to stock levels | Concurrency control required; potential bottleneck identified |
Building the Feature Dependency Graph:
For each core feature, document:
The result is a directed acyclic graph (DAG) showing feature relationships. This graph reveals:
1234567891011121314151617181920212223242526272829303132333435
Feature Dependency Graph: E-Commerce Checkout Level 0 (Foundations - No Dependencies):├── User Authentication├── Product Catalog└── Inventory Management Level 1 (Depends on Level 0):├── Shopping Cart → [User Auth, Product Catalog]├── Product Search → [Product Catalog]└── Stock Checking → [Inventory Management] Level 2 (Depends on Level 1):├── Checkout Initiation → [Shopping Cart, Stock Checking]└── Saving for Later → [Shopping Cart, User Auth] Level 3 (Depends on Level 2):├── Payment Processing → [Checkout Initiation]└── Address Management → [Checkout Initiation, User Auth] Level 4 (Depends on Level 3):├── Order Confirmation → [Payment Processing, Address Mgmt]└── Payment Methods → [Payment Processing, User Auth] Level 5 (Depends on Level 4):├── Order Tracking → [Order Confirmation]├── Email Notifications → [Order Confirmation]└── Inventory Deduction → [Order Confirmation, Inventory Mgmt] BOTTLENECK ANALYSIS:- User Authentication: 7 features depend on it- Product Catalog: 3 features depend on it - Inventory Management: 3 features depend on it CRITICAL PATH: Cart → Checkout → Payment → ConfirmationThe feature dependency graph often reveals the natural service boundaries in your architecture. Features that have strong dependencies on each other tend to belong in the same service. Features with loose coupling can be separated. The graph is a proto-architecture diagram.
Principal Engineers serve as translators between business stakeholders and technical implementation. Feature identification requires bridging two different vocabularies and mental models.
The Translation Challenge:
Business stakeholders describe what they want in terms of:
Technical teams need to know:
The Clarification Protocol:
When business requirements are vague, use this protocol to extract technical requirements:
1234567891011121314151617181920212223242526272829303132333435
# Requirement Clarification: "Users should receive real-time notifications" ## Stakeholder Statement"Users need to get real-time notifications when something happens with their order." ## Clarification Dialogue Engineer: "What types of order events should trigger notifications?"Stakeholder: "When the order is confirmed, when it ships, and when it's delivered." Engineer: "What channels should notifications be sent through?"Stakeholder: "Push notifications on mobile, and email as backup." Engineer: "When you say 'real-time,' what delay is acceptable?"Stakeholder: "Under 30 seconds for push, email can be up to 5 minutes." Engineer: "What if push notification fails? Silent failure or retry?"Stakeholder: "We should retry 3 times. If still fails, send email only." Engineer: "Should users be able to configure which notifications they receive?"Stakeholder: "Yes, they should opt in/out per notification type." Engineer: "What about quiet hours? Should we delay non-critical notifications?"Stakeholder: "Good point—delivery confirmations can wait, but we need to think about time zones." ## Translated Technical Requirements1. Event-driven notification trigger on order state changes2. Multi-channel delivery: Push (primary), Email (fallback)3. Push SLO: 95% delivered within 30 seconds4. Email SLO: 99% delivered within 5 minutes5. Retry policy: 3 attempts with exponential backoff6. User preference service for notification settings7. Time-zone-aware delivery scheduling8. Delivery tracking and failure loggingThe best feature specifications emerge from multiple rounds of translation and validation. Don't expect to get it right in one pass. Plan for discovery—the first technical translation often reveals questions that send you back to stakeholders for clarification.
Once core features are identified, they must be documented in a way that guides design and prevents scope creep. Effective feature documentation serves multiple audiences: architects designing the system, developers implementing it, testers validating it, and stakeholders reviewing progress.
The Core Feature Specification Format:
Each core feature should be documented with the following elements:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
# Feature Specification: Payment Processing ## Feature IDCF-PAY-001 ## Feature NamePayment Processing ## CategoryCore Feature (Identity-Defining) ## Purpose StatementEnable customers to pay for their orders using credit/debit cards,ensuring secure, reliable transaction processing that converts cart contents into confirmed orders while maintaining PCI compliance. ## User StoryAs a customer completing checkout,I want to pay for my order using my credit card,So that I can complete my purchase and receive my items. ## Acceptance Criteria□ Customer can enter card details (number, expiry, CVV, billing address)□ Card validation occurs before submission (Luhn check, expiry check)□ Payment is authorized with payment provider within 3 seconds (p95)□ On success: order is created, confirmation displayed, email sent□ On failure: clear error message, all page state preserved□ Card data never stored on our servers (PCI compliance)□ Transaction is idempotent (double-click doesn't double-charge)□ Retry failed bank calls up to 2 times with 1-second delay ## Input Specification| Field | Type | Validation | Required ||----------------|--------|-------------------------------|----------|| cardNumber | string | 13-19 digits, passes Luhn | Yes || expiryMonth | int | 1-12 | Yes || expiryYear | int | Current year to +10 years | Yes || cvv | string | 3-4 digits | Yes || billingAddress | object | Street, city, state, zip | Yes || amount | int | Cents, > 0, matches cart | Yes || currency | string | ISO 4217 code | Yes || orderId | string | UUID, unique | Yes | ## Output Specification| Success Response | Failure Response ||-----------------------------|-------------------------------|| transactionId: string | errorCode: string || status: "approved" | errorMessage: string || approvalCode: string | retryable: boolean || cardLastFour: string | suggestedAction: string || timestamp: ISO8601 | timestamp: ISO8601 | ## Dependencies- CF-CART-001: Shopping Cart (provides items to purchase)- CF-AUTH-001: User Authentication (identifies paying customer)- CF-INV-001: Inventory Check (confirms items available)- EXT: Payment Gateway API (Stripe/Braintree/Adyen) ## Constraints- Performance: p95 latency < 3 seconds end-to-end- Availability: 99.95% during business hours- Security: PCI-DSS Level 1 compliance- Consistency: Exactly-once payment guarantee- Data Residency: Process EU cards in EU region ## Edge Cases| Scenario | Expected Behavior ||--------------------------------|----------------------------------|| Card declined | Show message, allow retry || Payment timeout | Check status, retry or refund || Duplicate submission | Return cached success response || Item becomes unavailable | Cancel payment, notify customer || Currency mismatch | Convert at current rate || Address verification fails | Allow override with fraud flag | ## Out of Scope (v1)- Alternative payment methods (PayPal) — see CF-PAY-002- Stored payment methods — see CF-PAY-003 - Installment payments — see CF-PAY-004- Cryptocurrency — not planned- Manual payment verification — handled by ops toolingThe 'Out of Scope' section is often more important than the feature description itself. It explicitly draws the boundary, preventing scope creep and ensuring everyone agrees on what this feature is NOT. Include it in every specification.
Even experienced engineers fall into predictable traps during feature identification. Awareness of these patterns helps you avoid them.
Recovery Strategies:
When you realize you've fallen into a pitfall:
If your 'core' feature list exceeds 10-15 items for a new system, you're likely including essential and enhancement features. True core features are few. A social media platform's core might be just: create post, follow user, view feed. Everything else builds on those.
Let's apply everything we've learned to a realistic system design scenario. We'll walk through the complete feature identification process for a food delivery platform.
Initial Brief from Stakeholders:
'Build a food delivery system like DoorDash. Users should be able to order food from local restaurants and have it delivered to their location. Restaurants should be able to manage their menus and orders. Drivers should be able to accept deliveries.'
Step 1: Establish the Raison d'Être
The system exists to connect hungry customers with local restaurants, facilitating the ordering and delivery of food.
Step 2: Identify User Personas and Core Journeys
| Persona | Core Journey | Definition of Success |
|---|---|---|
| Customer | Discover → Order → Receive Food | Food arrives hot at correct location within estimated time |
| Restaurant | List Menu → Receive Order → Prepare → Hand Off | Order revenue collected, food picked up promptly |
| Driver | Find Delivery → Accept → Pickup → Deliver | Complete deliveries, earn money, give good ratings |
| Platform (Operator) | Match → Track → Resolve Issues | Transactions complete, all parties satisfied, platform earns margin |
Step 3: Extract Core Capabilities from Customer Journey
123456789101112131415161718192021222324252627282930
CUSTOMER JOURNEY: Find Food → Order → Pay → Track → Receive Journey Step | Required Capability | Core?--------------------------|-------------------------------|-------Customer enters location | Geolocation / Address input | YESSee nearby restaurants | Restaurant search by location | YESView restaurant menu | Menu retrieval and display | YESAdd items to order | Cart management | YESCustomize items | Item variant handling | NO*Apply promo code | Promocode validation | NOEnter delivery address | Address management | YESSelect delivery time | Scheduling | NO (v1 ASAP only)Pay for order | Payment processing | YESTrack order status | Real-time order tracking | YESCommunicate with driver | In-app messaging | NORate experience | Rating/review submission | NORequest support | Customer support | NO (manual v1) * Item customization: Not core because a v1 could launch with fixed menu items. Restaurants would upload exact items they sell. Core features are what makes it WORK, not what makes it GOOD. EXTRACTED CORE CAPABILITIES (Customer):1. Location services (input + geocoding)2. Restaurant discovery (search by proximity)3. Menu display4. Cart management 5. Payment processing6. Order trackingStep 4: Apply Essentiality Filters
For each extracted capability, apply our three tests:
| Capability | Removal Test | Substitution Test | Day-One Test | Verdict |
|---|---|---|---|---|
| Restaurant Discovery | Can't order without finding restaurant | Could provide static list, but terrible UX | Would not launch | CORE |
| Menu Display | Can't order unknown items | Cannot be substituted | Would not launch | CORE |
| Cart Management | Can't assemble order without cart | Could use single-item orders only | Would not launch | CORE |
| Payment Processing | Can't complete transaction | Could do cash-on-delivery only | Probably launch, but limited | CORE* |
| Order Tracking | Order completes without it | Could use SMS updates | Could launch without | ESSENTIAL |
| Driver Matching | No delivery without driver | Cannot be substituted | Would not launch | CORE |
| Real-time Driver Location | Delivery still happens | Could provide ETA only | Could launch without | ESSENTIAL |
| In-app Chat | Delivery still happens | Could use phone calls | Would launch without | ENHANCEMENT |
Step 5: Final Core Feature List
After completing this analysis for all personas, our core features are:
Features that many would assume are core—like real-time driver tracking, ratings, or in-app chat—are actually essential or enhancement features. A food delivery platform can function (poorly, but function) without them. Core features are the minimum required for the system to fulfill its purpose even once.
Core feature identification is the foundation upon which all successful system designs are built. The discipline required to distinguish core from essential from enhancement features separates engineers who build what's needed from those who over-engineer or under-deliver.
Key Takeaways:
What's Next:
With core feature identification mastered, we turn to the discipline of capturing features through user stories and use cases. While we've touched on user-story format, the next page will dive deep into creating user stories that drive development, use cases that catch edge conditions, and documentation patterns that keep teams aligned.
You now possess a systematic framework for identifying core features in any system design challenge. This skill distinguishes Principal Engineers from those who simply implement requirements handed to them. Apply this rigorously, and you'll never again build a system that fails because it optimized for the wrong things.