This post is the first of a series of posts about Software Architecture. In them, I write about what I’ve learned on Software Architecture, how I think of it, and how I use that knowledge.
I am calling these series of posts “The Software Architecture Chronicles”, not because I think of myself as a great writer but because I find the name rather corny in a funny way!😀
In this first post, I am going to talk about why I am writing this series of posts and what’s to come.
The importance of knowing our history
Those who fail to learn History are doomed to repeat it.
Winston S. Churchil
I find it important to learn from history, it can teach us a lot. At a personal level, we (eventually & hopefully) learn from our personal mistakes. As a country, history helps model our culture, helps create an idea of a group, an idea of ’us’, a national identity. It also helps us learn from our ancestor mistakes, like trusting people with very weird ideas, think WW2 …
For us, as developers, it helps us build on our predecessor developers knowledge. It helps us learn from their mistakes, from their paths, from their experiences: their knowledge. It helps us achieve higher grounds by “standing on the shoulders of giants“!
In my path to be a better developer, I’ve read a lot of articles, watched a lot of conference talks, and read plenty of books. I do my best to stand on the shoulders of giants!
One thing that puzzles me though, is that there are many opinions based on opinions based on opinions… And this works like the “Chinese whispering game”, where we end up with a distorted idea of what a paper, article or book really states.
So I set out to scavenge the internet for the original papers, articles and books that state the concepts that I find of most importance for my work, and reason about them by myself.
These posts are the result of this reasoning, as I try to understand how these concepts came to be, in a somewhat chronological way.
Writing these posts forced me to read and reason a lot about all these subjects and helped me understand the techniques used today in software development and I hope these posts are helpful to more fellow developers.
Nevertheless, if you read something you don’t understand or disagree with, please let me know, I am perfectly open to discussing these subjects, learn from other people and change my point of view when I’m proven wrong.
Posts in The Software Architecture Chronicles
- The Software Architecture Chronicles
- Software Architecture Premises
- Programming Language evolution
- Architectural Styles vs. Architectural Patterns vs. Design Patterns
- Monolithic Architecture
- Layered Architecture
- MVC and its variants
- EBI Architecture
- Packaging code
- Domain-Driven Design
- Ports & Adapters Architecture (aka Hexagonal Architecture)
- Onion Architecture
- Clean Architecture
- Event-Driven Architecture
- From CQS to CQRS
- Service Oriented Architecture (SOA)
- How I put it all together
- Reflecting architecture and domain in code
- DCI Architecture
This is a rough timeline of software development evolution, as I perceive it after having read articles and books about all these subjects. I added links to where I found the date reference, and I put a “~” wherever I’m not very sure of the date, meaning “approximately”. We can also find a plethora of information about these things through the main Programming Paradigm page inWikipedia.
I will talk about most of these subjects in this series of posts.
- Non-structured Programming
- ~1951 – Assembly
- Structured Programming
- Layering: 1 tier with the UI, Business Logic and Data Storage
- ~1958 – Algol
- Procedural / Functional Programming
- ~1970 – Pascal
- ~1972 – C
- 1979 – Model-View-Controller
- Object Oriented Programming (first thoughts were in the late 1960s, though)
- Layering: 2 tier, the 1st tier with the UI, the 2nd tier with Business Logic and Data Storage
- ~1980 – C++
- CORBA – Common Object Request Broker Architecture (though the first stable version was only out in 1991, the first usages were during the 1980s)
- ~1986 – Erlang
- ~1987 – Perl
- 1987 – PAC aka Hierarchical Model-View-Controller
- 1988 – LSP (~SOLID)
- Layering: 3 tier, the 1st tier with the UI, the 2nd tier Business Logic (and the UI presentation logic in case of a browser as client), the 3rd tier with the Data Storage
- ~1991 – Message Bus
- ~1991 – Python
- 1992 – Entity-Boundary-Interactor Architecture aka EBC aka EIC
- ~1993 – Ruby
- 1996 – Model-View-Presenter
- 1996 – OCP, ISP, DIP (~SOLID), REP, CRP, CCP, ADP
- 1997 – SDP, SAP
- ~1997 – Aspect Oriented Programming
- ~1997 – Web Services
- ~1997 – ESB – Enterprise Service Bus (although the book that coined the term was published in 2004, the concept was already used before)