Everything You Need To Know About Software Design In Ten Minutes
Software design is hard to talk about. We often rely on metaphors from structural engineering and other disciplines to describe this process. We might use terms like “architecture” to describe the components of our system, how they fit together, and why we put them together that way.
In general, we can say that software design is the process of putting together working systems with repeatable patterns in a way that results in a flexible system.
Software Is Flexible
“Architecture” is actually a terrible name for what we mean when we talk about our process of designing software. The word “architecture” brings to mind building blueprints worked out in great detail with concern for both functionality and aesthetics.
Early attempts at designing software fell prey to this illusion. We spent decades trying to write detailed architecture specifications for software projects. The Agile movement restored sanity by reminding us that software needs to change and the design process must reflect that.
In reality, real working software is almost never planned out in detail ahead of time. We don’t know the full requirements in perfect detail on day one. At best, we have a general outline. So blueprints are out the window.
Software must be malleable and adapt to new, unknown requirements. So it’s very important that our system remain flexible. Let’s look at how we can ensure that.
Architecture by Design Principles
Instead of blueprints, we have design principles that define how components of our system should be structured to ensure that our system remains flexible. These aren’t hard-and-fast rules, but rather concepts that we need to apply judiciously.
Some design principles you may have heard of include the Single Responsibility Principle. This is a simple enough edict that tells us the components in our system should do one thing, and do it well. We should not have a class that handles both HTTP requests and database calls, for example.
I could bullet point a list of design principles, but I think it’s more useful to understand some broader concepts first. Namely, we need to look at the foundations of object oriented design.