🏠 Home

Week 2

Software Architecture Design Space

BS Software Engineering - IV - A

Instructor: Baber Sheikh (Visiting Faculty)

2.1 Overview
2.2 Types of Structures
2.3 Software Elements
2.4 Software Connectors
2.5 Agile Approach

Chapter 2: Software Architecture Design Space

🔄 Week 1 Recap: Introduction to Software Architecture

IEEE Definition of Software Architecture:

"The fundamental organization of a system embodied in its elements, their relationships to each other and to the environment, and the principles guiding its design and evolution."

🧱 Elements/Components

Modules, objects, services that perform specific functions

🔗 Connectors

Communication channels between elements

📋 Constraints

Rules governing how elements integrate

🌉 Key Concept: Architecture is the Bridge

Software architecture connects what the customer wants (requirements) with what developers build (implementation)

🔄 Week 1 Recap: Key Principles & Quality Attributes

🎯 High Cohesion

Each module should have a single, well-defined responsibility

Example: AuthService handles ONLY authentication, not emails

🔗 Loose Coupling

Modules should have minimal dependencies on each other

Example: Changing database shouldn't affect UI

⚖️ Quality Attributes (Non-functional Requirements)

Implementation:

Maintainability, Testability, Portability, Scalability

Runtime:

Performance, Security, Availability, Reliability

Business:

Time to Market, Cost, Lifetime

⚠️ Remember: Tradeoffs are Necessary!

You CANNOT maximize all quality attributes simultaneously. Security vs Usability, Performance vs Cost, etc.

📺 Homework Review: YouTube Architecture

Let's review the homework: Sketch YouTube's architecture

Here's how YouTube actually works at scale!

YouTube Architecture

🐍 Python (Frontend Logic)

Used for rapid development. Powers web interface and APIs.

⚡ C++ (Heavy Lifting)

Used for video processing. Python would be too slow for this!

📺 YouTube Architecture - Key Components

🗄️ Vitess (Database Layer)

Standard MySQL cannot handle YouTube's scale!

Vitess shards MySQL (splits data into smaller pieces)

Manages billions of video records efficiently

🌍 CDN (Google Global Cache)

Servers located near your location!

Videos are served from nearby edge servers, not from US data centers.

Enables fast delivery + low latency

🎯 Key Insight:

YouTube's success secret: Right tool for the right job!

Python for speed of development, C++ for speed of execution

2.1 The Design Space - Overview

🎯 What is Design Space?

Design Space is like a menu card for architects. It contains ALL the options available to build software!

👨‍💻 Architect's Job

A software architect must:

  • Know all available design alternatives
  • Choose the best option for the project
  • Support both functional & non-functional requirements

🧩 Core Formula

Architecture =
Elements + Connectors

Elements do the work, Connectors link them together!

💡 Simple Example: Online Store

Elements: Shopping Cart, Payment System, Inventory Database

Connectors: REST API calls between them

2.1 Two Ways to See Software Elements

🔑 Important Concept from Book:

Software elements can be viewed from two perspectives - what you CODE vs what RUNS!

⚡ Dynamic Structure (Runtime)

What's RUNNING in memory

  • Process: A running program
  • Object: Instance in memory
  • Service: API endpoint running
  • Thread: Parallel execution path

📍 Example: When you open Chrome, 10+ processes start running!

📁 Static Structure (Code)

What's WRITTEN in files

  • Package: Group of related files
  • Class: Blueprint for objects
  • Component: Reusable module
  • Library: Code you import

📍 Example: Your .java or .py files sitting in VS Code

2.1 How Elements Connect (Connector Types)

🔗 Connectors Depend on WHERE Elements Are!

Elements can be on the same computer, same network, or across the Internet. Connectors change accordingly!

