# Introduction

Developers often say that they want to produce "well-designed" software. What does that actually mean?

It doesn't take a huge amount of knowledge and skill to get a program working. Kids in high school do it all the time... The code they produce may not be pretty; but it works. It works because getting something to work once just isn’t that hard.

Getting software right is hard. When software is done right, it requires a fraction of the human resources to create and maintain. Changes are simple and rapid. Defects are few and far between. Effort is minimized, and functionality and flexibility are maximized.

— Robert C. Martin, Clean Architecture (2016).

In Martin's view, software should be enduring. Software that you produce should be able to function for a long period of time, in a changing environment. You should expect to make adjustments over time as defects will be found and fixed, new features will be introduced, and old features phased out, but these changes should be relatively easy to make.

If software architecture is concerned with the high-level structure of a software system, software design refers to the actual implementation of that system. Design includes concerns like module and class structure, design patterns and principles, and other low-level abstractions. Software design attempts to answer the question of "how should we build it?"

Enduring software needs to be well-architected to support extensibility and other qualities. However, the actual structure of the code matters too!

irs_software.png
irs_software.png