Simplicity first: Features should be simple to build, simple to use, and simple to maintain.
Startup agility: Ship features fast, get user feedback, iterate quickly. Optimize and add robustness only when usage shows it's needed.
- Understand the user problem before proposing solutions
- Validate the problem is real and worth solving
- Define success criteria before building
- Consider the simplest solution first
- Define the minimum viable feature
- Identify what's out of scope
- Break large features into smaller, deliverable pieces
- Avoid feature creep during development
- Design the user experience first
- Consider edge cases but don't over-engineer
- Get feedback on design before implementation
- Keep designs simple and focused
- Build the smallest working version first
- Add functionality incrementally
- Test each increment before moving on
- Deploy and get feedback early
- Ship fast - don't wait for perfection
- Optimize features based on actual usage, not assumptions
- Create feature branches from main/master
- Keep branches small and focused
- Merge frequently to avoid divergence
- Delete branches after merging
- Write tests as you develop, not after
- Test the happy path first
- Add edge case tests when needed
- Keep tests simple and maintainable
- Use established patterns in the codebase
- Follow team conventions and standards
- Reuse existing components and utilities
- Don't introduce new patterns without discussion
- Design APIs for the use case, not theoretical flexibility
- Use RESTful conventions when appropriate
- Version APIs when making breaking changes
- Keep API responses simple and consistent
- Extend existing models when possible
- Add new tables only when necessary
- Keep relationships simple and clear
- Consider migration impact before schema changes
- Review your own code before requesting review
- Run tests and linters locally
- Check that code follows team standards
- Ensure documentation is updated
- Keep pull requests small and focused
- Write clear descriptions of changes
- Link to related issues or tickets
- Request review from appropriate team members
- Address all review comments
- Ask questions if feedback is unclear
- Discuss significant changes, don't just implement
- Thank reviewers for their time
- Test feature integration with existing systems
- Verify no regressions in related features
- Test error cases and edge conditions
- Validate performance impact
- Update documentation (user and technical)
- Prepare rollback plan if needed
- Coordinate with team on deployment timing
- Verify monitoring and alerts are in place
- Monitor feature usage and errors
- Gather user feedback
- Fix critical issues immediately
- Plan follow-up improvements
- Document public APIs and interfaces
- Explain non-obvious implementation decisions
- Keep comments current with code
- Use self-documenting code when possible
- Document new features for end users
- Keep documentation simple and clear
- Include examples and screenshots when helpful
- Update existing documentation affected by changes
- Document architecture decisions
- Update system diagrams if needed
- Note any new dependencies or requirements
- Document configuration changes
- Monitor feature usage metrics
- Collect user feedback systematically
- Identify pain points and issues
- Prioritize improvements based on impact
- Make small improvements based on feedback
- Remove features that aren't used
- Simplify features that are too complex
- Don't add features to fix feature problems
- Plan for feature deprecation when appropriate
- Communicate deprecation clearly to users
- Provide migration paths when needed
- Remove deprecated features cleanly
- User Feedback: When users consistently report problems
- Usage Data: When analytics show users struggling with the feature
- Scale: When feature usage grows significantly
- Performance Issues: When monitoring shows actual performance problems
- Business Impact: When feature issues affect business metrics
- Measure First: Use analytics and user feedback to identify real problems
- Prioritize by Impact: Focus on optimizations that affect most users
- Iterate Quickly: Make small improvements and measure results
- Test Changes: A/B test optimizations when possible
- Remove What Doesn't Work: Don't be afraid to simplify or remove features
- Don't optimize features that users aren't complaining about
- Don't add robustness "just in case"
- Don't optimize for edge cases before common cases
- Don't build enterprise features without enterprise needs
- Don't wait for perfection before shipping
Before considering a feature complete:
- Does it solve the user problem simply?
- Is it tested and working?
- Does it follow team conventions?
- Is documentation updated?
- Are there no obvious performance issues?
- Can it be maintained easily?
- Is it ready for production?
- Can we ship this and learn from users?
- Building features "just in case"
- Over-engineering the first version
- Ignoring existing patterns and conventions
- Skipping tests to move faster
- Adding features to fix feature problems
- Building for hypothetical future needs
- Complex solutions when simple ones work
- Optimizing before measuring user behavior
- Waiting for perfection before shipping
- Enterprise patterns without enterprise problems