In perfect world you can get all of the best things in one place. But in real world it’s not. In software development there are some basic trade-offs when you consider a specific design feature. Exploring these considerations will help you to create the architecture that matches best with the given context.
Performance
Security (code level, encryption etc) VS Performance (code level)
Caching: Memory VS Performance
Object Oriented/Layered Code VS Performance
Scalability VS Deployment (n-tier)
User Experience
Usability
Security (user level) VS Usability (user level)
Usability (user level) VS Functionality (user level)
Robustness (user level) VS Usability (user level)
Rich User Experience
AJAX VS Browser Compatibly Issue
Rich Function (FAT Client) VS Poor Function (Thin Client)
Developer Experience
Development Time
Analysis and Design Time VS Development Time
Object Oriented Programming VS Development Time
Quality Assurance and Control VS Time
Well Engineering VS Modification/Change/Reuse (Understandability) Time
System Data Reliability (back up) VS Maintenance Time
Development Structure
Readability (code level) VS Writability (code level)
Reliability (code level) VS Flexibility (code level)
Developer Improvement
Own Study VS External Resources
Latest/New Practices VS Learning Time (PHP VS .NET etc)