From Coding to Programming: Introduction
Tags: programming, codenewbie
Published: 2022-03-01 23:14:31

The era of programmers; this is the best description that I'd give to the current era we live in. In these days, everyone wants to be a programmer, each one of us is somehow attracted to programming since the first time he/she heard of it. Thanks to YouTube and the dozens of free online courses on the internet, the number of programmers in the whole world is increasing exponentially. Each one of us, as a newbie, got interested in this creative magic thing, watched dozens of videos on YouTube that telling us how to write classes and methods (how to code), wrote several applications with various languages in different disciplines — starting with "Hello World" simple app, and ending up to a barely complex desktop/web/mobile app. Hover, **knows nothing about programming**.

As I mentioned, we watched many tutorials, but **none of them taught us how to program**. All they taught us is how to write code, how to define variables and use them with flow-control statements, how to turn the thoughts and solutions in our mind into code of sequences, selections, and iterations. Which is a good thing to learn, but it's not sufficient to make us real programmers.

It may seem absurd in the first glance; you may think that: "But we actually do make programs, so we can do programming... WE ARE PROGRAMMERS!". No, **you cannot be a programmer just because you're able to produce a program**. You are just using some programmers' artifacts to make/produce your messy, miserable, fragile program. You can't take a sketching pencil and start scribbling and then call yourself an artist!

[Robert Martin](https://en.wikipedia.org/wiki/Robert_C._Martin) had been teaching us that, in his books and lectures, for years. And one of the remarkable things that Robert said in one of his lectures was that the word "software" is a compound word composed of two words; "ware" which means product, and the word "soft" which means easy to change. We, as newbies programmers (software developers), fulfill just one part; we just write codes and make products that are not "soft", that are not maintainable and flexible.

Eventually, learning how to write code isn't sufficient to make you and me programmers. Software design and architecture is an essential topic for programmers to learn.

## What is Software Design & Architecture
Although the word architecture is usually used to refer to the high-level, and the word design to the low-level, we often use the both interchangeably. In software, the high-level and the low-level specifications are made asynchronously, **the architect keeps leaping from one level to the other**, several times. Until he winds up with the suitable design for the system.

A software with a good architecture ought to be maintainable and flexible; If some code somewhere has been changed for some reason, it doesn't cause a bunch of bugs throughout various parts of the system. If any new feature would be added to the system, not much code would be changed (if 0 code will be changed, then the architect did his job well). On the other hand, a software with a bad architecture is always hard to change, hard to maintain, and costs a lot of money and time.

We may define Software Design and Architecture as a set of principles and best practices in software development, that developers should employ in their systems, in order to obtain the highest level of maintainability and flexibility.

> In this series, I'll cover some of the principles, and a few design patterns. However, you can take a step further and learn more about these stuff by reading the following two books:
- Clean Architecture, by Robert Martine. 
- Design Patterns, Elements of Reusable Object-Oriented Software. 
- Or even by watching [Robert Martin lectures on YouTube](https://www.youtube.com/playlist?list=PLmmYSbUCWJ4x1GO839azG_BBw8rkh-zOj).