Avoid code duplication, extract common functionality
Don't add functionality until necessary
Prefer simple solutions over complex ones
A class should have only one reason to change
Open for extension, closed for modification
Subtypes must be substitutable for their base types
Many specific interfaces are better than one general interface
Depend on abstractions, not concretions
Favor object composition over class inheritance for flexibility and reduced coupling
Only talk to immediate friends - avoid deep coupling chains, principle of least knowledge
High cohesion within classes, low coupling between them - GRASP essentials for responsibility assignment
Designing thread-safe classes - immutability, synchronized access, shared state pitfalls, and when to mention concurrency in LLD interviews