DEV Community

Cover image for Understanding The "Why" Behind Software Design: Introduction
Ashay Tiwari
Ashay Tiwari

Posted on

Understanding The "Why" Behind Software Design: Introduction

✨ Why Software Design Matters

If you've been developing software for a while, you've probably come across terms like:

  • Object-Oriented Programming (OOP)
  • Encapsulation
  • Abstraction
  • Inheritance
  • Polymorphism
  • SOLID Principles
  • Dependency Injection
  • Design Patterns

There are countless articles, videos, and courses explaining these concepts.

Still, there are plenty of developers, including me, who learn those concepts and forget them very quickly.

We memorize definitions.

We learn syntax.

We understand enough to answer interview questions.

But we rarely stop and ask:

Why were these concepts introduced in the first place?

Asking Why??

That realization is the reason I'm starting this series.


🧐 The Problem With How We Learn Software Design

When I first learned OOP, I learned things like:

  • Encapsulation is data hiding.
  • Inheritance allows code reuse.
  • Polymorphism means many forms.
  • Abstraction hides implementation details.

The definitions were easy enough to remember.

The difficult part was understanding when these concepts actually mattered.

If someone asked:

  • Why is inheritance considered risky in some situations?
  • Why do people say composition is often better?
  • Why was the SOLID principle created?
  • Why do modern frameworks rely heavily on Dependency Injection?

I could explain the concepts individually, but I couldn't always explain the problems they were trying to solve.

Over time, I realized that software design concepts are much easier to understand when viewed from a different perspective.

Instead of asking:

"What is this concept?"

Ask:

"What problem were developers facing that made this concept necessary?"

Once you understand the problem, the solution becomes much more intuitive.


🛠️ Why Software Design Matters

When we start learning programming, most applications are small.

A few functions.

A few variables.

A few files.

Everything feels manageable.

As projects grow, something interesting happens.

The challenge is no longer writing code.

The challenge becomes managing code.

Features are added.

Requirements change.

Teams grow.

Business logic becomes more complex.

Code that once felt simple starts becoming difficult to understand and modify.

At some point, developers begin encountering questions like:

  • Why is this logic duplicated in multiple places?
  • Why does changing one feature break another?
  • Why is this class responsible for so many things?
  • Why is testing this code so difficult?
  • Why does every new feature require modifying existing code?

The software still works.

But it becomes harder to maintain.

Harder to extend.

Harder to reason about.

This is where software design becomes important.

Software design is not about making code look clever.

It's about organizing code in a way that allows systems to evolve without becoming unmanageable.

Most of the concepts we'll discuss throughout this series were created to solve exactly these kinds of problems.


❓ What This Series Is About

This series is not going to focus on memorizing definitions.

Instead, we'll focus on understanding:

  • What problem exists?
  • Why the straightforward solution eventually breaks down?
  • What concept was introduced to solve it?
  • What trade-offs come with that solution?

We'll use JavaScript and TypeScript examples because that's what I work with most often, but the concepts themselves apply regardless of programming language.

Whether you're writing Java, C#, Python, Go, JavaScript, or something else entirely, the underlying design principles remain largely the same.


↔️ A Small Shift in Perspective

Throughout this series, I'd encourage you to think about concepts differently.

Instead of learning:

"Encapsulation is data hiding."

Think:

"What problems occur when every part of the system can freely modify an object's state?"

Instead of learning:

"Dependency Injection helps decouple code."

Think:

"Why does directly creating dependencies become painful as applications grow?"

The answers to those questions are often more valuable than the definitions themselves.


⏭️ What's Next?

In the next article, we'll begin with Object-Oriented Programming itself.

Not by starting with classes and syntax.

But by understanding the problems developers were facing before OOP became one of the most influential programming paradigms in software development.

Top comments (0)