•
Software Architecture / Engineering / Design / Notes

What is Software Architecture? Core Concepts

My personal notes and reflections on the core fundamentals of software architecture, structural design levels, and the real role of a software architect.

What is Software Architecture?

To me, software architecture represents the highest level in the conceptual design of a system. When building software, I find it super helpful to position architecture within the four key levels of creating any system:

  1. Requirements: What the client asks for in plain, natural language (often informal or ambiguous).
  2. Specification: Translating those user needs into structured logical and mathematical terms.
  3. Design & Architecture: Structuring the system: breaking it into modules, defining what each component does, and establishing clear communication boundaries between them.
  4. Code (Program): The final implementation with precise syntax that the machine executes.

💡 Key Analogy: Trying to jump straight from informal requirements to writing code without thinking through the architecture is a recipe for disaster. It's like confusing a house's blueprint with the physical building itself. The blueprint is where you figure out structural load and lighting; writing code is laying down the bricks.


The 3 Structural Levels of Design

We often throw around terms like "design" and "architecture" interchangeably, but I've learned it helps to divide them into 3 distinct levels of abstraction based on detail:

  • 1. Architectural Style: Pure architecture. It defines the overall shape of the entire system (the "forest" view). Detail is low, but it lets you evaluate critical traits like security or scalability long before writing a single line of code.
  • 2. Design Patterns: Intermediate design. It models the structure of a specific module or subsystem. You assemble multiple patterns to build a complete system.
  • 3. Component Design: Detailed design, right next to the source code (the shape of each individual "tree"). This is where you decide local classes, methods, and interfaces.

Quick Comparison: Architecture vs. Low-Level Design

FeatureSoftware ArchitectureLow-Level Design
IndependenceExists independently of the specific implementation code.Tightly coupled to the language and actual code.
Cost of ErrorExtremely high. Make a mistake at the foundation, and fixing it later costs a fortune or forces a complete rewrite.Low. Decisions are local and cheap to refactor.
Real ExamplesDeciding on a distributed system, a central database, or an event-driven style.Naming classes, organizing a method, or applying MVC within a single component.

Why Architecture Matters So Much to Me

There's an engineering maxim that always stuck with me: "Design for change". The primary goal of good architecture is to let the system evolve over time at the lowest possible cost without degrading quality.

  • Makes future changes painless: Roughly 80% of software costs happen during maintenance. Code is malleable, but messing with it without solid architecture creates a destructive domino effect. Good architecture stops feature additions from feeling like open-heart surgery.
  • Enables or blocks quality attributes: The structure determines whether your app will be fast or secure. And these attributes should always be measured with hard data (like exact response time in milliseconds, not just asking it to "be fast").
  • Saves massive time: Finding a flaw in a design diagram takes hours; discovering it in production with finished code costs months of rework.
  • Unlocks parallel work: By setting clear boundaries and interface rules between modules, different developers can work simultaneously without stepping on each other's toes.
  • A shared language: It gives me a common bridge to talk tech with clients, PMs, and other devs without getting lost in implementation minutiae.

⚠️ Beware of "works fine today": A system can respond fast and show zero errors today while having a terrible architecture. If it wasn't built "for change," adding one new feature tomorrow could crash the whole thing.


The Role of a Software Architect

Rather than a senior developer issuing decrees, I see the architect as a technical leader and strategist who sets clear guidelines:

  • Forward-looking perspective: Developers usually focus on the present ("How do I get this working today?"). The architect adds the time dimension: "What happens if this needs to change in 6 months?" or "How easy will this be for another dev to understand?".
  • Broad profile with domain expertise: Not tied to a single technology stack. On top of tech, they understand the business domain (finances, e-commerce, 3D, etc.) to anticipate what the business will ask for next.
  • Objective choices, not tech trends: A great architect doesn't pick a framework just because it's trending or it's their favorite language. Architecture is chosen strictly based on project requirements.
  • Negotiator and diplomat: Balances client goals, management budgets, and the dev team's technical constraints.

My Architecture Lifecycle Checklist

This is the methodical flow I like to follow before and during development:

  1. Requirements & Domain Analysis: Capture functional requirements and quantitative quality attributes.
  2. Design & Style Selection: Pick the right architectural style (layered, event-driven, pipes and filters, client-server, etc.). (Note: MVC is usually a design pattern for modules, not an architectural style for a whole enterprise system).
  3. Documentation: Create clear view diagrams and interface rules so every team knows their component boundaries.
  4. Evaluation before coding: Critically review the documented design to spot risks before writing a single line of code.
  5. Construction & Supervision: Oversee development to ensure the code respects the original architecture, adapting it if real-world challenges pop up.