Introduction

Created

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.