DEV Community

Cover image for Software Architecture: A Journey Through Time 🕰️
Mo
Mo

Posted on

Software Architecture: A Journey Through Time 🕰️

Hello everyone! Hope you're all doing well! 😊 In today’s post, we’re diving into the fascinating world of Software Architecture. We'll journey through its history, explore the differences between architecture and design, and clarify the often-confused terms software architecture and software design. So, let’s get started!

A Brief History of Software Architecture 🏛️

To truly appreciate software architecture as we know it today, we need to rewind the clock and explore how it evolved:

  • 1950s: The early days of computing, where coding was mostly low-level and done in assembly languages. The concept of "architecture" didn't exist yet.

  • 1960s: The rise of structured programming and the birth of object-oriented programming (OOP), marking the first steps towards modularity and component-based design. A small step for programming, but a giant leap for architecture! 🚀

  • Late 1960s: Enter monolithic architectures—systems where everything was built as one large unit. People started theorising about how to structure software, laying the groundwork for more sophisticated architectures.

  • 1970s: Big innovations like microkernel architecture came along. This modular design had a core system (the microkernel) surrounded by components. Plus, event-driven programming made it possible for systems to respond to events, creating a more dynamic interaction between modules.

  • 1978: The rise of Client-Server architecture. Initially, servers handled everything, but soon the Model-View-Controller (MVC) pattern was introduced to divide responsibilities more efficiently.

  • 1980s & 1990s: More refined architectures came into play like Command-Query Separation (CQS). This was also the era when the web browser was born! 🌐 With the rise of the internet, architectures like Service-Oriented Architecture (SOA) and Domain-Driven Design (DDD) emerged.

  • 2000s: The modern age of Microservices, Onion Architecture, CQRS (Command Query Responsibility Segregation), and Clean Architecture. These patterns are designed for scalability, maintainability, and modularity.


Architecture vs Design 🏗️🛠️

Let’s clear up a common point of confusion: what's the difference between software architecture and software design? 🤔

Architecture: The Big Picture

Think of architecture as the blueprint of your system. It defines the structure, how components interact, and the guiding principles like scalability and modularity.

For example, in C#, you might decide that your system will follow a Microservices architecture to ensure modularity and ease of scaling. Here’s how you might define a service in C#:



public class UserService
{
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public async Task<User> GetUserByIdAsync(int id)
    {
        return await _userRepository.GetByIdAsync(id);
    }
}


Enter fullscreen mode Exit fullscreen mode

The architect's role is to ensure that this blueprint serves both the business's functional and non-functional requirements.

Design: The Nitty-Gritty Details

Design is where the actual implementation happens. If architecture is the what, design is the how. While architecture decides the overall structure, design dives into the technical aspects, like which libraries to use and how classes will be structured.

For instance, in our Microservices example, design would focus on how the UserService interacts with the repository, which libraries are employed, and which coding patterns (like Dependency Injection) are used.



public interface IUserRepository
{
    Task<User> GetByIdAsync(int id);
}

public class UserRepository : IUserRepository
{
    private readonly DbContext _context;

    public UserRepository(DbContext context)
    {
        _context = context;
    }

    public async Task<User> GetByIdAsync(int id)
    {
        return await _context.Users.FindAsync(id);
    }
}


Enter fullscreen mode Exit fullscreen mode

Notice how the architecture stays the same (we still have a service and a repository), but the design handles the specifics of how data is fetched from a database.


Software Architecture vs Software Design 🔍

It’s easy to confuse these terms, but they serve different purposes. To simplify:

  • Software Architecture is the high-level structure of a system. It deals with how the system is divided into components, how data flows between those components, and which architectural pattern (e.g. monolithic, microservices) is best suited to solve the problem.

  • Software Design is the low-level implementation. It focuses on fleshing out the architecture with specific libraries, technologies, and coding techniques.

Imagine you’re building a house 🏡. The architecture is like the blueprint, determining how rooms and spaces are arranged. The design, on the other hand, would be things like which materials to use for the walls, the placement of electrical wiring, and the style of windows. Both are crucial, but they address different levels of the project.


Wrapping Up 🎁

In summary:

  • Software Architecture focuses on the big picture: the structure, modularity, and high-level organisation of a system.
  • Software Design is all about the technical implementation: choosing the right tools and ensuring everything works efficiently within the architectural framework.

Understanding the history of software architecture helps us see why different patterns like Microservices or Clean Architecture emerged and how they continue to shape modern software development. 💻

In our next article (and video!), we’ll dive deeper into architectural patterns like Clean Architecture vs Microservices and discuss how they can impact your projects.

Stay tuned, and happy coding! 👨‍💻👩‍💻

Top comments (0)