Location Connector Type Speed Real Example
Same Process Local Method Call ⚡ Fastest (nanoseconds) Function calling another function
Same Computer Inter-Process Communication 🔶 Fast (microseconds) Chrome tabs talking to main process
Same Network (Intranet) Remote Method Invocation 🔴 Medium (milliseconds) Office apps → Office database
Across Internet REST API / Message Queue 🔴 Slowest (100ms+) Your app → Google Maps API

⚠️ Key Point:

Connectors can work in Synchronous (wait for response) or Asynchronous (don't wait) mode!

2.1 Static Connectors (Code-Level)

📄 In terms of CODE (Static Structure):

Connectors are the relationships you define in code between different parts!

📦 Import Clause

import React from 'react';
from django.db import models

Your code DEPENDS on another library

🧬 Inheritance

class Dog extends Animal { }
class Car(Vehicle):

Child class INHERITS from parent

📋 Interface Specification

interface PaymentGateway {
    pay(amount): boolean;
}

Defines CONTRACT between components

🔧 Pipe & Filter

cat file.txt | grep "error" | wc -l

Output of one → Input of next

2.1 Why Design Space Matters Today

🌍 The Real World Challenge

Today's software industry has constantly changing requirements!

🔄 Common Changes:

  • Company Expansion: Need to handle more users
  • Mergers: Two different IT systems must work together
  • B2B Integration: Connect with partner companies
  • New Features: Customer demands keep changing

✅ Good Architecture Should:

  • Adapt to changes easily
  • NOT require major reengineering
  • Support heterogeneous systems
  • Work across Internet boundaries

💡 Netflix Example:

2007: DVD mailing service → 2023: Global streaming with 200+ million users!

Their architecture evolved from simple servers to 700+ microservices. Good design space understanding made this possible!

2.1 How Technology Has Evolved

📚 From the Book:

Over the last decade, information technology has gone through significant changes. Let's see what's new!

🏗️ Component-Based Engineering

Build software from reusable parts

Like LEGO blocks!

  • React Components
  • npm packages
  • NuGet libraries

⚙️ Software Frameworks

Enhanced encapsulation

Pre-built foundations!

  • .NET Framework
  • J2EE (now Jakarta EE)
  • Spring Boot

🌐 Web Services & SOA

Flexible connector technologies

Talk to anything!

  • REST APIs
  • GraphQL
  • gRPC

🎯 Key Takeaway: Understanding Design Space helps you choose the right technologies for your project!

2.2 Types of Software Structures

📚 From the Book:

"A software architecture design can be described with various software structures, each from a different perspective."

📁 1. Static Structure

The code files and their organization

  • Source code files
  • Binary/DLL files
  • Packages, Modules

📍 What you see in VS Code

⚡ 2. Runtime Structure

What is actually running

  • Threads, Processes
  • Sessions, Transactions
  • Object instances

⭐ This is the FOCUS of the book!

👥 3. Management Structure

How the team is organized

  • Team assignments
  • SDLC stages
  • Resource allocation

📍 Project management view

⚠️ Important:

Each structure uses different connector types and has different performance attributes!

2.2.1 Static Structure - Software Elements

📄 What are Static Elements?

The physical files that make up your software project!

🛠️ At Development Time:

Main elements are source code modules

  • .java, .py, .js - Source files
  • package.json - Config files
  • Interfaces/APIs - Separate interface from implementation

📍 Example: Your Python .py files in PyCharm

📦 At Deployment Time:

Elements become binary versions

  • .exe, .dll - Executable files
  • .jar, .war - Java archives
  • JavaBeans, EJBs - Components
  • Deployment descriptors - Config

📍 Note: Multiple source files → Single deployment unit

2.2.1 Static Connectors - Attributes

🔗 When Module A Connects to Module B:

Module A is connected to Module B if and only if A needs to invoke methods in B during execution!

Attribute Description Example
➡️ Direction If A calls B, there's a unidirectional connector from A → B UserController → UserService (one-way)
🔄 Synchronization Method call can be synchronous (wait) or asynchronous (don't wait) Sync: HTTP request
Async: Message queue
📊 Sequence Some connectors must be used in particular order Login → Get Token → Access API

💡 Callback Example (Sequence):

1️⃣ Module A calls Module B and passes a callback reference

2️⃣ Later, an event in B triggers a callback TO A

Both have the same sequence ID but different sequence numbers!

2.2.1 Java Example: Packages & Static Structure

☕ Java's Static Structure (from the Book):

Java is a perfect example to understand static structure!

📚 Building Blocks:

  • Classes - Basic building blocks
  • Files - Compilation units (each file compiled separately)
  • Packages - Group related classes (like folders)
// File: com/myapp/UserService.java
package com.myapp;

public class UserService {
    // ...
}

🌳 Tree-like Hierarchy:

Packages inside packages → Tree structure

com/
└── myapp/
    ├── controllers/
    │   └── UserController.java
    ├── services/
    │   └── UserService.java
    └── models/
        └── User.java

Naming: com.myapp.services.UserService

📌 Import creates linear ordering + Subunits create tree = Complete Static Structure!

2.2.1 Two Types of Hierarchies in Static Structure

📐 Managing Static Structure involves:

Layers of abstraction (visibility) and refinement (encapsulation)

🔗 Client-Server Relation (Linear)

Abstraction / Visibility

  • Client requests services from Server
  • Server provides primitive abstractions
  • Visibility is NOT transitive
  • Server doesn't know client's identity (reusability!)
// UserController (client) uses UserService (server)
UserService service = new UserService();
User user = service.findById(123);

🌳 Refinement Relation (Tree)

Encapsulation / Decomposition

  • Parent component decomposes into children
  • Child exists ONLY within parent's context
  • Always forms tree-like hierarchy
  • Inheritance is a special case!
// Animal (parent) refined into Dog, Cat (children)
class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }

2.2.1 Why Static Structure is Critical

📚 From the Book:

"Static structure plays a critical role in software architecture design."

✅ Good Static Structure Helps With:

  • Clarity: Easy to understand code organization
  • Construction: Incremental development possible
  • Maintenance: Find and fix bugs easily
  • Reengineering: Refactor without breaking
  • Reusability: Use modules in other projects

❌ Poor Static Structure Causes:

  • Spaghetti Code: Everything tangled
  • Circular Dependencies: A → B → C → A
  • God Classes: One class does everything
  • Maintenance Hell: Fix one, break ten
  • Team Conflicts: Everyone editing same files

⚠️ Key Insight:

Since systems are developed incrementally, tight control of static structure in physical software elements is essential!

2.2.2 Runtime Structure - Execution Behavior

⚡ What runs at Runtime?

At runtime, a project consists of threads, processes, functional units, and data units!

🔄 Threads

Parallel execution paths within a process

Example: Browser rendering thread + JS thread

📊 Processes

Running programs with their own memory

Example: Each Chrome tab = separate process

🎯 Objects/Instances

Live instances in memory at execution time

Example: UserService object handling requests

💡 Key Insight from Book:

Same code element → Multiple runtime elements: One client module can run on MANY client computers!

Multiple code elements → Single runtime element: Many classes from different packages can run in the same thread!

2.2.2 Runtime Connectors - Attributes 🔥

⚠️ Important for Interviews!

Runtime connectors inherit static attributes PLUS have these additional attributes!

Attribute Description Example
🔢 Multiplicity One element can connect to multiple elements Load balancer → 5 servers
📏 Distance & Media Same thread / process / computer / across network LAN (fast) vs Internet (slow)
🌐 Universally Invocable Any system can invoke, regardless of platform/language REST API (anyone can call)
📝 Self-Descriptive No pre-installation needed to invoke WSDL, OpenAPI docs

🌍 Why "Universally Invocable" Matters:

Critical for heterogeneous enterprise systems that must integrate efficiently!

🔄 Why "Self-Descriptive" Matters:

Allows dynamic service discovery - choose providers at runtime!

2.2.2 Common Runtime Problems

🐛 Deadlock

Two processes waiting for each other forever!

Thread A: Lock X, waiting for Y
Thread B: Lock Y, waiting for X
// Both stuck forever! 💀

📍 Analogy: Two cars in narrow lane, neither can pass

🏃 Race Condition

Unpredictable results due to timing!

// Both threads run: counter++
// Expected: 2, Actual: 1 or 2?
// Depends on who runs first!

📍 Analogy: Two people editing same doc simultaneously

💾 Memory Leak

RAM keeps filling, never released!

Objects created but never garbage collected. Eventually: OUT OF MEMORY!

🧠 Architect's Thinking:

"If 10,000 users click simultaneously..."

  • Will server crash?
  • Will response be slow?
  • Will data be corrupted?

This is Runtime Thinking!

2.2.3 Management Structure

👥 From the Book:

"A large software project is normally designed and implemented by several project teams, each having well-defined responsibilities at specific SDLC stages."

🧱 Elements in Management Structure:

  • Team assignments to specific code units
  • Responsibilities at SDLC stages (design, implement, test)
  • Resource allocation (people, time, budget)

🔗 Connectors in Management Structure:

  • Runtime dependency between code units
  • Process dependencies (who waits for whom)
  • Communication channels between teams

🏛️ Conway's Law (1968):

"Organizations design systems that mirror their own communication structure."

📍 If Database team and UI team don't talk, their code won't integrate well either!

2.2 Summary: Which Structure is Most Important?

📚 From the Book:

"Software runtime structures serve as the technical backbone of architecture designs and provide the basis from which other structures are derived."

📁 Static Structure

Important for development & maintenance

Derived from runtime

⚡ Runtime Structure ⭐

THE FOCUS!

Technical backbone of design

👥 Management Structure

Important for project planning

Derived from runtime

🎯 Key Takeaway:

This book focuses on software runtime structures and their efficient mapping to the best implementation technologies!

2.3 Software Elements - Building Blocks

📚 From the Book:

"At runtime each software element has well-defined functions and connects to other elements into a dependency graph through connectors."

⚙️ Processing Elements

Components that transform data

  • Video Encoder
  • Tax Calculator
  • Image Compressor

💾 Data Elements

Components that store information

  • Database tables
  • Files on disk
  • Variables in RAM

🚦 Service Elements

Components that coordinate flow

  • Controller (routes)
  • API Gateway
  • Load Balancer

⚠️ Key Point:

Elements are refined through multiple transformation steps based on their attributes and project requirements!

2.3 Reentrant vs Non-Reentrant Elements 🔥

📚 Important Concept:

Depending on each element's function, there are different synchronization and performance constraints!

✅ Reentrant Elements

Multiple threads can execute concurrently without interfering!

  • More efficient
  • Avoids synchronization issues
  • Supports shared thread/process pools
  • Better for high-load scenarios
// Reentrant: Stateless function
function calculateTax(income) {
    return income * 0.15; // No shared state!
}

❌ Non-Reentrant Elements

Only ONE thread can execute at a time (thread-safe)

  • Must run on separate threads/processes
  • Business logic may require this
  • Needs synchronization mechanisms
  • Can become bottleneck
// Non-Reentrant: Stateful, needs lock
class Counter {
    value = 0;
    increment() { this.value++; } // Race condition!
}

2.3 Element Implementation Guidelines

📋 From the Book: Guidelines for Mapping Runtime Elements

Condition Recommendation Example
Reentrant element Implement as thread or process Stateless API handlers
Non-reentrant + multiple callers Run on separate threads/processes (thread-safe) Database connection manager
High multiplicity + performance critical Use Application Server for pooling & caching E-commerce checkout service
Heavy computations Use cluster of processors with load balancing Video transcoding, ML training
Well-defined functions, not performance critical Use COTS (off-the-shelf) components Logging, Email sending

2.3 Transforming Complex Elements

🔄 When an element is too complex:

Transform it using one of these strategies!

🧩 Expand to Subsystem

Create a mini-architecture with its own elements & connectors

  • Define clear interface
  • Encapsulate internal details
  • Hide complexity

📍 Example: "Payment Module" becomes its own subsystem

📚 Vertical Layers

Each layer provides virtual machine to upper layer

  • Each layer hides low-level details
  • Upper layer uses abstractions
  • Classic layered architecture

📍 Example: UI → Business → Data → DB

🔗 Horizontal Tiers

Data flows through discrete processing stages

  • Well-defined interfaces
  • Balanced workloads
  • Pipeline processing

📍 Example: Input → Validate → Process → Output

2.4 Software Connectors

📚 From the Book:

"In the most abstract form, a connector indicates the necessity during system execution for one element to send a message to another and potentially get a return message."

⚠️ Connectors are refined based on deployment!

  • Same process → Local method invocation
  • Different processes, same computer → Message queue or pipe
  • Different computers → Remote method invocation or web service

📊 8 Ways to Classify Connectors (Figure 2.2):

1. Sync Mode
Blocking / Non-blocking
2. Initiator
One / Two
3. Info Carrier
Variable / Pipe / Message
4. Implementation
Signature / Protocol
5. Active Time
Programmed / Event-driven
6. Span
Local / Networked
7. Fan-out
1-1 / 1-*
8. Environment
Homogeneous / Heterogeneous

Connector Type 1: Synchronous vs Asynchronous

🤔 First Question: Sync or Async?

This is the most important decision when choosing a connector!

📞 Blocking (Synchronous)

Like a phone call

  • Must wait for the other party to answer
  • Caller blocks until response
  • Simple to code
  • Can be slow
result = database.query("SELECT *")
// Won't reach here until 
// query completes
print(result)

📧 Non-Blocking (Asynchronous)

Like an email

  • Send and continue working
  • Handle response when it arrives
  • Fast performance
  • More complex to code
database.query("SELECT *", (result) => {
    // Executes later
    print(result)
})
// This executes first!

Connector Type 2: Who Initiates Communication?

🎬 Who starts the conversation?

For communication to happen, someone must initiate!

🌐 Client-Server Model

Client initiates (Browser)

Server sits silently, waiting for requests

Example: Web browsing
Browser → Sends request → Server responds

🤝 Peer-to-Peer Model

Either party can initiate

Both are equal, no master-slave relationship

Example: Chat apps (WhatsApp)
Either user can send a message first

Connector Type 3: Information Carrier

📦 How does data travel?

How do we move data from one place to another?

🧠 Shared Memory (RAM)

Condition: Both components on same machine

  • Extremely FAST
  • Direct memory access
  • No serialization needed

✅ Best for: Same machine communication

🌐 Network Packets

Condition: Components on different machines

  • Relatively SLOW
  • Data must be serialized
  • Network latency exists

⚠️ Necessary for distributed systems

Rule of Thumb: Use Shared Memory whenever possible. Only use Network when absolutely necessary!

🔥 Network Connectors & Proxy Pattern

⚠️ These Concepts Are Very Important!

Frequently asked in technical interviews.

🤔 Problem:

If I need to communicate with a server in America, how do I write the code?
Writing network details every time is tedious!

💡 Solution: Proxy Pattern

This is a "good deception"!

Developer thinks they're calling a local function getUser(),
but the Proxy converts it to a network message and sends it.

// Developer's code - Simple!
User user = userService.getUser(123);

// Proxy behind the scenes:
// 1. Serialize request to JSON
// 2. Send HTTP request to America
// 3. Wait for response
// 4. Deserialize JSON to User object
// 5. Return to developer

Location Transparency

🎭 The Magic of Proxies

The developer doesn't even know if the object is local or remote!

This is called Location Transparency

🖥️ Client Side (Stub)

Looks like a local object

Serializes the request

Sends over network

🌐 Server Side (Skeleton)

Receives request from network

Deserializes request

Calls the actual object

Examples: Java RMI, gRPC, CORBA, REST APIs with client libraries

Heterogeneous Connectors - Different Languages

🌍 Problem:

My Frontend is in JavaScript and Backend is in Java.
These two speak different languages!

💡 Solution: Data Marshalling

We need a translator! We Marshal the data (convert to JSON or XML format)

📄 JSON

Today's standard language that everyone understands!

{
  "name": "Ali",
  "age": 25
}

📝 XML

Older format but still widely used


  Ali
  25

⚡ Protocol Buffers

Google's format - Fast & Compact

Binary format

Used in gRPC

Connector Attributes - Summary Table

Attribute Options When to Use
Synchronization Sync / Async Async for better performance, Sync for simplicity
Initiator Client-Server / Peer-to-Peer P2P for chat apps, C-S for web apps
Information Carrier Shared Memory / Network Memory for local, Network for distributed
Data Format JSON / XML / Binary JSON for web, Binary for performance
Cardinality 1:1 / 1:N / N:N Depends on communication pattern

Key Takeaway: Every connector decision involves a tradeoff. Choose wisely based on your requirements!

2.5 Agile Approach to Architecture Design

📚 From the Book:

"Traditional software architecture designs, based on a waterfall model, do not emphasize iterative refinement nature..."

❌ Traditional (Waterfall) Problems:

  • All decisions upfront (BDUF)
  • Big gap between requirements and implementation
  • If deployment environment changes → start from scratch!
  • Changes are expensive

✅ Book's Agile Approach:

  • Iterative refinement of architecture
  • Abstract high-level design first
  • Attributes identified for elements & connectors
  • Maximizes reuse of design & implementation

🌟 Unique Features of This Approach:

1. Delayed Binding of Connectors

More flexible implementation decisions!

2. Seamless Integration of Multiple Styles

Different styles for different subsystems!

2.5 Example: Iterative Architecture Evolution

📚 From the Book: Data Presenter System

Let's see how architecture evolves through iterative refinement!

📍 Stage 1: Stand-alone Application (Figure 2.5)

Single user, single machine

  • Client GUI Module - presents data
  • Data Retrieval & Processing - fetches from DB
  • Connector: Local method call
[Client GUI] ←→ [Data Retrieval] ←→ [Database]
     (Same process, different threads)

📍 Stage 2: Networked Application (Figure 2.6)

Requirement change: Multiple clients over Internet!

  • Connector gets Networked attribute
  • Same language? → Use Java RMI or .NET Remote
  • Connector: One-initiator, Networked, Signature-based
[Client GUI] ←--RMI--→ [Data Retrieval] ←→ [DB]
      (Different machines)

2.5 Example: Evolution Continues...

📍 Stage 3: Third-party Clients (Figure 2.7)

Requirement: Support clients from third parties!

  • Can't control client technology → Need Protocol-based connector
  • Use HTTP protocol
  • Use HTML for data presentation
  • Two new tiers: HTML Generator (server) + HTML Presenter (client)
[HTML Presenter] ←-HTTP-→ [HTML Generator] ←→ [Data Retrieval] ←→ [DB]
    (Browser)           (Server-side)

📍 Stage 4: Web Architecture (Figure 2.8)

Requirement: Significant data processing needed!

  • Apply Divide and Conquer
  • Server divided into 3 tiers:

1️⃣ Presentation Tier - HTML generation

2️⃣ Business Logic Tier - Data processing

3️⃣ Data Source Tier - Persistence

Result: Modern Web Architecture!

🎯 Key Insight:

Same system evolved through 4 stages by changing connector attributes and adding tiers based on requirements!

🎯 Golden Rule: Delayed Binding

Don't make decisions until you have to!

"Defer decisions to the last responsible moment"

❌ Early Binding (Bad)

"We decided from the start that we'll only use MySQL"

If you need PostgreSQL later, everything must change!

✅ Delayed Binding (Good)

"Write code using interfaces"

Any database can be plugged in later!

// Good: Use interfaces
interface DatabaseService {
    save(data);
    find(id);
}

// Decide implementation later
class MySQLService implements DatabaseService { ... }
class PostgreSQLService implements DatabaseService { ... }
class MongoDBService implements DatabaseService { ... }

📺 Case Study: YouTube - Applying What We Learned

Let's apply today's concepts to YouTube!

⚙️ Processing Elements

  • Video Encoder (C++): Raw video → MP4/WebM
  • Thumbnail Generator: Video frames → Images
  • Transcoder: 1080p → 720p → 480p → 360p

🚦 Service Elements

  • Recommendation Engine: ML models (Python)
  • Search Service: Index and query
  • User Service: Login, profiles

💾 Data Elements

Vitess (MySQL)

User data, metadata

BigTable

Analytics data

Cloud Storage

Video files

📺 Case Study: YouTube - Connectors

🗄️ Database Connector: Vitess

Sits in front of MySQL and manages traffic

  • Sharding: Splits data into pieces
  • Load Balancing: Distributes queries
  • Connection Pooling: Efficient connections

✅ Standard MySQL cannot handle millions of queries!

🌐 Network Connector: CDN

A location-aware connector!

  • Edge Servers: Near your location
  • Caching: Popular videos stored locally
  • Routing: Connects to nearest server

✅ Connects you to the server closest to you!

🎯 Key Learning:

In YouTube's architecture, every connector is carefully chosen based on specific requirements!

📋 Element & Connector Mapping Guidelines

Requirement Element Type Connector Type
Data transformation Processing Element Sync/Async based on speed need
Persistent storage Data Element Database connector
Coordination Service Element Message Queue (Async)
Real-time updates Service Element WebSocket (Bidirectional)
External API Service Element HTTP/REST connector

💡 Pro Tip:

Always ask: "What is this element's PRIMARY purpose?" and "How will these elements communicate?"

Week 2 Summary

What We Learned Today:

📊 3 Types of Structures

  • Static: Code organization
  • Runtime: Execution behavior
  • Management: Team structure (Conway's Law)

🧱 3 Types of Elements

  • Processing: Transform data
  • Data: Store information
  • Service: Coordinate flow

🔗 Connector Decisions

  • Sync vs Async
  • Client-Server vs Peer-to-Peer
  • Shared Memory vs Network
  • Proxy Pattern for transparency

🔄 Agile Architecture

  • Delayed Binding principle
  • Evolving design
  • Interface-based flexibility

🎯 Key Takeaway

Architecture is not just drawing boxes!

Behind every box (Element) and every line (Connector) there is a conscious decision.

📚 Homework:

Open any open source project on GitHub.
Identify:

  • Which are Processing Elements?
  • Which are Data Elements?
  • How are Connectors implemented?

Next Week: Models for Software Architecture

Week 3 Topics:

  • UML for Software Architecture (Class, Sequence, Component diagrams)
  • Architecture View Models
  • 4+1 View Model in detail
  • Architecture Description Languages (ADL)

📖 Reading Assignment:

Textbook Chapter 3: Models for Software Architecture

Focus on UML diagrams - we'll be drawing a lot!

📐 UML Diagrams

Visual notation for design

👁️ Multiple Views

Different perspectives

📝 ADL

Formal specifications

Questions?

Let's Discuss!

🤔 Think about your favorite app (Instagram, TikTok, Spotify)

Can you identify Processing, Data, and Service elements in it?

Are the connectors Sync or Async?

Thank you! See you next week! 🙏