Software design can be worked out either from top down approach (customer/user requirements/features → code → data) or from bottom up approach (data → code → features).
Process
High Level Design
- Define Requirements from user’s perspective
- product managers create PRD (Product Requirement Document) based on user feedback, data, market gaps
- Pick up the most important requirements
- From the product requirements, extract features/abstract concepts and map them to data definitions, which then turn into objects in your database
- define APIs through which data can be manipulated
- consider Network Protocols
- Consider engineering requirements
- availability, reliability, extensibility, fault tolerance, etc
- Estimation of scale
- Testing the design
- test flow through scenarios
- identify bottlenecks
Low Level Design
- Consider
- memory optimizations
- User behaviour
- API calling
- Concurrency
- Latency
- Throughput
- Perform Data modeling - use case diagram leading to class diagrams/ER diagrams
- write pseudocode
Use Case Diagram
- Define all the actors - users, stakeholders, operators, third party integrations, etc
- Define requirements in terms of actions the actors can take
- Convert the actions to objects → APIs and what services handle what
- The objects become the basis for class diagrams
Class Diagram
- Every class needs
- States
- data that an object needs to perform behaviours
- Behaviour
- States