System Design vs Software Design – Understanding the Key Differences

Connect the service map with the code inside it

Zoom from the service into its application

Across the service

Client → application → databaseRequests, durable data and failure boundaries

Inside the application

Validate → book → storeModules and interfaces implement the rules

The connecting promise

Confirm only saved bookingsContract and code must agree
The service view shows external relationships. The application view shows validation, booking logic and storage adapters inside one part of that service.

In a booking service, someone decides that the application saves reservations in a database and sends email after confirmation. Someone also designs the code that validates a booking, handles conflicts and calls those dependencies.

System design usually focuses on relationships across the service and its operating environment. Software design usually focuses on the structure and behaviour of the software within those parts. Teams use the terms differently, and the work overlaps. A dependable feature needs the decisions to agree.

What you’ll learn

  • Recognise decisions about service relationships and internal code structure.
  • Follow one requirement across both levels of design.
  • Connect timeouts and retries with safe application behaviour.

The system view follows relationships and operating needs

At the system level, ask where bookings are stored, how clients reach the application and which dependencies must be available. Decide when a success response is safe, how work continues after a failure and how changes are deployed.

A component can be a browser, application process, database or external service. An interface describes how two parts communicate. An interface needs more than a name: inputs, results, permission rules and failure behaviour matter.

The useful scope depends on the problem. You may need one application and a database, or several services and delivery locations. Diagram detail should match the decision being discussed.

The software view follows responsibilities inside the code

Inside the booking application, separate responsibilities so they are understandable and testable. Validation checks the requested data; booking logic applies the rules; a storage adapter communicates with the database.

An adapter is code that connects application behaviour to a dependency through an interface. It is not necessarily another server. A class, module or function can express an internal responsibility, depending on the language and the surrounding code.

A clean internal structure helps people change and test the code. It does not by itself provide durable storage, safe retries or capacity across machines. Those properties also depend on the surrounding system and the real implementations.

Connect a system rule to a code responsibility

Build a small decision record

A saved booking must survive an application restart.
A response was lost after the booking committed.

Compare the visible consequences. With JavaScript enabled, choose an option in each scenario to assemble your decision record.

This is an exploratory design exercise. It does not run infrastructure, measure capacity or replace the lesson’s quiz.

All choices and their consequences are visible. Select one choice in each scenario to assemble a design note; revise it as assumptions change.

The system and the code must support the same booking promise. Select a decision for each situation and read how the two levels fit together.

Both options remain visible. Use the exercise to discuss consequences, rather than treating a category name as a strict organisational boundary.

Design the contract across the boundary

Suppose the system view says the booking API accepts an action identifier so a client can safely retry. The application code must actually recognise the identifier, store the decision appropriately and handle concurrent repeats.

Conversely, a module that retries every failed network call may conflict with a system where repeating a write can duplicate an action. A tidy wrapper can still produce incorrect results if its retry policy ignores the operation’s semantics.

Review the complete behaviour: client contract, application rules, database guarantees and response handling. “Exactly once” written on a diagram is not an implementation or a test result.

Use the right view for the question

A service map helps discuss dependencies, trust boundaries and failures. Internal module or sequence diagrams help discuss responsibility, call order and conflict handling. One giant diagram often makes both conversations harder.

The C4 diagram model provides progressively closer views of a software system. Use the levels that help the audience understand the decision; not every discussion needs a code-level diagram. Official source checked 6 October 2026.

Validate the levels together. Test booking logic with useful unit tests, then test the actual database constraints and the behaviour when a response is lost. A mock of a database does not prove the database enforces the intended rule.

Check your design reasoning

A diagram requires safe retries, but the code creates a new booking on every retry. What is the problem?
Choose one answer. You can try again.

Answer and explanation

The system contract and software behaviour do not agree.

The design must be implemented consistently across both levels.

Check your design reasoning

Does a storage adapter inside application code have to be a separate network service?
Choose one answer. You can try again.

Answer and explanation

No. It can be an internal module implementing a dependency interface.

An internal responsibility is not automatically a separate deployment.

Connect the system view to code patterns

Compare Bridge’s object responsibilities and Facade’s subsystem interface with Saga’s cross-service recovery. They operate at different boundaries even when one implementation uses all three.

Keep the levels consistent

The system view explains how the service’s parts interact and operate. The software view explains responsibilities and behaviour inside those parts. Their boundaries depend on the team and the question.

Follow one requirement through both views. Contracts, durability and retry rules need matching code and infrastructure, with tests of their combined behaviour.

Reaching the recap and completing the quizzes are separate milestones.

    Next lesson: Types of System Design: High-Level vs Low-Level →