System Design
Basic concepts and terminology
Basic concepts and terminology
There are many fundamental concepts and terms that are widely used in system design. This list is comprehensive and I will continue to update and add new items as necessary.
- Scalability: The ability to handle increasing workload
- High availability: designing a system to minimize downtime and ensure that it is always available to users.
- Auto-scaling: designing a system to automatically adjust the amount of resources it uses based on the workload.
- Redundancy: designing a system with extra capacity to ensure that it can continue functioning in case of a failure.
- Failover: designing a system to automatically switch to a backup component in case of a failure.
- Modularity: Dividing the system into smaller independent components
- Abstraction: Hiding details of the system and presenting necessary information
- Encapsulation: Hiding internal details and exposing only public interface
- Coupling: Interdependence between components or modules
- Cohesion: How elements within a component or module work together
- Data Flow: Flow of data between components or modules
- Performance: Efficiency and effectiveness of a system
- Latency: Time delay between system response and request
- Throughput: Amount of work a system can handle over a period of time
- Load balancing: distributing workload evenly across the system to ensure that no single component is overworked.
- Concurrency: ability to handle multiple tasks simultaneously
- Fault Tolerance: ability of a system to continue functioning in case of failure
- Security: ability of a system to protect data and resources
- Caching: storing frequently accessed data for fast retrieval
- Indexing: organizing data for fast search and retrieval
- Replication: creating multiple copies of data for availability and fault tolerance.
- Partitioning: dividing a system into smaller units for better management and scalability.
- Architecture: the overall structure and organization of a system
- Design Patterns: reusable solutions to common design problems
- Service-oriented architecture (SOA): a design approach that focuses on building services that can be reused
- Microservices: a design approach that focuses on building small, independent services that can be developed and deployed separately
- Event-driven architecture (EDA): a design approach that focuses on processing and reacting to events
- Object-oriented design (OOD): a design approach that focuses on creating objects and classes to represent real-world entities
- Function-oriented design (FOD): a design approach that focuses on designing functions and procedures
- Data-oriented design (DOD): a design approach that focuses on designing data structures and algorithms
- Capacity Planning: determining the appropriate amount of resources needed to handle a given workload
- Resource Allocation: the process of assigning resources to different tasks or processes
- Stateless: a design approach that does not retain information about previous requests
- Stateful: a design approach that retains information about previous requests
- Synchronous: a design approach that requires the completion of a task before moving on to the next one
- Asynchronous: a design approach that allows tasks to be performed concurrently
- Client-Server: a design approach that separates the client and server components of a system
- Peer-to-Peer: a design approach that allows nodes in a network to communicate directly with each other
- Horizontal Scaling: adding more resources to a system to handle an increase in workload
- Vertical Scaling: adding more powerful resources to a system to handle an increase in workload
- Distributed Systems: systems that run on multiple devices or locations
- Cloud Computing: the use of remote servers over the internet to store, manage, and process data.
- API (Application Programming Interface): a set of protocols, routines, and tools for building software and applications
- Protocol: a set of rules and standards for communication between systems
- Session: a period of time during which a user interacts with a system
- Authentication: the process of verifying the identity of a user or system
- Authorization: the process of granting or denying access to a system's resources
- Monitoring: the process of tracking and analyzing the performance of a system.
- Backup and disaster recovery: designing a system to ensure that data can be recovered in case of a failure.
- Optimization: designing a system to minimize resource usage and improve performance.
- Refactoring: redesigning a system to improve its structure and organization without changing its functionality.
- Reusability: designing a system to make it easy to reuse components in other systems.
- Test-driven development: designing a system by writing tests for its functionality before writing the actual code.