Design First
npx machina-cli add skill rohitg00/skillkit/design-first --openclawDesign First Methodology
You are following a design-first approach. Before writing any code, design the solution. This prevents costly rewrites and ensures the implementation meets requirements.
Core Principle
Think first, code second. A good design makes implementation straightforward.
The cost of changing a design is 10x lower than changing code. Invest time in design to save time overall.
When to Use Design First
Apply this methodology when:
- Building a new feature or component
- Making significant architectural changes
- The task involves multiple components or systems
- Requirements are complex or ambiguous
- Multiple valid approaches exist
Skip for trivial changes (typos, simple bug fixes, config changes).
Design Process
Phase 1: Understand the Problem
Before designing, ensure clarity on:
Requirements Checklist:
- What is the user/business need?
- What are the inputs and outputs?
- What are the constraints (performance, security, compatibility)?
- What are the edge cases?
- What are the non-requirements (out of scope)?
Questions to Ask:
- What exactly should this do?
- What should it NOT do?
- How will users interact with it?
- How will it integrate with existing systems?
- What happens when things go wrong?
Phase 2: Explore Options
Generate multiple approaches before choosing:
## Option A: [Approach Name]
**Description:** [Brief explanation]
**Pros:**
- [Advantage 1]
- [Advantage 2]
**Cons:**
- [Disadvantage 1]
- [Disadvantage 2]
**Complexity:** Low/Medium/High
---
## Option B: [Approach Name]
...
Evaluate options against:
- Requirements fit
- Implementation complexity
- Maintenance burden
- Performance characteristics
- Team familiarity
Phase 3: Design the Solution
Create a design document covering:
System Overview
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Client │───▶│ Service │───▶│ Database │
└─────────────┘ └─────────────┘ └─────────────┘
Data Model
interface Order {
id: string;
customerId: string;
items: OrderItem[];
status: OrderStatus;
createdAt: Date;
total: Money;
}
API/Interface Design
// Public interface
interface OrderService {
createOrder(customerId: string, items: OrderItem[]): Promise<Order>;
getOrder(orderId: string): Promise<Order | null>;
cancelOrder(orderId: string): Promise<void>;
}
Key Algorithms/Logic
Order Total Calculation:
1. Sum item prices (price × quantity)
2. Apply discounts (percentage-based first, then fixed)
3. Calculate tax (rate based on customer location)
4. Add shipping (free over threshold, otherwise flat rate)
Error Handling
- What errors can occur?
- How should they be handled?
- What should users see?
Phase 4: Validate the Design
Before implementing, validate:
Self-Review:
- Does it meet all requirements?
- Are there simpler alternatives?
- What could go wrong?
- Is it testable?
External Validation:
- Rubber duck explanation (explain to yourself/others)
- Quick review with teammate
- Check against similar patterns in codebase
Design Document Template
# Design: [Feature Name]
## Overview
[One paragraph summary of what we're building and why]
## Requirements
### Functional
- [Requirement 1]
- [Requirement 2]
### Non-Functional
- [Performance requirement]
- [Security requirement]
## Design
### Architecture
[Diagram and explanation of components]
### Data Model
[Entity definitions and relationships]
### API Design
[Interface definitions]
### Key Decisions
| Decision | Options Considered | Choice | Rationale |
|----------|-------------------|--------|-----------|
| Database | PostgreSQL, MongoDB | PostgreSQL | Need ACID transactions |
## Implementation Plan
1. [First step]
2. [Second step]
...
## Testing Strategy
- Unit tests for [X]
- Integration tests for [Y]
## Open Questions
- [Question 1]
- [Question 2]
Design Levels
High-Level Design (Architecture)
- System components and their interactions
- Data flow between systems
- Technology choices
- Deployment architecture
Mid-Level Design (Module/Component)
- Class/module structure
- Interfaces and contracts
- State management
- Error handling strategy
Low-Level Design (Implementation)
- Algorithm details
- Data structures
- Method signatures
- Edge case handling
Anti-Patterns to Avoid
Big Design Up Front (BDUF)
- Don't over-design every detail
- Design enough to start, refine as you learn
- Balance planning with doing
Analysis Paralysis
- Set a time limit for design phase
- Make decisions with 70% confidence
- Plan to iterate
Design in Isolation
- Consider existing patterns in codebase
- Align with team conventions
- Don't reinvent existing solutions
Integration with Implementation
After design is approved:
- Review the design one more time before coding
- Break into tasks using task-decomposition skill
- Implement incrementally - verify design assumptions as you code
- Update design if you discover issues during implementation
The design document is living - update it as you learn.
Signals You Need More Design
- "I'm not sure where to start"
- "This is getting complicated"
- "I keep refactoring"
- "The requirements are unclear"
- "Multiple approaches seem valid"
Stop and design before proceeding.
Source
git clone https://github.com/rohitg00/skillkit/blob/main/packages/core/src/methodology/packs/planning/design-first/SKILL.mdView on GitHub Overview
Design First is a methodology that requires designing the solution before implementing to prevent costly rewrites and ensure the implementation meets requirements. It’s especially valuable for complex features, major architectural changes, or multi-component systems. By investing in upfront design, teams align on scope, interfaces, and constraints before any code is written.
How This Skill Works
Start with a clear understanding of requirements, constraints, and edge cases. Then generate multiple design options, compare them, and select the best approach. Create a design document that covers system overview, data model, API/interface design, and key algorithms, followed by validation through self-review and external checks before coding begins.
When to Use It
- Building a new feature or component
- Making significant architectural changes
- The task involves multiple components or systems
- Requirements are complex or ambiguous
- Multiple valid approaches exist
Quick Start
- Step 1: Understand the problem using a requirements checklist and identify constraints
- Step 2: Explore at least two design options, compare them against requirements and trade-offs
- Step 3: Design the solution and write a design document (system overview, data model, API, key algorithms), then conduct self and external validation before implementation
Best Practices
- Begin with a Requirements Checklist: user/business need, inputs/outputs, constraints, edge cases, and out-of-scope items
- Generate and compare multiple options before choosing a solution
- Document the design with a System Overview, Data Model, API Design, and Key Algorithms/Logic
- Validate the design through self-review and quick external validation (rubber duck, teammate review)
- Remember that changing a design is far cheaper than changing implemented code
Example Use Cases
- Designing a new feature or component (e.g., a notification service) to prevent scope creep and rewrites
- Re-architecting a module to separate concerns and improve maintainability
- Introducing a service boundary for a multi-component workflow to enable independent evolution
- Evaluating multiple architectural options for a complex requirement with ambiguous inputs
- Planning a major API change with a design document before coding begins