← Microsoft Interview Insights

Microsoft·Software Engineer·Onsite - System Design / Architecture·Intermediate

Intermediate
Apr 2026

Summary

OOD round at Microsoft focused on class hierarchies, abstract classes vs interfaces, and whether you actually understand why you'd pick one over the other. Not a casual conversation, they want you to justify every design choice on the fly.

Questions Asked (3)

Q1

Design a small system (like a parking lot, vending machine, or ride-share app) using a proper class hierarchy. Define which classes are abstract and which are interfaces, and explain your reasoning.

System DesignTechnical Trade-offs
Author's notes

This is where I stumbled.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and scope, then identify core entities and their relationships. Use abstract classes for shared state/behavior and interfaces for capabilities, explaining trade-offs. Walk through a concrete example like a parking lot to demonstrate the hierarchy.

Pro tip: Emphasize that interfaces define contracts for 'can-do' capabilities (e.g., Payable) while abstract classes provide 'is-a' foundations with partial implementation, and justify choices based on extensibility and avoiding the fragile base class problem.

1. Clarify Requirements and Scope

Ask clarifying questions to understand functional and non-functional requirements, such as scale, concurrency, and extensibility needs. This ensures the design addresses the right problems.

2. Identify Core Entities and Relationships

List the main objects (e.g., ParkingLot, ParkingSpot, Vehicle) and their interactions. Determine which are nouns and how they relate (inheritance, composition, aggregation).

3. Decide Abstract Classes vs. Interfaces

For each entity, decide if it should be an abstract class (shared state/behavior) or an interface (capability contract). Explain your reasoning based on code reuse and flexibility.

4. Define Class Hierarchy and Interfaces

Sketch the hierarchy, showing abstract classes, concrete classes, and interfaces. Use a simple diagram or verbal description to illustrate relationships.

5. Discuss Trade-offs and Extensibility

Explain why you chose certain abstractions and how they support future changes, such as adding new vehicle types or payment methods, without modifying existing code.

Key Points to Mention

  • Abstract classes for shared state and behavior (e.g., Vehicle with licensePlate and abstract calculateFee())
  • Interfaces for capabilities (e.g., Payable, Parkable) to allow multiple inheritance of type
  • Favor composition over inheritance where appropriate to reduce coupling
  • Open/Closed Principle: design for extension without modification
  • Avoid deep inheritance hierarchies; prefer interfaces for flexibility
  • Consider using design patterns like Strategy for payment or Factory for vehicle creation

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

Walk through how inheritance, composition, and polymorphism show up in your design and why you made those structural choices.

System DesignTechnical Trade-offs
Author's notes

Easier once the class diagram was on the board.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Pick a concrete project you know well and narrate the design decisions around inheritance, composition, and polymorphism as a story of trade-offs. Explain why you chose each structure, what alternatives you considered, and how the choice impacted maintainability, extensibility, and testability. Keep the focus on your reasoning, not just the mechanics.

Pro tip: Emphasize that you favor composition over inheritance by default, but show you know when inheritance is justified—like when there's a true is-a relationship with shared behavior and a stable hierarchy. Mention that you've refactored away from deep inheritance trees when they became brittle.

1. Set the context

Briefly describe the project or feature you'll use as an example, including its scale and your role. This grounds the discussion and shows you can communicate technical context clearly.

2. Explain inheritance choices

Describe where you used inheritance, why it was appropriate (e.g., shared interface with default behavior), and any pitfalls you avoided. If you avoided inheritance, explain why composition was better.

3. Explain composition choices

Detail how you used composition to assemble behavior, promote flexibility, and reduce coupling. Give a specific example of a class that delegates to collaborators.

4. Explain polymorphism usage

Show how polymorphism enabled extensibility—e.g., swapping implementations at runtime, using interfaces for dependency injection, or supporting multiple algorithms. Connect it to testability and open/closed principle.

5. Reflect on trade-offs and outcomes

Summarize why these structural choices were right for the context, what you might change, and how they affected the team's velocity or code quality. This demonstrates maturity and self-awareness.

Key Points to Mention

  • Composition over inheritance as a default, with inheritance reserved for true is-a relationships and stable hierarchies.
  • Polymorphism through interfaces or abstract classes to enable dependency inversion and runtime flexibility.
  • Avoiding deep inheritance trees and the fragile base class problem.
  • Using composition to achieve code reuse and adhere to the single responsibility principle.
  • How polymorphism supports testability via mocking and dependency injection.
  • Concrete examples of refactoring from inheritance to composition when requirements changed.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

How do SOLID principles apply to the system you just designed? Can you point to specific parts of your design that reflect them?

System DesignTechnical Trade-offs
Author's notes

Blanked on open/closed for a second.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by briefly recapping the key components of your design, then map each SOLID principle to specific classes, interfaces, or modules you created. Use concrete examples from your design to show how each principle improved maintainability, extensibility, or testability, and be honest about any trade-offs.

Pro tip: Don't just list the principles—explain how applying them made your design better for Microsoft's scale and evolving requirements, and acknowledge any areas where you consciously deviated from SOLID for pragmatic reasons.

1. Recap the design

Briefly summarize the system's architecture and key components so the interviewer has context for your SOLID examples.

2. Map each principle to a specific design element

For each SOLID principle, point to a concrete class, interface, or module in your design and explain how it embodies that principle.

3. Explain the impact

Describe how applying each principle improved the design's flexibility, testability, or maintainability, and how it would help with future changes.

4. Discuss trade-offs and deviations

Acknowledge any areas where you intentionally relaxed a SOLID principle for performance, simplicity, or other constraints, and justify your decision.

5. Connect to Microsoft's context

Tie your SOLID application to Microsoft's engineering practices, such as scalability, reliability, and long-term maintenance of large codebases.

Key Points to Mention

  • Single Responsibility Principle: e.g., separating data access, business logic, and presentation into distinct classes.
  • Open/Closed Principle: using interfaces or abstract classes to allow extension without modifying existing code.
  • Liskov Substitution Principle: ensuring derived classes can replace base classes without breaking behavior.
  • Interface Segregation Principle: creating small, client-specific interfaces instead of large, monolithic ones.
  • Dependency Inversion Principle: depending on abstractions rather than concretions, often via dependency injection.
  • Trade-offs: acknowledging that strict adherence to SOLID can introduce complexity, and balancing it with pragmatism.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.