The software engineering principles cheat sheet I would give to myself If I was preparing for technical interviews again
🟠 ACID Properties
- Atomicity: Transactions are all-or-nothing, fully completed, or not.
- Consistency: Transactions ensure the database remains in a valid state.
- Isolation: Transactions operate independently, unaffected by others.
- Durability: Completed transactions are permanently recorded despite failures.
🟠SOLID Principles
- Single Responsibility: Limit each class to a single responsibility.
- Open/Closed: Classes should be open for extension but closed for modification.
- Liskov Substitution: Subclasses should be substitutable for their base classes.
- Interface Segregation: Prefer small, focused interfaces over broad ones.
- Dependency Inversion: Rely on abstractions rather than concrete implementations.
🟠Design Patterns:
- Factory Method: Create objects without specifying the exact class.
- Abstract Factory: Create families of related objects without specifying their concrete classes.
- Builder: Construct complex objects through a series of steps.
- Prototype: Copy existing objects without knowing the specifics of their construction.
- Singleton: Ensure a class has only one instance with a global point of access.
- Adapter: Enable cooperation between incompatible interfaces.
- Bridge: Decouple an abstraction from its implementation.
- Composite: Organize objects into tree structures to represent part-whole hierarchies.
- Decorator: Add responsibilities to objects dynamically.
- Facade: Provide a simple interface to a complex system.
- Flyweight: Reduce the cost of creating and managing many similar objects.
- Proxy: Control access to another object, handling expensive or complex operations.
- Command: Encapsulate a request as an object, allowing parameterization and queuing.
🟠 System Design Principles
- Scalability: Design systems to handle growth in users and data smoothly.
- Performance: Optimize response times and resource utilization.
- Reliability: Ensure the system functions correctly and consistently.
- Availability: Design for near-constant operability.
- Security: Safeguard systems against unauthorized access and vulnerabilities.
- Maintainability: Facilitate updates and maintenance with minimal disruption.
- Modularity: Build components that can be updated independently.
- Reusability: Design for components to be reused across different parts of the system.
- Decomposability: Break down complex processes into simpler, manageable parts.
- Concurrency: Design interactions to handle multiple operations simultaneously without conflict.