OOP
1. Core OOP Principles (Deep Understanding)
- Encapsulation (information hiding, invariants)
- Abstraction (interfaces, contracts, boundaries)
- Inheritance (when to use vs. composition)
- Polymorphism (subtyping vs. parametric vs. ad-hoc)
- SOLID principles (with real-world tradeoffs)
2. Object Design & Modeling
- Domain-driven design (entities, value objects, aggregates)
- Rich vs. anemic domain models
- Modeling real-world systems with objects
- Object lifecycle & state transitions
- Avoiding “god objects” and tight coupling
3. Design Patterns (Not Just Names — Usage & Tradeoffs)
Creational
- Factory, Abstract Factory, Builder, Singleton (and why to avoid it)
Structural
- Adapter, Decorator, Composite, Facade, Proxy
Behavioral
- Strategy, Observer, Command, State, Template Method, Visitor, Mediator
Know:
- When not to use a pattern
- How patterns emerge naturally from good design
4. Composition Over Inheritance
- Favoring composition
- Role-based composition
- Delegation vs. inheritance
- Mixins / traits (language-specific)
5. Interfaces, APIs & Contracts
- Interface segregation
- Liskov Substitution Principle (LSP) in practice
- Designing stable public APIs
- Backward compatibility strategies
- Versioning object models
6. Dependency Management
- Dependency inversion principle (DIP)
- Constructor vs. setter vs. method injection
- Dependency injection frameworks (Spring, Guice, .NET DI, etc.)
- Avoiding service locator anti-pattern
7. Object-Oriented Architecture
- Layered architecture
- Hexagonal (Ports & Adapters)
- Clean Architecture
- Onion architecture
- How OOP fits into microservices & modular monoliths
8. Error Handling & Robustness
- Exception hierarchies
- Checked vs. unchecked exceptions (language-specific)
- Fail-fast vs. graceful degradation
- Designing recoverable vs. unrecoverable errors
9. Testing Object-Oriented Systems
- Unit testing objects in isolation
- Mocking vs. fakes vs. stubs
- Test-driven development (TDD)
- Designing testable objects
- Testing polymorphic behavior
10. Performance & Memory Considerations
- Object allocation costs
- Garbage collection impact
- Object pooling (when justified)
- Immutability vs. mutability
- Value objects vs. reference objects
11. Concurrency & OOP
- Thread safety in object design
- Immutable objects
- Synchronization strategies
- Actor model vs. shared state
- Designing concurrent-safe APIs
12. Refactoring & Legacy Code
- Refactoring object hierarchies
- Breaking large classes safely
- Replacing inheritance with delegation
- Eliminating code smells (e.g., feature envy, shotgun surgery)
13. Language-Specific Mastery (Pick Your Stack)
- Java: JVM memory model, equals/hashCode, serialization, streams
- C#: value vs. reference types, async/await, immutability
- Python: duck typing, multiple inheritance, dataclasses
- C++: RAII, rule of 5, smart pointers
- Kotlin/Swift: data classes, sealed classes, value types
14. Anti-Patterns to Avoid
- God object
- Anemic domain model
- Tight coupling
- Inheritance abuse
- Over-engineering
- Premature abstraction
15. Communication & Leadership in OOP
- Explaining design decisions
- Mentoring juniors on design
- Leading design reviews
- Balancing purity vs. pragmatism