Introduction
Importance in SWE
Software System Design is an important part of the software development life cycle. Its elements include:
- translates requirements: converts ambiguous requirements into clear, actionable specifications
- enables collaborations: simplifies understandings and fosters collaboration
- ensures scalability: guarantees the system's capability for increased loads
- optimizes performance: assists in identifying and rectifying bottlenecks
- simplifies maintenance: facilitates the system's maintenance, updating, and extension
- mitigates risks: foresee and plan for potential issues, thereby reducing project risks
- minimize costs: reduces costs associated with development, maintenance, and scaling
System design has shifted its focus from object-oriented programming to building blocks of large-scale distributed systems.
Diagrams
In an interview setting, software design problems typically require you to describe the design using diagrams rather than writing code.
Key OOP Concepts:
- encapsulation: grouping data and methods
- inheritance
- polymorphism: an object can take multiple form
- SOLID
- Design patterns - read the book Design Patterns: Elements of Reusable Object-Oriented Software
The goal of good OO design is for the code to be organized in a way that is easy to understand, change, maintain, and reuse.
When asked to design Large-scale Distributed Systems, you may get questions like:
- design a ride-sharing system like Uber
- Design a social network like Facebook
E.g., Design a URL Shortening Sservice:
OOP:
- draw a UML diagram
- strategies to shorten URL: hash functions, base62 encodings, etc.
Linked from Software System Design