It involves translating high-level specifications and user requirements into a detailed blueprint that software developers, engineers, and other stakeholders can use to build, implement, and maintain the system.
Key aspects of system design include:
Architecture: This involves designing the overall structure of the system, including how different components will interact, communicate, and collaborate to achieve the desired functionality.
Components and Modules: Breaking down the system into smaller components or modules, each responsible for specific tasks or functions. This modular approach makes the system more manageable and allows for easier development, testing, and maintenance.
Data Flow and Communication: Defining how data will flow between different components and modules of the system. This includes specifying data formats, protocols, and communication mechanisms.
Scalability and Performance: Considering how the system will handle increasing loads and users. Designing for scalability involves planning for the system's ability to handle growth without significant performance degradation.
Security and Reliability: Incorporating measures to ensure the security of data and system operations, as well as designing for high reliability to minimize downtime and ensure smooth operation.
User Experience: Designing the user interface (UI) and user experience (UX) to ensure that users can interact with the system in an intuitive and efficient manner.
Integration: Determining how the system will integrate with other external systems, databases, or services.
Technology Stack: Selecting the appropriate technologies, programming languages, frameworks, and tools that best suit the requirements of the system.
Constraints and Trade-offs: Addressing any limitations, constraints, or trade-offs that may impact the design decisions. These could include budget constraints, time limitations, hardware limitations, and more.
Documentation: Creating detailed documentation that explains the design decisions, architecture, components, and other relevant aspects of the system. This documentation serves as a guide for developers, testers, and maintainers.
System design is a crucial step in the software development process because it provides a clear roadmap for implementation and helps ensure that the resulting system meets the intended functionality, performance, and quality standards. It requires collaboration between various stakeholders, including business analysts, system architects, developers, testers, and project managers, to create a well-structured and effective system design.
The physical design relates to the actual input and output processes of the system. This is explained in terms of how data is input into a system, how it is verified/authenticated, how it is processed, and how it is displayed. In physical design, the following requirements about the system are decided.
- Input requirement,
- Output requirements,
- Storage requirements,
- Processing requirements,
- System control and backup or recovery.
Put another way, the physical portion of system design can generally be broken down into three sub-tasks:
- User Interface Design
- Data Design
- Process Design
Web System design
Online websites such as Google, Twitter, Facebook, Amazon and Netflix are used by millions of user worldwide, as the user increase, a scalable, highly available system must be designed to accommodate a lot of user. Here are the things to consider in designing the system:
- Functional and non functional requirement
- Capacity estimation
- Database to use, Relational or NoSQL
- Vertical scaling, Horizontal scaling, Sharding
- Load Balancing
- Master-Slave Replication
- Cache and CDN
- Stateless and Stateful servers
- Data center georouting
- Message Queue, Publish Subscribe Architecture
- Performance Metrics Monitoring and Logging
- Build, test, configure deploy automation
- Finding single point of failure
- API Rate limiting
- Service Level Agreement